Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(537)

Side by Side Diff: third_party/WebKit/Source/web/InspectorOverlayAgent.cpp

Issue 2819183002: [DevTools] Consolidate overlay-related functionality in Overlay domain (Closed)
Patch Set: rebased Created 3 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2011 Google Inc. All rights reserved. 2 * Copyright (C) 2011 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 7 *
8 * 1. Redistributions of source code must retain the above copyright 8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright 10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the 11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution. 12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14 * its contributors may be used to endorse or promote products derived 14 * its contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission. 15 * from this software without specific prior written permission.
16 * 16 *
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 */ 27 */
28 28
29 #include "web/InspectorOverlay.h" 29 #include "web/InspectorOverlayAgent.h"
30 30
31 #include <memory> 31 #include <memory>
32 32
33 #include "bindings/core/v8/ScriptController.h" 33 #include "bindings/core/v8/ScriptController.h"
34 #include "bindings/core/v8/ScriptSourceCode.h" 34 #include "bindings/core/v8/ScriptSourceCode.h"
35 #include "bindings/core/v8/V8Binding.h" 35 #include "bindings/core/v8/V8Binding.h"
36 #include "bindings/core/v8/V8InspectorOverlayHost.h" 36 #include "bindings/core/v8/V8InspectorOverlayHost.h"
37 #include "core/dom/DOMNodeIds.h"
37 #include "core/dom/Node.h" 38 #include "core/dom/Node.h"
38 #include "core/dom/StaticNodeList.h" 39 #include "core/dom/StaticNodeList.h"
39 #include "core/dom/TaskRunnerHelper.h" 40 #include "core/dom/TaskRunnerHelper.h"
40 #include "core/frame/FrameView.h" 41 #include "core/frame/FrameView.h"
41 #include "core/frame/LocalFrame.h" 42 #include "core/frame/LocalFrame.h"
42 #include "core/frame/LocalFrameClient.h" 43 #include "core/frame/LocalFrameClient.h"
43 #include "core/frame/Settings.h" 44 #include "core/frame/Settings.h"
44 #include "core/frame/VisualViewport.h" 45 #include "core/frame/VisualViewport.h"
45 #include "core/html/HTMLFrameOwnerElement.h" 46 #include "core/html/HTMLFrameOwnerElement.h"
46 #include "core/input/EventHandler.h" 47 #include "core/input/EventHandler.h"
48 #include "core/inspector/IdentifiersFactory.h"
49 #include "core/inspector/InspectedFrames.h"
50 #include "core/inspector/InspectorDOMAgent.h"
47 #include "core/inspector/InspectorOverlayHost.h" 51 #include "core/inspector/InspectorOverlayHost.h"
48 #include "core/layout/api/LayoutViewItem.h" 52 #include "core/layout/api/LayoutViewItem.h"
49 #include "core/loader/EmptyClients.h" 53 #include "core/loader/EmptyClients.h"
50 #include "core/loader/FrameLoadRequest.h" 54 #include "core/loader/FrameLoadRequest.h"
51 #include "core/page/ChromeClient.h" 55 #include "core/page/ChromeClient.h"
52 #include "core/page/Page.h" 56 #include "core/page/Page.h"
53 #include "platform/ScriptForbiddenScope.h" 57 #include "platform/ScriptForbiddenScope.h"
54 #include "platform/graphics/Color.h" 58 #include "platform/graphics/Color.h"
55 #include "platform/graphics/GraphicsContext.h" 59 #include "platform/graphics/GraphicsContext.h"
56 #include "platform/graphics/paint/CullRect.h" 60 #include "platform/graphics/paint/CullRect.h"
57 #include "platform/wtf/AutoReset.h" 61 #include "platform/wtf/AutoReset.h"
58 #include "public/platform/Platform.h" 62 #include "public/platform/Platform.h"
59 #include "public/platform/WebData.h" 63 #include "public/platform/WebData.h"
60 #include "v8/include/v8.h" 64 #include "v8/include/v8.h"
61 #include "web/ChromeClientImpl.h" 65 #include "web/ChromeClientImpl.h"
62 #include "web/PageOverlay.h" 66 #include "web/PageOverlay.h"
63 #include "web/WebInputEventConversion.h" 67 #include "web/WebInputEventConversion.h"
64 #include "web/WebLocalFrameImpl.h" 68 #include "web/WebLocalFrameImpl.h"
69 #include "web/WebViewImpl.h"
65 70
66 namespace blink { 71 namespace blink {
67 72
73 using protocol::Maybe;
74 using protocol::Response;
75
68 namespace { 76 namespace {
69 77
78 namespace OverlayAgentState {
79 static const char kEnabled[] = "enabled";
80 static const char kShowDebugBorders[] = "showDebugBorders";
81 static const char kShowFPSCounter[] = "showFPSCounter";
82 static const char kShowPaintRects[] = "showPaintRects";
83 static const char kShowScrollBottleneckRects[] = "showScrollBottleneckRects";
84 static const char kShowSizeOnResize[] = "showSizeOnResize";
85 static const char kSuspended[] = "suspended";
86 static const char kPausedInDebuggerMessage[] = "pausedInDebuggerMessage";
87 }
88
70 Node* HoveredNodeForPoint(LocalFrame* frame, 89 Node* HoveredNodeForPoint(LocalFrame* frame,
71 const IntPoint& point_in_root_frame, 90 const IntPoint& point_in_root_frame,
72 bool ignore_pointer_events_none) { 91 bool ignore_pointer_events_none) {
73 HitTestRequest::HitTestRequestType hit_type = 92 HitTestRequest::HitTestRequestType hit_type =
74 HitTestRequest::kMove | HitTestRequest::kReadOnly | 93 HitTestRequest::kMove | HitTestRequest::kReadOnly |
75 HitTestRequest::kAllowChildFrameContent; 94 HitTestRequest::kAllowChildFrameContent;
76 if (ignore_pointer_events_none) 95 if (ignore_pointer_events_none)
77 hit_type |= HitTestRequest::kIgnorePointerEventsNone; 96 hit_type |= HitTestRequest::kIgnorePointerEventsNone;
78 HitTestRequest request(hit_type); 97 HitTestRequest request(hit_type);
79 HitTestResult result(request, 98 HitTestResult result(request,
(...skipping 23 matching lines...) Expand all
103 122
104 Node* HoveredNodeForEvent(LocalFrame* frame, 123 Node* HoveredNodeForEvent(LocalFrame* frame,
105 const WebTouchEvent& event, 124 const WebTouchEvent& event,
106 bool ignore_pointer_events_none) { 125 bool ignore_pointer_events_none) {
107 if (!event.touches_length) 126 if (!event.touches_length)
108 return nullptr; 127 return nullptr;
109 WebTouchPoint transformed_point = event.TouchPointInRootFrame(0); 128 WebTouchPoint transformed_point = event.TouchPointInRootFrame(0);
110 return HoveredNodeForPoint(frame, RoundedIntPoint(transformed_point.position), 129 return HoveredNodeForPoint(frame, RoundedIntPoint(transformed_point.position),
111 ignore_pointer_events_none); 130 ignore_pointer_events_none);
112 } 131 }
132
133 bool ParseQuad(std::unique_ptr<protocol::Array<double>> quad_array,
134 FloatQuad* quad) {
135 const size_t kCoordinatesInQuad = 8;
136 if (!quad_array || quad_array->length() != kCoordinatesInQuad)
137 return false;
138 quad->SetP1(FloatPoint(quad_array->get(0), quad_array->get(1)));
139 quad->SetP2(FloatPoint(quad_array->get(2), quad_array->get(3)));
140 quad->SetP3(FloatPoint(quad_array->get(4), quad_array->get(5)));
141 quad->SetP4(FloatPoint(quad_array->get(6), quad_array->get(7)));
142 return true;
143 }
144
113 } // namespace 145 } // namespace
114 146
115 class InspectorOverlay::InspectorPageOverlayDelegate final 147 class InspectorOverlayAgent::InspectorPageOverlayDelegate final
116 : public PageOverlay::Delegate { 148 : public PageOverlay::Delegate {
117 public: 149 public:
118 explicit InspectorPageOverlayDelegate(InspectorOverlay& overlay) 150 explicit InspectorPageOverlayDelegate(InspectorOverlayAgent& overlay)
119 : overlay_(&overlay) {} 151 : overlay_(&overlay) {}
120 152
121 void PaintPageOverlay(const PageOverlay&, 153 void PaintPageOverlay(const PageOverlay&,
122 GraphicsContext& graphics_context, 154 GraphicsContext& graphics_context,
123 const WebSize& web_view_size) const override { 155 const WebSize& web_view_size) const override {
124 if (overlay_->IsEmpty()) 156 if (overlay_->IsEmpty())
125 return; 157 return;
126 158
127 FrameView* view = overlay_->OverlayMainFrame()->View(); 159 FrameView* view = overlay_->OverlayMainFrame()->View();
128 DCHECK(!view->NeedsLayout()); 160 DCHECK(!view->NeedsLayout());
129 view->Paint(graphics_context, 161 view->Paint(graphics_context,
130 CullRect(IntRect(0, 0, view->Width(), view->Height()))); 162 CullRect(IntRect(0, 0, view->Width(), view->Height())));
131 } 163 }
132 164
133 private: 165 private:
134 Persistent<InspectorOverlay> overlay_; 166 Persistent<InspectorOverlayAgent> overlay_;
135 }; 167 };
136 168
137 class InspectorOverlay::InspectorOverlayChromeClient final 169 class InspectorOverlayAgent::InspectorOverlayChromeClient final
138 : public EmptyChromeClient { 170 : public EmptyChromeClient {
139 public: 171 public:
140 static InspectorOverlayChromeClient* Create(ChromeClient& client, 172 static InspectorOverlayChromeClient* Create(ChromeClient& client,
141 InspectorOverlay& overlay) { 173 InspectorOverlayAgent& overlay) {
142 return new InspectorOverlayChromeClient(client, overlay); 174 return new InspectorOverlayChromeClient(client, overlay);
143 } 175 }
144 176
145 DEFINE_INLINE_VIRTUAL_TRACE() { 177 DEFINE_INLINE_VIRTUAL_TRACE() {
146 visitor->Trace(client_); 178 visitor->Trace(client_);
147 visitor->Trace(overlay_); 179 visitor->Trace(overlay_);
148 EmptyChromeClient::Trace(visitor); 180 EmptyChromeClient::Trace(visitor);
149 } 181 }
150 182
151 void SetCursor(const Cursor& cursor, LocalFrame* local_root) override { 183 void SetCursor(const Cursor& cursor, LocalFrame* local_root) override {
(...skipping 13 matching lines...) Expand all
165 void InvalidateRect(const IntRect&) override { overlay_->Invalidate(); } 197 void InvalidateRect(const IntRect&) override { overlay_->Invalidate(); }
166 198
167 void ScheduleAnimation(FrameViewBase* frame_view_base) override { 199 void ScheduleAnimation(FrameViewBase* frame_view_base) override {
168 if (overlay_->in_layout_) 200 if (overlay_->in_layout_)
169 return; 201 return;
170 202
171 client_->ScheduleAnimation(frame_view_base); 203 client_->ScheduleAnimation(frame_view_base);
172 } 204 }
173 205
174 private: 206 private:
175 InspectorOverlayChromeClient(ChromeClient& client, InspectorOverlay& overlay) 207 InspectorOverlayChromeClient(ChromeClient& client,
208 InspectorOverlayAgent& overlay)
176 : client_(&client), overlay_(&overlay) {} 209 : client_(&client), overlay_(&overlay) {}
177 210
178 Member<ChromeClient> client_; 211 Member<ChromeClient> client_;
179 Member<InspectorOverlay> overlay_; 212 Member<InspectorOverlayAgent> overlay_;
180 }; 213 };
181 214
182 InspectorOverlay::InspectorOverlay(WebLocalFrameImpl* frame_impl) 215 InspectorOverlayAgent::InspectorOverlayAgent(
216 WebLocalFrameImpl* frame_impl,
217 InspectedFrames* inspected_frames,
218 v8_inspector::V8InspectorSession* v8_session,
219 InspectorDOMAgent* dom_agent)
183 : frame_impl_(frame_impl), 220 : frame_impl_(frame_impl),
184 overlay_host_(InspectorOverlayHost::Create()), 221 inspected_frames_(inspected_frames),
222 enabled_(false),
223 overlay_host_(new InspectorOverlayHost(this)),
185 draw_view_size_(false), 224 draw_view_size_(false),
186 resize_timer_active_(false), 225 resize_timer_active_(false),
187 omit_tooltip_(false), 226 omit_tooltip_(false),
188 timer_(TaskRunnerHelper::Get(TaskType::kUnspecedTimer, 227 timer_(TaskRunnerHelper::Get(TaskType::kUnspecedTimer,
189 frame_impl->GetFrame()), 228 frame_impl->GetFrame()),
190 this, 229 this,
191 &InspectorOverlay::OnTimer), 230 &InspectorOverlayAgent::OnTimer),
192 suspended_(false), 231 suspended_(false),
193 show_reloading_blanket_(false), 232 show_reloading_blanket_(false),
194 in_layout_(false), 233 in_layout_(false),
195 needs_update_(false), 234 needs_update_(false),
235 v8_session_(v8_session),
236 dom_agent_(dom_agent),
196 swallow_next_mouse_up_(false), 237 swallow_next_mouse_up_(false),
197 inspect_mode_(InspectorDOMAgent::kNotSearching) {} 238 inspect_mode_(kNotSearching),
239 backend_node_id_to_inspect_(0) {}
198 240
199 InspectorOverlay::~InspectorOverlay() { 241 InspectorOverlayAgent::~InspectorOverlayAgent() {
200 DCHECK(!overlay_page_); 242 DCHECK(!overlay_page_);
201 } 243 }
202 244
203 DEFINE_TRACE(InspectorOverlay) { 245 DEFINE_TRACE(InspectorOverlayAgent) {
204 visitor->Trace(frame_impl_); 246 visitor->Trace(frame_impl_);
247 visitor->Trace(inspected_frames_);
205 visitor->Trace(highlight_node_); 248 visitor->Trace(highlight_node_);
206 visitor->Trace(event_target_node_); 249 visitor->Trace(event_target_node_);
207 visitor->Trace(overlay_page_); 250 visitor->Trace(overlay_page_);
208 visitor->Trace(overlay_chrome_client_); 251 visitor->Trace(overlay_chrome_client_);
209 visitor->Trace(overlay_host_); 252 visitor->Trace(overlay_host_);
210 visitor->Trace(dom_agent_); 253 visitor->Trace(dom_agent_);
211 visitor->Trace(hovered_node_for_inspect_mode_); 254 visitor->Trace(hovered_node_for_inspect_mode_);
212 } 255 InspectorBaseAgent::Trace(visitor);
213 256 }
214 void InspectorOverlay::Init(v8_inspector::V8InspectorSession* v8_session, 257
215 InspectorDOMAgent* dom_agent) { 258 void InspectorOverlayAgent::Restore() {
216 v8_session_ = v8_session; 259 if (state_->booleanProperty(OverlayAgentState::kEnabled, false))
217 dom_agent_ = dom_agent; 260 enabled_ = true;
218 overlay_host_->SetListener(this); 261 setShowDebugBorders(
219 } 262 state_->booleanProperty(OverlayAgentState::kShowDebugBorders, false));
220 263 setShowFPSCounter(
221 void InspectorOverlay::Invalidate() { 264 state_->booleanProperty(OverlayAgentState::kShowFPSCounter, false));
265 setShowPaintRects(
266 state_->booleanProperty(OverlayAgentState::kShowPaintRects, false));
267 setShowScrollBottleneckRects(state_->booleanProperty(
268 OverlayAgentState::kShowScrollBottleneckRects, false));
269 setShowViewportSizeOnResize(
270 state_->booleanProperty(OverlayAgentState::kShowSizeOnResize, false));
271 String message;
272 state_->getString(OverlayAgentState::kPausedInDebuggerMessage, &message);
273 setPausedInDebuggerMessage(message);
274 setSuspended(state_->booleanProperty(OverlayAgentState::kSuspended, false));
275 }
276
277 Response InspectorOverlayAgent::enable() {
278 if (!dom_agent_->Enabled())
279 return Response::Error("DOM should be enabled first");
280 state_->setBoolean(OverlayAgentState::kEnabled, true);
281 enabled_ = true;
282 if (backend_node_id_to_inspect_)
283 GetFrontend()->inspectNodeRequested(backend_node_id_to_inspect_);
284 backend_node_id_to_inspect_ = 0;
285 return Response::OK();
286 }
287
288 Response InspectorOverlayAgent::disable() {
289 state_->setBoolean(OverlayAgentState::kEnabled, false);
290 enabled_ = false;
291 setShowDebugBorders(false);
292 setShowFPSCounter(false);
293 setShowPaintRects(false);
294 setShowScrollBottleneckRects(false);
295 setShowViewportSizeOnResize(false);
296 setPausedInDebuggerMessage(String());
297 setSuspended(false);
298 SetSearchingForNode(kNotSearching,
299 Maybe<protocol::Overlay::HighlightConfig>());
300 return Response::OK();
301 }
302
303 Response InspectorOverlayAgent::setShowDebugBorders(bool show) {
304 state_->setBoolean(OverlayAgentState::kShowDebugBorders, show);
305 if (show) {
306 Response response = CompositingEnabled();
307 if (!response.isSuccess())
308 return response;
309 }
310 frame_impl_->ViewImpl()->SetShowDebugBorders(show);
311 return Response::OK();
312 }
313
314 Response InspectorOverlayAgent::setShowFPSCounter(bool show) {
315 state_->setBoolean(OverlayAgentState::kShowFPSCounter, show);
316 if (show) {
317 Response response = CompositingEnabled();
318 if (!response.isSuccess())
319 return response;
320 }
321 frame_impl_->ViewImpl()->SetShowFPSCounter(show);
322 return Response::OK();
323 }
324
325 Response InspectorOverlayAgent::setShowPaintRects(bool show) {
326 state_->setBoolean(OverlayAgentState::kShowPaintRects, show);
327 if (show) {
328 Response response = CompositingEnabled();
329 if (!response.isSuccess())
330 return response;
331 }
332 frame_impl_->ViewImpl()->SetShowPaintRects(show);
333 if (!show && frame_impl_->GetFrameView())
334 frame_impl_->GetFrameView()->Invalidate();
335 return Response::OK();
336 }
337
338 Response InspectorOverlayAgent::setShowScrollBottleneckRects(bool show) {
339 state_->setBoolean(OverlayAgentState::kShowScrollBottleneckRects, show);
340 if (show) {
341 Response response = CompositingEnabled();
342 if (!response.isSuccess())
343 return response;
344 }
345 frame_impl_->ViewImpl()->SetShowScrollBottleneckRects(show);
346 return Response::OK();
347 }
348
349 Response InspectorOverlayAgent::setShowViewportSizeOnResize(bool show) {
350 state_->setBoolean(OverlayAgentState::kShowSizeOnResize, show);
351 draw_view_size_ = show;
352 return Response::OK();
353 }
354
355 Response InspectorOverlayAgent::setPausedInDebuggerMessage(
356 Maybe<String> message) {
357 String just_message = message.fromMaybe(String());
358 state_->setString(OverlayAgentState::kPausedInDebuggerMessage, just_message);
359 paused_in_debugger_message_ = just_message;
360 ScheduleUpdate();
361 return Response::OK();
362 }
363
364 Response InspectorOverlayAgent::setSuspended(bool suspended) {
365 state_->setBoolean(OverlayAgentState::kSuspended, suspended);
366 if (suspended && !suspended_ && !show_reloading_blanket_)
367 ClearInternal();
368 suspended_ = suspended;
369 return Response::OK();
370 }
371
372 Response InspectorOverlayAgent::setInspectMode(
373 const String& mode,
374 Maybe<protocol::Overlay::HighlightConfig> highlight_config) {
375 SearchMode search_mode;
376 if (mode == protocol::Overlay::InspectModeEnum::SearchForNode) {
377 search_mode = kSearchingForNormal;
378 } else if (mode == protocol::Overlay::InspectModeEnum::SearchForUAShadowDOM) {
379 search_mode = kSearchingForUAShadow;
380 } else if (mode == protocol::Overlay::InspectModeEnum::None) {
381 search_mode = kNotSearching;
382 } else {
383 return Response::Error(
384 String("Unknown mode \"" + mode + "\" was provided."));
385 }
386
387 if (search_mode != kNotSearching) {
388 Response response = dom_agent_->PushDocumentUponHandlelessOperation();
389 if (!response.isSuccess())
390 return response;
391 }
392
393 return SetSearchingForNode(search_mode, std::move(highlight_config));
394 }
395
396 Response InspectorOverlayAgent::highlightRect(
397 int x,
398 int y,
399 int width,
400 int height,
401 Maybe<protocol::DOM::RGBA> color,
402 Maybe<protocol::DOM::RGBA> outline_color) {
403 std::unique_ptr<FloatQuad> quad =
404 WTF::WrapUnique(new FloatQuad(FloatRect(x, y, width, height)));
405 InnerHighlightQuad(std::move(quad), std::move(color),
406 std::move(outline_color));
407 return Response::OK();
408 }
409
410 Response InspectorOverlayAgent::highlightQuad(
411 std::unique_ptr<protocol::Array<double>> quad_array,
412 Maybe<protocol::DOM::RGBA> color,
413 Maybe<protocol::DOM::RGBA> outline_color) {
414 std::unique_ptr<FloatQuad> quad = WTF::MakeUnique<FloatQuad>();
415 if (!ParseQuad(std::move(quad_array), quad.get()))
416 return Response::Error("Invalid Quad format");
417 InnerHighlightQuad(std::move(quad), std::move(color),
418 std::move(outline_color));
419 return Response::OK();
420 }
421
422 Response InspectorOverlayAgent::highlightNode(
423 std::unique_ptr<protocol::Overlay::HighlightConfig>
424 highlight_inspector_object,
425 Maybe<int> node_id,
426 Maybe<int> backend_node_id,
427 Maybe<String> object_id) {
428 Node* node = nullptr;
429 Response response;
430 if (node_id.isJust()) {
431 response = dom_agent_->AssertNode(node_id.fromJust(), node);
432 } else if (backend_node_id.isJust()) {
433 node = DOMNodeIds::NodeForId(backend_node_id.fromJust());
434 response = !node ? Response::Error("No node found for given backend id")
435 : Response::OK();
436 } else if (object_id.isJust()) {
437 response = dom_agent_->NodeForRemoteId(object_id.fromJust(), node);
438 } else {
439 response = Response::Error(
440 "Either nodeId, backendNodeId or objectId must be specified");
441 }
442
443 if (!response.isSuccess())
444 return response;
445
446 std::unique_ptr<InspectorHighlightConfig> highlight_config;
447 response = HighlightConfigFromInspectorObject(
448 std::move(highlight_inspector_object), &highlight_config);
449 if (!response.isSuccess())
450 return response;
451
452 InnerHighlightNode(node, nullptr, *highlight_config, false);
453 return Response::OK();
454 }
455
456 Response InspectorOverlayAgent::highlightFrame(
457 const String& frame_id,
458 Maybe<protocol::DOM::RGBA> color,
459 Maybe<protocol::DOM::RGBA> outline_color) {
460 LocalFrame* frame =
461 IdentifiersFactory::FrameById(inspected_frames_, frame_id);
462 // FIXME: Inspector doesn't currently work cross process.
463 if (frame && frame->DeprecatedLocalOwner()) {
464 std::unique_ptr<InspectorHighlightConfig> highlight_config =
465 WTF::MakeUnique<InspectorHighlightConfig>();
466 highlight_config->show_info = true; // Always show tooltips for frames.
467 highlight_config->content =
468 InspectorDOMAgent::ParseColor(color.fromMaybe(nullptr));
469 highlight_config->content_outline =
470 InspectorDOMAgent::ParseColor(outline_color.fromMaybe(nullptr));
471 InnerHighlightNode(frame->DeprecatedLocalOwner(), nullptr,
472 *highlight_config, false);
473 }
474 return Response::OK();
475 }
476
477 Response InspectorOverlayAgent::hideHighlight() {
478 InnerHideHighlight();
479 return Response::OK();
480 }
481
482 Response InspectorOverlayAgent::getHighlightObjectForTest(
483 int node_id,
484 std::unique_ptr<protocol::DictionaryValue>* result) {
485 Node* node = nullptr;
486 Response response = dom_agent_->AssertNode(node_id, node);
487 if (!response.isSuccess())
488 return response;
489 InspectorHighlight highlight(node, InspectorHighlight::DefaultConfig(), true);
490 *result = highlight.AsProtocolValue();
491 return Response::OK();
492 }
493
494 void InspectorOverlayAgent::Invalidate() {
222 if (!page_overlay_) { 495 if (!page_overlay_) {
223 page_overlay_ = PageOverlay::Create( 496 page_overlay_ = PageOverlay::Create(
224 frame_impl_, WTF::WrapUnique(new InspectorPageOverlayDelegate(*this))); 497 frame_impl_, WTF::WrapUnique(new InspectorPageOverlayDelegate(*this)));
225 } 498 }
226 499
227 page_overlay_->Update(); 500 page_overlay_->Update();
228 } 501 }
229 502
230 void InspectorOverlay::UpdateAllLifecyclePhases() { 503 void InspectorOverlayAgent::UpdateAllLifecyclePhases() {
231 if (IsEmpty()) 504 if (IsEmpty())
232 return; 505 return;
233 506
234 AutoReset<bool> scoped(&in_layout_, true); 507 AutoReset<bool> scoped(&in_layout_, true);
235 if (needs_update_) { 508 if (needs_update_) {
236 needs_update_ = false; 509 needs_update_ = false;
237 RebuildOverlayPage(); 510 RebuildOverlayPage();
238 } 511 }
239 OverlayMainFrame()->View()->UpdateAllLifecyclePhases(); 512 OverlayMainFrame()->View()->UpdateAllLifecyclePhases();
240 } 513 }
241 514
242 bool InspectorOverlay::HandleInputEvent(const WebInputEvent& input_event) { 515 bool InspectorOverlayAgent::HandleInputEvent(const WebInputEvent& input_event) {
243 bool handled = false; 516 bool handled = false;
244 517
245 if (IsEmpty()) 518 if (IsEmpty())
246 return false; 519 return false;
247 520
248 if (input_event.GetType() == WebInputEvent::kGestureTap) { 521 if (input_event.GetType() == WebInputEvent::kGestureTap) {
249 // We only have a use for gesture tap. 522 // We only have a use for gesture tap.
250 WebGestureEvent transformed_event = TransformWebGestureEvent( 523 WebGestureEvent transformed_event = TransformWebGestureEvent(
251 frame_impl_->GetFrameView(), 524 frame_impl_->GetFrameView(),
252 static_cast<const WebGestureEvent&>(input_event)); 525 static_cast<const WebGestureEvent&>(input_event));
(...skipping 18 matching lines...) Expand all
271 if (handled) 544 if (handled)
272 return true; 545 return true;
273 546
274 if (mouse_event.GetType() == WebInputEvent::kMouseMove) { 547 if (mouse_event.GetType() == WebInputEvent::kMouseMove) {
275 handled = OverlayMainFrame()->GetEventHandler().HandleMouseMoveEvent( 548 handled = OverlayMainFrame()->GetEventHandler().HandleMouseMoveEvent(
276 mouse_event, TransformWebMouseEventVector( 549 mouse_event, TransformWebMouseEventVector(
277 frame_impl_->GetFrameView(), 550 frame_impl_->GetFrameView(),
278 std::vector<const WebInputEvent*>())) != 551 std::vector<const WebInputEvent*>())) !=
279 WebInputEventResult::kNotHandled; 552 WebInputEventResult::kNotHandled;
280 } 553 }
281 if (mouse_event.GetType() == WebInputEvent::kMouseDown) 554 if (mouse_event.GetType() == WebInputEvent::kMouseDown) {
282 handled = OverlayMainFrame()->GetEventHandler().HandleMousePressEvent( 555 handled = OverlayMainFrame()->GetEventHandler().HandleMousePressEvent(
283 mouse_event) != WebInputEventResult::kNotHandled; 556 mouse_event) != WebInputEventResult::kNotHandled;
284 if (mouse_event.GetType() == WebInputEvent::kMouseUp) 557 }
558 if (mouse_event.GetType() == WebInputEvent::kMouseUp) {
285 handled = OverlayMainFrame()->GetEventHandler().HandleMouseReleaseEvent( 559 handled = OverlayMainFrame()->GetEventHandler().HandleMouseReleaseEvent(
286 mouse_event) != WebInputEventResult::kNotHandled; 560 mouse_event) != WebInputEventResult::kNotHandled;
561 }
287 } 562 }
288 563
289 if (WebInputEvent::IsTouchEventType(input_event.GetType())) { 564 if (WebInputEvent::IsTouchEventType(input_event.GetType())) {
290 WebTouchEvent transformed_event = 565 WebTouchEvent transformed_event =
291 TransformWebTouchEvent(frame_impl_->GetFrameView(), 566 TransformWebTouchEvent(frame_impl_->GetFrameView(),
292 static_cast<const WebTouchEvent&>(input_event)); 567 static_cast<const WebTouchEvent&>(input_event));
293 handled = HandleTouchEvent(transformed_event); 568 handled = HandleTouchEvent(transformed_event);
294 if (handled) 569 if (handled)
295 return true; 570 return true;
296 OverlayMainFrame()->GetEventHandler().HandleTouchEvent( 571 OverlayMainFrame()->GetEventHandler().HandleTouchEvent(
297 transformed_event, Vector<WebTouchEvent>()); 572 transformed_event, Vector<WebTouchEvent>());
298 } 573 }
299 if (WebInputEvent::IsKeyboardEventType(input_event.GetType())) { 574 if (WebInputEvent::IsKeyboardEventType(input_event.GetType())) {
300 OverlayMainFrame()->GetEventHandler().KeyEvent( 575 OverlayMainFrame()->GetEventHandler().KeyEvent(
301 static_cast<const WebKeyboardEvent&>(input_event)); 576 static_cast<const WebKeyboardEvent&>(input_event));
302 } 577 }
303 578
304 if (input_event.GetType() == WebInputEvent::kMouseWheel) { 579 if (input_event.GetType() == WebInputEvent::kMouseWheel) {
305 WebMouseWheelEvent transformed_event = TransformWebMouseWheelEvent( 580 WebMouseWheelEvent transformed_event = TransformWebMouseWheelEvent(
306 frame_impl_->GetFrameView(), 581 frame_impl_->GetFrameView(),
307 static_cast<const WebMouseWheelEvent&>(input_event)); 582 static_cast<const WebMouseWheelEvent&>(input_event));
308 handled = OverlayMainFrame()->GetEventHandler().HandleWheelEvent( 583 handled = OverlayMainFrame()->GetEventHandler().HandleWheelEvent(
309 transformed_event) != WebInputEventResult::kNotHandled; 584 transformed_event) != WebInputEventResult::kNotHandled;
310 } 585 }
311 586
312 return handled; 587 return handled;
313 } 588 }
314 589
315 void InspectorOverlay::SetPausedInDebuggerMessage(const String& message) { 590 void InspectorOverlayAgent::ShowReloadingBlanket() {
316 paused_in_debugger_message_ = message;
317 ScheduleUpdate();
318 }
319
320 void InspectorOverlay::ShowReloadingBlanket() {
321 show_reloading_blanket_ = true; 591 show_reloading_blanket_ = true;
322 ScheduleUpdate(); 592 ScheduleUpdate();
323 } 593 }
324 594
325 void InspectorOverlay::HideReloadingBlanket() { 595 void InspectorOverlayAgent::HideReloadingBlanket() {
326 if (!show_reloading_blanket_) 596 if (!show_reloading_blanket_)
327 return; 597 return;
328 show_reloading_blanket_ = false; 598 show_reloading_blanket_ = false;
329 if (suspended_) 599 if (suspended_)
330 ClearInternal(); 600 ClearInternal();
331 else 601 else
332 ScheduleUpdate(); 602 ScheduleUpdate();
333 } 603 }
334 604
335 void InspectorOverlay::HideHighlight() { 605 void InspectorOverlayAgent::InnerHideHighlight() {
336 highlight_node_.Clear(); 606 highlight_node_.Clear();
337 event_target_node_.Clear(); 607 event_target_node_.Clear();
338 highlight_quad_.reset(); 608 highlight_quad_.reset();
339 ScheduleUpdate(); 609 ScheduleUpdate();
340 } 610 }
341 611
342 void InspectorOverlay::HighlightNode( 612 void InspectorOverlayAgent::InnerHighlightNode(
343 Node* node,
344 const InspectorHighlightConfig& highlight_config,
345 bool omit_tooltip) {
346 HighlightNode(node, nullptr, highlight_config, omit_tooltip);
347 }
348
349 void InspectorOverlay::HighlightNode(
350 Node* node, 613 Node* node,
351 Node* event_target, 614 Node* event_target,
352 const InspectorHighlightConfig& highlight_config, 615 const InspectorHighlightConfig& highlight_config,
353 bool omit_tooltip) { 616 bool omit_tooltip) {
354 node_highlight_config_ = highlight_config; 617 node_highlight_config_ = highlight_config;
355 highlight_node_ = node; 618 highlight_node_ = node;
356 event_target_node_ = event_target; 619 event_target_node_ = event_target;
357 omit_tooltip_ = omit_tooltip; 620 omit_tooltip_ = omit_tooltip;
358 ScheduleUpdate(); 621 ScheduleUpdate();
359 } 622 }
360 623
361 void InspectorOverlay::SetInspectMode( 624 void InspectorOverlayAgent::InnerHighlightQuad(
362 InspectorDOMAgent::SearchMode search_mode,
363 std::unique_ptr<InspectorHighlightConfig> highlight_config) {
364 inspect_mode_ = search_mode;
365 ScheduleUpdate();
366
367 if (search_mode != InspectorDOMAgent::kNotSearching) {
368 inspect_mode_highlight_config_ = std::move(highlight_config);
369 } else {
370 hovered_node_for_inspect_mode_.Clear();
371 HideHighlight();
372 }
373 }
374
375 void InspectorOverlay::HighlightQuad(
376 std::unique_ptr<FloatQuad> quad, 625 std::unique_ptr<FloatQuad> quad,
377 const InspectorHighlightConfig& highlight_config) { 626 Maybe<protocol::DOM::RGBA> color,
378 quad_highlight_config_ = highlight_config; 627 Maybe<protocol::DOM::RGBA> outline_color) {
628 quad_content_color_ = InspectorDOMAgent::ParseColor(color.fromMaybe(nullptr));
629 quad_content_outline_color_ =
630 InspectorDOMAgent::ParseColor(outline_color.fromMaybe(nullptr));
379 highlight_quad_ = std::move(quad); 631 highlight_quad_ = std::move(quad);
380 omit_tooltip_ = false; 632 omit_tooltip_ = false;
381 ScheduleUpdate(); 633 ScheduleUpdate();
382 } 634 }
383 635
384 bool InspectorOverlay::IsEmpty() { 636 bool InspectorOverlayAgent::IsEmpty() {
385 if (show_reloading_blanket_) 637 if (show_reloading_blanket_)
386 return false; 638 return false;
387 if (suspended_) 639 if (suspended_)
388 return true; 640 return true;
389 bool has_visible_elements = highlight_node_ || event_target_node_ || 641 bool has_visible_elements = highlight_node_ || event_target_node_ ||
390 highlight_quad_ || 642 highlight_quad_ ||
391 (resize_timer_active_ && draw_view_size_) || 643 (resize_timer_active_ && draw_view_size_) ||
392 !paused_in_debugger_message_.IsNull(); 644 !paused_in_debugger_message_.IsNull();
393 return !has_visible_elements && 645 return !has_visible_elements && inspect_mode_ == kNotSearching;
394 inspect_mode_ == InspectorDOMAgent::kNotSearching;
395 } 646 }
396 647
397 void InspectorOverlay::ScheduleUpdate() { 648 void InspectorOverlayAgent::ScheduleUpdate() {
398 if (IsEmpty()) { 649 if (IsEmpty()) {
399 if (page_overlay_) 650 if (page_overlay_)
400 page_overlay_.reset(); 651 page_overlay_.reset();
401 return; 652 return;
402 } 653 }
403 needs_update_ = true; 654 needs_update_ = true;
404 FrameView* view = frame_impl_->GetFrameView(); 655 FrameView* view = frame_impl_->GetFrameView();
405 LocalFrame* frame = frame_impl_->GetFrame(); 656 LocalFrame* frame = frame_impl_->GetFrame();
406 if (view && frame) 657 if (view && frame)
407 frame->GetPage()->GetChromeClient().ScheduleAnimation(view); 658 frame->GetPage()->GetChromeClient().ScheduleAnimation(view);
408 } 659 }
409 660
410 void InspectorOverlay::RebuildOverlayPage() { 661 void InspectorOverlayAgent::RebuildOverlayPage() {
411 FrameView* view = frame_impl_->GetFrameView(); 662 FrameView* view = frame_impl_->GetFrameView();
412 LocalFrame* frame = frame_impl_->GetFrame(); 663 LocalFrame* frame = frame_impl_->GetFrame();
413 if (!view || !frame) 664 if (!view || !frame)
414 return; 665 return;
415 666
416 IntRect visible_rect_in_document = 667 IntRect visible_rect_in_document =
417 view->GetScrollableArea()->VisibleContentRect(); 668 view->GetScrollableArea()->VisibleContentRect();
418 IntSize viewport_size = frame->GetPage()->GetVisualViewport().Size(); 669 IntSize viewport_size = frame->GetPage()->GetVisualViewport().Size();
419 OverlayMainFrame()->View()->Resize(viewport_size); 670 OverlayMainFrame()->View()->Resize(viewport_size);
420 OverlayPage()->GetVisualViewport().SetSize(viewport_size); 671 OverlayPage()->GetVisualViewport().SetSize(viewport_size);
(...skipping 13 matching lines...) Expand all
434 685
435 static std::unique_ptr<protocol::DictionaryValue> BuildObjectForSize( 686 static std::unique_ptr<protocol::DictionaryValue> BuildObjectForSize(
436 const IntSize& size) { 687 const IntSize& size) {
437 std::unique_ptr<protocol::DictionaryValue> result = 688 std::unique_ptr<protocol::DictionaryValue> result =
438 protocol::DictionaryValue::create(); 689 protocol::DictionaryValue::create();
439 result->setInteger("width", size.Width()); 690 result->setInteger("width", size.Width());
440 result->setInteger("height", size.Height()); 691 result->setInteger("height", size.Height());
441 return result; 692 return result;
442 } 693 }
443 694
444 void InspectorOverlay::DrawNodeHighlight() { 695 void InspectorOverlayAgent::DrawNodeHighlight() {
445 if (!highlight_node_) 696 if (!highlight_node_)
446 return; 697 return;
447 698
448 String selectors = node_highlight_config_.selector_list; 699 String selectors = node_highlight_config_.selector_list;
449 StaticElementList* elements = nullptr; 700 StaticElementList* elements = nullptr;
450 DummyExceptionStateForTesting exception_state; 701 DummyExceptionStateForTesting exception_state;
451 ContainerNode* query_base = highlight_node_->ContainingShadowRoot(); 702 ContainerNode* query_base = highlight_node_->ContainingShadowRoot();
452 if (!query_base) 703 if (!query_base)
453 query_base = highlight_node_->ownerDocument(); 704 query_base = highlight_node_->ownerDocument();
454 if (selectors.length()) 705 if (selectors.length()) {
455 elements = 706 elements =
456 query_base->QuerySelectorAll(AtomicString(selectors), exception_state); 707 query_base->QuerySelectorAll(AtomicString(selectors), exception_state);
708 }
457 if (elements && !exception_state.HadException()) { 709 if (elements && !exception_state.HadException()) {
458 for (unsigned i = 0; i < elements->length(); ++i) { 710 for (unsigned i = 0; i < elements->length(); ++i) {
459 Element* element = elements->item(i); 711 Element* element = elements->item(i);
460 InspectorHighlight highlight(element, node_highlight_config_, false); 712 InspectorHighlight highlight(element, node_highlight_config_, false);
461 std::unique_ptr<protocol::DictionaryValue> highlight_json = 713 std::unique_ptr<protocol::DictionaryValue> highlight_json =
462 highlight.AsProtocolValue(); 714 highlight.AsProtocolValue();
463 EvaluateInOverlay("drawHighlight", std::move(highlight_json)); 715 EvaluateInOverlay("drawHighlight", std::move(highlight_json));
464 } 716 }
465 } 717 }
466 718
467 bool append_element_info = 719 bool append_element_info =
468 highlight_node_->IsElementNode() && !omit_tooltip_ && 720 highlight_node_->IsElementNode() && !omit_tooltip_ &&
469 node_highlight_config_.show_info && highlight_node_->GetLayoutObject() && 721 node_highlight_config_.show_info && highlight_node_->GetLayoutObject() &&
470 highlight_node_->GetDocument().GetFrame(); 722 highlight_node_->GetDocument().GetFrame();
471 InspectorHighlight highlight(highlight_node_.Get(), node_highlight_config_, 723 InspectorHighlight highlight(highlight_node_.Get(), node_highlight_config_,
472 append_element_info); 724 append_element_info);
473 if (event_target_node_) 725 if (event_target_node_) {
474 highlight.AppendEventTargetQuads(event_target_node_.Get(), 726 highlight.AppendEventTargetQuads(event_target_node_.Get(),
475 node_highlight_config_); 727 node_highlight_config_);
728 }
476 729
477 std::unique_ptr<protocol::DictionaryValue> highlight_json = 730 std::unique_ptr<protocol::DictionaryValue> highlight_json =
478 highlight.AsProtocolValue(); 731 highlight.AsProtocolValue();
479 EvaluateInOverlay("drawHighlight", std::move(highlight_json)); 732 EvaluateInOverlay("drawHighlight", std::move(highlight_json));
480 } 733 }
481 734
482 void InspectorOverlay::DrawQuadHighlight() { 735 void InspectorOverlayAgent::DrawQuadHighlight() {
483 if (!highlight_quad_) 736 if (!highlight_quad_)
484 return; 737 return;
485 738
486 InspectorHighlight highlight(WindowToViewportScale()); 739 InspectorHighlight highlight(WindowToViewportScale());
487 highlight.AppendQuad(*highlight_quad_, quad_highlight_config_.content, 740 highlight.AppendQuad(*highlight_quad_, quad_content_color_,
488 quad_highlight_config_.content_outline); 741 quad_content_outline_color_);
489 EvaluateInOverlay("drawHighlight", highlight.AsProtocolValue()); 742 EvaluateInOverlay("drawHighlight", highlight.AsProtocolValue());
490 } 743 }
491 744
492 void InspectorOverlay::DrawPausedInDebuggerMessage() { 745 void InspectorOverlayAgent::DrawPausedInDebuggerMessage() {
493 if (inspect_mode_ == InspectorDOMAgent::kNotSearching && 746 if (inspect_mode_ == kNotSearching && !paused_in_debugger_message_.IsNull()) {
494 !paused_in_debugger_message_.IsNull())
495 EvaluateInOverlay("drawPausedInDebuggerMessage", 747 EvaluateInOverlay("drawPausedInDebuggerMessage",
496 paused_in_debugger_message_); 748 paused_in_debugger_message_);
749 }
497 } 750 }
498 751
499 void InspectorOverlay::DrawViewSize() { 752 void InspectorOverlayAgent::DrawViewSize() {
500 if (resize_timer_active_ && draw_view_size_) 753 if (resize_timer_active_ && draw_view_size_)
501 EvaluateInOverlay("drawViewSize", ""); 754 EvaluateInOverlay("drawViewSize", "");
502 } 755 }
503 756
504 float InspectorOverlay::WindowToViewportScale() const { 757 float InspectorOverlayAgent::WindowToViewportScale() const {
505 LocalFrame* frame = frame_impl_->GetFrame(); 758 LocalFrame* frame = frame_impl_->GetFrame();
506 if (!frame) 759 if (!frame)
507 return 1.0f; 760 return 1.0f;
508 return frame->GetPage()->GetChromeClient().WindowToViewportScalar(1.0f); 761 return frame->GetPage()->GetChromeClient().WindowToViewportScalar(1.0f);
509 } 762 }
510 763
511 Page* InspectorOverlay::OverlayPage() { 764 Page* InspectorOverlayAgent::OverlayPage() {
512 if (overlay_page_) 765 if (overlay_page_)
513 return overlay_page_.Get(); 766 return overlay_page_.Get();
514 767
515 ScriptForbiddenScope::AllowUserAgentScript allow_script; 768 ScriptForbiddenScope::AllowUserAgentScript allow_script;
516 769
517 DEFINE_STATIC_LOCAL(LocalFrameClient, dummy_local_frame_client, 770 DEFINE_STATIC_LOCAL(LocalFrameClient, dummy_local_frame_client,
518 (EmptyLocalFrameClient::Create())); 771 (EmptyLocalFrameClient::Create()));
519 Page::PageClients page_clients; 772 Page::PageClients page_clients;
520 FillWithEmptyClients(page_clients); 773 FillWithEmptyClients(page_clients);
521 DCHECK(!overlay_chrome_client_); 774 DCHECK(!overlay_chrome_client_);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 EvaluateInOverlay("setPlatform", "windows"); 834 EvaluateInOverlay("setPlatform", "windows");
582 #elif OS(MACOSX) 835 #elif OS(MACOSX)
583 EvaluateInOverlay("setPlatform", "mac"); 836 EvaluateInOverlay("setPlatform", "mac");
584 #elif OS(POSIX) 837 #elif OS(POSIX)
585 EvaluateInOverlay("setPlatform", "linux"); 838 EvaluateInOverlay("setPlatform", "linux");
586 #endif 839 #endif
587 840
588 return overlay_page_.Get(); 841 return overlay_page_.Get();
589 } 842 }
590 843
591 LocalFrame* InspectorOverlay::OverlayMainFrame() { 844 LocalFrame* InspectorOverlayAgent::OverlayMainFrame() {
592 return ToLocalFrame(OverlayPage()->MainFrame()); 845 return ToLocalFrame(OverlayPage()->MainFrame());
593 } 846 }
594 847
595 void InspectorOverlay::Reset(const IntSize& viewport_size, 848 void InspectorOverlayAgent::Reset(const IntSize& viewport_size,
596 const IntPoint& document_scroll_offset) { 849 const IntPoint& document_scroll_offset) {
597 std::unique_ptr<protocol::DictionaryValue> reset_data = 850 std::unique_ptr<protocol::DictionaryValue> reset_data =
598 protocol::DictionaryValue::create(); 851 protocol::DictionaryValue::create();
599 reset_data->setDouble( 852 reset_data->setDouble(
600 "deviceScaleFactor", 853 "deviceScaleFactor",
601 frame_impl_->GetFrame()->GetPage()->DeviceScaleFactorDeprecated()); 854 frame_impl_->GetFrame()->GetPage()->DeviceScaleFactorDeprecated());
602 reset_data->setDouble( 855 reset_data->setDouble(
603 "pageScaleFactor", 856 "pageScaleFactor",
604 frame_impl_->GetFrame()->GetPage()->GetVisualViewport().Scale()); 857 frame_impl_->GetFrame()->GetPage()->GetVisualViewport().Scale());
605 858
606 IntRect viewport_in_screen = 859 IntRect viewport_in_screen =
607 frame_impl_->GetFrame()->GetPage()->GetChromeClient().ViewportToScreen( 860 frame_impl_->GetFrame()->GetPage()->GetChromeClient().ViewportToScreen(
608 IntRect(IntPoint(), viewport_size), frame_impl_->GetFrame()->View()); 861 IntRect(IntPoint(), viewport_size), frame_impl_->GetFrame()->View());
609 reset_data->setObject("viewportSize", 862 reset_data->setObject("viewportSize",
610 BuildObjectForSize(viewport_in_screen.Size())); 863 BuildObjectForSize(viewport_in_screen.Size()));
611 864
612 // The zoom factor in the overlay frame already has been multiplied by the 865 // The zoom factor in the overlay frame already has been multiplied by the
613 // window to viewport scale (aka device scale factor), so cancel it. 866 // window to viewport scale (aka device scale factor), so cancel it.
614 reset_data->setDouble( 867 reset_data->setDouble(
615 "pageZoomFactor", 868 "pageZoomFactor",
616 frame_impl_->GetFrame()->PageZoomFactor() / WindowToViewportScale()); 869 frame_impl_->GetFrame()->PageZoomFactor() / WindowToViewportScale());
617 870
618 reset_data->setInteger("scrollX", document_scroll_offset.X()); 871 reset_data->setInteger("scrollX", document_scroll_offset.X());
619 reset_data->setInteger("scrollY", document_scroll_offset.Y()); 872 reset_data->setInteger("scrollY", document_scroll_offset.Y());
620 EvaluateInOverlay("reset", std::move(reset_data)); 873 EvaluateInOverlay("reset", std::move(reset_data));
621 } 874 }
622 875
623 void InspectorOverlay::EvaluateInOverlay(const String& method, 876 void InspectorOverlayAgent::EvaluateInOverlay(const String& method,
624 const String& argument) { 877 const String& argument) {
625 ScriptForbiddenScope::AllowUserAgentScript allow_script; 878 ScriptForbiddenScope::AllowUserAgentScript allow_script;
626 std::unique_ptr<protocol::ListValue> command = protocol::ListValue::create(); 879 std::unique_ptr<protocol::ListValue> command = protocol::ListValue::create();
627 command->pushValue(protocol::StringValue::create(method)); 880 command->pushValue(protocol::StringValue::create(method));
628 command->pushValue(protocol::StringValue::create(argument)); 881 command->pushValue(protocol::StringValue::create(argument));
629 ToLocalFrame(OverlayPage()->MainFrame()) 882 ToLocalFrame(OverlayPage()->MainFrame())
630 ->GetScriptController() 883 ->GetScriptController()
631 .ExecuteScriptInMainWorld( 884 .ExecuteScriptInMainWorld(
632 "dispatch(" + command->serialize() + ")", 885 "dispatch(" + command->serialize() + ")",
633 ScriptController::kExecuteScriptWhenScriptsDisabled); 886 ScriptController::kExecuteScriptWhenScriptsDisabled);
634 } 887 }
635 888
636 void InspectorOverlay::EvaluateInOverlay( 889 void InspectorOverlayAgent::EvaluateInOverlay(
637 const String& method, 890 const String& method,
638 std::unique_ptr<protocol::Value> argument) { 891 std::unique_ptr<protocol::Value> argument) {
639 ScriptForbiddenScope::AllowUserAgentScript allow_script; 892 ScriptForbiddenScope::AllowUserAgentScript allow_script;
640 std::unique_ptr<protocol::ListValue> command = protocol::ListValue::create(); 893 std::unique_ptr<protocol::ListValue> command = protocol::ListValue::create();
641 command->pushValue(protocol::StringValue::create(method)); 894 command->pushValue(protocol::StringValue::create(method));
642 command->pushValue(std::move(argument)); 895 command->pushValue(std::move(argument));
643 ToLocalFrame(OverlayPage()->MainFrame()) 896 ToLocalFrame(OverlayPage()->MainFrame())
644 ->GetScriptController() 897 ->GetScriptController()
645 .ExecuteScriptInMainWorld( 898 .ExecuteScriptInMainWorld(
646 "dispatch(" + command->serialize() + ")", 899 "dispatch(" + command->serialize() + ")",
647 ScriptController::kExecuteScriptWhenScriptsDisabled); 900 ScriptController::kExecuteScriptWhenScriptsDisabled);
648 } 901 }
649 902
650 String InspectorOverlay::EvaluateInOverlayForTest(const String& script) { 903 String InspectorOverlayAgent::EvaluateInOverlayForTest(const String& script) {
651 ScriptForbiddenScope::AllowUserAgentScript allow_script; 904 ScriptForbiddenScope::AllowUserAgentScript allow_script;
652 v8::HandleScope handle_scope(ToIsolate(OverlayMainFrame())); 905 v8::HandleScope handle_scope(ToIsolate(OverlayMainFrame()));
653 v8::Local<v8::Value> string = 906 v8::Local<v8::Value> string =
654 ToLocalFrame(OverlayPage()->MainFrame()) 907 ToLocalFrame(OverlayPage()->MainFrame())
655 ->GetScriptController() 908 ->GetScriptController()
656 .ExecuteScriptInMainWorldAndReturnValue( 909 .ExecuteScriptInMainWorldAndReturnValue(
657 ScriptSourceCode(script), 910 ScriptSourceCode(script),
658 ScriptController::kExecuteScriptWhenScriptsDisabled); 911 ScriptController::kExecuteScriptWhenScriptsDisabled);
659 return ToCoreStringWithUndefinedOrNullCheck(string); 912 return ToCoreStringWithUndefinedOrNullCheck(string);
660 } 913 }
661 914
662 void InspectorOverlay::OnTimer(TimerBase*) { 915 void InspectorOverlayAgent::OnTimer(TimerBase*) {
663 resize_timer_active_ = false; 916 resize_timer_active_ = false;
664 ScheduleUpdate(); 917 ScheduleUpdate();
665 } 918 }
666 919
667 void InspectorOverlay::ClearInternal() { 920 void InspectorOverlayAgent::ClearInternal() {
668 if (overlay_page_) { 921 if (overlay_page_) {
669 overlay_page_->WillBeDestroyed(); 922 overlay_page_->WillBeDestroyed();
670 overlay_page_.Clear(); 923 overlay_page_.Clear();
671 overlay_chrome_client_.Clear(); 924 overlay_chrome_client_.Clear();
672 } 925 }
673 resize_timer_active_ = false; 926 resize_timer_active_ = false;
674 paused_in_debugger_message_ = String(); 927 paused_in_debugger_message_ = String();
675 inspect_mode_ = InspectorDOMAgent::kNotSearching; 928 inspect_mode_ = kNotSearching;
676 timer_.Stop(); 929 timer_.Stop();
677 HideHighlight(); 930 InnerHideHighlight();
678 } 931 }
679 932
680 void InspectorOverlay::Clear() { 933 void InspectorOverlayAgent::OverlayResumed() {
681 ClearInternal();
682 v8_session_ = nullptr;
683 dom_agent_.Clear();
684 overlay_host_->SetListener(nullptr);
685 }
686
687 void InspectorOverlay::OverlayResumed() {
688 if (v8_session_) 934 if (v8_session_)
689 v8_session_->resume(); 935 v8_session_->resume();
690 } 936 }
691 937
692 void InspectorOverlay::OverlaySteppedOver() { 938 void InspectorOverlayAgent::OverlaySteppedOver() {
693 if (v8_session_) 939 if (v8_session_)
694 v8_session_->stepOver(); 940 v8_session_->stepOver();
695 } 941 }
696 942
697 void InspectorOverlay::Suspend() { 943 void InspectorOverlayAgent::PageLayoutInvalidated(bool resized) {
698 if (!suspended_) {
699 suspended_ = true;
700 ClearInternal();
701 }
702 }
703
704 void InspectorOverlay::Resume() {
705 suspended_ = false;
706 }
707
708 void InspectorOverlay::PageLayoutInvalidated(bool resized) {
709 if (resized && draw_view_size_) { 944 if (resized && draw_view_size_) {
710 resize_timer_active_ = true; 945 resize_timer_active_ = true;
711 timer_.StartOneShot(1, BLINK_FROM_HERE); 946 timer_.StartOneShot(1, BLINK_FROM_HERE);
712 } 947 }
713 ScheduleUpdate(); 948 ScheduleUpdate();
714 } 949 }
715 950
716 void InspectorOverlay::SetShowViewportSizeOnResize(bool show) { 951 bool InspectorOverlayAgent::HandleMouseMove(const WebMouseEvent& event) {
717 draw_view_size_ = show;
718 }
719
720 bool InspectorOverlay::HandleMouseMove(const WebMouseEvent& event) {
721 if (!ShouldSearchForNode()) 952 if (!ShouldSearchForNode())
722 return false; 953 return false;
723 954
724 LocalFrame* frame = frame_impl_->GetFrame(); 955 LocalFrame* frame = frame_impl_->GetFrame();
725 if (!frame || !frame->View() || frame->ContentLayoutItem().IsNull()) 956 if (!frame || !frame->View() || frame->ContentLayoutItem().IsNull())
726 return false; 957 return false;
727 Node* node = HoveredNodeForEvent( 958 Node* node = HoveredNodeForEvent(
728 frame, event, event.GetModifiers() & WebInputEvent::kShiftKey); 959 frame, event, event.GetModifiers() & WebInputEvent::kShiftKey);
729 960
730 // Do not highlight within user agent shadow root unless requested. 961 // Do not highlight within user agent shadow root unless requested.
731 if (inspect_mode_ != InspectorDOMAgent::kSearchingForUAShadow) { 962 if (inspect_mode_ != kSearchingForUAShadow) {
732 ShadowRoot* shadow_root = InspectorDOMAgent::UserAgentShadowRoot(node); 963 ShadowRoot* shadow_root = InspectorDOMAgent::UserAgentShadowRoot(node);
733 if (shadow_root) 964 if (shadow_root)
734 node = &shadow_root->host(); 965 node = &shadow_root->host();
735 } 966 }
736 967
737 // Shadow roots don't have boxes - use host element instead. 968 // Shadow roots don't have boxes - use host element instead.
738 if (node && node->IsShadowRoot()) 969 if (node && node->IsShadowRoot())
739 node = node->ParentOrShadowHostNode(); 970 node = node->ParentOrShadowHostNode();
740 971
741 if (!node) 972 if (!node)
742 return true; 973 return true;
743 974
744 if (node->IsFrameOwnerElement()) { 975 if (node->IsFrameOwnerElement()) {
745 HTMLFrameOwnerElement* frame_owner = ToHTMLFrameOwnerElement(node); 976 HTMLFrameOwnerElement* frame_owner = ToHTMLFrameOwnerElement(node);
746 if (frame_owner->ContentFrame() && 977 if (frame_owner->ContentFrame() &&
747 !frame_owner->ContentFrame()->IsLocalFrame()) { 978 !frame_owner->ContentFrame()->IsLocalFrame()) {
748 // Do not consume event so that remote frame can handle it. 979 // Do not consume event so that remote frame can handle it.
749 HideHighlight(); 980 InnerHideHighlight();
750 hovered_node_for_inspect_mode_.Clear(); 981 hovered_node_for_inspect_mode_.Clear();
751 return false; 982 return false;
752 } 983 }
753 } 984 }
754 985
755 Node* event_target = (event.GetModifiers() & WebInputEvent::kShiftKey) 986 Node* event_target = (event.GetModifiers() & WebInputEvent::kShiftKey)
756 ? HoveredNodeForEvent(frame, event, false) 987 ? HoveredNodeForEvent(frame, event, false)
757 : nullptr; 988 : nullptr;
758 if (event_target == node) 989 if (event_target == node)
759 event_target = nullptr; 990 event_target = nullptr;
760 991
761 if (node && inspect_mode_highlight_config_) { 992 if (node && inspect_mode_highlight_config_) {
762 hovered_node_for_inspect_mode_ = node; 993 hovered_node_for_inspect_mode_ = node;
763 if (dom_agent_) 994 NodeHighlightRequested(node);
764 dom_agent_->NodeHighlightedInOverlay(node); 995 bool omit_tooltip = event.GetModifiers() &
765 HighlightNode(node, event_target, *inspect_mode_highlight_config_, 996 (WebInputEvent::kControlKey | WebInputEvent::kMetaKey);
766 (event.GetModifiers() & 997 InnerHighlightNode(node, event_target, *inspect_mode_highlight_config_,
767 (WebInputEvent::kControlKey | WebInputEvent::kMetaKey))); 998 omit_tooltip);
768 } 999 }
769 return true; 1000 return true;
770 } 1001 }
771 1002
772 bool InspectorOverlay::HandleMouseDown() { 1003 bool InspectorOverlayAgent::HandleMouseDown() {
773 swallow_next_mouse_up_ = false; 1004 swallow_next_mouse_up_ = false;
774 if (!ShouldSearchForNode()) 1005 if (!ShouldSearchForNode())
775 return false; 1006 return false;
776 1007
777 if (hovered_node_for_inspect_mode_) { 1008 if (hovered_node_for_inspect_mode_) {
778 swallow_next_mouse_up_ = true; 1009 swallow_next_mouse_up_ = true;
779 Inspect(hovered_node_for_inspect_mode_.Get()); 1010 Inspect(hovered_node_for_inspect_mode_.Get());
780 hovered_node_for_inspect_mode_.Clear(); 1011 hovered_node_for_inspect_mode_.Clear();
781 return true; 1012 return true;
782 } 1013 }
783 return false; 1014 return false;
784 } 1015 }
785 1016
786 bool InspectorOverlay::HandleMouseUp() { 1017 bool InspectorOverlayAgent::HandleMouseUp() {
787 if (swallow_next_mouse_up_) { 1018 if (swallow_next_mouse_up_) {
788 swallow_next_mouse_up_ = false; 1019 swallow_next_mouse_up_ = false;
789 return true; 1020 return true;
790 } 1021 }
791 return false; 1022 return false;
792 } 1023 }
793 1024
794 bool InspectorOverlay::HandleGestureEvent(const WebGestureEvent& event) { 1025 bool InspectorOverlayAgent::HandleGestureEvent(const WebGestureEvent& event) {
795 if (!ShouldSearchForNode() || event.GetType() != WebInputEvent::kGestureTap) 1026 if (!ShouldSearchForNode() || event.GetType() != WebInputEvent::kGestureTap)
796 return false; 1027 return false;
797 Node* node = HoveredNodeForEvent(frame_impl_->GetFrame(), event, false); 1028 Node* node = HoveredNodeForEvent(frame_impl_->GetFrame(), event, false);
798 if (node && inspect_mode_highlight_config_) { 1029 if (node && inspect_mode_highlight_config_) {
799 HighlightNode(node, *inspect_mode_highlight_config_, false); 1030 InnerHighlightNode(node, nullptr, *inspect_mode_highlight_config_, false);
800 Inspect(node); 1031 Inspect(node);
801 return true; 1032 return true;
802 } 1033 }
803 return false; 1034 return false;
804 } 1035 }
805 1036
806 bool InspectorOverlay::HandleTouchEvent(const WebTouchEvent& event) { 1037 bool InspectorOverlayAgent::HandleTouchEvent(const WebTouchEvent& event) {
807 if (!ShouldSearchForNode()) 1038 if (!ShouldSearchForNode())
808 return false; 1039 return false;
809 Node* node = HoveredNodeForEvent(frame_impl_->GetFrame(), event, false); 1040 Node* node = HoveredNodeForEvent(frame_impl_->GetFrame(), event, false);
810 if (node && inspect_mode_highlight_config_) { 1041 if (node && inspect_mode_highlight_config_) {
811 HighlightNode(node, *inspect_mode_highlight_config_, false); 1042 InnerHighlightNode(node, nullptr, *inspect_mode_highlight_config_, false);
812 Inspect(node); 1043 Inspect(node);
813 return true; 1044 return true;
814 } 1045 }
815 return false; 1046 return false;
816 } 1047 }
817 1048
818 bool InspectorOverlay::ShouldSearchForNode() { 1049 Response InspectorOverlayAgent::CompositingEnabled() {
819 return inspect_mode_ != InspectorDOMAgent::kNotSearching; 1050 bool main_frame = frame_impl_->ViewImpl() && !frame_impl_->Parent();
1051 if (!main_frame || !frame_impl_->ViewImpl()
1052 ->GetPage()
1053 ->GetSettings()
1054 .GetAcceleratedCompositingEnabled())
1055 return Response::Error("Compositing mode is not supported");
1056 return Response::OK();
820 } 1057 }
821 1058
822 void InspectorOverlay::Inspect(Node* node) { 1059 bool InspectorOverlayAgent::ShouldSearchForNode() {
823 if (dom_agent_) 1060 return inspect_mode_ != kNotSearching;
824 dom_agent_->Inspect(node); 1061 }
1062
1063 void InspectorOverlayAgent::Inspect(Node* inspected_node) {
1064 if (!inspected_node)
1065 return;
1066
1067 Node* node = inspected_node;
1068 while (node && !node->IsElementNode() && !node->IsDocumentNode() &&
1069 !node->IsDocumentFragment())
1070 node = node->ParentOrShadowHostNode();
1071 if (!node)
1072 return;
1073
1074 int backend_node_id = DOMNodeIds::IdForNode(node);
1075 if (!enabled_) {
1076 backend_node_id_to_inspect_ = backend_node_id;
1077 return;
1078 }
1079
1080 GetFrontend()->inspectNodeRequested(backend_node_id);
1081 }
1082
1083 void InspectorOverlayAgent::NodeHighlightRequested(Node* node) {
1084 if (!enabled_)
1085 return;
1086
1087 while (node && !node->IsElementNode() && !node->IsDocumentNode() &&
1088 !node->IsDocumentFragment())
1089 node = node->ParentOrShadowHostNode();
1090
1091 if (!node)
1092 return;
1093
1094 int node_id = dom_agent_->PushNodePathToFrontend(node);
1095 GetFrontend()->nodeHighlightRequested(node_id);
1096 }
1097
1098 Response InspectorOverlayAgent::SetSearchingForNode(
1099 SearchMode search_mode,
1100 Maybe<protocol::Overlay::HighlightConfig> highlight_inspector_object) {
1101 if (search_mode == kNotSearching) {
1102 inspect_mode_ = search_mode;
1103 ScheduleUpdate();
1104 hovered_node_for_inspect_mode_.Clear();
1105 InnerHideHighlight();
1106 return Response::OK();
1107 }
1108
1109 std::unique_ptr<InspectorHighlightConfig> config;
1110 Response response = HighlightConfigFromInspectorObject(
1111 std::move(highlight_inspector_object), &config);
1112 if (!response.isSuccess())
1113 return response;
1114 inspect_mode_ = search_mode;
1115 inspect_mode_highlight_config_ = std::move(config);
1116 ScheduleUpdate();
1117 return Response::OK();
1118 }
1119
1120 Response InspectorOverlayAgent::HighlightConfigFromInspectorObject(
1121 Maybe<protocol::Overlay::HighlightConfig> highlight_inspector_object,
1122 std::unique_ptr<InspectorHighlightConfig>* out_config) {
1123 if (!highlight_inspector_object.isJust()) {
1124 return Response::Error(
1125 "Internal error: highlight configuration parameter is missing");
1126 }
1127
1128 protocol::Overlay::HighlightConfig* config =
1129 highlight_inspector_object.fromJust();
1130 std::unique_ptr<InspectorHighlightConfig> highlight_config =
1131 WTF::MakeUnique<InspectorHighlightConfig>();
1132 highlight_config->show_info = config->getShowInfo(false);
1133 highlight_config->show_rulers = config->getShowRulers(false);
1134 highlight_config->show_extension_lines = config->getShowExtensionLines(false);
1135 highlight_config->display_as_material = config->getDisplayAsMaterial(false);
1136 highlight_config->content =
1137 InspectorDOMAgent::ParseColor(config->getContentColor(nullptr));
1138 highlight_config->padding =
1139 InspectorDOMAgent::ParseColor(config->getPaddingColor(nullptr));
1140 highlight_config->border =
1141 InspectorDOMAgent::ParseColor(config->getBorderColor(nullptr));
1142 highlight_config->margin =
1143 InspectorDOMAgent::ParseColor(config->getMarginColor(nullptr));
1144 highlight_config->event_target =
1145 InspectorDOMAgent::ParseColor(config->getEventTargetColor(nullptr));
1146 highlight_config->shape =
1147 InspectorDOMAgent::ParseColor(config->getShapeColor(nullptr));
1148 highlight_config->shape_margin =
1149 InspectorDOMAgent::ParseColor(config->getShapeMarginColor(nullptr));
1150 highlight_config->selector_list = config->getSelectorList("");
1151
1152 *out_config = std::move(highlight_config);
1153 return Response::OK();
825 } 1154 }
826 1155
827 } // namespace blink 1156 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698