Commit 8c8d38ee authored by Clark DuVall's avatar Clark DuVall Committed by Commit Bot

Reland "[WebLayer] Fix crash when top controls view has 0 height"

This is a reland of e26a5125

This conflicted with http://crrev.com/c/1888389 and caused a compile error.

Original change's description:
> [WebLayer] Fix crash when top controls view has 0 height
>
> This happens because the adapter and layer for the top controls is only
> created once height and width are > 0. We were assuming this had already
> been created in setTopControlsOffset().
>
> Change-Id: Idf104f9d5c951c1fa8719fa30661dceae59b4887
> Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1890492
> Commit-Queue: Clark DuVall <cduvall@chromium.org>
> Reviewed-by: Scott Violet <sky@chromium.org>
> Cr-Commit-Position: refs/heads/master@{#710897}

TBR=sky@chromium.org

Change-Id: I482a241fcb43fe2bff3ec8f315cfed5ee266e828
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1890959Reviewed-by: default avatarClark DuVall <cduvall@chromium.org>
Reviewed-by: default avatarScott Violet <sky@chromium.org>
Commit-Queue: Clark DuVall <cduvall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#711013}
parent e8b4ccb4
......@@ -71,8 +71,10 @@ void TopControlsContainerView::SetTopControlsOffset(
const base::android::JavaParamRef<jobject>& caller,
int top_controls_offset_y,
int top_content_offset_y) {
DCHECK(top_controls_layer_);
top_controls_layer_->SetPosition(gfx::PointF(0, top_controls_offset_y));
// |top_controls_layer_| may not be created if the top controls view has 0
// height.
if (top_controls_layer_)
top_controls_layer_->SetPosition(gfx::PointF(0, top_controls_offset_y));
web_contents()->GetNativeView()->GetLayer()->SetPosition(
gfx::PointF(0, top_content_offset_y));
}
......
......@@ -131,7 +131,11 @@ public class InstrumentationActivityTestRule extends ActivityTestRule<Instrument
* Loads the given URL in the shell.
*/
public void navigateAndWait(String url) {
NavigationWaiter waiter = new NavigationWaiter(url, getActivity().getBrowserController());
navigateAndWait(getActivity().getBrowserController(), url);
}
public void navigateAndWait(BrowserController controller, String url) {
NavigationWaiter waiter = new NavigationWaiter(url, controller);
waiter.navigateAndWait();
}
......
......@@ -5,20 +5,24 @@
package org.chromium.weblayer.test;
import android.support.test.filters.SmallTest;
import android.support.v4.app.Fragment;
import android.view.View;
import android.widget.FrameLayout;
import org.json.JSONObject;
import org.junit.Assert;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.chromium.base.test.BaseJUnit4ClassRunner;
import org.chromium.base.test.util.CallbackHelper;
import org.chromium.base.test.util.UrlUtils;
import org.chromium.content_public.browser.test.util.Criteria;
import org.chromium.content_public.browser.test.util.CriteriaHelper;
import org.chromium.content_public.browser.test.util.TestThreadUtils;
import org.chromium.weblayer.BrowserController;
import org.chromium.weblayer.BrowserFragmentController;
import org.chromium.weblayer.WebLayer;
import org.chromium.weblayer.shell.InstrumentationActivity;
/**
......@@ -32,18 +36,43 @@ public class TopControlsTest {
private int mTopControlsHeight;
private int mInitialVisiblePageHeight;
private BrowserController mBrowserController;
private BrowserFragmentController mBrowserFragmentController;
/**
* Returns the visible height of the page as determined by JS. The returned value is in CSS
* pixels (which are most likely not the same as device pixels).
*/
private int getVisiblePageHeight() {
try {
JSONObject result = mActivityTestRule.executeScriptSync("window.innerHeight");
return result.getInt(BrowserController.SCRIPT_RESULT_KEY);
} catch (Exception e) {
return -1;
}
return mActivityTestRule.executeScriptAndExtractInt("window.innerHeight");
}
@Test
@SmallTest
public void testZeroHeight() throws Exception {
InstrumentationActivity activity = mActivityTestRule.launchShellWithUrl(null);
TestThreadUtils.runOnUiThreadBlocking(() -> {
Fragment fragment = WebLayer.createBrowserFragment(null);
activity.getSupportFragmentManager()
.beginTransaction()
.add(android.R.id.content, fragment)
.commitNow();
mBrowserFragmentController = BrowserFragmentController.fromFragment(fragment);
mBrowserFragmentController.setTopView(new FrameLayout(activity));
mBrowserController = mBrowserFragmentController.getBrowserController();
});
mActivityTestRule.navigateAndWait(
mBrowserController, UrlUtils.encodeHtmlDataUri("<html></html>"));
// Calling setSupportsEmbedding() makes sure onTopControlsChanged() will get called, which
// should not crash.
CallbackHelper helper = new CallbackHelper();
TestThreadUtils.runOnUiThreadBlocking(() -> {
mBrowserFragmentController.setSupportsEmbedding(true).addCallback(
(Boolean result) -> { helper.notifyCalled(); });
});
helper.waitForCallback(0);
}
@Test
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment