diff options
Diffstat (limited to 'chrome/browser/extensions/api')
5 files changed, 141 insertions, 0 deletions
diff --git a/chrome/browser/extensions/api/management/management_api.cc b/chrome/browser/extensions/api/management/management_api.cc index 189692a..3160c87 100644 --- a/chrome/browser/extensions/api/management/management_api.cc +++ b/chrome/browser/extensions/api/management/management_api.cc @@ -25,6 +25,7 @@ #include "chrome/browser/extensions/extension_ui_util.h" #include "chrome/browser/extensions/extension_uninstall_dialog.h" #include "chrome/browser/extensions/launch_util.h" +#include "chrome/browser/favicon/favicon_service_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser_dialogs.h" #include "chrome/browser/ui/browser_finder.h" @@ -56,6 +57,7 @@ #include "extensions/common/permissions/permission_set.h" #include "extensions/common/permissions/permissions_data.h" #include "extensions/common/url_pattern.h" +#include "ui/gfx/favicon_size.h" #if !defined(OS_ANDROID) #include "chrome/browser/ui/webui/ntp/core_app_launcher_handler.h" @@ -852,6 +854,91 @@ bool ManagementSetLaunchTypeFunction::RunSync() { return true; } +ManagementGenerateAppForLinkFunction::ManagementGenerateAppForLinkFunction() { +} + +ManagementGenerateAppForLinkFunction::~ManagementGenerateAppForLinkFunction() { +} + +void ManagementGenerateAppForLinkFunction::FinishCreateBookmarkApp( + const extensions::Extension* extension, + const WebApplicationInfo& web_app_info) { + if (extension) { + scoped_ptr<management::ExtensionInfo> info = + CreateExtensionInfo(*extension, ExtensionSystem::Get(GetProfile())); + results_ = management::GenerateAppForLink::Results::Create(*info); + + SendResponse(true); + Release(); + } else { + error_ = keys::kGenerateAppForLinkInstallError; + SendResponse(false); + Release(); + } +} + +void ManagementGenerateAppForLinkFunction::OnFaviconForApp( + const favicon_base::FaviconImageResult& image_result) { + WebApplicationInfo web_app; + web_app.title = base::UTF8ToUTF16(title_); + web_app.app_url = launch_url_; + + if (!image_result.image.IsEmpty()) { + WebApplicationInfo::IconInfo icon; + icon.data = image_result.image.AsBitmap(); + icon.width = icon.data.width(); + icon.height = icon.data.height(); + web_app.icons.push_back(icon); + } + + bookmark_app_helper_.reset(new BookmarkAppHelper(service(), web_app, NULL)); + bookmark_app_helper_->Create(base::Bind( + &ManagementGenerateAppForLinkFunction::FinishCreateBookmarkApp, this)); +} + +bool ManagementGenerateAppForLinkFunction::RunAsync() { + if (!user_gesture()) { + error_ = keys::kGestureNeededForGenerateAppForLinkError; + return false; + } + + scoped_ptr<management::GenerateAppForLink::Params> params( + management::GenerateAppForLink::Params::Create(*args_)); + EXTENSION_FUNCTION_VALIDATE(params.get()); + + GURL launch_url(params->url); + if (!launch_url.is_valid() || !launch_url.SchemeIsHTTPOrHTTPS()) { + error_ = ErrorUtils::FormatErrorMessage(keys::kInvalidURLError, + params->url); + return false; + } + + if (params->title.empty()) { + error_ = keys::kEmptyTitleError; + return false; + } + + FaviconService* favicon_service = + FaviconServiceFactory::GetForProfile(GetProfile(), + Profile::EXPLICIT_ACCESS); + DCHECK(favicon_service); + + title_ = params->title; + launch_url_ = launch_url; + + favicon_service->GetFaviconImageForURL( + FaviconService::FaviconForURLParams( + launch_url, favicon_base::FAVICON, gfx::kFaviconSize), + base::Bind(&ManagementGenerateAppForLinkFunction::OnFaviconForApp, this), + &cancelable_task_tracker_); + + // Matched with a Release() in OnExtensionLoaded(). + AddRef(); + + // Response is sent async in OnExtensionLoaded(). + return true; +} + ManagementEventRouter::ManagementEventRouter(Profile* profile) : profile_(profile) { int types[] = {chrome::NOTIFICATION_EXTENSION_INSTALLED_DEPRECATED, diff --git a/chrome/browser/extensions/api/management/management_api.h b/chrome/browser/extensions/api/management/management_api.h index 6c98306..264a08f 100644 --- a/chrome/browser/extensions/api/management/management_api.h +++ b/chrome/browser/extensions/api/management/management_api.h @@ -6,9 +6,13 @@ #define CHROME_BROWSER_EXTENSIONS_API_MANAGEMENT_MANAGEMENT_API_H_ #include "base/compiler_specific.h" +#include "base/task/cancelable_task_tracker.h" +#include "chrome/browser/extensions/bookmark_app_helper.h" #include "chrome/browser/extensions/chrome_extension_function.h" #include "chrome/browser/extensions/extension_install_prompt.h" #include "chrome/browser/extensions/extension_uninstall_dialog.h" +#include "chrome/common/web_application_info.h" +#include "components/favicon_base/favicon_types.h" #include "components/keyed_service/core/keyed_service.h" #include "content/public/browser/notification_observer.h" #include "content/public/browser/notification_registrar.h" @@ -200,6 +204,32 @@ class ManagementSetLaunchTypeFunction : public ManagementFunction { virtual bool RunSync() OVERRIDE; }; +class ManagementGenerateAppForLinkFunction : public AsyncManagementFunction { + public: + DECLARE_EXTENSION_FUNCTION("management.generateAppForLink", + MANAGEMENT_GENERATEAPPFORLINK); + + ManagementGenerateAppForLinkFunction(); + + protected: + virtual ~ManagementGenerateAppForLinkFunction(); + + virtual bool RunAsync() OVERRIDE; + + private: + void OnFaviconForApp(const favicon_base::FaviconImageResult& image_result); + void FinishCreateBookmarkApp(const extensions::Extension* extension, + const WebApplicationInfo& web_app_info); + + std::string title_; + GURL launch_url_; + + scoped_ptr<BookmarkAppHelper> bookmark_app_helper_; + + // Used for favicon loading tasks. + base::CancelableTaskTracker cancelable_task_tracker_; +}; + class ManagementEventRouter : public content::NotificationObserver { public: explicit ManagementEventRouter(Profile* profile); diff --git a/chrome/browser/extensions/api/management/management_api_constants.cc b/chrome/browser/extensions/api/management/management_api_constants.cc index 3251084..bb2e0cb 100644 --- a/chrome/browser/extensions/api/management/management_api_constants.cc +++ b/chrome/browser/extensions/api/management/management_api_constants.cc @@ -37,5 +37,11 @@ const char kGestureNeededForSetLaunchTypeError[] = "chrome.management.setLaunchType requires a user gesture."; const char kLaunchTypeNotAvailableError[] = "The launch type is not available for this app."; +const char kGestureNeededForGenerateAppForLinkError[] = + "chrome.management.generateAppForLink requires a user gesture."; +const char kInvalidURLError[] = "The URL \"*\" is invalid."; +const char kEmptyTitleError[] = "The title can not be empty."; +const char kGenerateAppForLinkInstallError[] = + "Failed to install the generated app."; } // namespace extension_management_api_constants diff --git a/chrome/browser/extensions/api/management/management_api_constants.h b/chrome/browser/extensions/api/management/management_api_constants.h index 2c96554..4592231 100644 --- a/chrome/browser/extensions/api/management/management_api_constants.h +++ b/chrome/browser/extensions/api/management/management_api_constants.h @@ -29,6 +29,10 @@ extern const char kCreateOnlyPackagedAppShortcutMac[]; extern const char kCreateShortcutCanceledError[]; extern const char kGestureNeededForSetLaunchTypeError[]; extern const char kLaunchTypeNotAvailableError[]; +extern const char kGestureNeededForGenerateAppForLinkError[]; +extern const char kInvalidURLError[]; +extern const char kEmptyTitleError[]; +extern const char kGenerateAppForLinkInstallError[]; } // namespace extension_management_api_constants diff --git a/chrome/browser/extensions/api/management/management_apitest.cc b/chrome/browser/extensions/api/management/management_apitest.cc index a275eaf0..ee0b508 100644 --- a/chrome/browser/extensions/api/management/management_apitest.cc +++ b/chrome/browser/extensions/api/management/management_apitest.cc @@ -149,6 +149,20 @@ IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, "createAppShortcutNotInStable.html")); } +IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, GenerateAppForLink) { + LoadExtensions(); + ASSERT_TRUE(RunExtensionSubtest("management/test", + "generateAppForLink.html")); +} + +IN_PROC_BROWSER_TEST_F(ExtensionManagementApiTest, + GenerateAppForLinkNotInStable) { + extensions::ScopedCurrentChannel channel( + chrome::VersionInfo::CHANNEL_STABLE); + ASSERT_TRUE(RunExtensionSubtest("management/test", + "generateAppForLinkNotInStable.html")); +} + // Fails often on Windows dbg bots. http://crbug.com/177163 #if defined(OS_WIN) #define MAYBE_ManagementPolicyAllowed DISABLED_ManagementPolicyAllowed |