Title: [96876] trunk/Source
Revision
96876
Author
a...@apple.com
Date
2011-10-06 16:52:21 -0700 (Thu, 06 Oct 2011)

Log Message

        [Mac] Should be able to scroll embedded PDFs using mouse
        https://bugs.webkit.org/show_bug.cgi?id=69579

        Reviewed by Darin Adler.

        Hit testing doesn't find scrollbars installed by a plug-in, so mouse events don't work.

        As we want to use WebKit scrollbars with PDF plug-in, a cleaner long-term solution would be
        to have a base class under PluginViewBase that can handle scrolling instead of doing that
        in PluginView and Plugin.

        * plugins/PluginViewBase.h:
        (WebCore::PluginViewBase::horizontalScrollbar):
        (WebCore::PluginViewBase::verticalScrollbar):
        Added accessors for scrollbars installed by plug-in.

        * rendering/nodeAtPoint.cpp: (WebCore::RenderEmbeddedObject::nodeAtPoint):
        Like RenderLayer, add scrollbars to hit result after normal  hit testing.

        * rendering/RenderEmbeddedObject.h: Added a nodeAtPoint override.

        * rendering/RenderWidget.h: Made nodeAtPoint() protected instead of private, so that
        RenderEmbeddedObject could call it.

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (96875 => 96876)


--- trunk/Source/WebCore/ChangeLog	2011-10-06 23:48:06 UTC (rev 96875)
+++ trunk/Source/WebCore/ChangeLog	2011-10-06 23:52:21 UTC (rev 96876)
@@ -1,3 +1,29 @@
+2011-10-06  Alexey Proskuryakov  <a...@apple.com>
+
+        [Mac] Should be able to scroll embedded PDFs using mouse
+        https://bugs.webkit.org/show_bug.cgi?id=69579
+
+        Reviewed by Darin Adler.
+
+        Hit testing doesn't find scrollbars installed by a plug-in, so mouse events don't work.
+
+        As we want to use WebKit scrollbars with PDF plug-in, a cleaner long-term solution would be
+        to have a base class under PluginViewBase that can handle scrolling instead of doing that
+        in PluginView and Plugin.
+
+        * plugins/PluginViewBase.h:
+        (WebCore::PluginViewBase::horizontalScrollbar):
+        (WebCore::PluginViewBase::verticalScrollbar):
+        Added accessors for scrollbars installed by plug-in.
+
+        * rendering/nodeAtPoint.cpp: (WebCore::RenderEmbeddedObject::nodeAtPoint):
+        Like RenderLayer, add scrollbars to hit result after normal  hit testing.
+
+        * rendering/RenderEmbeddedObject.h: Added a nodeAtPoint override.
+
+        * rendering/RenderWidget.h: Made nodeAtPoint() protected instead of private, so that
+        RenderEmbeddedObject could call it.
+
 2011-10-06  Dan Bernstein  <m...@apple.com>
 
         <rdar://problem/9717490> Flash of white when navigating daringfireball.net

Modified: trunk/Source/WebCore/plugins/PluginViewBase.h (96875 => 96876)


