Chromium Code Reviews| Index: Source/web/InspectorOverlayImpl.cpp |
| diff --git a/Source/web/InspectorOverlayImpl.cpp b/Source/web/InspectorOverlayImpl.cpp |
| index b721e3b822b1e6afbd8d73365fe3c3fc2f119408..2fc516c47fb84832b9d92ba73537325153e112e0 100644 |
| --- a/Source/web/InspectorOverlayImpl.cpp |
| +++ b/Source/web/InspectorOverlayImpl.cpp |
| @@ -40,6 +40,7 @@ |
| #include "core/inspector/InspectorDebuggerAgent.h" |
| #include "core/inspector/InspectorOverlayHost.h" |
| #include "core/inspector/LayoutEditor.h" |
| +#include "core/layout/LayoutView.h" |
| #include "core/loader/EmptyClients.h" |
| #include "core/loader/FrameLoadRequest.h" |
| #include "core/page/ChromeClient.h" |
| @@ -136,7 +137,6 @@ private: |
| InspectorOverlayImpl::InspectorOverlayImpl(WebViewImpl* webViewImpl) |
| : m_webViewImpl(webViewImpl) |
| - , m_inspectModeEnabled(false) |
| , m_overlayHost(InspectorOverlayHost::create()) |
| , m_drawViewSize(false) |
| , m_drawViewSizeWithGrid(false) |
| @@ -146,6 +146,7 @@ InspectorOverlayImpl::InspectorOverlayImpl(WebViewImpl* webViewImpl) |
| , m_suspendCount(0) |
| , m_inLayout(false) |
| , m_needsUpdate(false) |
| + , m_searchingForNode(InspectorDOMAgent::NotSearching) |
| { |
| } |
| @@ -162,13 +163,16 @@ DEFINE_TRACE(InspectorOverlayImpl) |
| visitor->trace(m_overlayChromeClient); |
| visitor->trace(m_overlayHost); |
| visitor->trace(m_debuggerAgent); |
| + visitor->trace(m_domAgent); |
| visitor->trace(m_layoutEditor); |
| + visitor->trace(m_hoveredNodeForInspectMode); |
| } |
| -void InspectorOverlayImpl::init(InspectorCSSAgent* cssAgent, InspectorDebuggerAgent* debuggerAgent) |
| +void InspectorOverlayImpl::init(InspectorCSSAgent* cssAgent, InspectorDebuggerAgent* debuggerAgent, InspectorDOMAgent* domAgent) |
| { |
| m_layoutEditor = LayoutEditor::create(cssAgent); |
| m_debuggerAgent = debuggerAgent; |
| + m_domAgent = domAgent; |
| m_overlayHost->setListener(this); |
| } |
| @@ -196,17 +200,28 @@ void InspectorOverlayImpl::layout() |
| bool InspectorOverlayImpl::handleInputEvent(const WebInputEvent& inputEvent) |
| { |
| bool handled = false; |
| - if (isEmpty()) |
|
dgozman
2015/09/01 00:53:29
Please bring it back.
sergeyv
2015/09/01 03:41:20
Done. Had to change isEmpty method: now it is not
|
| - return handled; |
| if (WebInputEvent::isGestureEventType(inputEvent.type) && inputEvent.type == WebInputEvent::GestureTap) { |
| // Only let GestureTab in (we only need it and we know PlatformGestureEventBuilder supports it). |
| PlatformGestureEvent gestureEvent = PlatformGestureEventBuilder(m_webViewImpl->mainFrameImpl()->frameView(), static_cast<const WebGestureEvent&>(inputEvent)); |
| + handled = handleGestureEvent(m_webViewImpl->mainFrameImpl()->frame(), gestureEvent); |
|
dgozman
2015/09/01 00:53:29
Let's drop the first parameter.
sergeyv
2015/09/01 03:41:20
Done.
|
| + if (handled) |
| + return true; |
| + |
| overlayMainFrame()->eventHandler().handleGestureEvent(gestureEvent); |
| } |
| if (WebInputEvent::isMouseEventType(inputEvent.type) && inputEvent.type != WebInputEvent::MouseEnter) { |
| // PlatformMouseEventBuilder does not work with MouseEnter type, so we filter it out manually. |
| PlatformMouseEvent mouseEvent = PlatformMouseEventBuilder(m_webViewImpl->mainFrameImpl()->frameView(), static_cast<const WebMouseEvent&>(inputEvent)); |
| + |
| + if (mouseEvent.type() == PlatformEvent::MouseMoved) |
| + handled = handleMouseMove(m_webViewImpl->mainFrameImpl()->frame(), mouseEvent); |
| + else if (mouseEvent.type() == PlatformEvent::MousePressed) |
| + handled = handleMousePress(); |
| + |
| + if (handled) |
| + return true; |
| + |
| if (mouseEvent.type() == PlatformEvent::MouseMoved) |
| handled = overlayMainFrame()->eventHandler().handleMouseMoveEvent(mouseEvent); |
| if (mouseEvent.type() == PlatformEvent::MousePressed) |
| @@ -214,8 +229,13 @@ bool InspectorOverlayImpl::handleInputEvent(const WebInputEvent& inputEvent) |
| if (mouseEvent.type() == PlatformEvent::MouseReleased) |
| handled = overlayMainFrame()->eventHandler().handleMouseReleaseEvent(mouseEvent); |
| } |
| + |
|
dgozman
2015/09/01 00:53:29
Two blank lines at the same time!
sergeyv
2015/09/01 03:41:20
Done.
|
| + |
| if (WebInputEvent::isTouchEventType(inputEvent.type)) { |
| PlatformTouchEvent touchEvent = PlatformTouchEventBuilder(m_webViewImpl->mainFrameImpl()->frameView(), static_cast<const WebTouchEvent&>(inputEvent)); |
| + handled = handleTouchEvent(m_webViewImpl->mainFrameImpl()->frame(), touchEvent); |
| + if (handled) |
| + return true; |
| overlayMainFrame()->eventHandler().handleTouchEvent(touchEvent); |
| } |
| if (WebInputEvent::isKeyboardEventType(inputEvent.type)) { |
| @@ -232,12 +252,6 @@ void InspectorOverlayImpl::setPausedInDebuggerMessage(const String* message) |
| update(); |
| } |
| -void InspectorOverlayImpl::setInspectModeEnabled(bool enabled) |
| -{ |
| - m_inspectModeEnabled = enabled; |
| - update(); |
| -} |
| - |
| void InspectorOverlayImpl::hideHighlight() |
| { |
| if (m_layoutEditor) |
| @@ -259,6 +273,19 @@ void InspectorOverlayImpl::highlightNode(Node* node, Node* eventTarget, const In |
| update(); |
| } |
| +void InspectorOverlayImpl::setSearchingForNode(InspectorDOMAgent::SearchMode searchMode, PassOwnPtr<InspectorHighlightConfig> highlightConfig) |
| +{ |
| + m_searchingForNode = searchMode; |
| + update(); |
|
dgozman
2015/09/01 00:53:29
We can probably rename this in a follow-up.
sergeyv
2015/09/01 03:41:20
Yep
|
| + |
| + if (searchMode != InspectorDOMAgent::NotSearching) { |
| + m_inspectModeHighlightConfig = highlightConfig; |
| + } else { |
| + m_hoveredNodeForInspectMode.clear(); |
| + hideHighlight(); |
| + } |
| +} |
| + |
| void InspectorOverlayImpl::highlightQuad(PassOwnPtr<FloatQuad> quad, const InspectorHighlightConfig& highlightConfig) |
| { |
| m_quadHighlightConfig = highlightConfig; |
| @@ -273,7 +300,7 @@ bool InspectorOverlayImpl::isEmpty() |
| return true; |
| bool hasAlwaysVisibleElements = m_highlightNode || m_eventTargetNode || m_highlightQuad || (m_resizeTimerActive && m_drawViewSize); |
| bool hasInvisibleInInspectModeElements = !m_pausedInDebuggerMessage.isNull(); |
| - return !(hasAlwaysVisibleElements || (hasInvisibleInInspectModeElements && !m_inspectModeEnabled)); |
| + return !(hasAlwaysVisibleElements || (hasInvisibleInInspectModeElements && m_searchingForNode == InspectorDOMAgent::NotSearching)); |
| } |
| void InspectorOverlayImpl::update() |
| @@ -300,7 +327,7 @@ void InspectorOverlayImpl::rebuildOverlayPage() |
| drawNodeHighlight(); |
| drawQuadHighlight(); |
| - if (!m_inspectModeEnabled) |
| + if (m_searchingForNode == InspectorDOMAgent::NotSearching) |
| drawPausedInDebuggerMessage(); |
| drawViewSize(); |
| } |
| @@ -467,7 +494,7 @@ void InspectorOverlayImpl::clear() |
| } |
| m_resizeTimerActive = false; |
| m_pausedInDebuggerMessage = String(); |
| - m_inspectModeEnabled = false; |
| + m_searchingForNode = InspectorDOMAgent::NotSearching; |
| m_timer.stop(); |
| hideHighlight(); |
| } |
| @@ -529,4 +556,112 @@ void InspectorOverlayImpl::setShowViewportSizeOnResize(bool show, bool showGrid) |
| m_drawViewSizeWithGrid = showGrid; |
| } |
| +Node* hoveredNodeForPoint(LocalFrame* frame, const IntPoint& pointInRootFrame, bool ignorePointerEventsNone) |
|
dgozman
2015/09/01 00:53:29
These should go to anonymous namespace.
sergeyv
2015/09/01 03:41:20
Done.
|
| +{ |
| + HitTestRequest::HitTestRequestType hitType = HitTestRequest::Move | HitTestRequest::ReadOnly | HitTestRequest::AllowChildFrameContent; |
| + if (ignorePointerEventsNone) |
| + hitType |= HitTestRequest::IgnorePointerEventsNone; |
| + HitTestRequest request(hitType); |
| + HitTestResult result(request, frame->view()->rootFrameToContents(pointInRootFrame)); |
| + frame->contentLayoutObject()->hitTest(result); |
| + Node* node = result.innerPossiblyPseudoNode(); |
| + while (node && node->nodeType() == Node::TEXT_NODE) |
| + node = node->parentNode(); |
| + return node; |
| +} |
| + |
| +Node* hoveredNodeForEvent(LocalFrame* frame, const PlatformGestureEvent& event, bool ignorePointerEventsNone) |
| +{ |
| + return hoveredNodeForPoint(frame, event.position(), ignorePointerEventsNone); |
| +} |
| + |
| +Node* hoveredNodeForEvent(LocalFrame* frame, const PlatformMouseEvent& event, bool ignorePointerEventsNone) |
| +{ |
| + return hoveredNodeForPoint(frame, event.position(), ignorePointerEventsNone); |
| +} |
| + |
| +Node* hoveredNodeForEvent(LocalFrame* frame, const PlatformTouchEvent& event, bool ignorePointerEventsNone) |
| +{ |
| + const Vector<PlatformTouchPoint>& points = event.touchPoints(); |
| + if (!points.size()) |
| + return nullptr; |
| + return hoveredNodeForPoint(frame, roundedIntPoint(points[0].pos()), ignorePointerEventsNone); |
| +} |
| + |
| +bool InspectorOverlayImpl::handleMouseMove(LocalFrame* frame, const PlatformMouseEvent& event) |
| +{ |
| + if (m_searchingForNode == InspectorDOMAgent::NotSearching) |
| + return false; |
| + |
| + if (!frame->view() || !frame->contentLayoutObject()) |
| + return true; |
|
dgozman
2015/09/01 00:53:29
false
sergeyv
2015/09/01 03:41:20
Done.
|
| + Node* node = hoveredNodeForEvent(frame, event, event.shiftKey()); |
| + |
| + // Do not highlight within user agent shadow root unless requested. |
| + if (m_searchingForNode != InspectorDOMAgent::SearchingForUAShadow) { |
| + ShadowRoot* shadowRoot = InspectorDOMAgent::userAgentShadowRoot(node); |
| + if (shadowRoot) |
| + node = shadowRoot->host(); |
| + } |
| + |
| + // Shadow roots don't have boxes - use host element instead. |
| + if (node && node->isShadowRoot()) |
| + node = node->parentOrShadowHostNode(); |
| + |
| + if (!node) |
| + return true; |
| + |
| + Node* eventTarget = event.shiftKey() ? hoveredNodeForEvent(frame, event, false) : nullptr; |
| + if (eventTarget == node) |
| + eventTarget = 0; |
|
dgozman
2015/09/01 00:53:29
nullptr
sergeyv
2015/09/01 03:41:20
Done.
|
| + |
| + if (node && m_inspectModeHighlightConfig) { |
| + m_hoveredNodeForInspectMode = node; |
| + highlightNode(node, eventTarget, *m_inspectModeHighlightConfig, event.ctrlKey() || event.metaKey()); |
| + } |
| + return true; |
| +} |
| + |
| +bool InspectorOverlayImpl::handleMousePress() |
| +{ |
| + if (m_searchingForNode == InspectorDOMAgent::NotSearching) |
| + return false; |
| + |
| + if (m_hoveredNodeForInspectMode) { |
| + if (m_domAgent) |
| + m_domAgent->inspect(m_hoveredNodeForInspectMode.get()); |
| + m_hoveredNodeForInspectMode.clear(); |
| + return true; |
| + } |
| + return false; |
| +} |
| + |
| +bool InspectorOverlayImpl::handleGestureEvent(LocalFrame* frame, const PlatformGestureEvent& event) |
| +{ |
| + if (m_searchingForNode == InspectorDOMAgent::NotSearching || event.type() != PlatformEvent::GestureTap) |
| + return false; |
| + Node* node = hoveredNodeForEvent(frame, event, false); |
| + if (node && m_inspectModeHighlightConfig) { |
| + highlightNode(node, 0 /* eventTarget */, *m_inspectModeHighlightConfig, false); |
|
dgozman
2015/09/01 00:53:29
nullptr
sergeyv
2015/09/01 03:41:20
Done.
|
| + if (m_domAgent) |
| + m_domAgent->inspect(node); |
| + return true; |
| + } |
| + return false; |
| +} |
| + |
| +bool InspectorOverlayImpl::handleTouchEvent(LocalFrame* frame, const PlatformTouchEvent& event) |
| +{ |
| + if (m_searchingForNode == InspectorDOMAgent::NotSearching) |
| + return false; |
| + Node* node = hoveredNodeForEvent(frame, event, false); |
| + if (node && m_inspectModeHighlightConfig) { |
| + highlightNode(node, 0 /* eventTarget */, *m_inspectModeHighlightConfig, false); |
|
dgozman
2015/09/01 00:53:29
0 -> nullptr
sergeyv
2015/09/01 03:41:20
Done.
|
| + if (m_domAgent) |
| + m_domAgent->inspect(node); |
| + return true; |
| + } |
| + return false; |
| +} |
| + |
| } // namespace blink |