Let WebCore take care of the highlight drawing entirely
authoraroben@apple.com <aroben@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 31 Jan 2008 18:47:44 +0000 (18:47 +0000)
committeraroben@apple.com <aroben@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 31 Jan 2008 18:47:44 +0000 (18:47 +0000)
 WebCore:

         Put more knowledge about the node highlight in WebCore

         InspectorController now calculates the overlay rect and node rect when
         drawing the node highlight instead of having them be passed in.
         InspectorController now holds onto the highlighted node so that it can
         determine these rects.

         Once all platforms are calling down to drawNodeHighlight instead of
         drawing the highlight themselves, we can change
         InspectorClient::highlight(Node*) to something like
         InspectorClient::updateAndShowHighlight().

         This also fixes Bug 14264: Node highlight makes it impossible to
         scroll the page
         <http://bugs.webkit.org/show_bug.cgi?id=14264>
         <rdar://5712788>

         Reviewed by Darin.

         * page/InspectorController.cpp:
         (WebCore::InspectorController::highlight): Store the node for use in
         drawNodeHighlight.
         (WebCore::InspectorController::drawNodeHighlight): Changed to be a
         const instance method. Now calculates the overlay rect and node rect
         instead of having them passed in.
         * page/InspectorController.h:

 WebKit/win:

         Let WebCore take care of the highlight drawing entirely

         Reviewed by Darin.

         * WebInspectorClient.cpp:
         (WebInspectorClient::highlight): We now just show our highlight
         window and let WebCore figure out what/where to paint. Once all ports
         follow suit the Node* parameter to this method should be removed
         entirely, and the name should probably change to
         updateAndShowHighlight or something similar.
         * WebNodeHighlight.cpp: Renamed m_webView to m_inspectedWebViewWindow.
         (WebNodeHighlight::WebNodeHighlight): Now takes a WebView* parameter.
         (WebNodeHighlight::show): Renamed from highlight(). Now gets the
         WebView's HWND. Updated for member rename/removal.
         (WebNodeHighlight::updateWindow): Updated for member rename and for
         InspectorController changes.
         * WebNodeHighlight.h: Added m_inspectedWebView member, removed m_rect
         member, renamed highlight(Node*) -> show().

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@29887 268f45cc-cd09-0410-ab3c-d52691b4dbfc

WebCore/ChangeLog
WebCore/page/InspectorController.cpp
WebCore/page/InspectorController.h
WebKit/win/ChangeLog
WebKit/win/WebInspectorClient.cpp
WebKit/win/WebNodeHighlight.cpp
WebKit/win/WebNodeHighlight.h

index 1dfa167..44351e5 100644 (file)
@@ -1,5 +1,34 @@
 2008-01-31  Adam Roben  <aroben@apple.com>
 
+        Put more knowledge about the node highlight in WebCore
+
+        InspectorController now calculates the overlay rect and node rect when
+        drawing the node highlight instead of having them be passed in.
+        InspectorController now holds onto the highlighted node so that it can
+        determine these rects.
+
+        Once all platforms are calling down to drawNodeHighlight instead of
+        drawing the highlight themselves, we can change
+        InspectorClient::highlight(Node*) to something like
+        InspectorClient::updateAndShowHighlight().
+
+        This also fixes Bug 14264: Node highlight makes it impossible to
+        scroll the page
+        <http://bugs.webkit.org/show_bug.cgi?id=14264>
+        <rdar://5712788>
+
+        Reviewed by Darin.
+
+        * page/InspectorController.cpp:
+        (WebCore::InspectorController::highlight): Store the node for use in
+        drawNodeHighlight.
+        (WebCore::InspectorController::drawNodeHighlight): Changed to be a
+        const instance method. Now calculates the overlay rect and node rect
+        instead of having them passed in.
+        * page/InspectorController.h:
+
+2008-01-31  Adam Roben  <aroben@apple.com>
+
         Add node highlight drawing code to InspectorController
 
         The code came from WebKit/win/WebNodeHighlight.cpp. It's not quite as
index 01483b8..91f8fb6 100644 (file)
@@ -40,6 +40,7 @@
 #include "Frame.h"
 #include "FrameLoader.h"
 #include "FrameTree.h"
+#include "FrameView.h"
 #include "GraphicsContext.h"
 #include "HTMLFrameOwnerElement.h"
 #include "InspectorClient.h"
@@ -668,6 +669,7 @@ void InspectorController::highlight(Node* node)
     if (!enabled())
         return;
     ASSERT_ARG(node, node);
+    m_highlightedNode = node;
     m_client->highlight(node);
 }
 
@@ -1578,16 +1580,37 @@ void InspectorController::moveWindowBy(float x, float y) const
     m_page->chrome()->setWindowRect(frameRect);
 }
 
