1 |
|
-module(chrme_dom). |
2 |
|
-export([get_document/1, query_selector/3, get_outer_html/2, set_attribute_value/4, |
3 |
|
remove_node/2, register_document_updated_handler/2, unregister_document_updated_handler/2]). |
4 |
|
|
5 |
|
%% Get the root document node |
6 |
|
-spec get_document(Name :: chrme_session:name()) -> {ok, map()} | {error, term()}. |
7 |
|
get_document(Name) -> |
8 |
:-( |
case chrme_cdp:call(Name, <<"DOM.getDocument">>, #{}) of |
9 |
|
{ok, Resp} -> |
10 |
:-( |
Root = maps:get(<<"root">>, Resp), |
11 |
:-( |
{ok, Root}; |
12 |
:-( |
Err -> Err |
13 |
|
end. |
14 |
|
|
15 |
|
%% Find a child node matching selector |
16 |
|
-spec query_selector(Name :: chrme_session:name(), NodeId :: integer(), Selector0 :: klsn:binstr()) -> {ok, integer()} | {error, term()}. |
17 |
|
query_selector(Name, NodeId, Selector0) -> |
18 |
:-( |
Sel = chrme_util:to_binary(Selector0), |
19 |
:-( |
case chrme_cdp:call(Name, <<"DOM.querySelector">>, #{nodeId => NodeId, selector => Sel}) of |
20 |
|
{ok, Resp} -> |
21 |
:-( |
{ok, maps:get(<<"nodeId">>, Resp)}; |
22 |
:-( |
Err -> Err |
23 |
|
end. |
24 |
|
|
25 |
|
%% Get outer HTML of a node |
26 |
|
-spec get_outer_html(Name :: chrme_session:name(), NodeId :: integer()) -> {ok, binary()} | {error, term()}. |
27 |
|
get_outer_html(Name, NodeId) -> |
28 |
:-( |
case chrme_cdp:call(Name, <<"DOM.getOuterHTML">>, #{nodeId => NodeId}) of |
29 |
|
{ok, Resp} -> |
30 |
:-( |
{ok, maps:get(<<"outerHTML">>, Resp)}; |
31 |
:-( |
Err -> Err |
32 |
|
end. |
33 |
|
|
34 |
|
%% Set an attribute value on an element |
35 |
|
-spec set_attribute_value(Name :: chrme_session:name(), NodeId :: integer(), AttrName0 :: klsn:binstr(), AttrValue0 :: klsn:binstr()) -> {ok, map()} | {error, term()}. |
36 |
|
set_attribute_value(Name, NodeId, AttrName0, AttrValue0) -> |
37 |
:-( |
NameBin = chrme_util:to_binary(AttrName0), |
38 |
:-( |
ValBin = chrme_util:to_binary(AttrValue0), |
39 |
:-( |
chrme_cdp:call(Name, <<"DOM.setAttributeValue">>, |
40 |
|
#{nodeId => NodeId, name => NameBin, value => ValBin}). |
41 |
|
|
42 |
|
%% Remove a node from the document |
43 |
|
-spec remove_node(Name :: chrme_session:name(), NodeId :: integer()) -> {ok, map()} | {error, term()}. |
44 |
|
remove_node(Name, NodeId) -> |
45 |
:-( |
chrme_cdp:call(Name, <<"DOM.removeNode">>, #{nodeId => NodeId}). |
46 |
|
|
47 |
|
%% Subscribe to documentUpdated events |
48 |
|
-spec register_document_updated_handler(Name :: chrme_session:name(), Fun :: fun(() -> any())) -> reference(). |
49 |
|
register_document_updated_handler(Name, Fun) -> |
50 |
:-( |
Ref = make_ref(), |
51 |
:-( |
CallbackName = {chrme_dom, register_document_updated_handler, Name, Ref}, |
52 |
:-( |
CallbackFun = fun |
53 |
:-( |
(stop) -> false; |
54 |
|
(Msg = #{<<"method">> := <<"DOM.documentUpdated">>, <<"params">> := Params}) -> |
55 |
:-( |
Fun(Params), |
56 |
:-( |
true; |
57 |
:-( |
(_) -> false |
58 |
|
end, |
59 |
:-( |
chrme_ws_apic:add_callback(Name, {CallbackName, CallbackFun}), |
60 |
:-( |
Ref. |
61 |
|
|
62 |
|
-spec unregister_document_updated_handler(Name :: chrme_session:name(), Ref :: reference()) -> ok. |
63 |
|
unregister_document_updated_handler(Name, Ref) -> |
64 |
:-( |
CallbackName = {chrme_dom, register_document_updated_handler, Name, Ref}, |
65 |
:-( |
chrme_ws_apic:remove_callback(Name, CallbackName), |
66 |
:-( |
ok. |