Commit af64d3cf authored by Rahul Singh (EDGE)'s avatar Rahul Singh (EDGE) Committed by Commit Bot

DPWA: Add Web App Manifest updates for Shortcuts Menu

This CL adds support for Shortcuts Menu to be updated when an installed
PWA's manifest is updated.

Code in manifest_update_task.cc detects changes to the shortcuts member
of the manifest. It then triggers a reinstallation of the PWA per the
new info in the manifest.

As part of this flow we Unregister the existing Shortcuts Menu with the
OS and then Reregister it as part of the reinstallation flow.

To help detect changes in the manifest, this CL adds new methods to
AppRegistrar that help read existing ShortcutsMenu related info. These
methods have been implemented for both BookmarkApp and WebApp systems.

Testing: This CL adds Shortcuts Menu related browser tests in
manifest_update_manager_browsertest.cc. It also adds new tests in
web_app_install_task_unittest.cc for invoking UpdateWebAppFromInfo with
Shortcuts Menu data.

Design doc: https://docs.google.com/document/d/1KhHWikx1z-604LIjDKEdnL9MyezJklxM8kEYNnMLIQs/

Bug: 1087212
Change-Id: Ie825494ab137724e07e55bc12098cbfb386fb6ba
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2244111Reviewed-by: default avatarAlexey Baskakov <loyso@chromium.org>
Reviewed-by: default avatarAlan Cutter <alancutter@chromium.org>
Commit-Queue: Rahul Singh <rahsin@microsoft.com>
Cr-Commit-Position: refs/heads/master@{#780214}
parent 34984180
...@@ -107,6 +107,16 @@ class AppRegistrar { ...@@ -107,6 +107,16 @@ class AppRegistrar {
virtual std::vector<SquareSizePx> GetAppDownloadedIconSizes( virtual std::vector<SquareSizePx> GetAppDownloadedIconSizes(
const AppId& app_id) const = 0; const AppId& app_id) const = 0;
// Returns the "shortcuts" field from the app manifest, use |AppIconManager|
// to load shortcuts menu icons bitmaps data.
virtual std::vector<WebApplicationShortcutsMenuItemInfo> GetAppShortcutInfos(
const AppId& app_id) const = 0;
// Represents which icon sizes we successfully downloaded from the
// ShortcutInfos.
virtual std::vector<std::vector<SquareSizePx>>
GetAppDownloadedShortcutsMenuIconsSizes(const AppId& app_id) const = 0;
virtual std::vector<AppId> GetAppIds() const = 0; virtual std::vector<AppId> GetAppIds() const = 0;
// Safe downcast. // Safe downcast.
......
...@@ -25,19 +25,6 @@ namespace web_app { ...@@ -25,19 +25,6 @@ namespace web_app {
namespace { namespace {
void OnShortcutsInfoRetrievedRegisterShortcutsMenuWithOs(
const WebApplicationInfo& web_app_info,
std::unique_ptr<ShortcutInfo> shortcut_info) {
// |shortcut_data_dir| is located in per-app OS integration resources
// directory. See GetOsIntegrationResourcesDirectoryForApp function for more
// info.
base::FilePath shortcut_data_dir =
internals::GetShortcutDataDir(*shortcut_info);
RegisterShortcutsMenuWithOs(
std::move(shortcut_data_dir), std::move(shortcut_info->extension_id),
std::move(shortcut_info->profile_path), web_app_info);
}
AppShortcutManager::ShortcutCallback& GetShortcutUpdateCallbackForTesting() { AppShortcutManager::ShortcutCallback& GetShortcutUpdateCallbackForTesting() {
static base::NoDestructor<AppShortcutManager::ShortcutCallback> callback; static base::NoDestructor<AppShortcutManager::ShortcutCallback> callback;
return *callback; return *callback;
...@@ -163,16 +150,42 @@ void AppShortcutManager::CreateShortcuts(const AppId& app_id, ...@@ -163,16 +150,42 @@ void AppShortcutManager::CreateShortcuts(const AppId& app_id,
} }
void AppShortcutManager::RegisterShortcutsMenuWithOs( void AppShortcutManager::RegisterShortcutsMenuWithOs(
const WebApplicationInfo& web_app_info, const AppId& app_id,
const AppId& app_id) { const std::vector<WebApplicationShortcutsMenuItemInfo>& shortcut_infos,
const ShortcutsMenuIconsBitmaps& shortcuts_menu_icons_bitmaps) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
if (!web_app::ShouldRegisterShortcutsMenuWithOs() ||
suppress_shortcuts_for_testing()) {
return;
}
std::unique_ptr<ShortcutInfo> shortcut_info = BuildShortcutInfo(app_id);
if (!shortcut_info)
return;
// |shortcut_data_dir| is located in per-app OS integration resources
// directory. See GetOsIntegrationResourcesDirectoryForApp function for more
// info.
base::FilePath shortcut_data_dir =
internals::GetShortcutDataDir(*shortcut_info);
web_app::RegisterShortcutsMenuWithOs(
shortcut_info->extension_id, shortcut_info->profile_path,
shortcut_data_dir, shortcut_infos, shortcuts_menu_icons_bitmaps);
}
void AppShortcutManager::UnregisterShortcutsMenuWithOs(const AppId& app_id) {
DCHECK_CURRENTLY_ON(content::BrowserThread::UI); DCHECK_CURRENTLY_ON(content::BrowserThread::UI);
if (!web_app::ShouldRegisterShortcutsMenuWithOs()) if (!web_app::ShouldRegisterShortcutsMenuWithOs())
return; return;
GetShortcutInfoForApp( // TODO(https://crbug.com/1069298): Get profile_path without using
app_id, // shortcut_info.
base::BindOnce(&OnShortcutsInfoRetrievedRegisterShortcutsMenuWithOs, std::unique_ptr<ShortcutInfo> shortcut_info = BuildShortcutInfo(app_id);
web_app_info)); if (!shortcut_info)
return;
web_app::UnregisterShortcutsMenuWithOs(shortcut_info->extension_id,
shortcut_info->profile_path);
} }
void AppShortcutManager::OnShortcutsCreated(const AppId& app_id, void AppShortcutManager::OnShortcutsCreated(const AppId& app_id,
...@@ -206,7 +219,8 @@ void AppShortcutManager::OnShortcutInfoRetrievedCreateShortcuts( ...@@ -206,7 +219,8 @@ void AppShortcutManager::OnShortcutInfoRetrievedCreateShortcuts(
if (!base::FeatureList::IsEnabled( if (!base::FeatureList::IsEnabled(
features::kDesktopPWAsAppIconShortcutsMenu) && features::kDesktopPWAsAppIconShortcutsMenu) &&
web_app::ShouldRegisterShortcutsMenuWithOs()) { web_app::ShouldRegisterShortcutsMenuWithOs()) {
UnregisterShortcutsMenuWithOs(info->extension_id, info->profile_path); web_app::UnregisterShortcutsMenuWithOs(info->extension_id,
info->profile_path);
} }
internals::ScheduleCreatePlatformShortcuts( internals::ScheduleCreatePlatformShortcuts(
......
...@@ -65,11 +65,12 @@ class AppShortcutManager : public AppRegistrarObserver { ...@@ -65,11 +65,12 @@ class AppShortcutManager : public AppRegistrarObserver {
RegisterRunOnOsLoginCallback callback); RegisterRunOnOsLoginCallback callback);
// Registers a shortcuts menu for the web app's icon with the OS. // Registers a shortcuts menu for the web app's icon with the OS.
void RegisterShortcutsMenuWithOs(const WebApplicationInfo& web_app_info, void RegisterShortcutsMenuWithOs(
const AppId& app_id); const AppId& app_id,
const std::vector<WebApplicationShortcutsMenuItemInfo>& shortcut_infos,
const ShortcutsMenuIconsBitmaps& shortcuts_menu_icons_bitmaps);
// TODO(https://crbug.com/1069306): Implement UnregisterShortcutsMenuWithOS() void UnregisterShortcutsMenuWithOs(const AppId& app_id);
// to support local offline installs and uninstalls.
// Builds initial ShortcutInfo without |ShortcutInfo::favicon| being read. // Builds initial ShortcutInfo without |ShortcutInfo::favicon| being read.
virtual std::unique_ptr<ShortcutInfo> BuildShortcutInfo( virtual std::unique_ptr<ShortcutInfo> BuildShortcutInfo(
......
...@@ -14,10 +14,12 @@ bool ShouldRegisterShortcutsMenuWithOs() { ...@@ -14,10 +14,12 @@ bool ShouldRegisterShortcutsMenuWithOs() {
return false; return false;
} }
void RegisterShortcutsMenuWithOs(const base::FilePath& shortcut_data_dir, void RegisterShortcutsMenuWithOs(
const AppId& app_id, const AppId& app_id,
const base::FilePath& profile_path, const base::FilePath& profile_path,
const WebApplicationInfo& web_app_info) { const base::FilePath& shortcut_data_dir,
const std::vector<WebApplicationShortcutsMenuItemInfo>& shortcut_infos,
const ShortcutsMenuIconsBitmaps& shortcuts_menu_icons_bitmaps) {
NOTIMPLEMENTED(); NOTIMPLEMENTED();
DCHECK(ShouldRegisterShortcutsMenuWithOs()); DCHECK(ShouldRegisterShortcutsMenuWithOs());
} }
......
...@@ -8,13 +8,12 @@ ...@@ -8,13 +8,12 @@
#include <vector> #include <vector>
#include "chrome/browser/web_applications/components/web_app_id.h" #include "chrome/browser/web_applications/components/web_app_id.h"
#include "chrome/common/web_application_info.h"
namespace base { namespace base {
class FilePath; class FilePath;
} }
struct WebApplicationInfo;
namespace web_app { namespace web_app {
// Returns true if Shortcuts Menu is managed externally by the operating system, // Returns true if Shortcuts Menu is managed externally by the operating system,
...@@ -23,10 +22,12 @@ namespace web_app { ...@@ -23,10 +22,12 @@ namespace web_app {
bool ShouldRegisterShortcutsMenuWithOs(); bool ShouldRegisterShortcutsMenuWithOs();
// Does an OS specific registration of a Shortcuts Menu for the web app's icon. // Does an OS specific registration of a Shortcuts Menu for the web app's icon.
void RegisterShortcutsMenuWithOs(const base::FilePath& shortcut_data_dir, void RegisterShortcutsMenuWithOs(
const AppId& app_id, const AppId& app_id,
const base::FilePath& profile_path, const base::FilePath& profile_path,
const WebApplicationInfo& web_app_info); const base::FilePath& shortcut_data_dir,
const std::vector<WebApplicationShortcutsMenuItemInfo>& shortcut_infos,
const ShortcutsMenuIconsBitmaps& shortcuts_menu_icons_bitmaps);
// Deletes the ShortcutsMenu from the OS. This should be called during the // Deletes the ShortcutsMenu from the OS. This should be called during the
// uninstallation process. // uninstallation process.
......
...@@ -135,16 +135,18 @@ bool ShouldRegisterShortcutsMenuWithOs() { ...@@ -135,16 +135,18 @@ bool ShouldRegisterShortcutsMenuWithOs() {
return true; return true;
} }
void RegisterShortcutsMenuWithOsTask(const base::FilePath& shortcut_data_dir, void RegisterShortcutsMenuWithOsTask(
const AppId& app_id, const AppId& app_id,
const base::FilePath& profile_path, const base::FilePath& profile_path,
const WebApplicationInfo& web_app_info) { const base::FilePath& shortcut_data_dir,
const std::vector<WebApplicationShortcutsMenuItemInfo>& shortcut_infos,
const ShortcutsMenuIconsBitmaps& shortcuts_menu_icons_bitmaps) {
// Each entry in the ShortcutsMenu (JumpList on Windows) needs an icon in .ico // Each entry in the ShortcutsMenu (JumpList on Windows) needs an icon in .ico
// format. This helper writes these icon files to disk as a series of // format. This helper writes these icon files to disk as a series of
// <index>.ico files, where index is a particular shortcut's index in the // <index>.ico files, where index is a particular shortcut's index in the
// shortcuts vector. // shortcuts vector.
if (!WriteShortcutsMenuIconsToIcoFiles( if (!WriteShortcutsMenuIconsToIcoFiles(shortcut_data_dir,
shortcut_data_dir, web_app_info.shortcuts_menu_icons_bitmaps)) { shortcuts_menu_icons_bitmaps)) {
RecordRegistration(RegistrationResult::kFailedToWriteIcoFilesToDisk); RecordRegistration(RegistrationResult::kFailedToWriteIcoFilesToDisk);
return; return;
} }
...@@ -160,7 +162,6 @@ void RegisterShortcutsMenuWithOsTask(const base::FilePath& shortcut_data_dir, ...@@ -160,7 +162,6 @@ void RegisterShortcutsMenuWithOsTask(const base::FilePath& shortcut_data_dir,
ShellLinkItemList shortcut_list; ShellLinkItemList shortcut_list;
// Limit JumpList entries. // Limit JumpList entries.
const auto& shortcut_infos = web_app_info.shortcut_infos;
int num_entries = int num_entries =
std::min(static_cast<int>(shortcut_infos.size()), kMaxJumpListItems); std::min(static_cast<int>(shortcut_infos.size()), kMaxJumpListItems);
for (int i = 0; i < num_entries; i++) { for (int i = 0; i < num_entries; i++) {
...@@ -197,14 +198,17 @@ void RegisterShortcutsMenuWithOsTask(const base::FilePath& shortcut_data_dir, ...@@ -197,14 +198,17 @@ void RegisterShortcutsMenuWithOsTask(const base::FilePath& shortcut_data_dir,
RecordRegistration(RegistrationResult::kSuccess); RecordRegistration(RegistrationResult::kSuccess);
} }
void RegisterShortcutsMenuWithOs(const base::FilePath& shortcut_data_dir, void RegisterShortcutsMenuWithOs(
const AppId& app_id, const AppId& app_id,
const base::FilePath& profile_path, const base::FilePath& profile_path,
const WebApplicationInfo& web_app_info) { const base::FilePath& shortcut_data_dir,
const std::vector<WebApplicationShortcutsMenuItemInfo>& shortcut_infos,
const ShortcutsMenuIconsBitmaps& shortcuts_menu_icons_bitmaps) {
base::ThreadPool::PostTask( base::ThreadPool::PostTask(
FROM_HERE, {base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN}, FROM_HERE, {base::MayBlock(), base::TaskShutdownBehavior::BLOCK_SHUTDOWN},
base::BindOnce(&RegisterShortcutsMenuWithOsTask, shortcut_data_dir, base::BindOnce(&RegisterShortcutsMenuWithOsTask, app_id, profile_path,
app_id, profile_path, web_app_info)); shortcut_data_dir, shortcut_infos,
shortcuts_menu_icons_bitmaps));
} }
void UnregisterShortcutsMenuWithOs(const AppId& app_id, void UnregisterShortcutsMenuWithOs(const AppId& app_id,
......
...@@ -4,6 +4,7 @@ ...@@ -4,6 +4,7 @@
#include "chrome/browser/web_applications/extensions/bookmark_app_registrar.h" #include "chrome/browser/web_applications/extensions/bookmark_app_registrar.h"
#include <map>
#include <utility> #include <utility>
#include "base/one_shot_event.h" #include "base/one_shot_event.h"
...@@ -22,6 +23,8 @@ ...@@ -22,6 +23,8 @@
#include "extensions/browser/extension_registry.h" #include "extensions/browser/extension_registry.h"
#include "extensions/browser/unloaded_extension_reason.h" #include "extensions/browser/unloaded_extension_reason.h"
#include "extensions/common/extension.h" #include "extensions/common/extension.h"
#include "extensions/common/manifest_handlers/web_app_linked_shortcut_items.h"
#include "extensions/common/manifest_handlers/web_app_shortcut_icons_handler.h"
#include "url/gurl.h" #include "url/gurl.h"
using web_app::DisplayMode; using web_app::DisplayMode;
...@@ -214,6 +217,59 @@ std::vector<SquareSizePx> BookmarkAppRegistrar::GetAppDownloadedIconSizes( ...@@ -214,6 +217,59 @@ std::vector<SquareSizePx> BookmarkAppRegistrar::GetAppDownloadedIconSizes(
: std::vector<SquareSizePx>(); : std::vector<SquareSizePx>();
} }
std::vector<WebApplicationShortcutsMenuItemInfo>
BookmarkAppRegistrar::GetAppShortcutInfos(const web_app::AppId& app_id) const {
std::vector<WebApplicationShortcutsMenuItemInfo> result;
const Extension* extension = GetBookmarkAppDchecked(app_id);
if (!extension)
return result;
const WebAppLinkedShortcutItems& linked_shortcut_items =
WebAppLinkedShortcutItems::GetWebAppLinkedShortcutItems(extension);
result.reserve(linked_shortcut_items.shortcut_item_infos.size());
for (const WebAppLinkedShortcutItems::ShortcutItemInfo& linked_item_info :
linked_shortcut_items.shortcut_item_infos) {
WebApplicationShortcutsMenuItemInfo shortcut_item_info;
shortcut_item_info.name = linked_item_info.name;
shortcut_item_info.url = linked_item_info.url;
shortcut_item_info.shortcut_icon_infos.reserve(
linked_item_info.shortcut_item_icon_infos.size());
for (const WebAppLinkedShortcutItems::ShortcutItemInfo::IconInfo&
shortcut_item_icon_info :
linked_item_info.shortcut_item_icon_infos) {
WebApplicationShortcutsMenuItemInfo::Icon shortcut_icon_info;
shortcut_icon_info.square_size_px = shortcut_item_icon_info.size;
shortcut_icon_info.url = shortcut_item_icon_info.url;
shortcut_item_info.shortcut_icon_infos.emplace_back(
std::move(shortcut_icon_info));
}
result.emplace_back(std::move(shortcut_item_info));
}
return result;
}
std::vector<std::vector<SquareSizePx>>
BookmarkAppRegistrar::GetAppDownloadedShortcutsMenuIconsSizes(
const web_app::AppId& app_id) const {
std::vector<std::vector<SquareSizePx>> result;
const Extension* extension = GetBookmarkAppDchecked(app_id);
if (!extension)
return result;
const std::map<int, ExtensionIconSet>& shortcuts_menu_icons =
WebAppShortcutIconsInfo::GetShortcutIcons(extension);
result.reserve(shortcuts_menu_icons.size());
for (const auto& shortcuts_menu_icon : shortcuts_menu_icons) {
std::vector<SquareSizePx> shortcuts_menu_icon_sizes;
shortcuts_menu_icon_sizes.reserve(shortcuts_menu_icon.second.map().size());
for (const auto& icon_info : shortcuts_menu_icon.second.map()) {
shortcuts_menu_icon_sizes.emplace_back(icon_info.first);
}
result.push_back(std::move(shortcuts_menu_icon_sizes));
}
return result;
}
std::vector<web_app::AppId> BookmarkAppRegistrar::GetAppIds() const { std::vector<web_app::AppId> BookmarkAppRegistrar::GetAppIds() const {
std::vector<web_app::AppId> app_ids; std::vector<web_app::AppId> app_ids;
for (scoped_refptr<const Extension> app : for (scoped_refptr<const Extension> app :
......
...@@ -5,6 +5,9 @@ ...@@ -5,6 +5,9 @@
#ifndef CHROME_BROWSER_WEB_APPLICATIONS_EXTENSIONS_BOOKMARK_APP_REGISTRAR_H_ #ifndef CHROME_BROWSER_WEB_APPLICATIONS_EXTENSIONS_BOOKMARK_APP_REGISTRAR_H_
#define CHROME_BROWSER_WEB_APPLICATIONS_EXTENSIONS_BOOKMARK_APP_REGISTRAR_H_ #define CHROME_BROWSER_WEB_APPLICATIONS_EXTENSIONS_BOOKMARK_APP_REGISTRAR_H_
#include <string>
#include <vector>
#include "base/callback_forward.h" #include "base/callback_forward.h"
#include "base/scoped_observer.h" #include "base/scoped_observer.h"
#include "chrome/browser/web_applications/components/app_registrar.h" #include "chrome/browser/web_applications/components/app_registrar.h"
...@@ -51,6 +54,11 @@ class BookmarkAppRegistrar : public web_app::AppRegistrar, ...@@ -51,6 +54,11 @@ class BookmarkAppRegistrar : public web_app::AppRegistrar,
const web_app::AppId& app_id) const override; const web_app::AppId& app_id) const override;
std::vector<SquareSizePx> GetAppDownloadedIconSizes( std::vector<SquareSizePx> GetAppDownloadedIconSizes(
const web_app::AppId& app_id) const override; const web_app::AppId& app_id) const override;
std::vector<WebApplicationShortcutsMenuItemInfo> GetAppShortcutInfos(
const web_app::AppId& app_id) const override;
std::vector<std::vector<SquareSizePx>>
GetAppDownloadedShortcutsMenuIconsSizes(
const web_app::AppId& app_id) const override;
std::vector<web_app::AppId> GetAppIds() const override; std::vector<web_app::AppId> GetAppIds() const override;
web_app::WebAppRegistrar* AsWebAppRegistrar() override; web_app::WebAppRegistrar* AsWebAppRegistrar() override;
BookmarkAppRegistrar* AsBookmarkAppRegistrar() override; BookmarkAppRegistrar* AsBookmarkAppRegistrar() override;
......
...@@ -4,6 +4,12 @@ ...@@ -4,6 +4,12 @@
#include "chrome/browser/web_applications/manifest_update_task.h" #include "chrome/browser/web_applications/manifest_update_task.h"
#include <map>
#include <memory>
#include <utility>
#include <vector>
#include "base/feature_list.h"
#include "base/strings/utf_string_conversions.h" #include "base/strings/utf_string_conversions.h"
#include "chrome/browser/installable/installable_manager.h" #include "chrome/browser/installable/installable_manager.h"
#include "chrome/browser/web_applications/components/app_icon_manager.h" #include "chrome/browser/web_applications/components/app_icon_manager.h"
...@@ -13,6 +19,7 @@ ...@@ -13,6 +19,7 @@
#include "chrome/browser/web_applications/components/web_app_helpers.h" #include "chrome/browser/web_applications/components/web_app_helpers.h"
#include "chrome/browser/web_applications/components/web_app_install_utils.h" #include "chrome/browser/web_applications/components/web_app_install_utils.h"
#include "chrome/browser/web_applications/components/web_app_ui_manager.h" #include "chrome/browser/web_applications/components/web_app_ui_manager.h"
#include "chrome/common/chrome_features.h"
#include "chrome/common/web_application_info.h" #include "chrome/common/web_application_info.h"
#include "ui/gfx/skia_util.h" #include "ui/gfx/skia_util.h"
...@@ -128,6 +135,13 @@ bool ManifestUpdateTask::IsUpdateNeededForManifest() const { ...@@ -128,6 +135,13 @@ bool ManifestUpdateTask::IsUpdateNeededForManifest() const {
if (web_application_info_->icon_infos != registrar_.GetAppIconInfos(app_id_)) if (web_application_info_->icon_infos != registrar_.GetAppIconInfos(app_id_))
return true; return true;
if (base::FeatureList::IsEnabled(
features::kDesktopPWAsAppIconShortcutsMenu) &&
web_application_info_->shortcut_infos !=
registrar_.GetAppShortcutInfos(app_id_)) {
return true;
}
// TODO(crbug.com/926083): Check more manifest fields. // TODO(crbug.com/926083): Check more manifest fields.
return false; return false;
} }
......
...@@ -4,6 +4,8 @@ ...@@ -4,6 +4,8 @@
#include "chrome/browser/web_applications/test/test_app_registrar.h" #include "chrome/browser/web_applications/test/test_app_registrar.h"
#include <utility>
#include "base/callback.h" #include "base/callback.h"
#include "base/check.h" #include "base/check.h"
#include "base/notreached.h" #include "base/notreached.h"
...@@ -145,6 +147,19 @@ std::vector<SquareSizePx> TestAppRegistrar::GetAppDownloadedIconSizes( ...@@ -145,6 +147,19 @@ std::vector<SquareSizePx> TestAppRegistrar::GetAppDownloadedIconSizes(
return {}; return {};
} }
std::vector<WebApplicationShortcutsMenuItemInfo>
TestAppRegistrar::GetAppShortcutInfos(const AppId& app_id) const {
NOTIMPLEMENTED();
return {};
}
std::vector<std::vector<SquareSizePx>>
TestAppRegistrar::GetAppDownloadedShortcutsMenuIconsSizes(
const AppId& app_id) const {
NOTIMPLEMENTED();
return {{}};
}
std::vector<AppId> TestAppRegistrar::GetAppIds() const { std::vector<AppId> TestAppRegistrar::GetAppIds() const {
std::vector<AppId> result; std::vector<AppId> result;
for (const std::pair<const AppId, AppInfo>& it : installed_apps_) { for (const std::pair<const AppId, AppInfo>& it : installed_apps_) {
......
...@@ -5,7 +5,10 @@ ...@@ -5,7 +5,10 @@
#ifndef CHROME_BROWSER_WEB_APPLICATIONS_TEST_TEST_APP_REGISTRAR_H_ #ifndef CHROME_BROWSER_WEB_APPLICATIONS_TEST_TEST_APP_REGISTRAR_H_
#define CHROME_BROWSER_WEB_APPLICATIONS_TEST_TEST_APP_REGISTRAR_H_ #define CHROME_BROWSER_WEB_APPLICATIONS_TEST_TEST_APP_REGISTRAR_H_
#include <map>
#include <set> #include <set>
#include <string>
#include <vector>
#include "base/optional.h" #include "base/optional.h"
#include "chrome/browser/web_applications/components/app_registrar.h" #include "chrome/browser/web_applications/components/app_registrar.h"
...@@ -63,6 +66,10 @@ class TestAppRegistrar : public AppRegistrar { ...@@ -63,6 +66,10 @@ class TestAppRegistrar : public AppRegistrar {
const AppId& app_id) const override; const AppId& app_id) const override;
std::vector<SquareSizePx> GetAppDownloadedIconSizes( std::vector<SquareSizePx> GetAppDownloadedIconSizes(
const AppId& app_id) const override; const AppId& app_id) const override;
std::vector<WebApplicationShortcutsMenuItemInfo> GetAppShortcutInfos(
const AppId& app_id) const override;
std::vector<std::vector<SquareSizePx>>
GetAppDownloadedShortcutsMenuIconsSizes(const AppId& app_id) const override;
std::vector<AppId> GetAppIds() const override; std::vector<AppId> GetAppIds() const override;
WebAppRegistrar* AsWebAppRegistrar() override; WebAppRegistrar* AsWebAppRegistrar() override;
......
...@@ -681,8 +681,11 @@ void WebAppInstallTask::OnIconsRetrievedFinalizeUpdate( ...@@ -681,8 +681,11 @@ void WebAppInstallTask::OnIconsRetrievedFinalizeUpdate(
FilterAndResizeIconsGenerateMissing(web_app_info.get(), &icons_map); FilterAndResizeIconsGenerateMissing(web_app_info.get(), &icons_map);
install_finalizer_->FinalizeUpdate( install_finalizer_->FinalizeUpdate(
*web_app_info, base::BindOnce(&WebAppInstallTask::OnInstallFinalized, *web_app_info,
weak_ptr_factory_.GetWeakPtr())); base::BindOnce(&WebAppInstallTask::OnUpdateFinalizedRegisterShortcutsMenu,
weak_ptr_factory_.GetWeakPtr(),
web_app_info->shortcut_infos,
web_app_info->shortcuts_menu_icons_bitmaps));
} }
void WebAppInstallTask::OnDialogCompleted( void WebAppInstallTask::OnDialogCompleted(
...@@ -824,7 +827,9 @@ void WebAppInstallTask::OnShortcutsCreated( ...@@ -824,7 +827,9 @@ void WebAppInstallTask::OnShortcutsCreated(
if (base::FeatureList::IsEnabled( if (base::FeatureList::IsEnabled(
features::kDesktopPWAsAppIconShortcutsMenu) && features::kDesktopPWAsAppIconShortcutsMenu) &&
!web_app_info->shortcut_infos.empty()) { !web_app_info->shortcut_infos.empty()) {
shortcut_manager_->RegisterShortcutsMenuWithOs(*web_app_info, app_id); shortcut_manager_->RegisterShortcutsMenuWithOs(
app_id, web_app_info->shortcut_infos,
web_app_info->shortcuts_menu_icons_bitmaps);
} }
if (base::FeatureList::IsEnabled(features::kDesktopPWAsRunOnOsLogin)) { if (base::FeatureList::IsEnabled(features::kDesktopPWAsRunOnOsLogin)) {
...@@ -853,4 +858,28 @@ void WebAppInstallTask::OnRegisteredRunOnOsLogin( ...@@ -853,4 +858,28 @@ void WebAppInstallTask::OnRegisteredRunOnOsLogin(
CallInstallCallback(app_id, InstallResultCode::kSuccessNewInstall); CallInstallCallback(app_id, InstallResultCode::kSuccessNewInstall);
} }
// TODO(https://crbug.com/1087219): Move RegisterShortcutsMenuWithOs code into
// OsIntegrationManager when that becomes available.
void WebAppInstallTask::OnUpdateFinalizedRegisterShortcutsMenu(
const std::vector<WebApplicationShortcutsMenuItemInfo>& shortcut_infos,
const ShortcutsMenuIconsBitmaps& shortcuts_menu_icons_bitmaps,
const AppId& app_id,
InstallResultCode code) {
if (ShouldStopInstall())
return;
if (base::FeatureList::IsEnabled(
features::kDesktopPWAsAppIconShortcutsMenu) &&
!shortcut_infos.empty()) {
shortcut_manager_->RegisterShortcutsMenuWithOs(
app_id, shortcut_infos, shortcuts_menu_icons_bitmaps);
} else {
// Unregister shortcuts menu when feature is disabled or shortcut_infos is
// empty.
shortcut_manager_->UnregisterShortcutsMenuWithOs(app_id);
}
CallInstallCallback(app_id, code);
}
} // namespace web_app } // namespace web_app
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include "chrome/browser/web_applications/components/web_app_id.h" #include "chrome/browser/web_applications/components/web_app_id.h"
#include "chrome/browser/web_applications/components/web_app_install_utils.h" #include "chrome/browser/web_applications/components/web_app_install_utils.h"
#include "chrome/browser/web_applications/components/web_app_url_loader.h" #include "chrome/browser/web_applications/components/web_app_url_loader.h"
#include "chrome/common/web_application_info.h"
#include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_observer.h"
class GURL; class GURL;
...@@ -232,6 +233,11 @@ class WebAppInstallTask : content::WebContentsObserver { ...@@ -232,6 +233,11 @@ class WebAppInstallTask : content::WebContentsObserver {
bool shortcut_created); bool shortcut_created);
void OnRegisteredRunOnOsLogin(const AppId& app_id, void OnRegisteredRunOnOsLogin(const AppId& app_id,
bool registered_run_on_os_login); bool registered_run_on_os_login);
void OnUpdateFinalizedRegisterShortcutsMenu(
const std::vector<WebApplicationShortcutsMenuItemInfo>& shortcut_infos,
const ShortcutsMenuIconsBitmaps& shortcuts_menu_icons_bitmaps,
const AppId& app_id,
InstallResultCode code);
// Whether we should just obtain WebApplicationInfo instead of the actual // Whether we should just obtain WebApplicationInfo instead of the actual
// installation. // installation.
......
...@@ -131,6 +131,21 @@ std::vector<SquareSizePx> WebAppRegistrar::GetAppDownloadedIconSizes( ...@@ -131,6 +131,21 @@ std::vector<SquareSizePx> WebAppRegistrar::GetAppDownloadedIconSizes(
: std::vector<SquareSizePx>(); : std::vector<SquareSizePx>();
} }
std::vector<WebApplicationShortcutsMenuItemInfo>
WebAppRegistrar::GetAppShortcutInfos(const AppId& app_id) const {
auto* web_app = GetAppById(app_id);
return web_app ? web_app->shortcut_infos()
: std::vector<WebApplicationShortcutsMenuItemInfo>();
}
std::vector<std::vector<SquareSizePx>>
WebAppRegistrar::GetAppDownloadedShortcutsMenuIconsSizes(
const AppId& app_id) const {
auto* web_app = GetAppById(app_id);
return web_app ? web_app->downloaded_shortcuts_menu_icons_sizes()
: std::vector<std::vector<SquareSizePx>>();
}
std::vector<AppId> WebAppRegistrar::GetAppIds() const { std::vector<AppId> WebAppRegistrar::GetAppIds() const {
std::vector<AppId> app_ids; std::vector<AppId> app_ids;
......
...@@ -8,6 +8,8 @@ ...@@ -8,6 +8,8 @@
#include <map> #include <map>
#include <memory> #include <memory>
#include <string> #include <string>
#include <utility>
#include <vector>
#include "base/logging.h" #include "base/logging.h"
#include "base/macros.h" #include "base/macros.h"
...@@ -53,6 +55,10 @@ class WebAppRegistrar : public AppRegistrar, public ProfileManagerObserver { ...@@ -53,6 +55,10 @@ class WebAppRegistrar : public AppRegistrar, public ProfileManagerObserver {
const AppId& app_id) const override; const AppId& app_id) const override;
std::vector<SquareSizePx> GetAppDownloadedIconSizes( std::vector<SquareSizePx> GetAppDownloadedIconSizes(
const AppId& app_id) const override; const AppId& app_id) const override;
std::vector<WebApplicationShortcutsMenuItemInfo> GetAppShortcutInfos(
const AppId& app_id) const override;
std::vector<std::vector<SquareSizePx>>
GetAppDownloadedShortcutsMenuIconsSizes(const AppId& app_id) const override;
std::vector<AppId> GetAppIds() const override; std::vector<AppId> GetAppIds() const override;
WebAppRegistrar* AsWebAppRegistrar() override; WebAppRegistrar* AsWebAppRegistrar() override;
......
...@@ -84,3 +84,17 @@ std::ostream& operator<<(std::ostream& out, ...@@ -84,3 +84,17 @@ std::ostream& operator<<(std::ostream& out,
out << "none"; out << "none";
return out; return out;
} }
bool operator==(const WebApplicationShortcutsMenuItemInfo::Icon& icon1,
const WebApplicationShortcutsMenuItemInfo::Icon& icon2) {
return std::tie(icon1.url, icon1.square_size_px) ==
std::tie(icon2.url, icon2.square_size_px);
}
bool operator==(const WebApplicationShortcutsMenuItemInfo& shortcut_info1,
const WebApplicationShortcutsMenuItemInfo& shortcut_info2) {
return std::tie(shortcut_info1.name, shortcut_info1.url,
shortcut_info1.shortcut_icon_infos) ==
std::tie(shortcut_info2.name, shortcut_info2.url,
shortcut_info2.shortcut_icon_infos);
}
...@@ -154,4 +154,10 @@ std::ostream& operator<<(std::ostream& out, ...@@ -154,4 +154,10 @@ std::ostream& operator<<(std::ostream& out,
bool operator==(const WebApplicationIconInfo& icon_info1, bool operator==(const WebApplicationIconInfo& icon_info1,
const WebApplicationIconInfo& icon_info2); const WebApplicationIconInfo& icon_info2);
bool operator==(const WebApplicationShortcutsMenuItemInfo::Icon& icon1,
const WebApplicationShortcutsMenuItemInfo::Icon& icon2);
bool operator==(const WebApplicationShortcutsMenuItemInfo& shortcut_info1,
const WebApplicationShortcutsMenuItemInfo& shortcut_info2);
#endif // CHROME_COMMON_WEB_APPLICATION_INFO_H_ #endif // CHROME_COMMON_WEB_APPLICATION_INFO_H_
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