-void InspectorController::drawNodeHighlight(GraphicsContext& context, const IntRect& overlayRect, const IntRect& highlightedNodeRect)
+void InspectorController::drawNodeHighlight(GraphicsContext& context) const
 {
     static const Color overlayFillColor(0, 0, 0, 128);
     static const int outlineThickness = 1;
 
-    context.clipOut(highlightedNodeRect);
+    if (!m_highlightedNode)
+        return;
+
+    FrameView* view = m_inspectedPage->mainFrame()->view();
+    FloatRect overlayRect = static_cast<ScrollView*>(view)->visibleContentRect();
+    context.translate(-overlayRect.x(), -overlayRect.y());
+
+    RenderObject* renderer = m_highlightedNode->renderer();
+    if (!renderer)
+        return;
+    IntRect nodeRect(renderer->absoluteBoundingBoxRect());
+
+    if (!overlayRect.contains(nodeRect) && !nodeRect.contains(enclosingIntRect(overlayRect))) {
+        Element* element;
+        if (m_highlightedNode->isElementNode())
+            element = static_cast<Element*>(m_highlightedNode.get());
+        else
+            element = static_cast<Element*>(m_highlightedNode->parent());
+        element->scrollIntoViewIfNeeded();
+    }
+
+    context.clipOut(nodeRect);
 
     context.fillRect(overlayRect, overlayFillColor);
 
-    IntRect outlineRect(highlightedNodeRect);
+    IntRect outlineRect(nodeRect);
     outlineRect.inflate(outlineThickness);
     context.fillRect(outlineRect, Color::white);
 }
index a18db30..46a5df3 100644 (file)
@@ -120,7 +120,7 @@ public:
 
     void moveWindowBy(float x, float y) const;
 
-    static void drawNodeHighlight(GraphicsContext&, const IntRect& overlayRect, const IntRect& highlightedNodeRect);
+    void drawNodeHighlight(GraphicsContext&) const;
 
 private:
     void focusNode();
@@ -169,6 +169,7 @@ private:
     bool m_windowVisible;
     SpecialPanels m_showAfterVisible;
     long long m_nextIdentifier;
+    RefPtr<Node> m_highlightedNode;
 };
 
 } // namespace WebCore
index 071d1f7..347071b 100644 (file)
@@ -1,5 +1,26 @@
 2008-01-31  Adam Roben  <aroben@apple.com>
 
+        Let WebCore take care of the highlight drawing entirely
+
+        Reviewed by Darin.
+
+        * WebInspectorClient.cpp:
+        (WebInspectorClient::highlight): We now just show our highlight
+        window and let WebCore figure out what/where to paint. Once all ports
+        follow suit the Node* parameter to this method should be removed
+        entirely, and the name should probably change to
+        updateAndShowHighlight or something similar.
+        * WebNodeHighlight.cpp: Renamed m_webView to m_inspectedWebViewWindow.
+        (WebNodeHighlight::WebNodeHighlight): Now takes a WebView* parameter.
+        (WebNodeHighlight::show): Renamed from highlight(). Now gets the
+        WebView's HWND. Updated for member rename/removal.
+        (WebNodeHighlight::updateWindow): Updated for member rename and for
+        InspectorController changes.
+        * WebNodeHighlight.h: Added m_inspectedWebView member, removed m_rect
+        member, renamed highlight(Node*) -> show().
+
+2008-01-31  Adam Roben  <aroben@apple.com>
+
         Move node highlight drawing code to WebCore
 
         Reviewed by Darin.
index a82eee6..bed702f 100644 (file)
@@ -270,38 +270,12 @@ void WebInspectorClient::detachWindow()
         m_highlight->updateWindow();
 }
 
-void WebInspectorClient::highlight(Node* node)
+void WebInspectorClient::highlight(Node*)
 {
-    ASSERT_ARG(node, node);
-
-    HWND hwnd;
-    if (FAILED(m_inspectedWebView->viewWindow((OLE_HANDLE*)&hwnd)))
-        return;
-    RECT rect;
-    ::GetClientRect(hwnd, &rect);
-    IntRect webViewRect(rect);
-
-    RenderObject* renderer = node->renderer();
-    if (!renderer)
-        return;
-    IntRect nodeRect(renderer->absoluteBoundingBoxRect());
-
-    if (!webViewRect.contains(nodeRect) && !nodeRect.contains(webViewRect)) {
-        Element* element;
-        if (node->isElementNode())
-            element = static_cast<Element*>(node);
-        else
-            element = static_cast<Element*>(node->parent());
-        element->scrollIntoViewIfNeeded();
-    }
-
-    IntSize offset = m_inspectedWebView->page()->mainFrame()->view()->scrollOffset();
-    nodeRect.move(-offset);
-
     if (!m_highlight)
-        m_highlight.set(new WebNodeHighlight(hwnd));
+        m_highlight.set(new WebNodeHighlight(m_inspectedWebView));
 
-    m_highlight->highlight(nodeRect);
+    m_highlight->show();
 }
 
 void WebInspectorClient::hideHighlight()
