WebKit2 View Gestures: Support plugins that take over the page scale gesture
https://bugs.webkit.org/show_bug.cgi?id=126399
<rdar://problem/15738928>

Reviewed by Sam Weinig.

Teach ViewGestureController how to handle WebFrame::handlesPageScaleGesture=true,
which is used so that PDFPlugin can deal with magnification itself.

* UIProcess/mac/ViewGestureController.cpp:
(WebKit::ViewGestureController::ViewGestureController):
(WebKit::ViewGestureController::didCollectGeometryForMagnificationGesture):
(WebKit::ViewGestureController::handleMagnificationGesture):
(WebKit::ViewGestureController::endMagnificationGesture):
(WebKit::ViewGestureController::didCollectGeometryForSmartMagnificationGesture):
If the WebFrame is going to handle the page scale gesture itself (which currently
simply means that it is a main-frame PDFPlugin), send the magnification information
straight through to it. Also, don't provide smart-zoom in this case, since there
is currently no way to collect geometry information from the plugin.

* UIProcess/mac/ViewGestureController.h:
* UIProcess/mac/ViewGestureController.messages.in:
* WebProcess/WebPage/ViewGestureGeometryCollector.cpp:
(WebKit::ViewGestureGeometryCollector::collectGeometryForMagnificationGesture):
(WebKit::ViewGestureGeometryCollector::collectGeometryForSmartMagnificationGesture):
Retrieve WebFrame::handlesPageScaleGesture and return it to the UI process.


git-svn-id: http://svn.webkit.org/repository/webkit/trunk@161571 268f45cc-cd09-0410-ab3c-d52691b4dbfc
diff --git a/Source/WebKit2/ChangeLog b/Source/WebKit2/ChangeLog
index 3e586af..5b74e44 100644
--- a/Source/WebKit2/ChangeLog
+++ b/Source/WebKit2/ChangeLog
@@ -1,3 +1,32 @@
+2014-01-09  Tim Horton  <timothy_horton@apple.com>
+
+        WebKit2 View Gestures: Support plugins that take over the page scale gesture
+        https://bugs.webkit.org/show_bug.cgi?id=126399
+        <rdar://problem/15738928>
+
+        Reviewed by Sam Weinig.
+
+        Teach ViewGestureController how to handle WebFrame::handlesPageScaleGesture=true,
+        which is used so that PDFPlugin can deal with magnification itself.
+
+        * UIProcess/mac/ViewGestureController.cpp:
+        (WebKit::ViewGestureController::ViewGestureController):
+        (WebKit::ViewGestureController::didCollectGeometryForMagnificationGesture):
+        (WebKit::ViewGestureController::handleMagnificationGesture):
+        (WebKit::ViewGestureController::endMagnificationGesture):
+        (WebKit::ViewGestureController::didCollectGeometryForSmartMagnificationGesture):
+        If the WebFrame is going to handle the page scale gesture itself (which currently
+        simply means that it is a main-frame PDFPlugin), send the magnification information
+        straight through to it. Also, don't provide smart-zoom in this case, since there
+        is currently no way to collect geometry information from the plugin.
+
+        * UIProcess/mac/ViewGestureController.h:
+        * UIProcess/mac/ViewGestureController.messages.in:
+        * WebProcess/WebPage/ViewGestureGeometryCollector.cpp:
+        (WebKit::ViewGestureGeometryCollector::collectGeometryForMagnificationGesture):
+        (WebKit::ViewGestureGeometryCollector::collectGeometryForSmartMagnificationGesture):
+        Retrieve WebFrame::handlesPageScaleGesture and return it to the UI process.
+
 2014-01-09  Dan Bernstein  <mitz@apple.com>
 
         [Cocoa] Promote WKBackForwardList{,Item}.h to public
diff --git a/Source/WebKit2/UIProcess/mac/ViewGestureController.cpp b/Source/WebKit2/UIProcess/mac/ViewGestureController.cpp
index b8523bd..7cefcc1 100644
--- a/Source/WebKit2/UIProcess/mac/ViewGestureController.cpp
+++ b/Source/WebKit2/UIProcess/mac/ViewGestureController.cpp
@@ -51,6 +51,7 @@
     : m_webPageProxy(webPageProxy)
     , m_activeGestureType(ViewGestureType::None)
     , m_visibleContentRectIsValid(false)
+    , m_frameHandlesMagnificationGesture(false)
 {
     m_webPageProxy.process().addMessageReceiver(Messages::ViewGestureController::messageReceiverName(), m_webPageProxy.pageID(), *this);
 }
