[Chromium] Enable viewport metatag
authorfsamuel@chromium.org <fsamuel@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 9 Dec 2011 05:15:18 +0000 (05:15 +0000)
committerfsamuel@chromium.org <fsamuel@chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Fri, 9 Dec 2011 05:15:18 +0000 (05:15 +0000)
https://bugs.webkit.org/show_bug.cgi?id=73495

Reviewed by Darin Fisher.

Source/JavaScriptCore:

* wtf/Platform.h: Added ENABLE(VIEWPORT) tag.

Source/WebCore:

Recompute viewpot parameters on frame rect resize.

* page/FrameView.cpp:
(WebCore::FrameView::setFrameRect):

Source/WebKit/chromium:

Compute the appropriate fixed layout size, page, and device scale factors,
based on the viewport meta tag parameters.

See http://developer.android.com/guide/webapps/targeting.html for more information.

* features.gypi:
* public/WebView.h:
* src/ChromeClientImpl.cpp:
(WebKit::ChromeClientImpl::layoutUpdated):
(WebKit::ChromeClientImpl::dispatchViewportPropertiesDidChange):
* src/ChromeClientImpl.h:
* src/WebFrameImpl.cpp:
(WebKit::WebFrameImpl::createFrameView):
* src/WebViewImpl.cpp:
(WebKit::WebViewImpl::WebViewImpl):
(WebKit::WebViewImpl::isPageScaleFactorSet):
(WebKit::WebViewImpl::setPageScaleFactor):
(WebKit::WebViewImpl::observeNewNavigation):
* src/WebViewImpl.h:

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

12 files changed:
Source/JavaScriptCore/ChangeLog
Source/JavaScriptCore/wtf/Platform.h
Source/WebCore/ChangeLog
Source/WebCore/page/FrameView.cpp
Source/WebKit/chromium/ChangeLog
Source/WebKit/chromium/features.gypi
Source/WebKit/chromium/public/WebView.h
Source/WebKit/chromium/src/ChromeClientImpl.cpp
Source/WebKit/chromium/src/ChromeClientImpl.h
Source/WebKit/chromium/src/WebFrameImpl.cpp
Source/WebKit/chromium/src/WebViewImpl.cpp
Source/WebKit/chromium/src/WebViewImpl.h

index ada9940..5bc0f7d 100644 (file)
@@ -1,3 +1,12 @@
+2011-12-08  Fady Samuel  <fsamuel@chromium.org>
+
+        [Chromium] Enable viewport metatag
+        https://bugs.webkit.org/show_bug.cgi?id=73495
+
+        Reviewed by Darin Fisher.
+
+        * wtf/Platform.h: Added ENABLE(VIEWPORT) tag.
+
 2011-12-08  Adam Klein  <adamk@chromium.org>
 
         Use HashMap<Node*, OwnPtr<...>> in ChildListMutationScope
index e86f820..72bf23b 100644 (file)
 #define ENABLE_GESTURE_RECOGNIZER 0
 #endif
 
+#if !defined(ENABLE_VIEWPORT)
+#define ENABLE_VIEWPORT 0
+#endif
+
 #if !defined(ENABLE_NOTIFICATIONS)
 #define ENABLE_NOTIFICATIONS 0
 #endif
index f38958c..cfc9f78 100644 (file)
@@ -1,3 +1,15 @@
+2011-12-08  Fady Samuel  <fsamuel@chromium.org>
+
+        [Chromium] Enable viewport metatag
+        https://bugs.webkit.org/show_bug.cgi?id=73495
+
+        Reviewed by Darin Fisher.
+
+        Recompute viewpot parameters on frame rect resize.
+
+        * page/FrameView.cpp:
+        (WebCore::FrameView::setFrameRect):
+
 2011-12-08  Kent Tamura  <tkent@chromium.org>
 
         Build fix for r102419.
index 547a1c1..e1ed94a 100644 (file)
@@ -405,6 +405,16 @@ void FrameView::setFrameRect(const IntRect& newRect)
     if (newRect == oldRect)
         return;
 
+#if ENABLE(VIEWPORT)
+    if (useFixedLayout()) {
+        Document* document = m_frame->document();
+        ViewportArguments viewport = document->viewportArguments();
+        Page* page = frame() ? frame()->page() : 0;
+        if (page)
+            page->chrome()->client()->dispatchViewportPropertiesDidChange(viewport);
+    }
+#endif
+
     ScrollView::setFrameRect(newRect);
 
 #if USE(ACCELERATED_COMPOSITING)
