-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsession.h
187 lines (161 loc) · 6.8 KB
/
session.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
// Copyright 2012 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef CHROME_TEST_CHROMEDRIVER_SESSION_H_
#define CHROME_TEST_CHROMEDRIVER_SESSION_H_
#include <list>
#include <memory>
#include <queue>
#include <string>
#include <vector>
#include "base/callback.h"
#include "base/memory/raw_ptr.h"
#include "base/time/time.h"
#include "base/values.h"
#include "chrome/test/chromedriver/basic_types.h"
#include "chrome/test/chromedriver/chrome/device_metrics.h"
#include "chrome/test/chromedriver/chrome/geoposition.h"
#include "chrome/test/chromedriver/chrome/network_conditions.h"
#include "chrome/test/chromedriver/chrome/scoped_temp_dir_with_retry.h"
#include "chrome/test/chromedriver/chrome/ui_events.h"
#include "chrome/test/chromedriver/command_listener.h"
static const char kAccept[] = "accept";
static const char kAcceptAndNotify[] = "accept and notify";
static const char kDismiss[] = "dismiss";
static const char kDismissAndNotify[] = "dismiss and notify";
static const char kIgnore[] = "ignore";
// Controls whether ChromeDriver operates in W3C mode (when true) by default
// or legacy mode (when false).
static const bool kW3CDefault = true;
namespace base {
class DictionaryValue;
}
class Chrome;
class Status;
class WebDriverLog;
class WebView;
struct FrameInfo {
FrameInfo(const std::string& parent_frame_id,
const std::string& frame_id,
const std::string& chromedriver_frame_id);
std::string parent_frame_id;
std::string frame_id;
std::string chromedriver_frame_id;
};
struct InputCancelListEntry {
InputCancelListEntry(base::DictionaryValue* input_state,
const MouseEvent* mouse_event,
const TouchEvent* touch_event,
const KeyEvent* key_event);
InputCancelListEntry(InputCancelListEntry&& other);
~InputCancelListEntry();
raw_ptr<base::DictionaryValue> input_state;
std::unique_ptr<MouseEvent> mouse_event;
std::unique_ptr<TouchEvent> touch_event;
std::unique_ptr<KeyEvent> key_event;
};
typedef base::RepeatingCallback<void(const std::string& /*payload*/)>
SendTextFunc;
typedef base::RepeatingCallback<void()> CloseFunc;
struct BidiConnection {
BidiConnection(int connection_id,
SendTextFunc send_response,
CloseFunc close_connection);
BidiConnection(BidiConnection&& other);
~BidiConnection();
BidiConnection& operator=(BidiConnection&& other);
int connection_id;
SendTextFunc send_response;
CloseFunc close_connection;
};
struct Session {
static const base::TimeDelta kDefaultImplicitWaitTimeout;
static const base::TimeDelta kDefaultPageLoadTimeout;
static const base::TimeDelta kDefaultScriptTimeout;
explicit Session(const std::string& id);
Session(const std::string& id, std::unique_ptr<Chrome> chrome);
Session(const std::string& id, const std::string& host);
~Session();
Status GetTargetWindow(WebView** web_view);
void SwitchToTopFrame();
void SwitchToParentFrame();
void SwitchToSubFrame(const std::string& frame_id,
const std::string& chromedriver_frame_id);
std::string GetCurrentFrameId() const;
std::vector<WebDriverLog*> GetAllLogs() const;
bool BidiMapperIsLaunched() const;
void OnBidiResponse(const std::string& payload);
void AddBidiConnection(int connection_id,
SendTextFunc send_response,
CloseFunc close_connection);
void RemoveBidiConnection(int connection_id);
void CloseAllConnections();
const std::string id;
bool w3c_compliant;
bool webSocketUrl = false;
bool quit;
bool detach;
bool bidi_mapper_is_launched_ = false;
int awaited_bidi_response_id = -1;
std::unique_ptr<Chrome> chrome;
std::string window;
std::string bidi_mapper_web_view_id;
int sticky_modifiers;
// List of input sources for each active input. Everytime a new input source
// is added, there must be a corresponding entry made in input_state_table.
base::ListValue active_input_sources;
// Map between input id and input source state for the corresponding input
// source. One entry for each item in active_input_sources
base::DictionaryValue input_state_table;
// List of actions for Release Actions command.
std::vector<InputCancelListEntry> input_cancel_list;
// List of |FrameInfo|s for each frame to the current target frame from the
// first frame element in the root document. If target frame is window.top,
// this list will be empty.
std::list<FrameInfo> frames;
// Download directory that the user specifies. Used only in headless mode.
// Defaults to current directory in headless mode if no directory specified
std::unique_ptr<std::string> headless_download_directory;
WebPoint mouse_position;
MouseButton pressed_mouse_button;
base::TimeDelta implicit_wait;
base::TimeDelta page_load_timeout;
base::TimeDelta script_timeout;
std::unique_ptr<std::string> prompt_text;
std::unique_ptr<Geoposition> overridden_geoposition;
std::unique_ptr<DeviceMetrics> overridden_device_metrics;
std::unique_ptr<NetworkConditions> overridden_network_conditions;
std::string orientation_type;
// Logs that populate from DevTools events.
std::vector<std::unique_ptr<WebDriverLog>> devtools_logs;
std::unique_ptr<WebDriverLog> driver_log;
ScopedTempDirWithRetry temp_dir;
std::unique_ptr<base::DictionaryValue> capabilities;
// |command_listeners| should be declared after |chrome|. When the |Session|
// is destroyed, |command_listeners| should be freed first, since some
// |CommandListener|s might be |CommandListenerProxy|s that forward to
// |DevToolsEventListener|s owned by |chrome|.
std::vector<std::unique_ptr<CommandListener>> command_listeners;
bool strict_file_interactability;
std::string unhandled_prompt_behavior;
int click_count;
base::TimeTicks mouse_click_timestamp;
std::string host;
private:
void SwitchFrameInternal(bool for_top_frame);
void ProcessBidiResponseQueue();
// TODO: for the moment being we support single connection per client
// In the future (2022Q4) we will probably support multiple bidi connections.
// In order to do that we can try either of the following approaches:
// * Create a separate CDP session per connection
// * Give some connection identifying context to the BiDiMapper.
// The context will travel between the BiDiMapper and ChromeDriver.
// * Store an internal map between CDP command id and connection.
std::vector<BidiConnection> bidi_connections_;
// If there is no active connections the messages from Chrome are accumulated
// in this queue until a connection is created or the queue overflows.
std::queue<base::Value> bidi_response_queue_;
};
Session* GetThreadLocalSession();
void SetThreadLocalSession(std::unique_ptr<Session> session);
#endif // CHROME_TEST_CHROMEDRIVER_SESSION_H_