Commit 3b08f509 authored by Mike Jackson's avatar Mike Jackson Committed by Commit Bot

dpwas: Update AppBannerManagerDesktop to get winning display mode

Update AppBannerManagerDesktop::OnWebAppInstalled to use the
winning display mode when display_override is set.

To test the change use: chrome --enable-features=WebAppManifestDisplayOverride
Example websites:
 https://mwjacksonmsft.github.io/pwa/display-override-custom/index.html
 (display == browser, display_override == [standard])


Explainer: https://github.com/WICG/display-override/blob/master/explainer.m
Design document: https://docs.google.com/document/d/1hEmbGVHMN38q1YTaaGccQ-Y5CHr7xIURYPRWXTuvZLo/edit?usp=sharing
I2P: https://groups.google.com/a/chromium.org/d/topic/blink-dev/WvIeZT8uSzw/discussion

Bug: 1109520
Change-Id: If0b589f0a19367f01501e2eb52aec16f4f2645cf
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2354665Reviewed-by: default avatarDominick Ng <dominickn@chromium.org>
Reviewed-by: default avatarDaniel Murphy <dmurph@chromium.org>
Commit-Queue: Mike Jackson <mjackson@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#798519}
parent 59b02886
...@@ -223,7 +223,7 @@ void AppBannerManagerDesktop::OnWebAppInstalled( ...@@ -223,7 +223,7 @@ void AppBannerManagerDesktop::OnWebAppInstalled(
if (app_id.has_value() && *app_id == installed_app_id && if (app_id.has_value() && *app_id == installed_app_id &&
registrar().GetAppUserDisplayMode(*app_id) == registrar().GetAppUserDisplayMode(*app_id) ==
blink::mojom::DisplayMode::kStandalone) { blink::mojom::DisplayMode::kStandalone) {
OnInstall(registrar().GetAppDisplayMode(*app_id)); OnInstall(registrar().GetEffectiveDisplayModeFromManifest(*app_id));
SetInstallableWebAppCheckResult(InstallableWebAppCheckResult::kNo); SetInstallableWebAppCheckResult(InstallableWebAppCheckResult::kNo);
} }
} }
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "base/test/bind_test_util.h" #include "base/test/bind_test_util.h"
#include "base/test/metrics/histogram_tester.h" #include "base/test/metrics/histogram_tester.h"
#include "base/test/scoped_feature_list.h"
#include "chrome/app/chrome_command_ids.h" #include "chrome/app/chrome_command_ids.h"
#include "chrome/browser/banners/app_banner_manager_browsertest_base.h" #include "chrome/browser/banners/app_banner_manager_browsertest_base.h"
#include "chrome/browser/banners/app_banner_manager_desktop.h" #include "chrome/browser/banners/app_banner_manager_desktop.h"
...@@ -34,6 +35,7 @@ ...@@ -34,6 +35,7 @@
#include "chrome/common/chrome_features.h" #include "chrome/common/chrome_features.h"
#include "chrome/test/base/ui_test_utils.h" #include "chrome/test/base/ui_test_utils.h"
#include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents.h"
#include "content/public/common/content_features.h"
#include "content/public/test/browser_test.h" #include "content/public/test/browser_test.h"
#include "content/public/test/browser_test_utils.h" #include "content/public/test/browser_test_utils.h"
#include "extensions/common/extension.h" #include "extensions/common/extension.h"
...@@ -64,8 +66,30 @@ class AppBannerManagerDesktopBrowserTest ...@@ -64,8 +66,30 @@ class AppBannerManagerDesktopBrowserTest
chrome::SetAutoAcceptPWAInstallConfirmationForTesting(false); chrome::SetAutoAcceptPWAInstallConfirmationForTesting(false);
} }
AppBannerManagerDesktopBrowserTest(
const AppBannerManagerDesktopBrowserTest&) = delete;
AppBannerManagerDesktopBrowserTest& operator=(
const AppBannerManagerDesktopBrowserTest&) = delete;
};
// A dedicated test fixture for DisplayOverride, which is supported
// only for the new web apps mode, and requires a command line switch
// to enable manifest parsing.
class AppBannerManagerDesktopBrowserTest_DisplayOverride
: public AppBannerManagerDesktopBrowserTest {
public:
AppBannerManagerDesktopBrowserTest_DisplayOverride() {
scoped_feature_list_.InitAndEnableFeature(
features::kWebAppManifestDisplayOverride);
}
AppBannerManagerDesktopBrowserTest_DisplayOverride(
const AppBannerManagerDesktopBrowserTest_DisplayOverride&) = delete;
AppBannerManagerDesktopBrowserTest_DisplayOverride& operator=(
const AppBannerManagerDesktopBrowserTest_DisplayOverride&) = delete;
private: private:
DISALLOW_COPY_AND_ASSIGN(AppBannerManagerDesktopBrowserTest); base::test::ScopedFeatureList scoped_feature_list_;
}; };
IN_PROC_BROWSER_TEST_F(AppBannerManagerDesktopBrowserTest, IN_PROC_BROWSER_TEST_F(AppBannerManagerDesktopBrowserTest,
...@@ -328,4 +352,103 @@ IN_PROC_BROWSER_TEST_F(AppBannerManagerDesktopBrowserTest, ...@@ -328,4 +352,103 @@ IN_PROC_BROWSER_TEST_F(AppBannerManagerDesktopBrowserTest,
EXPECT_TRUE(manager->IsPromptAvailableForTesting()); EXPECT_TRUE(manager->IsPromptAvailableForTesting());
} }
IN_PROC_BROWSER_TEST_F(AppBannerManagerDesktopBrowserTest_DisplayOverride,
InstallPromptAfterUserMenuInstall) {
base::HistogramTester tester;
TestAppBannerManagerDesktop* manager =
TestAppBannerManagerDesktop::FromWebContents(
browser()->tab_strip_model()->GetActiveWebContents());
{
base::RunLoop run_loop;
manager->PrepareDone(run_loop.QuitClosure());
ui_test_utils::NavigateToURL(
browser(), GetBannerURLWithManifestAndQuery(
"/banners/manifest_display_override.json", "action",
"stash_event"));
run_loop.Run();
EXPECT_EQ(State::PENDING_PROMPT, manager->state());
}
// Install the app via the menu instead of the banner.
chrome::SetAutoAcceptPWAInstallConfirmationForTesting(true);
browser()->command_controller()->ExecuteCommand(IDC_INSTALL_PWA);
manager->AwaitAppInstall();
chrome::SetAutoAcceptPWAInstallConfirmationForTesting(false);
EXPECT_FALSE(manager->IsPromptAvailableForTesting());
tester.ExpectUniqueSample(kInstallDisplayModeHistogram,
blink::mojom::DisplayMode::kMinimalUi, 1);
}
IN_PROC_BROWSER_TEST_F(AppBannerManagerDesktopBrowserTest_DisplayOverride,
WebAppBannerResolvesUserChoice) {
base::HistogramTester tester;
content::WebContents* web_contents =
browser()->tab_strip_model()->GetActiveWebContents();
auto* manager = TestAppBannerManagerDesktop::FromWebContents(web_contents);
{
base::RunLoop run_loop;
manager->PrepareDone(run_loop.QuitClosure());
ui_test_utils::NavigateToURL(
browser(),
GetBannerURLWithManifestAndQuery(
"/banners/manifest_display_override_display_is_browser.json",
"action", "stash_event"));
run_loop.Run();
EXPECT_EQ(State::PENDING_PROMPT, manager->state());
}
{
// Trigger the installation prompt and wait for installation to occur.
base::RunLoop run_loop;
manager->PrepareDone(run_loop.QuitClosure());
ExecuteScript(browser(), "callStashedPrompt();", true /* with_gesture */);
run_loop.Run();
EXPECT_EQ(State::COMPLETE, manager->state());
}
// Ensure that the userChoice promise resolves.
const base::string16 title = base::ASCIIToUTF16("Got userChoice: accepted");
content::TitleWatcher watcher(web_contents, title);
EXPECT_EQ(title, watcher.WaitAndGetTitle());
tester.ExpectUniqueSample(kInstallDisplayModeHistogram,
blink::mojom::DisplayMode::kStandalone, 1);
}
IN_PROC_BROWSER_TEST_F(AppBannerManagerDesktopBrowserTest_DisplayOverride,
PolicyAppInstalled_NoPrompt) {
TestAppBannerManagerDesktop* manager =
TestAppBannerManagerDesktop::FromWebContents(
browser()->tab_strip_model()->GetActiveWebContents());
// Install web app by policy.
web_app::ExternalInstallOptions options =
web_app::CreateInstallOptions(GetBannerURLWithManifest(
"/banners/manifest_display_override_contains_browser.json"));
options.install_source = web_app::ExternalInstallSource::kExternalPolicy;
options.user_display_mode = web_app::DisplayMode::kBrowser;
web_app::PendingAppManagerInstall(browser()->profile(), options);
// Run promotability check.
{
base::RunLoop run_loop;
manager->PrepareDone(run_loop.QuitClosure());
ui_test_utils::NavigateToURL(browser(), GetBannerURL());
run_loop.Run();
EXPECT_EQ(State::COMPLETE, manager->state());
}
EXPECT_EQ(AppBannerManager::InstallableWebAppCheckResult::kNoAlreadyInstalled,
manager->GetInstallableWebAppCheckResultForTesting());
EXPECT_FALSE(manager->IsPromptAvailableForTesting());
}
} // namespace banners } // namespace banners
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