diff options
author | mnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-27 20:21:45 +0000 |
---|---|---|
committer | mnaganov@chromium.org <mnaganov@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-02-27 20:21:45 +0000 |
commit | 3f93980d6f500aef8e587445db50934e85244774 (patch) | |
tree | 3c8e4e7adc1b594bc8aba166da1d702ea2588b85 | |
parent | bfb88ec71c6cd955694024e2e57c9dca04ef6cba (diff) | |
download | chromium_src-3f93980d6f500aef8e587445db50934e85244774.zip chromium_src-3f93980d6f500aef8e587445db50934e85244774.tar.gz chromium_src-3f93980d6f500aef8e587445db50934e85244774.tar.bz2 |
[Android WebView] Update WebView.EnableFixedLayoutMode in sync with ViewportEnabled
After WebKit http://trac.webkit.org/changeset/143735,
WebView.EnableFixedLayoutMode must be updated together with
WebSettings.ViewportEnabled. This is a temporary state of
affairs, one of these settings will be removed in future.
Only Android WebView needs to switch thid mode dynamically,
thus the change is implemented in the android_webview layer.
BUG=177684
Review URL: https://chromiumcodereview.appspot.com/12317071
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@185016 0039d316-1c4b-4281-b951-d872f2087c98
11 files changed, 88 insertions, 12 deletions
diff --git a/android_webview/browser/renderer_host/aw_render_view_host_ext.cc b/android_webview/browser/renderer_host/aw_render_view_host_ext.cc index bbb2351..1874a41 100644 --- a/android_webview/browser/renderer_host/aw_render_view_host_ext.cc +++ b/android_webview/browser/renderer_host/aw_render_view_host_ext.cc @@ -63,6 +63,12 @@ const AwHitTestData& AwRenderViewHostExt::GetLastHitTestData() const { return last_hit_test_data_; } +void AwRenderViewHostExt::SetEnableFixedLayoutMode(bool enable) { + DCHECK(CalledOnValidThread()); + Send(new AwViewMsg_SetEnableFixedLayoutMode(web_contents()->GetRoutingID(), + enable)); +} + void AwRenderViewHostExt::SetTextZoomLevel(double level) { DCHECK(CalledOnValidThread()); Send(new AwViewMsg_SetTextZoomLevel(web_contents()->GetRoutingID(), level)); diff --git a/android_webview/browser/renderer_host/aw_render_view_host_ext.h b/android_webview/browser/renderer_host/aw_render_view_host_ext.h index eb4ab1c..ac99d1c 100644 --- a/android_webview/browser/renderer_host/aw_render_view_host_ext.h +++ b/android_webview/browser/renderer_host/aw_render_view_host_ext.h @@ -50,6 +50,12 @@ class AwRenderViewHostExt : public content::WebContentsObserver, // the corresponding public WebView API is as well. const AwHitTestData& GetLastHitTestData() const; + // Set whether fixed layout mode is enabled. Must be updated together + // with WebSettings.viewport_enabled. + // TODO(mnaganov): Leave only one setting. See the comments on + // https://bugs.webkit.org/show_bug.cgi?id=109946 + void SetEnableFixedLayoutMode(bool enable); + // Sets the zoom level for text only. Used in layout modes other than // Text Autosizing. void SetTextZoomLevel(double level); diff --git a/android_webview/common/render_view_messages.h b/android_webview/common/render_view_messages.h index f3680e40..dfc48bc 100644 --- a/android_webview/common/render_view_messages.h +++ b/android_webview/common/render_view_messages.h @@ -69,6 +69,12 @@ IPC_MESSAGE_ROUTED1(AwViewMsg_SetTextZoomLevel, // recalculated by WebKit. IPC_MESSAGE_ROUTED0(AwViewMsg_ResetScrollAndScaleState) +// Set whether fixed layout mode is enabled. Must be updated together +// with WebSettings.viewport_enabled. Only WebView switches this mode +// dynamically, thus there is no support for this in the common code. +IPC_MESSAGE_ROUTED1(AwViewMsg_SetEnableFixedLayoutMode, + bool /* enabled */) + //----------------------------------------------------------------------------- // RenderView messages // These are messages sent from the renderer to the browser process. diff --git a/android_webview/java/src/org/chromium/android_webview/AwSettings.java b/android_webview/java/src/org/chromium/android_webview/AwSettings.java index 426cf13..3ff16e2 100644 --- a/android_webview/java/src/org/chromium/android_webview/AwSettings.java +++ b/android_webview/java/src/org/chromium/android_webview/AwSettings.java @@ -145,6 +145,21 @@ public class AwSettings { } /** + * Set whether fixed layout mode is enabled. Must be updated together + * with ContentSettings.UseWideViewport, which maps on WebSettings.viewport_enabled. + */ + public void setEnableFixedLayoutMode(final boolean enable) { + // There is no need to lock, because the native code doesn't + // read anything from the Java side. + ThreadUtils.runOnUiThreadBlocking(new Runnable() { + @Override + public void run() { + nativeSetEnableFixedLayoutMode(mNativeAwSettings, enable); + } + }); + } + + /** * Sets the text zoom of the page in percent. This kind of zooming is * only applicable when Text Autosizing is turned off. Passing -1 will * reset the zoom to the default value. @@ -199,5 +214,7 @@ public class AwSettings { private native void nativeSetWebContents(int nativeAwSettings, int nativeWebContents); + private native void nativeSetEnableFixedLayoutMode(int nativeAwSettings, boolean enable); + private native void nativeSetTextZoom(int nativeAwSettings, int textZoom); } diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientOnScaleChangedTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientOnScaleChangedTest.java index d3e6c6f..353193b 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientOnScaleChangedTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwContentsClientOnScaleChangedTest.java @@ -42,6 +42,7 @@ public class AwContentsClientOnScaleChangedTest extends AndroidWebViewTestBase { @DisabledTest public void testScaleUp() throws Throwable { getContentSettingsOnUiThread(mAwContents).setUseWideViewPort(true); + mAwContents.getSettings().setEnableFixedLayoutMode(true); loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), CommonResources.ABOUT_HTML, "text/html", false); ContentViewCore core = mAwContents.getContentViewCore(); diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java index 3997723..d35509e 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwSettingsTest.java @@ -896,6 +896,7 @@ public class AwSettingsTest extends AndroidWebViewTestBase { super(awContents, contentViewClient); // Font autosizing doesn't step in for narrow layout widths. mContentSettings.setUseWideViewPort(true); + mAwSettings.setEnableFixedLayoutMode(true); } @Override @@ -1152,7 +1153,7 @@ public class AwSettingsTest extends AndroidWebViewTestBase { // "viewport" tag is ignored, and the layout width is set to device width in DIP pixels. // We specify a very high width value to make sure that it doesn't intersect with // device screen widths (in DIP pixels). - class AwSettingsUseWideViewportTestHelper extends AwSettingsTestHelper<Boolean> { + class AwSettingsUseWideViewportTestHelper extends AwSettingsWithSettingsTestHelper<Boolean> { static private final String VIEWPORT_TAG_LAYOUT_WIDTH = "3000"; AwSettingsUseWideViewportTestHelper( @@ -1179,6 +1180,7 @@ public class AwSettingsTest extends AndroidWebViewTestBase { @Override protected void setCurrentValue(Boolean value) { mContentSettings.setUseWideViewPort(value); + mAwSettings.setEnableFixedLayoutMode(value); } @Override @@ -1210,6 +1212,7 @@ public class AwSettingsTest extends AndroidWebViewTestBase { super(awContents, contentViewClient, true); mWithViewPortTag = withViewPortTag; mContentSettings.setUseWideViewPort(true); + mAwContents.getSettings().setEnableFixedLayoutMode(true); } @Override @@ -2284,13 +2287,8 @@ public class AwSettingsTest extends AndroidWebViewTestBase { } } - /* - * @SmallTest - * @Feature({"AndroidWebView", "Preferences"}) - * This test is temporary disabled to prevent bot redness after WK patch lands - * BUG=177684 - */ - @DisabledTest + @SmallTest + @Feature({"AndroidWebView", "Preferences"}) public void testUseWideViewportWithTwoViews() throws Throwable { ViewPair views = createViews(); runPerViewSettingsTest( @@ -2344,6 +2342,7 @@ public class AwSettingsTest extends AndroidWebViewTestBase { Math.abs(displayWidth - actualWidth) <= 1); settings.setUseWideViewPort(true); + awContents.getSettings().setEnableFixedLayoutMode(true); // When UseWideViewPort is on, "meta viewport" tag is used. // If there is no viewport tag, or width isn't specified, // then layout width is set to max(980, <device-width-in-DIP-pixels>) @@ -2405,6 +2404,7 @@ public class AwSettingsTest extends AndroidWebViewTestBase { assertEquals(1.0f, getScaleOnUiThread(awContents)); settings.setUseWideViewPort(true); + awContents.getSettings().setEnableFixedLayoutMode(true); settings.setLoadWithOverviewMode(true); awContents.resetScrollAndScaleState(); int onScaleChangedCallCount = contentClient.getOnScaleChangedHelper().getCallCount(); diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/ContentViewZoomTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/ContentViewZoomTest.java index 13bbae8..19eb319 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/ContentViewZoomTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/ContentViewZoomTest.java @@ -194,6 +194,7 @@ public class ContentViewZoomTest extends AndroidWebViewTestBase { private void runMagnificationTest(boolean supportZoom) throws Throwable { getContentSettingsOnUiThread(mAwContents).setUseWideViewPort(true); + mAwContents.getSettings().setEnableFixedLayoutMode(true); loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), getZoomableHtml(), "text/html", false); // It takes some time for scaling to settle down. @@ -240,6 +241,7 @@ public class ContentViewZoomTest extends AndroidWebViewTestBase { public void testZoomUsingMultiTouch() throws Throwable { ContentSettings webSettings = getContentSettingsOnUiThread(mAwContents); webSettings.setUseWideViewPort(true); + mAwContents.getSettings().setEnableFixedLayoutMode(true); loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), getZoomableHtml(), "text/html", false); @@ -263,6 +265,7 @@ public class ContentViewZoomTest extends AndroidWebViewTestBase { public void testZoomControls() throws Throwable { ContentSettings webSettings = getContentSettingsOnUiThread(mAwContents); webSettings.setUseWideViewPort(true); + mAwContents.getSettings().setEnableFixedLayoutMode(true); loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), getZoomableHtml(), "text/html", false); @@ -288,6 +291,7 @@ public class ContentViewZoomTest extends AndroidWebViewTestBase { public void testZoomControlsOnNonZoomableContent() throws Throwable { ContentSettings webSettings = getContentSettingsOnUiThread(mAwContents); webSettings.setUseWideViewPort(true); + mAwContents.getSettings().setEnableFixedLayoutMode(true); loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), getNonZoomableHtml(), "text/html", false); @@ -312,6 +316,7 @@ public class ContentViewZoomTest extends AndroidWebViewTestBase { public void testZoomControlsOnOrientationChange() throws Throwable { ContentSettings webSettings = getContentSettingsOnUiThread(mAwContents); webSettings.setUseWideViewPort(true); + mAwContents.getSettings().setEnableFixedLayoutMode(true); loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), getZoomableHtml(), "text/html", false); diff --git a/android_webview/native/aw_settings.cc b/android_webview/native/aw_settings.cc index e3716d8..5e3caeb 100644 --- a/android_webview/native/aw_settings.cc +++ b/android_webview/native/aw_settings.cc @@ -13,6 +13,7 @@ namespace android_webview { AwSettings::AwSettings(JNIEnv* env, jobject obj) : java_ref_(env, obj), + enable_fixed_layout_(false), text_zoom_percent_(100) { } @@ -23,6 +24,20 @@ void AwSettings::Destroy(JNIEnv* env, jobject obj) { delete this; } +AwRenderViewHostExt* AwSettings::GetAwRenderViewHostExt() { + if (!web_contents()) return NULL; + AwContents* contents = AwContents::FromWebContents(web_contents()); + if (!contents) return NULL; + return contents->render_view_host_ext(); +} + +void AwSettings::SetEnableFixedLayoutMode( + JNIEnv* env, jobject obj, jboolean enabled) { + if (enable_fixed_layout_ == enabled) return; + enable_fixed_layout_ = enabled; + UpdateEnableFixedLayoutMode(); +} + void AwSettings::SetTextZoom(JNIEnv* env, jobject obj, jint text_zoom_percent) { if (text_zoom_percent_ == text_zoom_percent) return; text_zoom_percent_ = text_zoom_percent; @@ -33,11 +48,14 @@ void AwSettings::SetWebContents(JNIEnv* env, jobject obj, jint web_contents) { Observe(reinterpret_cast<content::WebContents*>(web_contents)); } +void AwSettings::UpdateEnableFixedLayoutMode() { + AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt(); + if (!rvhe) return; + rvhe->SetEnableFixedLayoutMode(enable_fixed_layout_); +} + void AwSettings::UpdateTextZoom() { - if (!web_contents()) return; - AwContents* contents = AwContents::FromWebContents(web_contents()); - if (!contents) return; - AwRenderViewHostExt* rvhe = contents->render_view_host_ext(); + AwRenderViewHostExt* rvhe = GetAwRenderViewHostExt(); if (!rvhe) return; if (text_zoom_percent_ > 0) { rvhe->SetTextZoomLevel(webkit_glue::ZoomFactorToZoomLevel( @@ -49,6 +67,7 @@ void AwSettings::UpdateTextZoom() { } void AwSettings::RenderViewCreated(content::RenderViewHost* render_view_host) { + UpdateEnableFixedLayoutMode(); UpdateTextZoom(); } diff --git a/android_webview/native/aw_settings.h b/android_webview/native/aw_settings.h index a0b7730..4f7ec97 100644 --- a/android_webview/native/aw_settings.h +++ b/android_webview/native/aw_settings.h @@ -13,6 +13,8 @@ namespace android_webview { +class AwRenderViewHostExt; + class AwSettings : public content::WebContentsObserver { public: AwSettings(JNIEnv* env, jobject obj); @@ -20,10 +22,13 @@ class AwSettings : public content::WebContentsObserver { // Called from Java. void Destroy(JNIEnv* env, jobject obj); + void SetEnableFixedLayoutMode(JNIEnv* env, jobject obj, jboolean enabled); void SetTextZoom(JNIEnv* env, jobject obj, jint text_zoom_percent); void SetWebContents(JNIEnv* env, jobject obj, jint web_contents); private: + AwRenderViewHostExt* GetAwRenderViewHostExt(); + void UpdateEnableFixedLayoutMode(); void UpdateTextZoom(); // WebContentsObserver overrides: @@ -31,6 +36,7 @@ class AwSettings : public content::WebContentsObserver { content::RenderViewHost* render_view_host) OVERRIDE; JavaObjectWeakGlobalRef java_ref_; + bool enable_fixed_layout_; int text_zoom_percent_; }; diff --git a/android_webview/renderer/aw_render_view_ext.cc b/android_webview/renderer/aw_render_view_ext.cc index bcc2c20..b9b82dc 100644 --- a/android_webview/renderer/aw_render_view_ext.cc +++ b/android_webview/renderer/aw_render_view_ext.cc @@ -144,6 +144,8 @@ bool AwRenderViewExt::OnMessageReceived(const IPC::Message& message) { IPC_BEGIN_MESSAGE_MAP(AwRenderViewExt, message) IPC_MESSAGE_HANDLER(AwViewMsg_DocumentHasImages, OnDocumentHasImagesRequest) IPC_MESSAGE_HANDLER(AwViewMsg_DoHitTest, OnDoHitTest) + IPC_MESSAGE_HANDLER(AwViewMsg_SetEnableFixedLayoutMode, + OnSetEnableFixedLayoutMode) IPC_MESSAGE_HANDLER(AwViewMsg_SetTextZoomLevel, OnSetTextZoomLevel) IPC_MESSAGE_HANDLER(AwViewMsg_ResetScrollAndScaleState, OnResetScrollAndScaleState) @@ -241,6 +243,12 @@ void AwRenderViewExt::OnDoHitTest(int view_x, int view_y) { Send(new AwViewHostMsg_UpdateHitTestData(routing_id(), data)); } +void AwRenderViewExt::OnSetEnableFixedLayoutMode(bool enabled) { + if (!render_view() || !render_view()->GetWebView()) + return; + render_view()->GetWebView()->enableFixedLayoutMode(enabled); +} + void AwRenderViewExt::OnSetTextZoomLevel(double zoom_level) { if (!render_view() || !render_view()->GetWebView()) return; diff --git a/android_webview/renderer/aw_render_view_ext.h b/android_webview/renderer/aw_render_view_ext.h index 88f9338..3583ac5 100644 --- a/android_webview/renderer/aw_render_view_ext.h +++ b/android_webview/renderer/aw_render_view_ext.h @@ -41,6 +41,8 @@ class AwRenderViewExt : public content::RenderViewObserver, void OnDoHitTest(int view_x, int view_y); + void OnSetEnableFixedLayoutMode(bool enabled); + void OnSetTextZoomLevel(double zoom_level); void OnResetScrollAndScaleState(); |