@@ -88,11 +89,12 @@
     return scaledMagnificationOrigin;
 }
 
-void ViewGestureController::didCollectGeometryForMagnificationGesture(FloatRect visibleContentRect)
+void ViewGestureController::didCollectGeometryForMagnificationGesture(FloatRect visibleContentRect, bool frameHandlesMagnificationGesture)
 {
     m_activeGestureType = ViewGestureType::Magnification;
     m_visibleContentRect = visibleContentRect;
     m_visibleContentRectIsValid = true;
+    m_frameHandlesMagnificationGesture = frameHandlesMagnificationGesture;
 }
 
 void ViewGestureController::handleMagnificationGesture(double scale, FloatPoint origin)
@@ -111,6 +113,8 @@
     if (!m_visibleContentRectIsValid)
         return;
 
+    m_activeGestureType = ViewGestureType::Magnification;
+
     double scaleWithResistance = resistanceForDelta(scale, m_magnification) * scale;
 
     m_magnification += m_magnification * scaleWithResistance;
@@ -118,9 +122,10 @@
 
     m_magnificationOrigin = origin;
 
-    m_webPageProxy.drawingArea()->adjustTransientZoom(m_magnification, scaledMagnificationOrigin(origin, m_magnification));
-
-    m_activeGestureType = ViewGestureType::Magnification;
+    if (m_frameHandlesMagnificationGesture)
+        m_webPageProxy.scalePage(m_magnification, roundedIntPoint(origin));
+    else
+        m_webPageProxy.drawingArea()->adjustTransientZoom(m_magnification, scaledMagnificationOrigin(origin, m_magnification));
 }
 
 void ViewGestureController::endMagnificationGesture()
@@ -128,7 +133,11 @@
     ASSERT(m_activeGestureType == ViewGestureType::Magnification);
 
     double newMagnification = std::min(std::max(m_magnification, minMagnification), maxMagnification);
-    m_webPageProxy.drawingArea()->commitTransientZoom(newMagnification, scaledMagnificationOrigin(m_magnificationOrigin, newMagnification));
+
+    if (m_frameHandlesMagnificationGesture)
+        m_webPageProxy.scalePage(newMagnification, roundedIntPoint(m_magnificationOrigin));
+    else
+        m_webPageProxy.drawingArea()->commitTransientZoom(newMagnification, scaledMagnificationOrigin(m_magnificationOrigin, newMagnification));
 }
 
 void ViewGestureController::handleSmartMagnificationGesture(FloatPoint origin)
@@ -144,8 +153,11 @@
     return std::max(fabs(a.x() - b.x()), std::max(fabs(a.y() - b.y()), std::max(fabs(a.width() - b.width()), fabs(a.height() - b.height()))));
 }
 
-void ViewGestureController::didCollectGeometryForSmartMagnificationGesture(FloatPoint origin, FloatRect renderRect, FloatRect visibleContentRect, bool isReplacedElement)
+void ViewGestureController::didCollectGeometryForSmartMagnificationGesture(FloatPoint origin, FloatRect renderRect, FloatRect visibleContentRect, bool isReplacedElement, bool frameHandlesMagnificationGesture)
 {
+    if (frameHandlesMagnificationGesture)
+        return;
+
     double currentScaleFactor = m_webPageProxy.pageScaleFactor();
 
     FloatRect unscaledTargetRect = renderRect;
diff --git a/Source/WebKit2/UIProcess/mac/ViewGestureController.h b/Source/WebKit2/UIProcess/mac/ViewGestureController.h
index 06a8c1b..0b83914 100644
--- a/Source/WebKit2/UIProcess/mac/ViewGestureController.h
+++ b/Source/WebKit2/UIProcess/mac/ViewGestureController.h
@@ -57,8 +57,8 @@
     virtual void didReceiveMessage(IPC::Connection*, IPC::MessageDecoder&) OVERRIDE;
 
     // Message handlers.
-    void didCollectGeometryForMagnificationGesture(WebCore::FloatRect visibleContentBounds);
-    void didCollectGeometryForSmartMagnificationGesture(WebCore::FloatPoint origin, WebCore::FloatRect renderRect, WebCore::FloatRect visibleContentBounds, bool isReplacedElement);
+    void didCollectGeometryForMagnificationGesture(WebCore::FloatRect visibleContentBounds, bool frameHandlesMagnificationGesture);
+    void didCollectGeometryForSmartMagnificationGesture(WebCore::FloatPoint origin, WebCore::FloatRect renderRect, WebCore::FloatRect visibleContentBounds, bool isReplacedElement, bool frameHandlesMagnificationGesture);
 
     void endMagnificationGesture();
     WebCore::FloatPoint scaledMagnificationOrigin(WebCore::FloatPoint origin, double scale);
@@ -74,6 +74,7 @@
 
     WebCore::FloatRect m_visibleContentRect;
     bool m_visibleContentRectIsValid;
+    bool m_frameHandlesMagnificationGesture;
 };
 
 } // namespace WebKit
