Commit 5e4d5774 authored by Alan Cutter's avatar Alan Cutter Committed by Commit Bot

Suppress PWA install promotion if related Android app is already installed on Chrome OS

This CL hides the omnibox PWA install icon for installable sites if the
related_applications field lists an Android app that's already installed
on Chrome OS or could be installed and prefer_related_applications is true.

Example manifest field:
related_applications: [{
  "platform": "play",
  "id": "<App package name>"
}]

Bug: 949430
Change-Id: I1a8f4f5a8f0ec73f4919e30f54c0e9d82db6107d
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1631256
Commit-Queue: Alan Cutter <alancutter@chromium.org>
Reviewed-by: default avatarDominick Ng <dominickn@chromium.org>
Cr-Commit-Position: refs/heads/master@{#664648}
parent 4ef50e73
...@@ -21,12 +21,21 @@ ...@@ -21,12 +21,21 @@
#include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_registry.h"
#include "extensions/common/constants.h" #include "extensions/common/constants.h"
#if defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/arc/arc_util.h"
#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
#endif // defined(OS_CHROMEOS)
namespace { namespace {
// Platform values defined in: // Platform values defined in:
// https://github.com/w3c/manifest/wiki/Platforms // https://github.com/w3c/manifest/wiki/Platforms
const char kPlatformChromeWebStore[] = "chrome_web_store"; const char kPlatformChromeWebStore[] = "chrome_web_store";
#if defined(OS_CHROMEOS)
const char kPlatformPlay[] = "play";
#endif // defined(OS_CHROMEOS)
bool gDisableTriggeringForTesting = false; bool gDisableTriggeringForTesting = false;
} // namespace } // namespace
...@@ -61,24 +70,42 @@ void AppBannerManagerDesktop::InvalidateWeakPtrs() { ...@@ -61,24 +70,42 @@ void AppBannerManagerDesktop::InvalidateWeakPtrs() {
bool AppBannerManagerDesktop::IsSupportedAppPlatform( bool AppBannerManagerDesktop::IsSupportedAppPlatform(
const base::string16& platform) const { const base::string16& platform) const {
return base::EqualsASCII(platform, kPlatformChromeWebStore); if (base::EqualsASCII(platform, kPlatformChromeWebStore))
return true;
#if defined(OS_CHROMEOS)
if (base::EqualsASCII(platform, kPlatformPlay) &&
arc::IsArcAllowedForProfile(
Profile::FromBrowserContext(web_contents()->GetBrowserContext()))) {
return true;
}
#endif // defined(OS_CHROMEOS)
// TODO(https://crbug.com/949430): Implement for ARC apps on Chrome OS. return false;
} }
bool AppBannerManagerDesktop::IsRelatedAppInstalled( bool AppBannerManagerDesktop::IsRelatedAppInstalled(
const blink::Manifest::RelatedApplication& related_app) const { const blink::Manifest::RelatedApplication& related_app) const {
const base::string16& platform = related_app.platform.string(); std::string id = base::UTF16ToUTF8(related_app.id.string());
if (!base::EqualsASCII(platform, kPlatformChromeWebStore)) if (id.empty())
return false; return false;
std::string id = base::UTF16ToUTF8(related_app.id.string()); const base::string16& platform = related_app.platform.string();
return !id.empty() &&
extension_registry_->GetExtensionById( if (base::EqualsASCII(platform, kPlatformChromeWebStore)) {
id, extensions::ExtensionRegistry::ENABLED) != nullptr; return extension_registry_->GetExtensionById(
id, extensions::ExtensionRegistry::ENABLED) != nullptr;
}
#if defined(OS_CHROMEOS)
if (base::EqualsASCII(platform, kPlatformPlay)) {
ArcAppListPrefs* arc_app_list_prefs =
ArcAppListPrefs::Get(web_contents()->GetBrowserContext());
return arc_app_list_prefs && arc_app_list_prefs->GetPackage(id) != nullptr;
}
#endif // defined(OS_CHROMEOS)
// TODO(https://crbug.com/949430): Implement for ARC apps on Chrome OS. return false;
} }
bool AppBannerManagerDesktop::IsWebAppConsideredInstalled( bool AppBannerManagerDesktop::IsWebAppConsideredInstalled(
......
...@@ -31,6 +31,14 @@ ...@@ -31,6 +31,14 @@
#include "services/network/public/cpp/network_switches.h" #include "services/network/public/cpp/network_switches.h"
#include "ui/gfx/color_utils.h" #include "ui/gfx/color_utils.h"
#if defined(OS_CHROMEOS)
#include "chrome/browser/chromeos/arc/arc_util.h"
#include "chrome/browser/ui/app_list/arc/arc_app_list_prefs.h"
#include "components/arc/arc_util.h"
#include "components/arc/test/connection_holder_util.h"
#include "components/arc/test/fake_app_instance.h"
#endif // defined(OS_CHROMEOS)
class PwaInstallViewBrowserTest : public extensions::ExtensionBrowserTest { class PwaInstallViewBrowserTest : public extensions::ExtensionBrowserTest {
public: public:
PwaInstallViewBrowserTest() PwaInstallViewBrowserTest()
...@@ -53,11 +61,21 @@ class PwaInstallViewBrowserTest : public extensions::ExtensionBrowserTest { ...@@ -53,11 +61,21 @@ class PwaInstallViewBrowserTest : public extensions::ExtensionBrowserTest {
void SetUpCommandLine(base::CommandLine* command_line) override { void SetUpCommandLine(base::CommandLine* command_line) override {
extensions::ExtensionBrowserTest::SetUpCommandLine(command_line); extensions::ExtensionBrowserTest::SetUpCommandLine(command_line);
#if defined(OS_CHROMEOS)
arc::SetArcAvailableCommandLineForTesting(command_line);
#endif // defined(OS_CHROMEOS)
command_line->AppendSwitchASCII( command_line->AppendSwitchASCII(
network::switches::kUnsafelyTreatInsecureOriginAsSecure, network::switches::kUnsafelyTreatInsecureOriginAsSecure,
GetInstallableAppURL().GetOrigin().spec()); GetInstallableAppURL().GetOrigin().spec());
} }
void SetUpInProcessBrowserTestFixture() override {
#if defined(OS_CHROMEOS)
arc::ArcSessionManager::SetUiEnabledForTesting(false);
#endif // defined(OS_CHROMEOS)
}
void SetUpOnMainThread() override { void SetUpOnMainThread() override {
extensions::ExtensionBrowserTest::SetUpOnMainThread(); extensions::ExtensionBrowserTest::SetUpOnMainThread();
...@@ -415,3 +433,33 @@ IN_PROC_BROWSER_TEST_F(PwaInstallViewBrowserTest, ...@@ -415,3 +433,33 @@ IN_PROC_BROWSER_TEST_F(PwaInstallViewBrowserTest,
banners::AppBannerManager::GetInstallableWebAppName(web_contents_), banners::AppBannerManager::GetInstallableWebAppName(web_contents_),
"Manifest listing related chrome app")); "Manifest listing related chrome app"));
} }
#if defined(OS_CHROMEOS)
// Omnibox install promotion should not show if prefer_related_applications is
// true and an ARC app listed as related.
IN_PROC_BROWSER_TEST_F(PwaInstallViewBrowserTest,
ListedRelatedAndroidAppInstalled) {
arc::SetArcPlayStoreEnabledForProfile(browser()->profile(), true);
ArcAppListPrefs* arc_app_list_prefs =
ArcAppListPrefs::Get(browser()->profile());
auto app_instance =
std::make_unique<arc::FakeAppInstance>(arc_app_list_prefs);
arc_app_list_prefs->app_connection_holder()->SetInstance(app_instance.get());
WaitForInstanceReady(arc_app_list_prefs->app_connection_holder());
// Install test Android app.
arc::mojom::ArcPackageInfo package;
package.package_name = "com.example.app";
app_instance->InstallPackage(package.Clone());
NavigateToURL(
https_server_.GetURL("/banners/manifest_test_page.html?manifest="
"manifest_listing_related_android_app.json"));
ASSERT_TRUE(app_banner_manager_->WaitForInstallableCheck());
EXPECT_FALSE(pwa_install_view_->GetVisible());
EXPECT_TRUE(base::EqualsASCII(
banners::AppBannerManager::GetInstallableWebAppName(web_contents_),
"Manifest listing related android app"));
}
#endif // defined(OS_CHROMEOS)
{
"name": "Manifest listing related android app",
"icons": [
{
"src": "/banners/image-512px.png",
"sizes": "512x512",
"type": "image/png"
}
],
"scope": ".",
"start_url": ".",
"display": "standalone",
"prefer_related_applications": false,
"related_applications": [{
"platform": "play",
"id": "com.example.app"
}]
}
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