--- trunk/Source/WebCore/plugins/PluginViewBase.h	2011-10-06 23:48:06 UTC (rev 96875)
+++ trunk/Source/WebCore/plugins/PluginViewBase.h	2011-10-06 23:52:21 UTC (rev 96876)
@@ -38,6 +38,8 @@
 
 namespace WebCore {
 
+class Scrollbar;
+
 // PluginViewBase is a widget that all plug-in views inherit from, both in Webkit and WebKit2.
 // It's intended as a stopgap measure until we can merge all plug-in views into a single plug-in view.
 class PluginViewBase : public Widget {
@@ -51,6 +53,10 @@
     virtual bool getFormValue(String&) { return false; }
     virtual bool scroll(ScrollDirection, ScrollGranularity) { return false; }
 
+    // A plug-in can ask WebKit to handle scrollbars for it.
+    virtual Scrollbar* horizontalScrollbar() { return 0; }
+    virtual Scrollbar* verticalScrollbar() { return 0; }
+
 protected:
     PluginViewBase(PlatformWidget widget = 0) : Widget(widget) { }
     

Modified: trunk/Source/WebCore/rendering/RenderEmbeddedObject.cpp (96875 => 96876)


--- trunk/Source/WebCore/rendering/RenderEmbeddedObject.cpp	2011-10-06 23:48:06 UTC (rev 96875)
+++ trunk/Source/WebCore/rendering/RenderEmbeddedObject.cpp	2011-10-06 23:52:21 UTC (rev 96876)
@@ -38,6 +38,7 @@
 #include "HTMLNames.h"
 #include "HTMLObjectElement.h"
 #include "HTMLParamElement.h"
+#include "HitTestResult.h"
 #include "LocalizedStrings.h"
 #include "MIMETypeRegistry.h"
 #include "MouseEvent.h"
@@ -250,6 +251,33 @@
     }
 }
 
+bool RenderEmbeddedObject::nodeAtPoint(const HitTestRequest& request, HitTestResult& result, const LayoutPoint& pointInContainer, const LayoutPoint& accumulatedOffset, HitTestAction hitTestAction)
+{
+    if (!RenderPart::nodeAtPoint(request, result, pointInContainer, accumulatedOffset, hitTestAction))
+        return false;
+
+    if (!widget() || !widget()->isPluginViewBase())
+        return true;
+
+    PluginViewBase* view = static_cast<PluginViewBase*>(widget());
+
+    if (Scrollbar* horizontalScrollbar = view->horizontalScrollbar()) {
+        if (horizontalScrollbar->frameRect().contains(pointInContainer)) {
+            result.setScrollbar(horizontalScrollbar);
+            return true;
+        }
+    }
+
+    if (Scrollbar* verticalScrollbar = view->verticalScrollbar()) {
+        if (verticalScrollbar->frameRect().contains(pointInContainer)) {
+            result.setScrollbar(verticalScrollbar);
+            return true;
+        }
+    }
+
+    return true;
+}
+
 bool RenderEmbeddedObject::scroll(ScrollDirection direction, ScrollGranularity granularity, float, Node**)
 {
     if (!widget() || !widget()->isPluginViewBase())

Modified: trunk/Source/WebCore/rendering/RenderEmbeddedObject.h (96875 => 96876)


--- trunk/Source/WebCore/rendering/RenderEmbeddedObject.h	2011-10-06 23:48:06 UTC (rev 96875)
+++ trunk/Source/WebCore/rendering/RenderEmbeddedObject.h	2011-10-06 23:52:21 UTC (rev 96876)
@@ -67,6 +67,8 @@
     virtual void layout();
     virtual void viewCleared();
 
+    virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const LayoutPoint& pointInContainer, const LayoutPoint& accumulatedOffset, HitTestAction);
+
     virtual bool scroll(ScrollDirection, ScrollGranularity, float multiplier, Node** stopNode);
     virtual bool logicalScroll(ScrollLogicalDirection, ScrollGranularity, float multiplier, Node** stopNode);
 

Modified: trunk/Source/WebCore/rendering/RenderWidget.h (96875 => 96876)


--- trunk/Source/WebCore/rendering/RenderWidget.h	2011-10-06 23:48:06 UTC (rev 96875)
+++ trunk/Source/WebCore/rendering/RenderWidget.h	2011-10-06 23:52:21 UTC (rev 96876)
@@ -60,6 +60,7 @@
     virtual void layout();
     virtual void paint(PaintInfo&, const LayoutPoint&);
     virtual CursorDirective getCursor(const LayoutPoint&, Cursor&) const;
+    virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const LayoutPoint& pointInContainer, const LayoutPoint& accumulatedOffset, HitTestAction);
 
 private:
     virtual bool isWidget() const { return true; }
@@ -67,7 +68,6 @@
     virtual void willBeDestroyed();
     virtual void destroy();
     virtual void setSelectionState(SelectionState);
