Merge "Cherry-pick http://crrev.com/27262002 "Should not clear logical widths dirty bit without computing the value"" into klp-dev
diff --git a/Source/core/dom/Document.cpp b/Source/core/dom/Document.cpp
index 6dc3a24..82029de 100644
--- a/Source/core/dom/Document.cpp
+++ b/Source/core/dom/Document.cpp
@@ -2824,7 +2824,8 @@
     if (origin < m_viewportArguments.type)
         return;
 
-    m_viewportArguments = ViewportArguments(origin);
+    if (origin != m_viewportArguments.type || !(page() && page()->settings()->viewportMetaMergeQuirk()))
+        m_viewportArguments = ViewportArguments(origin);
     processArguments(features, (void*)&m_viewportArguments, &setViewportFeature);
 
     updateViewportArguments();
diff --git a/Source/core/page/Settings.in b/Source/core/page/Settings.in
index 5689692..312ecdd 100644
--- a/Source/core/page/Settings.in
+++ b/Source/core/page/Settings.in
@@ -143,6 +143,9 @@
 # Yet another Android SDK <= 18 quirk, removable 2015.
 # See http://crbug.com/305236
 reportScreenSizeInPhysicalPixelsQuirk initial=false
+# One more Android SDK <= 18 quirk, removable 2015.
+# See http://crbug.com/306548
+viewportMetaMergeQuirk initial=false
 # This quirk is to maintain compatibility with Android apps.
 # It will be possible to remove it once WebSettings.{get|set}UseWideViewPort
 # API function will be removed. See http://crbug.com/288037.
diff --git a/Source/web/WebSettingsImpl.cpp b/Source/web/WebSettingsImpl.cpp
index 57c5be3..fa827c7 100644
--- a/Source/web/WebSettingsImpl.cpp
+++ b/Source/web/WebSettingsImpl.cpp
@@ -188,6 +188,11 @@
     m_viewportMetaLayoutSizeQuirk = viewportMetaLayoutSizeQuirk;
 }
 
+void WebSettingsImpl::setViewportMetaMergeQuirk(bool viewportMetaMergeQuirk)
+{
+    m_settings->setViewportMetaMergeQuirk(viewportMetaMergeQuirk);
+}
+
 void WebSettingsImpl::setViewportMetaZeroValuesQuirk(bool viewportMetaZeroValuesQuirk)
 {
     m_settings->setViewportMetaZeroValuesQuirk(viewportMetaZeroValuesQuirk);
diff --git a/Source/web/WebSettingsImpl.h b/Source/web/WebSettingsImpl.h
index a943390..c0a801a 100644
--- a/Source/web/WebSettingsImpl.h
+++ b/Source/web/WebSettingsImpl.h
@@ -168,6 +168,7 @@
     virtual void setValidationMessageTimerMagnification(int);
     virtual void setViewportEnabled(bool);
     virtual void setViewportMetaLayoutSizeQuirk(bool);
+    virtual void setViewportMetaMergeQuirk(bool);
     virtual void setViewportMetaZeroValuesQuirk(bool);
     virtual void setVisualWordMovementEnabled(bool);
     virtual void setWebAudioEnabled(bool);
diff --git a/Source/web/WebViewImpl.cpp b/Source/web/WebViewImpl.cpp
index 0750b8a..c1546ba 100644
--- a/Source/web/WebViewImpl.cpp
+++ b/Source/web/WebViewImpl.cpp
@@ -3061,7 +3061,7 @@
     ViewportArguments adjustedArguments = arguments;
     if (settingsImpl()->viewportMetaLayoutSizeQuirk() && adjustedArguments.type == ViewportArguments::ViewportMeta) {
         adjustedArguments.type = ViewportArguments::ViewportMetaLayoutSizeQuirk;
-        if (adjustedArguments.width >= 0 && adjustedArguments.width <= m_size.width)
+        if (adjustedArguments.width >= 0 && adjustedArguments.width <= 320)
             adjustedArguments.width = ViewportArguments::ValueDeviceWidth;
         if (adjustedArguments.height >= 0 && adjustedArguments.width <= m_size.height)
             adjustedArguments.height = ViewportArguments::ValueDeviceHeight;
diff --git a/public/web/WebSettings.h b/public/web/WebSettings.h
index b8e0363..24ec54b 100644
--- a/public/web/WebSettings.h
+++ b/public/web/WebSettings.h
@@ -179,6 +179,7 @@
     virtual void setValidationMessageTimerMagnification(int) = 0;
     virtual void setViewportEnabled(bool) = 0;
     virtual void setViewportMetaLayoutSizeQuirk(bool) = 0;
+    virtual void setViewportMetaMergeQuirk(bool) = 0;
     virtual void setViewportMetaZeroValuesQuirk(bool) = 0;
     virtual void setVisualWordMovementEnabled(bool) = 0;
     virtual void setWebAudioEnabled(bool) = 0;