Skip to content

Commit

Permalink
[Android WebView] Update WebView.EnableFixedLayoutMode in sync with V…
Browse files Browse the repository at this point in the history
…iewportEnabled

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
  • Loading branch information
mnaganov@chromium.org committed Feb 27, 2013
1 parent bfb88ec commit 3f93980
Show file tree
Hide file tree
Showing 11 changed files with 88 additions and 12 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
6 changes: 6 additions & 0 deletions android_webview/common/render_view_messages.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,21 @@ public void setShouldFocusFirstNode(boolean flag) {
}
}

/**
* 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
Expand Down Expand Up @@ -199,5 +214,7 @@ public void setWebContents(int nativeWebContents) {

private native void nativeSetWebContents(int nativeAwSettings, int nativeWebContents);

private native void nativeSetEnableFixedLayoutMode(int nativeAwSettings, boolean enable);

private native void nativeSetTextZoom(int nativeAwSettings, int textZoom);
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,7 @@ protected void tearDown() throws Exception {
@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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -896,6 +896,7 @@ class AwSettingsLayoutAlgorithmTestHelper extends
super(awContents, contentViewClient);
// Font autosizing doesn't step in for narrow layout widths.
mContentSettings.setUseWideViewPort(true);
mAwSettings.setEnableFixedLayoutMode(true);
}

@Override
Expand Down Expand Up @@ -1152,7 +1153,7 @@ protected void doEnsureSettingHasValue(Integer value) throws Throwable {
// "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(
Expand All @@ -1179,6 +1180,7 @@ protected Boolean getCurrentValue() {
@Override
protected void setCurrentValue(Boolean value) {
mContentSettings.setUseWideViewPort(value);
mAwSettings.setEnableFixedLayoutMode(value);
}

@Override
Expand Down Expand Up @@ -1210,6 +1212,7 @@ class AwSettingsLoadWithOverviewModeTestHelper extends AwSettingsTestHelper<Bool
super(awContents, contentViewClient, true);
mWithViewPortTag = withViewPortTag;
mContentSettings.setUseWideViewPort(true);
mAwContents.getSettings().setEnableFixedLayoutMode(true);
}

@Override
Expand Down Expand Up @@ -2284,13 +2287,8 @@ public void testAppCacheWithTwoViews() throws Throwable {
}
}

/*
* @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(
Expand Down Expand Up @@ -2344,6 +2342,7 @@ public void testUseWideViewportLayoutWidth() throws Throwable {
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>)
Expand Down Expand Up @@ -2405,6 +2404,7 @@ public void testLoadWithOverviewModeViewportScale() throws Throwable {
assertEquals(1.0f, getScaleOnUiThread(awContents));

settings.setUseWideViewPort(true);
awContents.getSettings().setEnableFixedLayoutMode(true);
settings.setLoadWithOverviewMode(true);
awContents.resetScrollAndScaleState();
int onScaleChangedCallCount = contentClient.getOnScaleChangedHelper().getCallCount();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,7 @@ public boolean isSatisfied() {

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.
Expand Down Expand Up @@ -240,6 +241,7 @@ public void testMagnificationWithZoomSupportOff() throws Throwable {
public void testZoomUsingMultiTouch() throws Throwable {
ContentSettings webSettings = getContentSettingsOnUiThread(mAwContents);
webSettings.setUseWideViewPort(true);
mAwContents.getSettings().setEnableFixedLayoutMode(true);
loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
getZoomableHtml(), "text/html", false);

Expand All @@ -263,6 +265,7 @@ public void testZoomUsingMultiTouch() throws Throwable {
public void testZoomControls() throws Throwable {
ContentSettings webSettings = getContentSettingsOnUiThread(mAwContents);
webSettings.setUseWideViewPort(true);
mAwContents.getSettings().setEnableFixedLayoutMode(true);
loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
getZoomableHtml(), "text/html", false);

Expand All @@ -288,6 +291,7 @@ public void testZoomControls() throws Throwable {
public void testZoomControlsOnNonZoomableContent() throws Throwable {
ContentSettings webSettings = getContentSettingsOnUiThread(mAwContents);
webSettings.setUseWideViewPort(true);
mAwContents.getSettings().setEnableFixedLayoutMode(true);
loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
getNonZoomableHtml(), "text/html", false);

Expand All @@ -312,6 +316,7 @@ public void testZoomControlsOnNonZoomableContent() throws Throwable {
public void testZoomControlsOnOrientationChange() throws Throwable {
ContentSettings webSettings = getContentSettingsOnUiThread(mAwContents);
webSettings.setUseWideViewPort(true);
mAwContents.getSettings().setEnableFixedLayoutMode(true);
loadDataSync(mAwContents, mContentsClient.getOnPageFinishedHelper(),
getZoomableHtml(), "text/html", false);

Expand Down
27 changes: 23 additions & 4 deletions android_webview/native/aw_settings.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
}

Expand All @@ -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;
Expand All @@ -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(
Expand All @@ -49,6 +67,7 @@ void AwSettings::UpdateTextZoom() {
}

void AwSettings::RenderViewCreated(content::RenderViewHost* render_view_host) {
UpdateEnableFixedLayoutMode();
UpdateTextZoom();
}

Expand Down
6 changes: 6 additions & 0 deletions android_webview/native/aw_settings.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,24 +13,30 @@

namespace android_webview {

class AwRenderViewHostExt;

class AwSettings : public content::WebContentsObserver {
public:
AwSettings(JNIEnv* env, jobject obj);
virtual ~AwSettings();

// 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:
virtual void RenderViewCreated(
content::RenderViewHost* render_view_host) OVERRIDE;

JavaObjectWeakGlobalRef java_ref_;
bool enable_fixed_layout_;
int text_zoom_percent_;
};

Expand Down
8 changes: 8 additions & 0 deletions android_webview/renderer/aw_render_view_ext.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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;
Expand Down
2 changes: 2 additions & 0 deletions android_webview/renderer/aw_render_view_ext.h
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand Down

0 comments on commit 3f93980

Please sign in to comment.