-    virtual bool nodeAtPoint(const HitTestRequest&, HitTestResult&, const LayoutPoint& pointInContainer, const LayoutPoint& accumulatedOffset, HitTestAction);
     virtual void setOverlapTestResult(bool);
 
     bool setWidgetGeometry(const IntRect&);

Modified: trunk/Source/WebKit2/ChangeLog (96875 => 96876)


--- trunk/Source/WebKit2/ChangeLog	2011-10-06 23:48:06 UTC (rev 96875)
+++ trunk/Source/WebKit2/ChangeLog	2011-10-06 23:52:21 UTC (rev 96876)
@@ -1,3 +1,35 @@
+2011-10-06  Alexey Proskuryakov  <a...@apple.com>
+
+        [Mac] Should be able to scroll embedded PDFs using mouse
+        https://bugs.webkit.org/show_bug.cgi?id=69579
+
+        Reviewed by Darin Adler.
+
+        * WebProcess/Plugins/PDF/BuiltInPDFView.cpp:
+        (WebKit::BuiltInPDFView::handleMouseEvent): No longer need to hardcode mouseDown handling,
+        ScrollableArea does everything now.
+        (WebKit::BuiltInPDFView::horizontalScrollbar): Added plumbing to access scrollbars from
+        WebCore hit testing code.
+        (WebKit::BuiltInPDFView::verticalScrollbar): Ditto.
+        (WebKit::BuiltInPDFView::visibleHeight): ScrollableArea now wants this.
+        (WebKit::BuiltInPDFView::visibleWidth): Ditto.
+
+        * WebProcess/Plugins/Netscape/NetscapePlugin.cpp:
+        (WebKit::NetscapePlugin::horizontalScrollbar):
+        (WebKit::NetscapePlugin::verticalScrollbar):
+        * WebProcess/Plugins/Netscape/NetscapePlugin.h:
+        * WebProcess/Plugins/PDF/BuiltInPDFView.h:
+        * WebProcess/Plugins/Plugin.h:
+        * WebProcess/Plugins/PluginProxy.cpp:
+        (WebKit::PluginProxy::horizontalScrollbar):
+        (WebKit::PluginProxy::verticalScrollbar):
+        * WebProcess/Plugins/PluginProxy.h:
+        * WebProcess/Plugins/PluginView.cpp:
+        (WebKit::PluginView::horizontalScrollbar):
+        (WebKit::PluginView::verticalScrollbar):
+        * WebProcess/Plugins/PluginView.h:
+        Added plumbing to access scrollbars from WebCore hit testing code.
+
 2011-10-06  Alexis Menard  <alexis.men...@openbossa.org>
 
         [Qt][WK2] WebIconDatabase expects a file path not a directory.

Modified: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp (96875 => 96876)


--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp	2011-10-06 23:48:06 UTC (rev 96875)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.cpp	2011-10-06 23:52:21 UTC (rev 96876)
@@ -885,6 +885,16 @@
     return false;
 }
 
