Commit 64bd1422 authored by Jeremy Roman's avatar Jeremy Roman Committed by Commit Bot

Make app install prompt work after portal activation.

Since the AppBannerManager may miss loading (its usual trigger) if
loaded in a portal context, also observe portal activation into a tab
and trigger the same logic at that point.

Android instrumentation test included.

Fixed: 1087163
Change-Id: I9e8a888f6f5ce2d3d13d825f62d64d0d164bfc55
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2219041Reviewed-by: default avatarYaron Friedman <yfriedman@chromium.org>
Reviewed-by: default avatarDominick Ng <dominickn@chromium.org>
Reviewed-by: default avatarKevin McNee <mcnee@chromium.org>
Commit-Queue: Jeremy Roman <jbroman@chromium.org>
Cr-Commit-Position: refs/heads/master@{#773233}
parent 97cb41e8
......@@ -12,6 +12,9 @@ import android.service.notification.StatusBarNotification;
import android.support.test.InstrumentationRegistry;
import android.support.test.filters.LargeTest;
import android.support.test.filters.MediumTest;
import android.support.test.uiautomator.UiDevice;
import android.support.test.uiautomator.UiObject;
import android.support.test.uiautomator.UiSelector;
import android.text.TextUtils;
import android.view.View;
......@@ -31,15 +34,19 @@ import org.chromium.base.test.util.DisabledTest;
import org.chromium.base.test.util.Feature;
import org.chromium.base.test.util.MinAndroidSdkLevel;
import org.chromium.chrome.browser.ChromeActivity;
import org.chromium.chrome.browser.banners.AppBannerManager;
import org.chromium.chrome.browser.engagement.SiteEngagementService;
import org.chromium.chrome.browser.flags.ChromeSwitches;
import org.chromium.chrome.browser.history.BrowsingHistoryBridge;
import org.chromium.chrome.browser.history.HistoryItem;
import org.chromium.chrome.browser.history.TestBrowsingHistoryObserver;
import org.chromium.chrome.browser.login.ChromeHttpAuthHandler;
import org.chromium.chrome.browser.profiles.Profile;
import org.chromium.chrome.browser.tab.EmptyTabObserver;
import org.chromium.chrome.browser.tab.Tab;
import org.chromium.chrome.test.ChromeActivityTestRule;
import org.chromium.chrome.test.ChromeJUnit4ClassRunner;
import org.chromium.chrome.test.util.browser.webapps.WebappTestPage;
import org.chromium.components.permissions.PermissionDialogController;
import org.chromium.content_public.browser.WebContents;
import org.chromium.content_public.browser.test.util.Coordinates;
......@@ -530,4 +537,38 @@ public class PortalsTest {
// Check if notification is still shown.
waitForMediaCaptureNotification();
}
@Test
@LargeTest
@Feature({"Portals", "AppBanners"})
public void testAppBannerTriggerableAfterActivation() throws Exception {
// Based on AppBannerManagerTest.
mActivityTestRule.startMainActivityWithURL(
mTestServer.getURL("/chrome/test/data/android/about.html"));
final Tab tab = mActivityTestRule.getActivity().getActivityTab();
final WebContents contents = tab.getWebContents();
Assert.assertNotNull(contents);
final String url = WebappTestPage.getServiceWorkerUrlWithAction(
mTestServer, "call_stashed_prompt_on_click");
TestThreadUtils.runOnUiThreadBlocking(() -> {
SiteEngagementService.getForProfile(Profile.getLastUsedRegularProfile())
.resetBaseScoreForUrl(url, 10);
});
JavaScriptUtils.executeJavaScript(contents,
"let portal = document.createElement('portal');\n"
+ "portal.src = '" + url + "';\n"
+ "portal.onload = () => portal.activate();\n"
+ "document.body.appendChild(portal);");
CriteriaHelper.pollUiThread(Criteria.equals("Web app banner test page", tab::getTitle));
CriteriaHelper.pollUiThread(() -> !AppBannerManager.forTab(tab).isRunningForTesting());
TouchCommon.singleClickView(tab.getView());
String expectedDialogTitle = mActivityTestRule.getActivity().getString(
AppBannerManager.getHomescreenLanguageOption());
UiObject dialogUiObject = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation())
.findObject(new UiSelector().text(expectedDialogTitle));
Assert.assertTrue(dialogUiObject.waitForExists(CriteriaHelper.DEFAULT_MAX_TIME_TO_POLL));
}
}
......@@ -582,6 +582,18 @@ void AppBannerManager::DidFinishLoad(
RequestAppBanner(validated_url);
}
void AppBannerManager::DidActivatePortal(
content::WebContents* predecessor_contents,
base::TimeTicks activation_time) {
// If this page was loaded in a portal, AppBannerManager may have been
// instantiated after DidFinishLoad. Trigger the banner pipeline now (on
// portal activation) if we missed the load event.
if (!load_finished_ && !web_contents()->IsLoadingToDifferentDocument()) {
DidFinishLoad(web_contents()->GetMainFrame(),
web_contents()->GetLastCommittedURL());
}
}
void AppBannerManager::MediaStartedPlaying(const MediaPlayerInfo& media_info,
const content::MediaPlayerId& id) {
active_media_players_.push_back(id);
......
......@@ -293,6 +293,8 @@ class AppBannerManager : public content::WebContentsObserver,
void DidFinishNavigation(content::NavigationHandle* handle) override;
void DidFinishLoad(content::RenderFrameHost* render_frame_host,
const GURL& validated_url) override;
void DidActivatePortal(content::WebContents* predecessor_contents,
base::TimeTicks activation_time) override;
void MediaStartedPlaying(const MediaPlayerInfo& media_info,
const content::MediaPlayerId& id) override;
void MediaStoppedPlaying(
......
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