index 3eba631..d905c6c 100644 (file)
@@ -1,3 +1,31 @@
+2011-12-08  Fady Samuel  <fsamuel@chromium.org>
+
+        [Chromium] Enable viewport metatag
+        https://bugs.webkit.org/show_bug.cgi?id=73495
+
+        Reviewed by Darin Fisher.
+
+        Compute the appropriate fixed layout size, page, and device scale factors,
+        based on the viewport meta tag parameters.
+
+        See http://developer.android.com/guide/webapps/targeting.html for more information.
+
+
+        * features.gypi:
+        * public/WebView.h:
+        * src/ChromeClientImpl.cpp:
+        (WebKit::ChromeClientImpl::layoutUpdated):
+        (WebKit::ChromeClientImpl::dispatchViewportPropertiesDidChange):
+        * src/ChromeClientImpl.h:
+        * src/WebFrameImpl.cpp:
+        (WebKit::WebFrameImpl::createFrameView):
+        * src/WebViewImpl.cpp:
+        (WebKit::WebViewImpl::WebViewImpl):
+        (WebKit::WebViewImpl::isPageScaleFactorSet):
+        (WebKit::WebViewImpl::setPageScaleFactor):
+        (WebKit::WebViewImpl::observeNewNavigation):
+        * src/WebViewImpl.h:
+
 2011-12-08  Pierre Rossi  <pierre.rossi@gmail.com>
 
         Drop ENABLE_NO_LISTBOX_RENDERING, and make it a runtime decision.
index 5073d43..6fdaa0e 100644 (file)
@@ -90,6 +90,7 @@
       'ENABLE_V8_SCRIPT_DEBUG_SERVER=1',
       'ENABLE_VIDEO=1',
       'ENABLE_VIDEO_TRACK=1',
+      'ENABLE_VIEWPORT=<(enable_viewport)',
       'ENABLE_WEBGL=1',
       'ENABLE_WEB_SOCKETS=1',
       'ENABLE_WEB_TIMING=1',
       'use_accelerated_compositing%': 1,
       'enable_skia_text%': 0,
       'enable_svg%': 1,
+      'enable_viewport%': 0,
       'enable_touch_events%': 1,
       'use_skia%': 0,
       'enable_touch_icon_loading%' : 0,
index 859757f..0126243 100644 (file)
@@ -214,6 +214,10 @@ public:
     // is scaled up, < 1.0 is scaled down.
     virtual float pageScaleFactor() const = 0;
 
+    // Indicates wehther the page scale factor has been set since navigating
+    // to a new page.
+    virtual bool isPageScaleFactorSet() const = 0;
+
     // Scales the page and the scroll offset by a given factor, while ensuring
     // that the new scroll position does not go beyond the edge of the page.
     virtual void setPageScaleFactorPreservingScrollOffset(float) = 0;
index 45fc825..dfa8b24 100644 (file)
@@ -55,6 +55,7 @@
 #include "NavigationAction.h"
 #include "Node.h"
 #include "Page.h"
+#include "PlatformScreen.h"
 #include "PlatformSupport.h"
 #include "PopupContainer.h"
 #include "PopupMenuChromium.h"
@@ -559,6 +560,15 @@ void ChromeClientImpl::contentsSizeChanged(Frame* frame, const IntSize& size) co
 
 void ChromeClientImpl::layoutUpdated(Frame* frame) const
 {
+#if ENABLE(VIEWPORT)
+    if (!m_webView->isPageScaleFactorSet() && frame == frame->page()->mainFrame()) {
+        // If the page does not have a viewport tag, then compute a scale
+        // factor to make the page width fit the device width based on the
+        // default viewport parameters.
+        ViewportArguments viewport = frame->document()->viewportArguments();
+        dispatchViewportPropertiesDidChange(viewport);
+    }
+#endif
     m_webView->layoutUpdated(WebFrameImpl::fromFrame(frame));
 }
 
@@ -603,6 +613,47 @@ void ChromeClientImpl::setToolTip(const String& tooltipText, TextDirection dir)
         tooltipText, textDirection);
 }
 