+Scrollbar* NetscapePlugin::horizontalScrollbar()
+{
+    return 0;
+}
+
+Scrollbar* NetscapePlugin::verticalScrollbar()
+{
+    return 0;
+}
+
 bool NetscapePlugin::supportsSnapshotting() const
 {
 #if PLATFORM(MAC)

Modified: trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h (96875 => 96876)


--- trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h	2011-10-06 23:48:06 UTC (rev 96875)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Netscape/NetscapePlugin.h	2011-10-06 23:52:21 UTC (rev 96876)
@@ -206,6 +206,8 @@
     virtual void privateBrowsingStateChanged(bool);
     virtual bool getFormValue(String& formValue);
     virtual bool handleScroll(WebCore::ScrollDirection, WebCore::ScrollGranularity);
+    virtual WebCore::Scrollbar* horizontalScrollbar();
+    virtual WebCore::Scrollbar* verticalScrollbar();
 
     bool supportsSnapshotting() const;
 

Modified: trunk/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.cpp (96875 => 96876)


--- trunk/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.cpp	2011-10-06 23:48:06 UTC (rev 96875)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.cpp	2011-10-06 23:52:21 UTC (rev 96876)
@@ -380,13 +380,9 @@
         // FIXME: Should also notify scrollbar to show hover effect. Should also send mouseExited to hide it.
         break;
     case WebEvent::MouseDown: {
-        PlatformMouseEvent mouseDownEvent = platform(event);
-        if (m_horizontalScrollbar)
-            m_horizontalScrollbar->mouseDown(mouseDownEvent);
-        if (m_verticalScrollbar)
-            m_verticalScrollbar->mouseDown(mouseDownEvent);
-        // Returning false as that will make EventHandler unfocus the plug-in, which is appropriate when clicking scrollbars.
-        // When support for PDF forms is added, we'll need to actually focus the plug-in.
+        // Returning false as will make EventHandler unfocus the plug-in, which is appropriate when clicking scrollbars.
+        // Ideally, we wouldn't change focus at all, but PluginView already did that for us.
+        // When support for PDF forms is added, we'll need to actually focus the plug-in when clicking in a form.
         break;
     }
     case WebEvent::MouseUp:
@@ -473,6 +469,16 @@
     return scroll(direction, granularity);
 }
 
+Scrollbar* BuiltInPDFView::horizontalScrollbar()
+{
+    return m_horizontalScrollbar.get();
+}
+
+Scrollbar* BuiltInPDFView::verticalScrollbar()
+{
+    return m_verticalScrollbar.get();
+}
+
 IntRect BuiltInPDFView::scrollCornerRect() const
 {
     if (!m_horizontalScrollbar || !m_verticalScrollbar)
@@ -556,6 +562,16 @@
     return maximumOffset;
 }
 
