summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/api
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/extensions/api')
-rw-r--r--chrome/browser/extensions/api/management/management_api.cc87
-rw-r--r--chrome/browser/extensions/api/management/management_api.h30
-rw-r--r--chrome/browser/extensions/api/management/management_api_constants.cc6
-rw-r--r--chrome/browser/extensions/api/management/management_api_constants.h4
-rw-r--r--chrome/browser/extensions/api/management/management_apitest.cc14
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