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));
}
}