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

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 bad merge 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(LocalFrame* frame) override { 199 void ScheduleAnimation(LocalFrame* frame) override {
168 if (overlay_->in_layout_) 200 if (overlay_->in_layout_)
169 return; 201 return;
170 202
171 client_->ScheduleAnimation(frame); 203 client_->ScheduleAnimation(frame);
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 void InspectorOverlayAgent::Dispose() {
278 show_reloading_blanket_ = false;
279 ClearInternal();
280 InspectorBaseAgent::Dispose();
281 }
282
283 Response InspectorOverlayAgent::enable() {
284 if (!dom_agent_->Enabled())
285 return Response::Error("DOM should be enabled first");
286 state_->setBoolean(OverlayAgentState::kEnabled, true);
287 enabled_ = true;
288 if (backend_node_id_to_inspect_)
289 GetFrontend()->inspectNodeRequested(backend_node_id_to_inspect_);
290 backend_node_id_to_inspect_ = 0;
291 return Response::OK();
292 }
293
294 Response InspectorOverlayAgent::disable() {
295 state_->setBoolean(OverlayAgentState::kEnabled, false);
296 enabled_ = false;
297 setShowDebugBorders(false);
298 setShowFPSCounter(false);
299 setShowPaintRects(false);
300 setShowScrollBottleneckRects(false);
301 setShowViewportSizeOnResize(false);
302 setPausedInDebuggerMessage(String());
303 setSuspended(false);
304 SetSearchingForNode(kNotSearching,
305 Maybe<protocol::Overlay::HighlightConfig>());
306 return Response::OK();
307 }
308
309 Response InspectorOverlayAgent::setShowDebugBorders(bool show) {
310 state_->setBoolean(OverlayAgentState::kShowDebugBorders, show);
311 if (show) {
312 Response response = CompositingEnabled();
313 if (!response.isSuccess())
314 return response;
315 }
316 frame_impl_->ViewImpl()->SetShowDebugBorders(show);
317 return Response::OK();
318 }
319
320 Response InspectorOverlayAgent::setShowFPSCounter(bool show) {
321 state_->setBoolean(OverlayAgentState::kShowFPSCounter, show);
322 if (show) {
323 Response response = CompositingEnabled();
324 if (!response.isSuccess())
325 return response;
326 }
327 frame_impl_->ViewImpl()->SetShowFPSCounter(show);
328 return Response::OK();
329 }
330
331 Response InspectorOverlayAgent::setShowPaintRects(bool show) {
332 state_->setBoolean(OverlayAgentState::kShowPaintRects, show);
333 if (show) {
334 Response response = CompositingEnabled();
335 if (!response.isSuccess())
336 return response;
337 }
338 frame_impl_->ViewImpl()->SetShowPaintRects(show);
339 if (!show && frame_impl_->GetFrameView())
340 frame_impl_->GetFrameView()->Invalidate();
341 return Response::OK();
342 }
343
344 Response InspectorOverlayAgent::setShowScrollBottleneckRects(bool show) {
345 state_->setBoolean(OverlayAgentState::kShowScrollBottleneckRects, show);
346 if (show) {
347 Response response = CompositingEnabled();
348 if (!response.isSuccess())
349 return response;
350 }
351 frame_impl_->ViewImpl()->SetShowScrollBottleneckRects(show);
352 return Response::OK();
353 }
354
355 Response InspectorOverlayAgent::setShowViewportSizeOnResize(bool show) {
356 state_->setBoolean(OverlayAgentState::kShowSizeOnResize, show);
357 draw_view_size_ = show;
358 return Response::OK();
359 }
360
361 Response InspectorOverlayAgent::setPausedInDebuggerMessage(
362 Maybe<String> message) {
363 String just_message = message.fromMaybe(String());
364 state_->setString(OverlayAgentState::kPausedInDebuggerMessage, just_message);
365 paused_in_debugger_message_ = just_message;
366 ScheduleUpdate();
367 return Response::OK();
368 }
369
370 Response InspectorOverlayAgent::setSuspended(bool suspended) {
371 state_->setBoolean(OverlayAgentState::kSuspended, suspended);
372 if (suspended && !suspended_ && !show_reloading_blanket_)
373 ClearInternal();
374 suspended_ = suspended;
375 return Response::OK();
376 }
377
378 Response InspectorOverlayAgent::setInspectMode(
379 const String& mode,
380 Maybe<protocol::Overlay::HighlightConfig> highlight_config) {
381 SearchMode search_mode;
382 if (mode == protocol::Overlay::InspectModeEnum::SearchForNode) {
383 search_mode = kSearchingForNormal;
384 } else if (mode == protocol::Overlay::InspectModeEnum::SearchForUAShadowDOM) {
385 search_mode = kSearchingForUAShadow;
386 } else if (mode == protocol::Overlay::InspectModeEnum::None) {
387 search_mode = kNotSearching;
388 } else {
389 return Response::Error(
390 String("Unknown mode \"" + mode + "\" was provided."));
391 }
392
393 if (search_mode != kNotSearching) {
394 Response response = dom_agent_->PushDocumentUponHandlelessOperation();
395 if (!response.isSuccess())
396 return response;
397 }
398
399 return SetSearchingForNode(search_mode, std::move(highlight_config));
400 }
401
402 Response InspectorOverlayAgent::highlightRect(
403 int x,
404 int y,
405 int width,
406 int height,
407 Maybe<protocol::DOM::RGBA> color,
408 Maybe<protocol::DOM::RGBA> outline_color) {
409 std::unique_ptr<FloatQuad> quad =
410 WTF::WrapUnique(new FloatQuad(FloatRect(x, y, width, height)));
411 InnerHighlightQuad(std::move(quad), std::move(color),
412 std::move(outline_color));
413 return Response::OK();
414 }
415
416 Response InspectorOverlayAgent::highlightQuad(
417 std::unique_ptr<protocol::Array<double>> quad_array,
418 Maybe<protocol::DOM::RGBA> color,
419 Maybe<protocol::DOM::RGBA> outline_color) {
420 std::unique_ptr<FloatQuad> quad = WTF::MakeUnique<FloatQuad>();
421 if (!ParseQuad(std::move(quad_array), quad.get()))
422 return Response::Error("Invalid Quad format");
423 InnerHighlightQuad(std::move(quad), std::move(color),
424 std::move(outline_color));
425 return Response::OK();
426 }
427
428 Response InspectorOverlayAgent::highlightNode(
429 std::unique_ptr<protocol::Overlay::HighlightConfig>
430 highlight_inspector_object,
431 Maybe<int> node_id,
432 Maybe<int> backend_node_id,
433 Maybe<String> object_id) {
434 Node* node = nullptr;
435 Response response;
436 if (node_id.isJust()) {
437 response = dom_agent_->AssertNode(node_id.fromJust(), node);
438 } else if (backend_node_id.isJust()) {
439 node = DOMNodeIds::NodeForId(backend_node_id.fromJust());
440 response = !node ? Response::Error("No node found for given backend id")
441 : Response::OK();
442 } else if (object_id.isJust()) {
443 response = dom_agent_->NodeForRemoteObjectId(object_id.fromJust(), node);
444 } else {
445 response = Response::Error(
446 "Either nodeId, backendNodeId or objectId must be specified");
447 }
448
449 if (!response.isSuccess())
450 return response;
451
452 std::unique_ptr<InspectorHighlightConfig> highlight_config;
453 response = HighlightConfigFromInspectorObject(
454 std::move(highlight_inspector_object), &highlight_config);
455 if (!response.isSuccess())
456 return response;
457
458 InnerHighlightNode(node, nullptr, *highlight_config, false);
459 return Response::OK();
460 }
461
462 Response InspectorOverlayAgent::highlightFrame(
463 const String& frame_id,
464 Maybe<protocol::DOM::RGBA> color,
465 Maybe<protocol::DOM::RGBA> outline_color) {
466 LocalFrame* frame =
467 IdentifiersFactory::FrameById(inspected_frames_, frame_id);
468 // FIXME: Inspector doesn't currently work cross process.
469 if (frame && frame->DeprecatedLocalOwner()) {
470 std::unique_ptr<InspectorHighlightConfig> highlight_config =
471 WTF::MakeUnique<InspectorHighlightConfig>();
472 highlight_config->show_info = true; // Always show tooltips for frames.
473 highlight_config->content =
474 InspectorDOMAgent::ParseColor(color.fromMaybe(nullptr));
475 highlight_config->content_outline =
476 InspectorDOMAgent::ParseColor(outline_color.fromMaybe(nullptr));
477 InnerHighlightNode(frame->DeprecatedLocalOwner(), nullptr,
478 *highlight_config, false);
479 }
480 return Response::OK();
481 }
482
483 Response InspectorOverlayAgent::hideHighlight() {
484 InnerHideHighlight();
485 return Response::OK();
486 }
487
488 Response InspectorOverlayAgent::getHighlightObjectForTest(
489 int node_id,
490 std::unique_ptr<protocol::DictionaryValue>* result) {
491 Node* node = nullptr;
492 Response response = dom_agent_->AssertNode(node_id, node);
493 if (!response.isSuccess())
494 return response;
495 InspectorHighlight highlight(node, InspectorHighlight::DefaultConfig(), true);
496 *result = highlight.AsProtocolValue();
497 return Response::OK();
498 }
499
500 void InspectorOverlayAgent::Invalidate() {
222 if (!page_overlay_) { 501 if (!page_overlay_) {
223 page_overlay_ = PageOverlay::Create( 502 page_overlay_ = PageOverlay::Create(
224 frame_impl_, WTF::WrapUnique(new InspectorPageOverlayDelegate(*this))); 503 frame_impl_, WTF::WrapUnique(new InspectorPageOverlayDelegate(*this)));
225 } 504 }
226 505
227 page_overlay_->Update(); 506 page_overlay_->Update();
228 } 507 }
229 508
230 void InspectorOverlay::UpdateAllLifecyclePhases() { 509 void InspectorOverlayAgent::UpdateAllLifecyclePhases() {
231 if (IsEmpty()) 510 if (IsEmpty())
232 return; 511 return;
233 512
234 AutoReset<bool> scoped(&in_layout_, true); 513 AutoReset<bool> scoped(&in_layout_, true);
235 if (needs_update_) { 514 if (needs_update_) {
236 needs_update_ = false; 515 needs_update_ = false;
237 RebuildOverlayPage(); 516 RebuildOverlayPage();
238 } 517 }
239 OverlayMainFrame()->View()->UpdateAllLifecyclePhases(); 518 OverlayMainFrame()->View()->UpdateAllLifecyclePhases();
240 } 519 }
241 520
242 bool InspectorOverlay::HandleInputEvent(const WebInputEvent& input_event) { 521 bool InspectorOverlayAgent::HandleInputEvent(const WebInputEvent& input_event) {
243 bool handled = false; 522 bool handled = false;
244 523
245 if (IsEmpty()) 524 if (IsEmpty())
246 return false; 525 return false;
247 526
248 if (input_event.GetType() == WebInputEvent::kGestureTap) { 527 if (input_event.GetType() == WebInputEvent::kGestureTap) {
249 // We only have a use for gesture tap. 528 // We only have a use for gesture tap.
250 WebGestureEvent transformed_event = TransformWebGestureEvent( 529 WebGestureEvent transformed_event = TransformWebGestureEvent(
251 frame_impl_->GetFrameView(), 530 frame_impl_->GetFrameView(),
252 static_cast<const WebGestureEvent&>(input_event)); 531 static_cast<const WebGestureEvent&>(input_event));
(...skipping 18 matching lines...) Expand all
271 if (handled) 550 if (handled)
272 return true; 551 return true;
273 552
274 if (mouse_event.GetType() == WebInputEvent::kMouseMove) { 553 if (mouse_event.GetType() == WebInputEvent::kMouseMove) {
275 handled = OverlayMainFrame()->GetEventHandler().HandleMouseMoveEvent( 554 handled = OverlayMainFrame()->GetEventHandler().HandleMouseMoveEvent(
276 mouse_event, TransformWebMouseEventVector( 555 mouse_event, TransformWebMouseEventVector(
277 frame_impl_->GetFrameView(), 556 frame_impl_->GetFrameView(),
278 std::vector<const WebInputEvent*>())) != 557 std::vector<const WebInputEvent*>())) !=
279 WebInputEventResult::kNotHandled; 558 WebInputEventResult::kNotHandled;
280 } 559 }
281 if (mouse_event.GetType() == WebInputEvent::kMouseDown) 560 if (mouse_event.GetType() == WebInputEvent::kMouseDown) {
282 handled = OverlayMainFrame()->GetEventHandler().HandleMousePressEvent( 561 handled = OverlayMainFrame()->GetEventHandler().HandleMousePressEvent(
283 mouse_event) != WebInputEventResult::kNotHandled; 562 mouse_event) != WebInputEventResult::kNotHandled;
284 if (mouse_event.GetType() == WebInputEvent::kMouseUp) 563 }
564 if (mouse_event.GetType() == WebInputEvent::kMouseUp) {
285 handled = OverlayMainFrame()->GetEventHandler().HandleMouseReleaseEvent( 565 handled = OverlayMainFrame()->GetEventHandler().HandleMouseReleaseEvent(
286 mouse_event) != WebInputEventResult::kNotHandled; 566 mouse_event) != WebInputEventResult::kNotHandled;
567 }
287 } 568 }
288 569
289 if (WebInputEvent::IsTouchEventType(input_event.GetType())) { 570 if (WebInputEvent::IsTouchEventType(input_event.GetType())) {
290 WebTouchEvent transformed_event = 571 WebTouchEvent transformed_event =
291 TransformWebTouchEvent(frame_impl_->GetFrameView(), 572 TransformWebTouchEvent(frame_impl_->GetFrameView(),
292 static_cast<const WebTouchEvent&>(input_event)); 573 static_cast<const WebTouchEvent&>(input_event));
293 handled = HandleTouchEvent(transformed_event); 574 handled = HandleTouchEvent(transformed_event);
294 if (handled) 575 if (handled)
295 return true; 576 return true;
296 OverlayMainFrame()->GetEventHandler().HandleTouchEvent( 577 OverlayMainFrame()->GetEventHandler().HandleTouchEvent(
297 transformed_event, Vector<WebTouchEvent>()); 578 transformed_event, Vector<WebTouchEvent>());
298 } 579 }
299 if (WebInputEvent::IsKeyboardEventType(input_event.GetType())) { 580 if (WebInputEvent::IsKeyboardEventType(input_event.GetType())) {
300 OverlayMainFrame()->GetEventHandler().KeyEvent( 581 OverlayMainFrame()->GetEventHandler().KeyEvent(
301 static_cast<const WebKeyboardEvent&>(input_event)); 582 static_cast<const WebKeyboardEvent&>(input_event));
302 } 583 }
303 584
304 if (input_event.GetType() == WebInputEvent::kMouseWheel) { 585 if (input_event.GetType() == WebInputEvent::kMouseWheel) {
305 WebMouseWheelEvent transformed_event = TransformWebMouseWheelEvent( 586 WebMouseWheelEvent transformed_event = TransformWebMouseWheelEvent(
306 frame_impl_->GetFrameView(), 587 frame_impl_->GetFrameView(),
307 static_cast<const WebMouseWheelEvent&>(input_event)); 588 static_cast<const WebMouseWheelEvent&>(input_event));
308 handled = OverlayMainFrame()->GetEventHandler().HandleWheelEvent( 589 handled = OverlayMainFrame()->GetEventHandler().HandleWheelEvent(
309 transformed_event) != WebInputEventResult::kNotHandled; 590 transformed_event) != WebInputEventResult::kNotHandled;
310 } 591 }
311 592
312 return handled; 593 return handled;
313 } 594 }
314 595
315 void InspectorOverlay::SetPausedInDebuggerMessage(const String& message) { 596 void InspectorOverlayAgent::ShowReloadingBlanket() {
316 paused_in_debugger_message_ = message;
317 ScheduleUpdate();
318 }
319
320 void InspectorOverlay::ShowReloadingBlanket() {
321 show_reloading_blanket_ = true; 597 show_reloading_blanket_ = true;
322 ScheduleUpdate(); 598 ScheduleUpdate();
323 } 599 }
324 600
325 void InspectorOverlay::HideReloadingBlanket() { 601 void InspectorOverlayAgent::HideReloadingBlanket() {
326 if (!show_reloading_blanket_) 602 if (!show_reloading_blanket_)
327 return; 603 return;
328 show_reloading_blanket_ = false; 604 show_reloading_blanket_ = false;
329 if (suspended_) 605 if (suspended_)
330 ClearInternal(); 606 ClearInternal();
331 else 607 else
332 ScheduleUpdate(); 608 ScheduleUpdate();
333 } 609 }
334 610
335 void InspectorOverlay::HideHighlight() { 611 void InspectorOverlayAgent::InnerHideHighlight() {
336 highlight_node_.Clear(); 612 highlight_node_.Clear();
337 event_target_node_.Clear(); 613 event_target_node_.Clear();
338 highlight_quad_.reset(); 614 highlight_quad_.reset();
339 ScheduleUpdate(); 615 ScheduleUpdate();
340 } 616 }
341 617
342 void InspectorOverlay::HighlightNode( 618 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, 619 Node* node,
351 Node* event_target, 620 Node* event_target,
352 const InspectorHighlightConfig& highlight_config, 621 const InspectorHighlightConfig& highlight_config,
353 bool omit_tooltip) { 622 bool omit_tooltip) {
354 node_highlight_config_ = highlight_config; 623 node_highlight_config_ = highlight_config;
355 highlight_node_ = node; 624 highlight_node_ = node;
356 event_target_node_ = event_target; 625 event_target_node_ = event_target;
357 omit_tooltip_ = omit_tooltip; 626 omit_tooltip_ = omit_tooltip;
358 ScheduleUpdate(); 627 ScheduleUpdate();
359 } 628 }
360 629
361 void InspectorOverlay::SetInspectMode( 630 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, 631 std::unique_ptr<FloatQuad> quad,
377 const InspectorHighlightConfig& highlight_config) { 632 Maybe<protocol::DOM::RGBA> color,
378 quad_highlight_config_ = highlight_config; 633 Maybe<protocol::DOM::RGBA> outline_color) {
634 quad_content_color_ = InspectorDOMAgent::ParseColor(color.fromMaybe(nullptr));
635 quad_content_outline_color_ =
636 InspectorDOMAgent::ParseColor(outline_color.fromMaybe(nullptr));
379 highlight_quad_ = std::move(quad); 637 highlight_quad_ = std::move(quad);
380 omit_tooltip_ = false; 638 omit_tooltip_ = false;
381 ScheduleUpdate(); 639 ScheduleUpdate();
382 } 640 }
383 641
384 bool InspectorOverlay::IsEmpty() { 642 bool InspectorOverlayAgent::IsEmpty() {
385 if (show_reloading_blanket_) 643 if (show_reloading_blanket_)
386 return false; 644 return false;
387 if (suspended_) 645 if (suspended_)
388 return true; 646 return true;
389 bool has_visible_elements = highlight_node_ || event_target_node_ || 647 bool has_visible_elements = highlight_node_ || event_target_node_ ||
390 highlight_quad_ || 648 highlight_quad_ ||
391 (resize_timer_active_ && draw_view_size_) || 649 (resize_timer_active_ && draw_view_size_) ||
392 !paused_in_debugger_message_.IsNull(); 650 !paused_in_debugger_message_.IsNull();
393 return !has_visible_elements && 651 return !has_visible_elements && inspect_mode_ == kNotSearching;
394 inspect_mode_ == InspectorDOMAgent::kNotSearching;
395 } 652 }
396 653
397 void InspectorOverlay::ScheduleUpdate() { 654 void InspectorOverlayAgent::ScheduleUpdate() {
398 if (IsEmpty()) { 655 if (IsEmpty()) {
399 if (page_overlay_) 656 if (page_overlay_)
400 page_overlay_.reset(); 657 page_overlay_.reset();
401 return; 658 return;
402 } 659 }
403 needs_update_ = true; 660 needs_update_ = true;
404 LocalFrame* frame = frame_impl_->GetFrame(); 661 LocalFrame* frame = frame_impl_->GetFrame();
405 if (frame) { 662 if (frame) {
406 frame->GetPage()->GetChromeClient().ScheduleAnimation(frame); 663 frame->GetPage()->GetChromeClient().ScheduleAnimation(frame);
407 } 664 }
408 } 665 }
409 666
410 void InspectorOverlay::RebuildOverlayPage() { 667 void InspectorOverlayAgent::RebuildOverlayPage() {
411 FrameView* view = frame_impl_->GetFrameView(); 668 FrameView* view = frame_impl_->GetFrameView();
412 LocalFrame* frame = frame_impl_->GetFrame(); 669 LocalFrame* frame = frame_impl_->GetFrame();
413 if (!view || !frame) 670 if (!view || !frame)
414 return; 671 return;
415 672
416 IntRect visible_rect_in_document = 673 IntRect visible_rect_in_document =
417 view->GetScrollableArea()->VisibleContentRect(); 674 view->GetScrollableArea()->VisibleContentRect();
418 IntSize viewport_size = frame->GetPage()->GetVisualViewport().Size(); 675 IntSize viewport_size = frame->GetPage()->GetVisualViewport().Size();
419 OverlayMainFrame()->View()->Resize(viewport_size); 676 OverlayMainFrame()->View()->Resize(viewport_size);
420 OverlayPage()->GetVisualViewport().SetSize(viewport_size); 677 OverlayPage()->GetVisualViewport().SetSize(viewport_size);
(...skipping 13 matching lines...) Expand all
434 691
435 static std::unique_ptr<protocol::DictionaryValue> BuildObjectForSize( 692 static std::unique_ptr<protocol::DictionaryValue> BuildObjectForSize(
436 const IntSize& size) { 693 const IntSize& size) {
437 std::unique_ptr<protocol::DictionaryValue> result = 694 std::unique_ptr<protocol::DictionaryValue> result =
438 protocol::DictionaryValue::create(); 695 protocol::DictionaryValue::create();
439 result->setInteger("width", size.Width()); 696 result->setInteger("width", size.Width());
440 result->setInteger("height", size.Height()); 697 result->setInteger("height", size.Height());
441 return result; 698 return result;
442 } 699 }
443 700
444 void InspectorOverlay::DrawNodeHighlight() { 701 void InspectorOverlayAgent::DrawNodeHighlight() {
445 if (!highlight_node_) 702 if (!highlight_node_)
446 return; 703 return;
447 704
448 String selectors = node_highlight_config_.selector_list; 705 String selectors = node_highlight_config_.selector_list;
449 StaticElementList* elements = nullptr; 706 StaticElementList* elements = nullptr;
450 DummyExceptionStateForTesting exception_state; 707 DummyExceptionStateForTesting exception_state;
451 ContainerNode* query_base = highlight_node_->ContainingShadowRoot(); 708 ContainerNode* query_base = highlight_node_->ContainingShadowRoot();
452 if (!query_base) 709 if (!query_base)
453 query_base = highlight_node_->ownerDocument(); 710 query_base = highlight_node_->ownerDocument();
454 if (selectors.length()) 711 if (selectors.length()) {
455 elements = 712 elements =
456 query_base->QuerySelectorAll(AtomicString(selectors), exception_state); 713 query_base->QuerySelectorAll(AtomicString(selectors), exception_state);
714 }
457 if (elements && !exception_state.HadException()) { 715 if (elements && !exception_state.HadException()) {
458 for (unsigned i = 0; i < elements->length(); ++i) { 716 for (unsigned i = 0; i < elements->length(); ++i) {
459 Element* element = elements->item(i); 717 Element* element = elements->item(i);
460 InspectorHighlight highlight(element, node_highlight_config_, false); 718 InspectorHighlight highlight(element, node_highlight_config_, false);
461 std::unique_ptr<protocol::DictionaryValue> highlight_json = 719 std::unique_ptr<protocol::DictionaryValue> highlight_json =
462 highlight.AsProtocolValue(); 720 highlight.AsProtocolValue();
463 EvaluateInOverlay("drawHighlight", std::move(highlight_json)); 721 EvaluateInOverlay("drawHighlight", std::move(highlight_json));
464 } 722 }
465 } 723 }
466 724
467 bool append_element_info = 725 bool append_element_info =
468 highlight_node_->IsElementNode() && !omit_tooltip_ && 726 highlight_node_->IsElementNode() && !omit_tooltip_ &&
469 node_highlight_config_.show_info && highlight_node_->GetLayoutObject() && 727 node_highlight_config_.show_info && highlight_node_->GetLayoutObject() &&
470 highlight_node_->GetDocument().GetFrame(); 728 highlight_node_->GetDocument().GetFrame();
471 InspectorHighlight highlight(highlight_node_.Get(), node_highlight_config_, 729 InspectorHighlight highlight(highlight_node_.Get(), node_highlight_config_,
472 append_element_info); 730 append_element_info);
473 if (event_target_node_) 731 if (event_target_node_) {
474 highlight.AppendEventTargetQuads(event_target_node_.Get(), 732 highlight.AppendEventTargetQuads(event_target_node_.Get(),
475 node_highlight_config_); 733 node_highlight_config_);
734 }
476 735
477 std::unique_ptr<protocol::DictionaryValue> highlight_json = 736 std::unique_ptr<protocol::DictionaryValue> highlight_json =
478 highlight.AsProtocolValue(); 737 highlight.AsProtocolValue();
479 EvaluateInOverlay("drawHighlight", std::move(highlight_json)); 738 EvaluateInOverlay("drawHighlight", std::move(highlight_json));
480 } 739 }
481 740
482 void InspectorOverlay::DrawQuadHighlight() { 741 void InspectorOverlayAgent::DrawQuadHighlight() {
483 if (!highlight_quad_) 742 if (!highlight_quad_)
484 return; 743 return;
485 744
486 InspectorHighlight highlight(WindowToViewportScale()); 745 InspectorHighlight highlight(WindowToViewportScale());
487 highlight.AppendQuad(*highlight_quad_, quad_highlight_config_.content, 746 highlight.AppendQuad(*highlight_quad_, quad_content_color_,
488 quad_highlight_config_.content_outline); 747 quad_content_outline_color_);
489 EvaluateInOverlay("drawHighlight", highlight.AsProtocolValue()); 748 EvaluateInOverlay("drawHighlight", highlight.AsProtocolValue());
490 } 749 }
491 750
492 void InspectorOverlay::DrawPausedInDebuggerMessage() { 751 void InspectorOverlayAgent::DrawPausedInDebuggerMessage() {
493 if (inspect_mode_ == InspectorDOMAgent::kNotSearching && 752 if (inspect_mode_ == kNotSearching && !paused_in_debugger_message_.IsNull()) {
494 !paused_in_debugger_message_.IsNull())
495 EvaluateInOverlay("drawPausedInDebuggerMessage", 753 EvaluateInOverlay("drawPausedInDebuggerMessage",
496 paused_in_debugger_message_); 754 paused_in_debugger_message_);
755 }
497 } 756 }
498 757
499 void InspectorOverlay::DrawViewSize() { 758 void InspectorOverlayAgent::DrawViewSize() {
500 if (resize_timer_active_ && draw_view_size_) 759 if (resize_timer_active_ && draw_view_size_)
501 EvaluateInOverlay("drawViewSize", ""); 760 EvaluateInOverlay("drawViewSize", "");
502 } 761 }
503 762
504 float InspectorOverlay::WindowToViewportScale() const { 763 float InspectorOverlayAgent::WindowToViewportScale() const {
505 LocalFrame* frame = frame_impl_->GetFrame(); 764 LocalFrame* frame = frame_impl_->GetFrame();
506 if (!frame) 765 if (!frame)
507 return 1.0f; 766 return 1.0f;
508 return frame->GetPage()->GetChromeClient().WindowToViewportScalar(1.0f); 767 return frame->GetPage()->GetChromeClient().WindowToViewportScalar(1.0f);
509 } 768 }
510 769
511 Page* InspectorOverlay::OverlayPage() { 770 Page* InspectorOverlayAgent::OverlayPage() {
512 if (overlay_page_) 771 if (overlay_page_)
513 return overlay_page_.Get(); 772 return overlay_page_.Get();
514 773
515 ScriptForbiddenScope::AllowUserAgentScript allow_script; 774 ScriptForbiddenScope::AllowUserAgentScript allow_script;
516 775
517 DEFINE_STATIC_LOCAL(LocalFrameClient, dummy_local_frame_client, 776 DEFINE_STATIC_LOCAL(LocalFrameClient, dummy_local_frame_client,
518 (EmptyLocalFrameClient::Create())); 777 (EmptyLocalFrameClient::Create()));
519 Page::PageClients page_clients; 778 Page::PageClients page_clients;
520 FillWithEmptyClients(page_clients); 779 FillWithEmptyClients(page_clients);
521 DCHECK(!overlay_chrome_client_); 780 DCHECK(!overlay_chrome_client_);
(...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after
581 EvaluateInOverlay("setPlatform", "windows"); 840 EvaluateInOverlay("setPlatform", "windows");
582 #elif OS(MACOSX) 841 #elif OS(MACOSX)
583 EvaluateInOverlay("setPlatform", "mac"); 842 EvaluateInOverlay("setPlatform", "mac");
584 #elif OS(POSIX) 843 #elif OS(POSIX)
585 EvaluateInOverlay("setPlatform", "linux"); 844 EvaluateInOverlay("setPlatform", "linux");
586 #endif 845 #endif
587 846
588 return overlay_page_.Get(); 847 return overlay_page_.Get();
589 } 848 }
590 849
591 LocalFrame* InspectorOverlay::OverlayMainFrame() { 850 LocalFrame* InspectorOverlayAgent::OverlayMainFrame() {
592 return ToLocalFrame(OverlayPage()->MainFrame()); 851 return ToLocalFrame(OverlayPage()->MainFrame());
593 } 852 }
594 853
595 void InspectorOverlay::Reset(const IntSize& viewport_size, 854 void InspectorOverlayAgent::Reset(const IntSize& viewport_size,
596 const IntPoint& document_scroll_offset) { 855 const IntPoint& document_scroll_offset) {
597 std::unique_ptr<protocol::DictionaryValue> reset_data = 856 std::unique_ptr<protocol::DictionaryValue> reset_data =
598 protocol::DictionaryValue::create(); 857 protocol::DictionaryValue::create();
599 reset_data->setDouble( 858 reset_data->setDouble(
600 "deviceScaleFactor", 859 "deviceScaleFactor",
601 frame_impl_->GetFrame()->GetPage()->DeviceScaleFactorDeprecated()); 860 frame_impl_->GetFrame()->GetPage()->DeviceScaleFactorDeprecated());
602 reset_data->setDouble( 861 reset_data->setDouble(
603 "pageScaleFactor", 862 "pageScaleFactor",
604 frame_impl_->GetFrame()->GetPage()->GetVisualViewport().Scale()); 863 frame_impl_->GetFrame()->GetPage()->GetVisualViewport().Scale());
605 864
606 IntRect viewport_in_screen = 865 IntRect viewport_in_screen =
607 frame_impl_->GetFrame()->GetPage()->GetChromeClient().ViewportToScreen( 866 frame_impl_->GetFrame()->GetPage()->GetChromeClient().ViewportToScreen(
608 IntRect(IntPoint(), viewport_size), frame_impl_->GetFrame()->View()); 867 IntRect(IntPoint(), viewport_size), frame_impl_->GetFrame()->View());
609 reset_data->setObject("viewportSize", 868 reset_data->setObject("viewportSize",
610 BuildObjectForSize(viewport_in_screen.Size())); 869 BuildObjectForSize(viewport_in_screen.Size()));
611 870
612 // The zoom factor in the overlay frame already has been multiplied by the 871 // 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. 872 // window to viewport scale (aka device scale factor), so cancel it.
614 reset_data->setDouble( 873 reset_data->setDouble(
615 "pageZoomFactor", 874 "pageZoomFactor",
616 frame_impl_->GetFrame()->PageZoomFactor() / WindowToViewportScale()); 875 frame_impl_->GetFrame()->PageZoomFactor() / WindowToViewportScale());
617 876
618 reset_data->setInteger("scrollX", document_scroll_offset.X()); 877 reset_data->setInteger("scrollX", document_scroll_offset.X());
619 reset_data->setInteger("scrollY", document_scroll_offset.Y()); 878 reset_data->setInteger("scrollY", document_scroll_offset.Y());
620 EvaluateInOverlay("reset", std::move(reset_data)); 879 EvaluateInOverlay("reset", std::move(reset_data));
621 } 880 }
622 881
623 void InspectorOverlay::EvaluateInOverlay(const String& method, 882 void InspectorOverlayAgent::EvaluateInOverlay(const String& method,
624 const String& argument) { 883 const String& argument) {
625 ScriptForbiddenScope::AllowUserAgentScript allow_script; 884 ScriptForbiddenScope::AllowUserAgentScript allow_script;
626 std::unique_ptr<protocol::ListValue> command = protocol::ListValue::create(); 885 std::unique_ptr<protocol::ListValue> command = protocol::ListValue::create();
627 command->pushValue(protocol::StringValue::create(method)); 886 command->pushValue(protocol::StringValue::create(method));
628 command->pushValue(protocol::StringValue::create(argument)); 887 command->pushValue(protocol::StringValue::create(argument));
629 ToLocalFrame(OverlayPage()->MainFrame()) 888 ToLocalFrame(OverlayPage()->MainFrame())
630 ->GetScriptController() 889 ->GetScriptController()
631 .ExecuteScriptInMainWorld( 890 .ExecuteScriptInMainWorld(
632 "dispatch(" + command->serialize() + ")", 891 "dispatch(" + command->serialize() + ")",
633 ScriptController::kExecuteScriptWhenScriptsDisabled); 892 ScriptController::kExecuteScriptWhenScriptsDisabled);
634 } 893 }
635 894
636 void InspectorOverlay::EvaluateInOverlay( 895 void InspectorOverlayAgent::EvaluateInOverlay(
637 const String& method, 896 const String& method,
638 std::unique_ptr<protocol::Value> argument) { 897 std::unique_ptr<protocol::Value> argument) {
639 ScriptForbiddenScope::AllowUserAgentScript allow_script; 898 ScriptForbiddenScope::AllowUserAgentScript allow_script;
640 std::unique_ptr<protocol::ListValue> command = protocol::ListValue::create(); 899 std::unique_ptr<protocol::ListValue> command = protocol::ListValue::create();
641 command->pushValue(protocol::StringValue::create(method)); 900 command->pushValue(protocol::StringValue::create(method));
642 command->pushValue(std::move(argument)); 901 command->pushValue(std::move(argument));
643 ToLocalFrame(OverlayPage()->MainFrame()) 902 ToLocalFrame(OverlayPage()->MainFrame())
644 ->GetScriptController() 903 ->GetScriptController()
645 .ExecuteScriptInMainWorld( 904 .ExecuteScriptInMainWorld(
646 "dispatch(" + command->serialize() + ")", 905 "dispatch(" + command->serialize() + ")",
647 ScriptController::kExecuteScriptWhenScriptsDisabled); 906 ScriptController::kExecuteScriptWhenScriptsDisabled);
648 } 907 }
649 908
650 String InspectorOverlay::EvaluateInOverlayForTest(const String& script) { 909 String InspectorOverlayAgent::EvaluateInOverlayForTest(const String& script) {
651 ScriptForbiddenScope::AllowUserAgentScript allow_script; 910 ScriptForbiddenScope::AllowUserAgentScript allow_script;
652 v8::HandleScope handle_scope(ToIsolate(OverlayMainFrame())); 911 v8::HandleScope handle_scope(ToIsolate(OverlayMainFrame()));
653 v8::Local<v8::Value> string = 912 v8::Local<v8::Value> string =
654 ToLocalFrame(OverlayPage()->MainFrame()) 913 ToLocalFrame(OverlayPage()->MainFrame())
655 ->GetScriptController() 914 ->GetScriptController()
656 .ExecuteScriptInMainWorldAndReturnValue( 915 .ExecuteScriptInMainWorldAndReturnValue(
657 ScriptSourceCode(script), 916 ScriptSourceCode(script),
658 ScriptController::kExecuteScriptWhenScriptsDisabled); 917 ScriptController::kExecuteScriptWhenScriptsDisabled);
659 return ToCoreStringWithUndefinedOrNullCheck(string); 918 return ToCoreStringWithUndefinedOrNullCheck(string);
660 } 919 }
661 920
662 void InspectorOverlay::OnTimer(TimerBase*) { 921 void InspectorOverlayAgent::OnTimer(TimerBase*) {
663 resize_timer_active_ = false; 922 resize_timer_active_ = false;
664 ScheduleUpdate(); 923 ScheduleUpdate();
665 } 924 }
666 925
667 void InspectorOverlay::ClearInternal() { 926 void InspectorOverlayAgent::ClearInternal() {
668 if (overlay_page_) { 927 if (overlay_page_) {
669 overlay_page_->WillBeDestroyed(); 928 overlay_page_->WillBeDestroyed();
670 overlay_page_.Clear(); 929 overlay_page_.Clear();
671 overlay_chrome_client_.Clear(); 930 overlay_chrome_client_.Clear();
672 } 931 }
673 resize_timer_active_ = false; 932 resize_timer_active_ = false;
674 paused_in_debugger_message_ = String(); 933 paused_in_debugger_message_ = String();
675 inspect_mode_ = InspectorDOMAgent::kNotSearching; 934 inspect_mode_ = kNotSearching;
676 timer_.Stop(); 935 timer_.Stop();
677 HideHighlight(); 936 InnerHideHighlight();
678 } 937 }
679 938
680 void InspectorOverlay::Clear() { 939 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_) 940 if (v8_session_)
689 v8_session_->resume(); 941 v8_session_->resume();
690 } 942 }
691 943
692 void InspectorOverlay::OverlaySteppedOver() { 944 void InspectorOverlayAgent::OverlaySteppedOver() {
693 if (v8_session_) 945 if (v8_session_)
694 v8_session_->stepOver(); 946 v8_session_->stepOver();
695 } 947 }
696 948
697 void InspectorOverlay::Suspend() { 949 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_) { 950 if (resized && draw_view_size_) {
710 resize_timer_active_ = true; 951 resize_timer_active_ = true;
711 timer_.StartOneShot(1, BLINK_FROM_HERE); 952 timer_.StartOneShot(1, BLINK_FROM_HERE);
712 } 953 }
713 ScheduleUpdate(); 954 ScheduleUpdate();
714 } 955 }
715 956
716 void InspectorOverlay::SetShowViewportSizeOnResize(bool show) { 957 bool InspectorOverlayAgent::HandleMouseMove(const WebMouseEvent& event) {
717 draw_view_size_ = show;
718 }
719
720 bool InspectorOverlay::HandleMouseMove(const WebMouseEvent& event) {
721 if (!ShouldSearchForNode()) 958 if (!ShouldSearchForNode())
722 return false; 959 return false;
723 960
724 LocalFrame* frame = frame_impl_->GetFrame(); 961 LocalFrame* frame = frame_impl_->GetFrame();
725 if (!frame || !frame->View() || frame->ContentLayoutItem().IsNull()) 962 if (!frame || !frame->View() || frame->ContentLayoutItem().IsNull())
726 return false; 963 return false;
727 Node* node = HoveredNodeForEvent( 964 Node* node = HoveredNodeForEvent(
728 frame, event, event.GetModifiers() & WebInputEvent::kShiftKey); 965 frame, event, event.GetModifiers() & WebInputEvent::kShiftKey);
729 966
730 // Do not highlight within user agent shadow root unless requested. 967 // Do not highlight within user agent shadow root unless requested.
731 if (inspect_mode_ != InspectorDOMAgent::kSearchingForUAShadow) { 968 if (inspect_mode_ != kSearchingForUAShadow) {
732 ShadowRoot* shadow_root = InspectorDOMAgent::UserAgentShadowRoot(node); 969 ShadowRoot* shadow_root = InspectorDOMAgent::UserAgentShadowRoot(node);
733 if (shadow_root) 970 if (shadow_root)
734 node = &shadow_root->host(); 971 node = &shadow_root->host();
735 } 972 }
736 973
737 // Shadow roots don't have boxes - use host element instead. 974 // Shadow roots don't have boxes - use host element instead.
738 if (node && node->IsShadowRoot()) 975 if (node && node->IsShadowRoot())
739 node = node->ParentOrShadowHostNode(); 976 node = node->ParentOrShadowHostNode();
740 977
741 if (!node) 978 if (!node)
742 return true; 979 return true;
743 980
744 if (node->IsFrameOwnerElement()) { 981 if (node->IsFrameOwnerElement()) {
745 HTMLFrameOwnerElement* frame_owner = ToHTMLFrameOwnerElement(node); 982 HTMLFrameOwnerElement* frame_owner = ToHTMLFrameOwnerElement(node);
746 if (frame_owner->ContentFrame() && 983 if (frame_owner->ContentFrame() &&
747 !frame_owner->ContentFrame()->IsLocalFrame()) { 984 !frame_owner->ContentFrame()->IsLocalFrame()) {
748 // Do not consume event so that remote frame can handle it. 985 // Do not consume event so that remote frame can handle it.
749 HideHighlight(); 986 InnerHideHighlight();
750 hovered_node_for_inspect_mode_.Clear(); 987 hovered_node_for_inspect_mode_.Clear();
751 return false; 988 return false;
752 } 989 }
753 } 990 }
754 991
755 Node* event_target = (event.GetModifiers() & WebInputEvent::kShiftKey) 992 Node* event_target = (event.GetModifiers() & WebInputEvent::kShiftKey)
756 ? HoveredNodeForEvent(frame, event, false) 993 ? HoveredNodeForEvent(frame, event, false)
757 : nullptr; 994 : nullptr;
758 if (event_target == node) 995 if (event_target == node)
759 event_target = nullptr; 996 event_target = nullptr;
760 997
761 if (node && inspect_mode_highlight_config_) { 998 if (node && inspect_mode_highlight_config_) {
762 hovered_node_for_inspect_mode_ = node; 999 hovered_node_for_inspect_mode_ = node;
763 if (dom_agent_) 1000 NodeHighlightRequested(node);
764 dom_agent_->NodeHighlightedInOverlay(node); 1001 bool omit_tooltip = event.GetModifiers() &
765 HighlightNode(node, event_target, *inspect_mode_highlight_config_, 1002 (WebInputEvent::kControlKey | WebInputEvent::kMetaKey);
766 (event.GetModifiers() & 1003 InnerHighlightNode(node, event_target, *inspect_mode_highlight_config_,
767 (WebInputEvent::kControlKey | WebInputEvent::kMetaKey))); 1004 omit_tooltip);
768 } 1005 }
769 return true; 1006 return true;
770 } 1007 }
771 1008
772 bool InspectorOverlay::HandleMouseDown() { 1009 bool InspectorOverlayAgent::HandleMouseDown() {
773 swallow_next_mouse_up_ = false; 1010 swallow_next_mouse_up_ = false;
774 if (!ShouldSearchForNode()) 1011 if (!ShouldSearchForNode())
775 return false; 1012 return false;
776 1013
777 if (hovered_node_for_inspect_mode_) { 1014 if (hovered_node_for_inspect_mode_) {
778 swallow_next_mouse_up_ = true; 1015 swallow_next_mouse_up_ = true;
779 Inspect(hovered_node_for_inspect_mode_.Get()); 1016 Inspect(hovered_node_for_inspect_mode_.Get());
780 hovered_node_for_inspect_mode_.Clear(); 1017 hovered_node_for_inspect_mode_.Clear();
781 return true; 1018 return true;
782 } 1019 }
783 return false; 1020 return false;
784 } 1021 }
785 1022
786 bool InspectorOverlay::HandleMouseUp() { 1023 bool InspectorOverlayAgent::HandleMouseUp() {
787 if (swallow_next_mouse_up_) { 1024 if (swallow_next_mouse_up_) {
788 swallow_next_mouse_up_ = false; 1025 swallow_next_mouse_up_ = false;
789 return true; 1026 return true;
790 } 1027 }
791 return false; 1028 return false;
792 } 1029 }
793 1030
794 bool InspectorOverlay::HandleGestureEvent(const WebGestureEvent& event) { 1031 bool InspectorOverlayAgent::HandleGestureEvent(const WebGestureEvent& event) {
795 if (!ShouldSearchForNode() || event.GetType() != WebInputEvent::kGestureTap) 1032 if (!ShouldSearchForNode() || event.GetType() != WebInputEvent::kGestureTap)
796 return false; 1033 return false;
797 Node* node = HoveredNodeForEvent(frame_impl_->GetFrame(), event, false); 1034 Node* node = HoveredNodeForEvent(frame_impl_->GetFrame(), event, false);
798 if (node && inspect_mode_highlight_config_) { 1035 if (node && inspect_mode_highlight_config_) {
799 HighlightNode(node, *inspect_mode_highlight_config_, false); 1036 InnerHighlightNode(node, nullptr, *inspect_mode_highlight_config_, false);
800 Inspect(node); 1037 Inspect(node);
801 return true; 1038 return true;
802 } 1039 }
803 return false; 1040 return false;
804 } 1041 }
805 1042
806 bool InspectorOverlay::HandleTouchEvent(const WebTouchEvent& event) { 1043 bool InspectorOverlayAgent::HandleTouchEvent(const WebTouchEvent& event) {
807 if (!ShouldSearchForNode()) 1044 if (!ShouldSearchForNode())
808 return false; 1045 return false;
809 Node* node = HoveredNodeForEvent(frame_impl_->GetFrame(), event, false); 1046 Node* node = HoveredNodeForEvent(frame_impl_->GetFrame(), event, false);
810 if (node && inspect_mode_highlight_config_) { 1047 if (node && inspect_mode_highlight_config_) {
811 HighlightNode(node, *inspect_mode_highlight_config_, false); 1048 InnerHighlightNode(node, nullptr, *inspect_mode_highlight_config_, false);
812 Inspect(node); 1049 Inspect(node);
813 return true; 1050 return true;
814 } 1051 }
815 return false; 1052 return false;
816 } 1053 }
817 1054
818 bool InspectorOverlay::ShouldSearchForNode() { 1055 Response InspectorOverlayAgent::CompositingEnabled() {
819 return inspect_mode_ != InspectorDOMAgent::kNotSearching; 1056 bool main_frame = frame_impl_->ViewImpl() && !frame_impl_->Parent();
1057 if (!main_frame || !frame_impl_->ViewImpl()
1058 ->GetPage()
1059 ->GetSettings()
1060 .GetAcceleratedCompositingEnabled())
1061 return Response::Error("Compositing mode is not supported");
1062 return Response::OK();
820 } 1063 }
821 1064
822 void InspectorOverlay::Inspect(Node* node) { 1065 bool InspectorOverlayAgent::ShouldSearchForNode() {
823 if (dom_agent_) 1066 return inspect_mode_ != kNotSearching;
824 dom_agent_->Inspect(node); 1067 }
1068
1069 void InspectorOverlayAgent::Inspect(Node* inspected_node) {
1070 if (!inspected_node)
1071 return;
1072
1073 Node* node = inspected_node;
1074 while (node && !node->IsElementNode() && !node->IsDocumentNode() &&
1075 !node->IsDocumentFragment())
1076 node = node->ParentOrShadowHostNode();
1077 if (!node)
1078 return;
1079
1080 int backend_node_id = DOMNodeIds::IdForNode(node);
1081 if (!enabled_) {
1082 backend_node_id_to_inspect_ = backend_node_id;
1083 return;
1084 }
1085
1086 GetFrontend()->inspectNodeRequested(backend_node_id);
1087 }
1088
1089 void InspectorOverlayAgent::NodeHighlightRequested(Node* node) {
1090 if (!enabled_)
1091 return;
1092
1093 while (node && !node->IsElementNode() && !node->IsDocumentNode() &&
1094 !node->IsDocumentFragment())
1095 node = node->ParentOrShadowHostNode();
1096
1097 if (!node)
1098 return;
1099
1100 int node_id = dom_agent_->PushNodePathToFrontend(node);
1101 GetFrontend()->nodeHighlightRequested(node_id);
1102 }
1103
1104 Response InspectorOverlayAgent::SetSearchingForNode(
1105 SearchMode search_mode,
1106 Maybe<protocol::Overlay::HighlightConfig> highlight_inspector_object) {
1107 if (search_mode == kNotSearching) {
1108 inspect_mode_ = search_mode;
1109 ScheduleUpdate();
1110 hovered_node_for_inspect_mode_.Clear();
1111 InnerHideHighlight();
1112 return Response::OK();
1113 }
1114
1115 std::unique_ptr<InspectorHighlightConfig> config;
1116 Response response = HighlightConfigFromInspectorObject(
1117 std::move(highlight_inspector_object), &config);
1118 if (!response.isSuccess())
1119 return response;
1120 inspect_mode_ = search_mode;
1121 inspect_mode_highlight_config_ = std::move(config);
1122 ScheduleUpdate();
1123 return Response::OK();
1124 }
1125
1126 Response InspectorOverlayAgent::HighlightConfigFromInspectorObject(
1127 Maybe<protocol::Overlay::HighlightConfig> highlight_inspector_object,
1128 std::unique_ptr<InspectorHighlightConfig>* out_config) {
1129 if (!highlight_inspector_object.isJust()) {
1130 return Response::Error(
1131 "Internal error: highlight configuration parameter is missing");
1132 }
1133
1134 protocol::Overlay::HighlightConfig* config =
1135 highlight_inspector_object.fromJust();
1136 std::unique_ptr<InspectorHighlightConfig> highlight_config =
1137 WTF::MakeUnique<InspectorHighlightConfig>();
1138 highlight_config->show_info = config->getShowInfo(false);
1139 highlight_config->show_rulers = config->getShowRulers(false);
1140 highlight_config->show_extension_lines = config->getShowExtensionLines(false);
1141 highlight_config->display_as_material = config->getDisplayAsMaterial(false);
1142 highlight_config->content =
1143 InspectorDOMAgent::ParseColor(config->getContentColor(nullptr));
1144 highlight_config->padding =
1145 InspectorDOMAgent::ParseColor(config->getPaddingColor(nullptr));
1146 highlight_config->border =
1147 InspectorDOMAgent::ParseColor(config->getBorderColor(nullptr));
1148 highlight_config->margin =
1149 InspectorDOMAgent::ParseColor(config->getMarginColor(nullptr));
1150 highlight_config->event_target =
1151 InspectorDOMAgent::ParseColor(config->getEventTargetColor(nullptr));
1152 highlight_config->shape =
1153 InspectorDOMAgent::ParseColor(config->getShapeColor(nullptr));
1154 highlight_config->shape_margin =
1155 InspectorDOMAgent::ParseColor(config->getShapeMarginColor(nullptr));
1156 highlight_config->selector_list = config->getSelectorList("");
1157
1158 *out_config = std::move(highlight_config);
1159 return Response::OK();
825 } 1160 }
826 1161
827 } // namespace blink 1162 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/web/InspectorOverlayAgent.h ('k') | third_party/WebKit/Source/web/InspectorRenderingAgent.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698