1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_EMULATION_AGENT_H_
6 #define THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_EMULATION_AGENT_H_
7 
8 #include "base/macros.h"
9 #include "base/optional.h"
10 #include "third_party/blink/public/common/user_agent/user_agent_metadata.h"
11 #include "third_party/blink/renderer/core/core_export.h"
12 #include "third_party/blink/renderer/core/inspector/inspector_base_agent.h"
13 #include "third_party/blink/renderer/core/inspector/protocol/Emulation.h"
14 #include "third_party/blink/renderer/core/loader/frame_loader_types.h"
15 #include "third_party/blink/renderer/core/timezone/timezone_controller.h"
16 #include "third_party/blink/renderer/platform/loader/fetch/resource_loader_options.h"
17 #include "third_party/blink/renderer/platform/scheduler/public/page_scheduler.h"
18 
19 namespace blink {
20 
21 class DocumentLoader;
22 class ResourceRequest;
23 class WebLocalFrameImpl;
24 class WebViewImpl;
25 enum class ResourceType : uint8_t;
26 
27 namespace protocol {
28 namespace DOM {
29 class RGBA;
30 }  // namespace DOM
31 }  // namespace protocol
32 
33 class CORE_EXPORT InspectorEmulationAgent final
34     : public InspectorBaseAgent<protocol::Emulation::Metainfo> {
35  public:
36   explicit InspectorEmulationAgent(WebLocalFrameImpl*);
37   ~InspectorEmulationAgent() override;
38 
39   // protocol::Dispatcher::EmulationCommandHandler implementation.
40   protocol::Response resetPageScaleFactor() override;
41   protocol::Response setPageScaleFactor(double) override;
42   protocol::Response setScriptExecutionDisabled(bool value) override;
43   protocol::Response setScrollbarsHidden(bool hidden) override;
44   protocol::Response setDocumentCookieDisabled(bool disabled) override;
45   protocol::Response setTouchEmulationEnabled(
46       bool enabled,
47       protocol::Maybe<int> max_touch_points) override;
48   protocol::Response setEmulatedMedia(
49       protocol::Maybe<String> media,
50       protocol::Maybe<protocol::Array<protocol::Emulation::MediaFeature>>
51           features) override;
52   protocol::Response setEmulatedVisionDeficiency(const String&) override;
53   protocol::Response setCPUThrottlingRate(double) override;
54   protocol::Response setFocusEmulationEnabled(bool) override;
55   protocol::Response setVirtualTimePolicy(
56       const String& policy,
57       protocol::Maybe<double> virtual_time_budget_ms,
58       protocol::Maybe<int> max_virtual_time_task_starvation_count,
59       protocol::Maybe<bool> wait_for_navigation,
60       protocol::Maybe<double> initial_virtual_time,
61       double* virtual_time_ticks_base_ms) override;
62   protocol::Response setTimezoneOverride(const String& timezone_id) override;
63   protocol::Response setNavigatorOverrides(const String& platform) override;
64   protocol::Response setDefaultBackgroundColorOverride(
65       protocol::Maybe<protocol::DOM::RGBA>) override;
66   protocol::Response setDeviceMetricsOverride(
67       int width,
68       int height,
69       double device_scale_factor,
70       bool mobile,
71       protocol::Maybe<double> scale,
72       protocol::Maybe<int> screen_width,
73       protocol::Maybe<int> screen_height,
74       protocol::Maybe<int> position_x,
75       protocol::Maybe<int> position_y,
76       protocol::Maybe<bool> dont_set_visible_size,
77       protocol::Maybe<protocol::Emulation::ScreenOrientation>,
78       protocol::Maybe<protocol::Page::Viewport>,
79       protocol::Maybe<protocol::Emulation::DisplayFeature>) override;
80   protocol::Response clearDeviceMetricsOverride() override;
81   protocol::Response setUserAgentOverride(
82       const String& user_agent,
83       protocol::Maybe<String> accept_language,
84       protocol::Maybe<String> platform,
85       protocol::Maybe<protocol::Emulation::UserAgentMetadata>
86           ua_metadata_override) override;
87   protocol::Response setLocaleOverride(protocol::Maybe<String>) override;
88   protocol::Response setDisabledImageTypes(
89       std::unique_ptr<protocol::Array<protocol::Emulation::DisabledImageType>>)
90       override;
91 
92   // InspectorInstrumentation API
93   void ApplyAcceptLanguageOverride(String* accept_lang);
94   void ApplyUserAgentOverride(String* user_agent);
95   void ApplyUserAgentMetadataOverride(
96       base::Optional<blink::UserAgentMetadata>* ua_metadata);
97   void FrameStartedLoading(LocalFrame*);
98   void PrepareRequest(DocumentLoader*,
99                       ResourceRequest&,
100                       ResourceLoaderOptions&,
101                       ResourceType);
102   void GetDisabledImageTypes(HashSet<String>* result);
103   void WillCommitLoad(LocalFrame*, DocumentLoader*);
104 
105   // InspectorBaseAgent overrides.
106   protocol::Response disable() override;
107   void Restore() override;
108 
109   void Trace(Visitor*) const override;
110 
111   static AtomicString OverrideAcceptImageHeader(const HashSet<String>*);
112 
113  private:
114   WebViewImpl* GetWebViewImpl();
115   protocol::Response AssertPage();
116   void VirtualTimeBudgetExpired();
117   void InnerEnable();
118 
119   struct PendingVirtualTimePolicy {
120     PageScheduler::VirtualTimePolicy policy;
121     base::Optional<double> virtual_time_budget_ms;
122     base::Optional<int> max_virtual_time_task_starvation_count;
123   };
124   void ApplyVirtualTimePolicy(const PendingVirtualTimePolicy& new_policy);
125 
126   Member<WebLocalFrameImpl> web_local_frame_;
127   base::TimeTicks virtual_time_base_ticks_;
128   HeapVector<Member<DocumentLoader>> pending_document_loaders_;
129 
130   std::unique_ptr<TimeZoneController::TimeZoneOverride> timezone_override_;
131 
132   // Supports a virtual time policy change scheduled to occur after any
133   // navigation has started.
134   base::Optional<PendingVirtualTimePolicy> pending_virtual_time_policy_;
135   bool enabled_ = false;
136 
137   InspectorAgentState::Bytes default_background_color_override_rgba_;
138   InspectorAgentState::Boolean script_execution_disabled_;
139   InspectorAgentState::Boolean scrollbars_hidden_;
140   InspectorAgentState::Boolean document_cookie_disabled_;
141   InspectorAgentState::Boolean touch_event_emulation_enabled_;
142   InspectorAgentState::Integer max_touch_points_;
143   InspectorAgentState::String emulated_media_;
144   InspectorAgentState::StringMap emulated_media_features_;
145   InspectorAgentState::String emulated_vision_deficiency_;
146   InspectorAgentState::String navigator_platform_override_;
147   InspectorAgentState::String user_agent_override_;
148   InspectorAgentState::String serialized_ua_metadata_override_;
149   base::Optional<blink::UserAgentMetadata> ua_metadata_override_;
150   InspectorAgentState::String accept_language_override_;
151   InspectorAgentState::String locale_override_;
152   InspectorAgentState::Double virtual_time_budget_;
153   InspectorAgentState::Double virtual_time_budget_initial_offset_;
154   InspectorAgentState::Double initial_virtual_time_;
155   InspectorAgentState::Double virtual_time_offset_;
156   InspectorAgentState::String virtual_time_policy_;
157   InspectorAgentState::Integer virtual_time_task_starvation_count_;
158   InspectorAgentState::Boolean wait_for_navigation_;
159   InspectorAgentState::Boolean emulate_focus_;
160   InspectorAgentState::String timezone_id_override_;
161   InspectorAgentState::BooleanMap disabled_image_types_;
162   DISALLOW_COPY_AND_ASSIGN(InspectorEmulationAgent);
163 };
164 
165 }  // namespace blink
166 
167 #endif  // THIRD_PARTY_BLINK_RENDERER_CORE_INSPECTOR_INSPECTOR_EMULATION_AGENT_H_
168