+LayoutUnit BuiltInPDFView::visibleHeight() const
+{
+    return m_frameRect.height();
+}
+
+LayoutUnit BuiltInPDFView::visibleWidth() const
+{
+    return m_frameRect.width();
+}
+
 IntSize BuiltInPDFView::contentsSize() const
 {
     return m_pdfDocumentSize;

Modified: trunk/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.h (96875 => 96876)


--- trunk/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.h	2011-10-06 23:48:06 UTC (rev 96875)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PDF/BuiltInPDFView.h	2011-10-06 23:52:21 UTC (rev 96876)
@@ -103,6 +103,8 @@
     virtual void privateBrowsingStateChanged(bool);
     virtual bool getFormValue(String& formValue);
     virtual bool handleScroll(WebCore::ScrollDirection, WebCore::ScrollGranularity);
+    virtual WebCore::Scrollbar* horizontalScrollbar();
+    virtual WebCore::Scrollbar* verticalScrollbar();
 
     // ScrollableArea methods.
     virtual WebCore::IntRect scrollCornerRect() const;
@@ -117,6 +119,8 @@
     virtual WebCore::IntPoint scrollPosition() const;
     virtual WebCore::IntPoint minimumScrollPosition() const;
     virtual WebCore::IntPoint maximumScrollPosition() const;
+    virtual WebCore::LayoutUnit visibleHeight() const;
+    virtual WebCore::LayoutUnit visibleWidth() const;
     virtual WebCore::IntSize contentsSize() const;
     virtual WebCore::Scrollbar* horizontalScrollbar() const  { return m_horizontalScrollbar.get(); }
     virtual WebCore::Scrollbar* verticalScrollbar() const { return m_verticalScrollbar.get(); }

Modified: trunk/Source/WebKit2/WebProcess/Plugins/Plugin.h (96875 => 96876)


--- trunk/Source/WebKit2/WebProcess/Plugins/Plugin.h	2011-10-06 23:48:06 UTC (rev 96875)
+++ trunk/Source/WebKit2/WebProcess/Plugins/Plugin.h	2011-10-06 23:52:21 UTC (rev 96876)
@@ -42,6 +42,7 @@
 namespace WebCore {
     class GraphicsContext;
     class IntRect;
+    class Scrollbar;
 }
 
 namespace WebKit {
@@ -203,6 +204,11 @@
     // Tells the plug-in that it should scroll. The plug-in should return true if it did scroll.
     virtual bool handleScroll(WebCore::ScrollDirection, WebCore::ScrollGranularity) = 0;
 
+    // A plug-in can use WebCore scroll bars. Make them known, so that hit testing can find them.
+    // FIXME: This code should be in PluginView or its base class, not in individual plug-ins.
+    virtual WebCore::Scrollbar* horizontalScrollbar() = 0;
+    virtual WebCore::Scrollbar* verticalScrollbar() = 0;
+
 protected:
     Plugin();
 

Modified: trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp (96875 => 96876)


--- trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp	2011-10-06 23:48:06 UTC (rev 96875)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.cpp	2011-10-06 23:52:21 UTC (rev 96876)
@@ -391,6 +391,16 @@
     return false;
 }
 
+Scrollbar* PluginProxy::horizontalScrollbar()
+{
+    return 0;
+}
+
+Scrollbar* PluginProxy::verticalScrollbar()
+{
+    return 0;
+}
+
 void PluginProxy::loadURL(uint64_t requestID, const String& method, const String& urlString, const String& target, const HTTPHeaderMap& headerFields, const Vector<uint8_t>& httpBody, bool allowPopups)
 {
     controller()->loadURL(requestID, method, urlString, target, headerFields, httpBody, allowPopups);

Modified: trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.h (96875 => 96876)


--- trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.h	2011-10-06 23:48:06 UTC (rev 96875)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PluginProxy.h	2011-10-06 23:52:21 UTC (rev 96876)
@@ -103,6 +103,8 @@
     virtual void privateBrowsingStateChanged(bool);
     virtual bool getFormValue(String& formValue);
     virtual bool handleScroll(WebCore::ScrollDirection, WebCore::ScrollGranularity);
+    virtual WebCore::Scrollbar* horizontalScrollbar();
+    virtual WebCore::Scrollbar* verticalScrollbar();
 
     bool needsBackingStore() const;
     uint64_t windowNPObjectID();

Modified: trunk/Source/WebKit2/WebProcess/Plugins/PluginView.cpp (96875 => 96876)


--- trunk/Source/WebKit2/WebProcess/Plugins/PluginView.cpp	2011-10-06 23:48:06 UTC (rev 96875)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PluginView.cpp	2011-10-06 23:52:21 UTC (rev 96876)
@@ -528,6 +528,24 @@
     return m_plugin->handleScroll(direction, granularity);
 }
 
+Scrollbar* PluginView::horizontalScrollbar()
+{
+    // The plug-in can be null here if it failed to initialize.
+    if (!m_isInitialized || !m_plugin)
+        return 0;
+
+    return m_plugin->horizontalScrollbar();
+}
+
+Scrollbar* PluginView::verticalScrollbar()
+{
+    // The plug-in can be null here if it failed to initialize.
+    if (!m_isInitialized || !m_plugin)
+        return 0;
+
+    return m_plugin->verticalScrollbar();
+}
+
 void PluginView::setFrameRect(const WebCore::IntRect& rect)
 {
     Widget::setFrameRect(rect);

Modified: trunk/Source/WebKit2/WebProcess/Plugins/PluginView.h (96875 => 96876)


--- trunk/Source/WebKit2/WebProcess/Plugins/PluginView.h	2011-10-06 23:48:06 UTC (rev 96875)
+++ trunk/Source/WebKit2/WebProcess/Plugins/PluginView.h	2011-10-06 23:52:21 UTC (rev 96876)
@@ -104,6 +104,8 @@
     virtual void privateBrowsingStateChanged(bool);
     virtual bool getFormValue(String&);
     virtual bool scroll(WebCore::ScrollDirection, WebCore::ScrollGranularity);
+    virtual WebCore::Scrollbar* horizontalScrollbar();
+    virtual WebCore::Scrollbar* verticalScrollbar();
 
     // WebCore::Widget
     virtual void setFrameRect(const WebCore::IntRect&);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to