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