Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4095)

Unified Diff: chrome/browser/extensions/extension_app_api.cc

Issue 7187023: Adding an experimental app notification API. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixing clang errors Created 9 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/extensions/extension_app_api.cc
diff --git a/chrome/browser/extensions/extension_app_api.cc b/chrome/browser/extensions/extension_app_api.cc
new file mode 100644
index 0000000000000000000000000000000000000000..b5e8c12336acc74112f0c8f73b81f46f25c64783
--- /dev/null
+++ b/chrome/browser/extensions/extension_app_api.cc
@@ -0,0 +1,144 @@
+// Copyright (c) 2011 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/extension_app_api.h"
+
+#include "base/stl_util-inl.h"
+#include "base/values.h"
+#include "chrome/browser/extensions/extension_service.h"
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/common/extensions/extension.h"
+#include "chrome/common/render_messages.h"
+#include "content/common/notification_service.h"
+#include "content/common/notification_type.h"
+
+
+const char kBodyTextKey[] = "bodyText";
+const char kIconDataKey[] = "iconData";
+const char kLinkTextKey[] = "linkText";
+const char kLinkUrlKey[] = "linkUrl";
+const char kTitleKey[] = "title";
+
+const char kMissingLinkTextError[] =
+ "You must specify linkText if you use linkUrl";
+
+AppNotification::AppNotification() {}
+
+AppNotification::~AppNotification() {}
+
+AppNotificationManager::AppNotificationManager() {
+ registrar_.Add(this,
+ NotificationType::EXTENSION_UNINSTALLED,
+ NotificationService::AllSources());
+}
+
+AppNotificationManager::~AppNotificationManager() {}
+
+void AppNotificationManager::Add(AppNotification* item) {
+ CHECK(!item->extension_id.empty());
+ NotificationMap::iterator found = notifications_.find(item->extension_id);
+ if (found == notifications_.end()) {
+ notifications_[item->extension_id] = AppNotificationList();
+ found = notifications_.find(item->extension_id);
+ }
+ CHECK(found != notifications_.end());
+ AppNotificationList& list = (*found).second;
+ list.push_back(linked_ptr<AppNotification>(item));
+}
+
+const AppNotificationList* AppNotificationManager::GetAll(
+ const std::string& extension_id) {
+ if (ContainsKey(notifications_, extension_id))
+ return &notifications_[extension_id];
+ return NULL;
+}
+
+const AppNotification* AppNotificationManager::GetLast(
+ const std::string& extension_id) {
+ NotificationMap::iterator found = notifications_.find(extension_id);
+ if (found == notifications_.end())
+ return NULL;
+ const AppNotificationList& list = found->second;
+ return list.rbegin()->get();
+}
+
+void AppNotificationManager::ClearAll(const std::string& extension_id) {
+ NotificationMap::iterator found = notifications_.find(extension_id);
+ if (found != notifications_.end())
+ notifications_.erase(found);
+}
+
+void AppNotificationManager::Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ CHECK(type == NotificationType::EXTENSION_UNINSTALLED);
+ const std::string& id =
+ Details<UninstalledExtensionInfo>(details)->extension_id;
+ ClearAll(id);
+}
+
+bool AppNotifyFunction::RunImpl() {
+ DictionaryValue* details;
+ EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &details));
+ EXTENSION_FUNCTION_VALIDATE(details != NULL);
+
+ scoped_ptr<AppNotification> item(new AppNotification());
+ item->extension_id = extension_id();
+
+ if (details->HasKey(kTitleKey))
+ EXTENSION_FUNCTION_VALIDATE(details->GetString(kTitleKey, &item->title));
+
+ if (details->HasKey(kBodyTextKey))
+ EXTENSION_FUNCTION_VALIDATE(details->GetString(kBodyTextKey, &item->body));
+
+ if (details->HasKey(kLinkUrlKey)) {
+ std::string link_url;
+ EXTENSION_FUNCTION_VALIDATE(details->GetString(kLinkUrlKey, &link_url));
+ item->linkUrl = GURL(link_url);
+ if (!item->linkUrl.is_valid()) {
+ error_ = "Invalid url: " + link_url;
+ return false;
+ }
+ if (!details->HasKey(kLinkTextKey)) {
+ error_ = kMissingLinkTextError;
+ return false;
+ }
+ EXTENSION_FUNCTION_VALIDATE(details->GetString(kLinkTextKey,
+ &item->linkText));
+ }
+
+ if (details->HasKey(kIconDataKey)) {
+ BinaryValue* binary = NULL;
+ EXTENSION_FUNCTION_VALIDATE(details->GetBinary(kIconDataKey, &binary));
+ IPC::Message bitmap_pickle(binary->GetBuffer(), binary->GetSize());
+ void* iter = NULL;
+ SkBitmap bitmap;
+ EXTENSION_FUNCTION_VALIDATE(
+ IPC::ReadParam(&bitmap_pickle, &iter, &bitmap));
+ // TODO(asargent) - use the bitmap to set the NTP icon!
+ }
+
+ AppNotificationManager* manager =
+ profile()->GetExtensionService()->app_notification_manager();
+
+ manager->Add(item.release());
+
+ NotificationService::current()->Notify(
+ NotificationType::APP_NOTIFICATION_STATE_CHANGED,
+ Source<Profile>(profile_),
+ Details<const std::string>(&extension_id()));
+
+ return true;
+}
+
+bool AppClearAllNotificationsFunction::RunImpl() {
+ AppNotificationManager* manager =
+ profile()->GetExtensionService()->app_notification_manager();
+ manager->ClearAll(extension_id());
+ NotificationService::current()->Notify(
+ NotificationType::APP_NOTIFICATION_STATE_CHANGED,
+ Source<Profile>(profile_),
+ Details<const std::string>(&extension_id()));
+ return true;
+}
« no previous file with comments | « chrome/browser/extensions/extension_app_api.h ('k') | chrome/browser/extensions/extension_function_dispatcher.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698