Commit ab9c235a authored by Alan Cutter's avatar Alan Cutter Committed by Commit Bot

desktop-pwas: Make chrome.management.generateAppForLink() work with non-Extension web apps

This CL updates the Extensions API
chrome.management.generateAppForLink() to function with the new web
apps backend by translating the installed web app's properties into an
equivalent ExtensionInfo return value.

Bug: 945205
Change-Id: I250659fb6e6c210ca467558e95c00a779104f763
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2094852
Commit-Queue: Alan Cutter <alancutter@chromium.org>
Reviewed-by: default avatarDevlin <rdevlin.cronin@chromium.org>
Cr-Commit-Position: refs/heads/master@{#752382}
parent b153587a
......@@ -50,6 +50,7 @@
#include "extensions/browser/extension_prefs.h"
#include "extensions/browser/extension_registry.h"
#include "extensions/browser/extension_system.h"
#include "extensions/common/api/management.h"
#include "extensions/common/extension.h"
#include "services/data_decoder/public/cpp/data_decoder.h"
#include "third_party/blink/public/mojom/manifest/display_mode.mojom.h"
......@@ -234,7 +235,7 @@ class ChromeAppForLinkDelegate : public extensions::AppForLinkDelegate {
auto web_app_info = std::make_unique<WebApplicationInfo>();
web_app_info->title = base::UTF8ToUTF16(title);
web_app_info->app_url = launch_url;
web_app_info->display_mode = blink::mojom::DisplayMode::kBrowser;
web_app_info->display_mode = web_app::DisplayMode::kBrowser;
web_app_info->open_as_window = false;
if (!image_result.image.IsEmpty()) {
......@@ -253,6 +254,59 @@ class ChromeAppForLinkDelegate : public extensions::AppForLinkDelegate {
base::RetainedRef(function)));
}
extensions::api::management::ExtensionInfo CreateExtensionInfoFromWebApp(
const std::string& app_id,
content::BrowserContext* context) override {
auto* provider = web_app::WebAppProviderBase::GetProviderBase(
Profile::FromBrowserContext(context));
DCHECK(provider);
const web_app::AppRegistrar& registrar = provider->registrar();
extensions::api::management::ExtensionInfo info;
info.id = app_id;
info.name = registrar.GetAppShortName(app_id);
info.enabled = registrar.IsLocallyInstalled(app_id);
info.install_type =
extensions::api::management::EXTENSION_INSTALL_TYPE_OTHER;
info.is_app = true;
info.type = extensions::api::management::EXTENSION_TYPE_HOSTED_APP;
info.app_launch_url =
std::make_unique<std::string>(registrar.GetAppLaunchURL(app_id).spec());
info.icons =
std::make_unique<std::vector<extensions::api::management::IconInfo>>();
std::vector<WebApplicationIconInfo> icon_infos =
registrar.GetAppIconInfos(app_id);
info.icons->reserve(icon_infos.size());
for (const WebApplicationIconInfo& web_app_icon_info : icon_infos) {
extensions::api::management::IconInfo icon_info;
icon_info.size = web_app_icon_info.square_size_px;
icon_info.url = web_app_icon_info.url.spec();
info.icons->push_back(std::move(icon_info));
}
switch (registrar.GetAppDisplayMode(app_id)) {
case web_app::DisplayMode::kBrowser:
info.launch_type =
extensions::api::management::LAUNCH_TYPE_OPEN_AS_REGULAR_TAB;
break;
case web_app::DisplayMode::kMinimalUi:
case web_app::DisplayMode::kStandalone:
info.launch_type =
extensions::api::management::LAUNCH_TYPE_OPEN_AS_WINDOW;
break;
case web_app::DisplayMode::kFullscreen:
info.launch_type =
extensions::api::management::LAUNCH_TYPE_OPEN_FULL_SCREEN;
break;
case web_app::DisplayMode::kUndefined:
info.launch_type = extensions::api::management::LAUNCH_TYPE_NONE;
break;
}
return info;
}
// Used for favicon loading tasks.
base::CancelableTaskTracker cancelable_task_tracker_;
......
......@@ -21,6 +21,8 @@
#include "chrome/browser/web_applications/components/web_app_helpers.h"
#include "chrome/browser/web_applications/components/web_app_provider_base.h"
#include "chrome/browser/web_applications/test/test_web_app_ui_manager.h"
#include "chrome/browser/web_applications/test/web_app_test.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/chrome_switches.h"
#include "chrome/common/extensions/extension_constants.h"
#include "extensions/browser/api/management/management_api.h"
......@@ -36,6 +38,7 @@
using extensions::Extension;
using extensions::Manifest;
using web_app::ProviderType;
namespace {
......@@ -149,11 +152,38 @@ IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, CreateAppShortcut) {
"createAppShortcut.html"));
}
IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, GenerateAppForLink) {
class GenerateAppManagementApiTest
: public ExtensionManagementApiTest,
public ::testing::WithParamInterface<ProviderType> {
public:
void SetUp() override {
if (GetParam() == ProviderType::kWebApps) {
scoped_feature_list_.InitWithFeatures(
{features::kDesktopPWAsWithoutExtensions}, {});
} else {
DCHECK_EQ(GetParam(), ProviderType::kBookmarkApps);
scoped_feature_list_.InitWithFeatures(
{}, {features::kDesktopPWAsWithoutExtensions});
}
ExtensionManagementApiTest::SetUp();
}
private:
base::test::ScopedFeatureList scoped_feature_list_;
};
IN_PROC_BROWSER_TEST_P(GenerateAppManagementApiTest, GenerateAppForLink) {
ASSERT_TRUE(RunExtensionSubtest("management/test",
"generateAppForLink.html"));
}
INSTANTIATE_TEST_SUITE_P(All,
GenerateAppManagementApiTest,
::testing::Values(ProviderType::kBookmarkApps,
ProviderType::kWebApps),
web_app::ProviderTypeParamToString);
class InstallReplacementWebAppApiTest : public ExtensionManagementApiTest {
public:
InstallReplacementWebAppApiTest()
......
......@@ -41,19 +41,8 @@ var tests = [
url, title, null, function(data) {
assertEq("http://google.com/", data.appLaunchUrl);
assertEq(title, data.name);
// There is no favicon in the test browser, so only 4 icons will
// be created.
assertEq(6, data.icons.length);
assertEq(32, data.icons[0].size);
assertEq(48, data.icons[1].size);
assertEq(64, data.icons[2].size);
assertEq(96, data.icons[3].size);
assertEq(128, data.icons[4].size);
assertEq(256, data.icons[5].size);
chrome.management.getAll(callback(function(items) {
assertTrue(getItemNamed(items, title) != null);
}));
// There is no manifest for the test page so no icons are specified.
assertEq(0, data.icons.length);
});
},
......@@ -63,17 +52,8 @@ var tests = [
url, title, null, function(data) {
assertEq(url, data.appLaunchUrl);
assertEq(title, data.name);
assertEq(6, data.icons.length);
assertEq(32, data.icons[0].size);
assertEq(48, data.icons[1].size);
assertEq(64, data.icons[2].size);
assertEq(96, data.icons[3].size);
assertEq(128, data.icons[4].size);
assertEq(256, data.icons[5].size);
chrome.management.getAll(callback(function(items) {
assertTrue(getItemNamed(items, title) != null);
}));
// There is no manifest for the test page so no icons are specified.
assertEq(0, data.icons.length);
});
}
];
......
......@@ -855,18 +855,11 @@ ManagementGenerateAppForLinkFunction::~ManagementGenerateAppForLinkFunction() {}
void ManagementGenerateAppForLinkFunction::FinishCreateWebApp(
const std::string& web_app_id,
bool install_success) {
ExtensionRegistry* registry = ExtensionRegistry::Get(browser_context());
const Extension* extension =
registry->enabled_extensions().GetByID(web_app_id);
// |extension| is nullptr here if install succeeds with
// kDesktopPWAsWithoutExtensions mode enabled: there is no underlying
// extension for |web_app_id|.
// TODO(loyso): Rework generateAppForLink API: crbug.com/945205.
ResponseValue response;
if (install_success && extension) {
if (install_success) {
response = ArgumentList(management::GenerateAppForLink::Results::Create(
CreateExtensionInfo(nullptr, *extension, browser_context())));
app_for_link_delegate_->CreateExtensionInfoFromWebApp(
web_app_id, browser_context())));
} else {
response = Error(keys::kGenerateAppForLinkInstallError);
}
......
......@@ -8,6 +8,7 @@
#include "base/callback.h"
#include "extensions/browser/disable_reason.h"
#include "extensions/browser/uninstall_reason.h"
#include "extensions/common/api/management.h"
#include "extensions/common/constants.h"
#include "extensions/common/extension.h"
#include "extensions/common/extension_icon_set.h"
......@@ -43,6 +44,10 @@ class UninstallDialogDelegate {
class AppForLinkDelegate {
public:
virtual ~AppForLinkDelegate() {}
virtual extensions::api::management::ExtensionInfo
CreateExtensionInfoFromWebApp(const std::string& app_id,
content::BrowserContext* context) = 0;
};
class ManagementAPIDelegate {
......
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