1 |
|
-module(chrme_page). |
2 |
|
-export([enable/1, navigate/2, reload/1, stop_loading/1, capture_screenshot/1, |
3 |
|
register_frame_navigated_handler/2, unregister_frame_navigated_handler/2]). |
4 |
|
|
5 |
|
-export_type([navigation/0]). |
6 |
|
-type navigation() :: #{ |
7 |
|
frame_id := klsn:binstr(), |
8 |
|
loader_id := klsn:binstr() | undefined |
9 |
|
}. |
10 |
|
|
11 |
|
%% ------------------------------------------------------------------ |
12 |
|
%% Page domain utilities |
13 |
|
%% ------------------------------------------------------------------ |
14 |
|
|
15 |
|
%% Enable the Page domain so that events like Page.frameNavigated will be |
16 |
|
%% delivered. Mirrors chrme_network:enable/1. |
17 |
|
-spec enable(Name :: chrme_session:name()) -> {ok, map()} | {error, term()}. |
18 |
|
enable(Name) -> |
19 |
:-( |
chrme_cdp:call(Name, <<"Page.enable">>, #{}). |
20 |
|
|
21 |
|
%% Navigate the current page to a URL |
22 |
|
-spec navigate(Name :: chrme_session:name(), Url :: klsn:binstr()) -> {ok, navigation()} | {error, term()}. |
23 |
|
navigate(Name, Url) -> |
24 |
:-( |
BinUrl = chrme_util:to_binary(Url), |
25 |
:-( |
case chrme_cdp:call(Name, <<"Page.navigate">>, #{url => BinUrl}) of |
26 |
|
{ok, Resp} -> |
27 |
:-( |
FrameId = maps:get(<<"frameId">>, Resp), |
28 |
:-( |
LoaderId = maps:get(<<"loaderId">>, Resp, undefined), |
29 |
:-( |
{ok, #{frame_id => FrameId, loader_id => LoaderId}}; |
30 |
|
Err -> |
31 |
:-( |
Err |
32 |
|
end. |
33 |
|
|
34 |
|
-spec reload(Name :: chrme_session:name()) -> {ok, undefined} | {error, term()}. |
35 |
|
reload(Name) -> |
36 |
:-( |
case chrme_cdp:call(Name, <<"Page.reload">>, #{}) of |
37 |
:-( |
{ok, _} -> {ok, undefined}; |
38 |
:-( |
Err -> Err |
39 |
|
end. |
40 |
|
|
41 |
|
-spec stop_loading(Name :: chrme_session:name()) -> {ok, undefined} | {error, term()}. |
42 |
|
stop_loading(Name) -> |
43 |
:-( |
case chrme_cdp:call(Name, <<"Page.stopLoading">>, #{}) of |
44 |
:-( |
{ok, _} -> {ok, undefined}; |
45 |
:-( |
Err -> Err |
46 |
|
end. |
47 |
|
|
48 |
|
%% Capture page screenshot as base64 |
49 |
|
-spec capture_screenshot(Name :: chrme_session:name()) -> {ok, klsn:binstr()} | {error, term()}. |
50 |
|
capture_screenshot(Name) -> |
51 |
:-( |
case chrme_cdp:call(Name, <<"Page.captureScreenshot">>, #{}) of |
52 |
|
{ok, Resp} -> |
53 |
:-( |
DataBin = maps:get(<<"data">>, Resp), |
54 |
:-( |
{ok, DataBin}; |
55 |
|
Err -> |
56 |
:-( |
Err |
57 |
|
end. |
58 |
|
|
59 |
|
%% Subscribe to frameNavigated events |
60 |
|
-spec register_frame_navigated_handler(Name :: chrme_session:name(), Fun :: fun((map()) -> any())) -> reference(). |
61 |
|
register_frame_navigated_handler(Name, Fun) -> |
62 |
:-( |
Ref = make_ref(), |
63 |
:-( |
CallbackName = {chrme_page, register_frame_navigated_handler, Name, Ref}, |
64 |
:-( |
CallbackFun = fun |
65 |
|
(stop) -> |
66 |
:-( |
false; |
67 |
|
(Msg = #{<<"method">> := <<"Page.frameNavigated">>, <<"params">> := Params}) -> |
68 |
:-( |
Fun(Params), |
69 |
:-( |
true; |
70 |
|
(_) -> |
71 |
:-( |
false |
72 |
|
end, |
73 |
:-( |
chrme_ws_apic:add_callback(Name, {CallbackName, CallbackFun}), |
74 |
:-( |
Ref. |
75 |
|
|
76 |
|
-spec unregister_frame_navigated_handler(Name :: chrme_session:name(), Ref :: reference()) -> ok. |
77 |
|
unregister_frame_navigated_handler(Name, Ref) -> |
78 |
:-( |
CallbackName = {chrme_page, register_frame_navigated_handler, Name, Ref}, |
79 |
:-( |
chrme_ws_apic:remove_callback(Name, CallbackName), |
80 |
:-( |
ok. |