+void ChromeClientImpl::dispatchViewportPropertiesDidChange(const ViewportArguments& arguments) const
+{
+#if ENABLE(VIEWPORT)
+    if (!m_webView->isFixedLayoutModeEnabled() || !m_webView->client() || !m_webView->page())
+        return;
+
+    ViewportArguments args;
+    if (arguments == args)
+        // Default viewport arguments passed in. This is a signal to reset the viewport.
+        args.width = ViewportArguments::ValueDesktopWidth;
+    else
+        args = arguments;
+
+    FrameView* frameView = m_webView->mainFrameImpl()->frameView();
+    int dpi = screenHorizontalDPI(frameView);
+    ASSERT(dpi > 0);
+
+    WebViewClient* client = m_webView->client();
+    WebRect deviceRect = client->windowRect();
+    // If the window size has not been set yet don't attempt to set the viewport
+    if (!deviceRect.width || !deviceRect.height)
+        return;
+
+    Settings* settings = m_webView->page()->settings();
+    // Call the common viewport computing logic in ViewportArguments.cpp.
+    ViewportAttributes computed = computeViewportAttributes(
+        args, settings->layoutFallbackWidth(), deviceRect.width, deviceRect.height,
+        dpi, IntSize(deviceRect.width, deviceRect.height));
+
+    int layoutWidth = computed.layoutSize.width();
+    int layoutHeight = computed.layoutSize.height();
+    m_webView->setFixedLayoutSize(IntSize(layoutWidth, layoutHeight));
+
+    // FIXME: Investigate the impact this has on layout/rendering if any.
+    // This exposes the correct device scale to javascript and media queries.
+    m_webView->setDeviceScaleFactor(computed.devicePixelRatio);
+    m_webView->setPageScaleFactorLimits(computed.minimumScale, computed.maximumScale);
+    m_webView->setPageScaleFactorPreservingScrollOffset(computed.initialScale * computed.devicePixelRatio);
+#endif
+}
+
 void ChromeClientImpl::print(Frame* frame)
 {
     if (m_webView->client())
index 77f2641..9fa92ef 100644 (file)
@@ -125,6 +125,7 @@ public:
     virtual void mouseDidMoveOverElement(
         const WebCore::HitTestResult& result, unsigned modifierFlags);
     virtual void setToolTip(const WTF::String& tooltipText, WebCore::TextDirection);
+    virtual void dispatchViewportPropertiesDidChange(const WebCore::ViewportArguments&) const;
     virtual void print(WebCore::Frame*);
     virtual void exceededDatabaseQuota(
         WebCore::Frame*, const WTF::String& databaseName);
index f30402c..3a2bca7 100644 (file)
@@ -2088,7 +2088,8 @@ void WebFrameImpl::createFrameView()
     ASSERT(m_frame); // If m_frame doesn't exist, we probably didn't init properly.
 
     WebViewImpl* webView = viewImpl();
-    m_frame->createView(webView->size(), Color::white, webView->isTransparent(),  webView->fixedLayoutSize(), webView->isFixedLayoutModeEnabled());
+    bool isMainFrame = webView->mainFrameImpl()->frame() == m_frame;
+    m_frame->createView(webView->size(), Color::white, webView->isTransparent(),  webView->fixedLayoutSize(), isMainFrame ? webView->isFixedLayoutModeEnabled() : 0);
     if (webView->shouldAutoResize())
         m_frame->view()->enableAutoSizeMode(true, webView->minAutoSize(), webView->maxAutoSize());
 
index b3bcb84..cf3f169 100644 (file)
@@ -347,6 +347,7 @@ WebViewImpl::WebViewImpl(WebViewClient* client)
     , m_pageDefinedMaximumPageScaleFactor(-1)
     , m_minimumPageScaleFactor(minPageScaleFactor)
     , m_maximumPageScaleFactor(maxPageScaleFactor)
+    , m_pageScaleFactorIsSet(false)
     , m_contextMenuAllowed(false)
     , m_doingDragAndDrop(false)
     , m_ignoreInputEvents(false)
@@ -1955,6 +1956,11 @@ float WebViewImpl::pageScaleFactor() const
     return page()->pageScaleFactor();
 }
 
+bool WebViewImpl::isPageScaleFactorSet() const
+{
+    return m_pageScaleFactorIsSet;
+}
+
 float WebViewImpl::clampPageScaleFactorToLimits(float scaleFactor)
 {
     return min(max(scaleFactor, m_minimumPageScaleFactor), m_maximumPageScaleFactor);
@@ -2003,6 +2009,7 @@ void WebViewImpl::setPageScaleFactor(float scaleFactor, const WebPoint& origin)
     scaleFactor = clampPageScaleFactorToLimits(scaleFactor);
     WebPoint clampedOrigin = clampOffsetAtScale(origin, scaleFactor);
     page()->setPageScaleFactor(scaleFactor, clampedOrigin);
+    m_pageScaleFactorIsSet = true;
 }
 
 float WebViewImpl::deviceScaleFactor() const
@@ -2675,6 +2682,9 @@ void WebViewImpl::startDragging(const WebDragData& dragData,
 void WebViewImpl::observeNewNavigation()
 {
     m_observedNewNavigation = true;
+    // FIXME: We need to make sure that m_pageScaleFactorIsSet is not reset
+    // on same page navigations.
+    m_pageScaleFactorIsSet = false;
 #ifndef NDEBUG
     m_newNavigationLoader = m_page->mainFrame()->loader()->documentLoader();
 #endif
index 40e931a..664129d 100644 (file)
@@ -164,6 +164,7 @@ public:
     virtual void zoomLimitsChanged(double minimumZoomLevel,
                                    double maximumZoomLevel);
     virtual float pageScaleFactor() const;
+    virtual bool isPageScaleFactorSet() const;
     virtual void setPageScaleFactorPreservingScrollOffset(float);
     virtual void setPageScaleFactor(float scaleFactor, const WebPoint& origin);
     virtual void setPageScaleFactorLimits(float minPageScale, float maxPageScale);
@@ -576,6 +577,8 @@ private:
     float m_minimumPageScaleFactor;
     float m_maximumPageScaleFactor;
 
+    bool m_pageScaleFactorIsSet;
+
     bool m_contextMenuAllowed;
 
     bool m_doingDragAndDrop;