/home/runner/work/chrme/chrme/_build/test/cover/ct/chrme_page.html

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 1 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 1 BinUrl = chrme_util:to_binary(Url),
25 1 case chrme_cdp:call(Name, <<"Page.navigate">>, #{url => BinUrl}) of
26 {ok, Resp} ->
27 1 FrameId = maps:get(<<"frameId">>, Resp),
28 1 LoaderId = maps:get(<<"loaderId">>, Resp, undefined),
29 1 {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 1 Ref = make_ref(),
63 1 CallbackName = {chrme_page, register_frame_navigated_handler, Name, Ref},
64 1 CallbackFun = fun
65 (stop) ->
66
:-(
false;
67 (Msg = #{<<"method">> := <<"Page.frameNavigated">>, <<"params">> := Params}) ->
68 1 Fun(Params),
69 1 true;
70 (_) ->
71 9 false
72 end,
73 1 chrme_ws_apic:add_callback(Name, {CallbackName, CallbackFun}),
74 1 Ref.
75
76 -spec unregister_frame_navigated_handler(Name :: chrme_session:name(), Ref :: reference()) -> ok.
77 unregister_frame_navigated_handler(Name, Ref) ->
78 1 CallbackName = {chrme_page, register_frame_navigated_handler, Name, Ref},
79 1 chrme_ws_apic:remove_callback(Name, CallbackName),
80 1 ok.
Line Hits Source