diff --git a/Source/WebKit2/UIProcess/mac/ViewGestureController.messages.in b/Source/WebKit2/UIProcess/mac/ViewGestureController.messages.in
index f77b6b3..0b399ef 100644
--- a/Source/WebKit2/UIProcess/mac/ViewGestureController.messages.in
+++ b/Source/WebKit2/UIProcess/mac/ViewGestureController.messages.in
@@ -21,6 +21,6 @@
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 messages -> ViewGestureController {
-    DidCollectGeometryForMagnificationGesture(WebCore::FloatRect visibleContentBounds)
-    DidCollectGeometryForSmartMagnificationGesture(WebCore::FloatPoint origin, WebCore::FloatRect renderRect, WebCore::FloatRect visibleContentBounds, bool isReplacedElement)
+    DidCollectGeometryForMagnificationGesture(WebCore::FloatRect visibleContentBounds, bool frameHandlesMagnificationGesture)
+    DidCollectGeometryForSmartMagnificationGesture(WebCore::FloatPoint origin, WebCore::FloatRect renderRect, WebCore::FloatRect visibleContentBounds, bool isReplacedElement, bool frameHandlesMagnificationGesture)
 }
diff --git a/Source/WebKit2/WebProcess/WebPage/ViewGestureGeometryCollector.cpp b/Source/WebKit2/WebProcess/WebPage/ViewGestureGeometryCollector.cpp
index f48ead6..4119a8c 100644
--- a/Source/WebKit2/WebProcess/WebPage/ViewGestureGeometryCollector.cpp
+++ b/Source/WebKit2/WebProcess/WebPage/ViewGestureGeometryCollector.cpp
@@ -29,6 +29,7 @@
 #include "ViewGestureControllerMessages.h"
 #include "ViewGestureGeometryCollectorMessages.h"
 #include "WebCoreArgumentCoders.h"
+#include "WebFrame.h"
 #include "WebPage.h"
 #include "WebProcess.h"
 #include <WebCore/FrameView.h>
@@ -53,12 +54,14 @@
 void ViewGestureGeometryCollector::collectGeometryForMagnificationGesture()
 {
     FloatRect visibleContentRect = m_webPage.mainFrameView()->visibleContentRect(ScrollableArea::IncludeScrollbars);
-    m_webPage.send(Messages::ViewGestureController::DidCollectGeometryForMagnificationGesture(visibleContentRect));
+    bool frameHandlesMagnificationGesture = m_webPage.mainWebFrame()->handlesPageScaleGesture();
+    m_webPage.send(Messages::ViewGestureController::DidCollectGeometryForMagnificationGesture(visibleContentRect, frameHandlesMagnificationGesture));
 }
 
 void ViewGestureGeometryCollector::collectGeometryForSmartMagnificationGesture(FloatPoint origin)
 {
     FloatRect visibleContentRect = m_webPage.mainFrameView()->visibleContentRect(ScrollableArea::IncludeScrollbars);
+    bool frameHandlesMagnificationGesture = m_webPage.mainWebFrame()->handlesPageScaleGesture();
 
     FloatPoint scrolledOrigin = origin;
     scrolledOrigin.moveBy(m_webPage.mainFrameView()->scrollPosition());
@@ -70,7 +73,7 @@
     if (hitTestResult.innerNode()) {
         bool isReplaced;
         FloatRect renderRect = hitTestResult.innerNode()->renderRect(&isReplaced);
-        m_webPage.send(Messages::ViewGestureController::DidCollectGeometryForSmartMagnificationGesture(origin, renderRect, visibleContentRect, isReplaced));
+        m_webPage.send(Messages::ViewGestureController::DidCollectGeometryForSmartMagnificationGesture(origin, renderRect, visibleContentRect, isReplaced, frameHandlesMagnificationGesture));
     }
 }