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

Unified Diff: Source/web/InspectorOverlayImpl.cpp

Issue 1322053002: Devtools: Move inspectMode logic from InspectorDomAgent to InspectorOverlayImpl (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 5 years, 4 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 side-by-side diff with in-line comments
Download patch
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

Powered by Google App Engine
This is Rietveld 408576698