index 0c3fbcd..d2ba30d 100644 (file)
 #include "config.h"
 #include "WebNodeHighlight.h"
 
+#include "WebView.h"
 #pragma warning(push, 0)
 #include <WebCore/Color.h>
 #include <WebCore/GraphicsContext.h>
 #include <WebCore/InspectorController.h>
+#include <WebCore/Page.h>
 #include <WebCore/WindowMessageBroadcaster.h>
 #pragma warning(pop)
 #include <wtf/OwnPtr.h>
@@ -44,8 +46,9 @@ static LPCTSTR kOverlayWindowClassName = TEXT("WebNodeHighlightWindowClass");
 static ATOM registerOverlayClass();
 static LPCTSTR kWebNodeHighlightPointerProp = TEXT("WebNodeHighlightPointer");
 
-WebNodeHighlight::WebNodeHighlight(HWND webView)
-    : m_webView(webView)
+WebNodeHighlight::WebNodeHighlight(WebView* webView)
+    : m_inspectedWebView(webView)
+    , m_inspectedWebViewWindow(0)
     , m_overlay(0)
     , m_observedWindow(0)
 {
@@ -60,25 +63,27 @@ WebNodeHighlight::~WebNodeHighlight()
         ::DestroyWindow(m_overlay);
 }
 
-void WebNodeHighlight::highlight(const IntRect& rect)
+void WebNodeHighlight::show()
 {
     if (!m_overlay) {
+        if (FAILED(m_inspectedWebView->viewWindow(reinterpret_cast<OLE_HANDLE*>(&m_inspectedWebViewWindow))) || !IsWindow(m_inspectedWebViewWindow))
+            return;
+
         registerOverlayClass();
 
         m_overlay = ::CreateWindowEx(WS_EX_LAYERED | WS_EX_TOOLWINDOW, kOverlayWindowClassName, 0, WS_POPUP | WS_VISIBLE,
                                      0, 0, 0, 0,
-                                     m_webView, 0, 0, 0);
+                                     m_inspectedWebViewWindow, 0, 0, 0);
         if (!m_overlay)
             return;
 
         ::SetProp(m_overlay, kWebNodeHighlightPointerProp, reinterpret_cast<HANDLE>(this));
-        ::SetWindowPos(m_overlay, m_webView, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
+        ::SetWindowPos(m_overlay, m_inspectedWebViewWindow, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE);
 
-        m_observedWindow = GetAncestor(m_webView, GA_ROOT);
+        m_observedWindow = GetAncestor(m_inspectedWebViewWindow, GA_ROOT);
         WindowMessageBroadcaster::addListener(m_observedWindow, this);
     }
 
-    m_rect = rect;
     updateWindow();
     ::ShowWindow(m_overlay, SW_SHOW);
 }
@@ -103,7 +108,7 @@ void WebNodeHighlight::updateWindow()
         return;
 
     RECT webViewRect;
-    ::GetWindowRect(m_webView, &webViewRect);
+    ::GetWindowRect(m_inspectedWebViewWindow, &webViewRect);
 
     SIZE size;
     size.cx = webViewRect.right - webViewRect.left;
@@ -129,10 +134,7 @@ void WebNodeHighlight::updateWindow()
 
     GraphicsContext context(hdc);
 
-    IntRect overlayRect(webViewRect);
-    overlayRect.setLocation(IntPoint(0, 0));
-
-    InspectorController::drawNodeHighlight(context, overlayRect, m_rect);
+    m_inspectedWebView->page()->inspectorController()->drawNodeHighlight(context);
 
     BLENDFUNCTION bf;
     bf.BlendOp = AC_SRC_OVER;
index 63dcc79..fcb2f18 100644 (file)
 #define WebNodeHighlight_h
 
 #pragma warning(push, 0)
-#include <WebCore/IntRect.h>
 #include <WebCore/WindowMessageListener.h>
 #pragma warning(pop)
 
 #include <windows.h>
 
+class WebView;
+
 class WebNodeHighlight : WebCore::WindowMessageListener {
 public:
-    WebNodeHighlight(HWND webView);
+    WebNodeHighlight(WebView*);
     ~WebNodeHighlight();
 
-    void highlight(const WebCore::IntRect&);
+    void show();
     void hide();
 
     void updateWindow();
@@ -50,12 +51,11 @@ public:
 private:
     virtual void windowReceivedMessage(HWND, UINT message, WPARAM, LPARAM);
 
-    HWND m_webView;
+    WebView* m_inspectedWebView;
+    HWND m_inspectedWebViewWindow;
     HWND m_overlay;
     HWND m_observedWindow;
 
-    WebCore::IntRect m_rect;
-
     friend static LRESULT CALLBACK OverlayWndProc(HWND, UINT, WPARAM, LPARAM);
 };