// 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/values.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_notification_types.h" #include "chrome/common/extensions/extension.h" const char kBodyTextKey[] = "bodyText"; const char kExtensionIdKey[] = "extensionId"; const char kLinkTextKey[] = "linkText"; const char kLinkUrlKey[] = "linkUrl"; const char kTitleKey[] = "title"; const char kInvalidExtensionIdError[] = "Invalid extension id"; const char kMissingLinkTextError[] = "You must specify linkText if you use linkUrl"; bool AppNotifyFunction::RunImpl() { DictionaryValue* details; EXTENSION_FUNCTION_VALIDATE(args_->GetDictionary(0, &details)); EXTENSION_FUNCTION_VALIDATE(details != NULL); // TODO(asargent) remove this before the API leaves experimental. std::string id = extension_id(); if (details->HasKey(kExtensionIdKey)) { EXTENSION_FUNCTION_VALIDATE(details->GetString(kExtensionIdKey, &id)); if (!profile()->GetExtensionService()->GetExtensionById(id, true)) { error_ = kInvalidExtensionIdError; return false; } } std::string title; if (details->HasKey(kTitleKey)) EXTENSION_FUNCTION_VALIDATE(details->GetString(kTitleKey, &title)); std::string body; if (details->HasKey(kBodyTextKey)) EXTENSION_FUNCTION_VALIDATE(details->GetString(kBodyTextKey, &body)); scoped_ptr item(new AppNotification(title, body)); if (details->HasKey(kLinkUrlKey)) { std::string link_url; EXTENSION_FUNCTION_VALIDATE(details->GetString(kLinkUrlKey, &link_url)); item->set_link_url(GURL(link_url)); if (!item->link_url().is_valid()) { error_ = "Invalid url: " + link_url; return false; } if (!details->HasKey(kLinkTextKey)) { error_ = kMissingLinkTextError; return false; } std::string link_text; EXTENSION_FUNCTION_VALIDATE(details->GetString(kLinkTextKey, &link_text)); item->set_link_text(link_text); } AppNotificationManager* manager = profile()->GetExtensionService()->app_notification_manager(); manager->Add(id, item.release()); NotificationService::current()->Notify( chrome::NOTIFICATION_APP_NOTIFICATION_STATE_CHANGED, Source(profile_), Details(&id)); return true; } bool AppClearAllNotificationsFunction::RunImpl() { std::string id = extension_id(); DictionaryValue* details = NULL; if (args_->GetDictionary(0, &details) && details->HasKey(kExtensionIdKey)) { EXTENSION_FUNCTION_VALIDATE(details->GetString(kExtensionIdKey, &id)); if (!profile()->GetExtensionService()->GetExtensionById(id, true)) { error_ = kInvalidExtensionIdError; return false; } } AppNotificationManager* manager = profile()->GetExtensionService()->app_notification_manager(); manager->ClearAll(id); NotificationService::current()->Notify( chrome::NOTIFICATION_APP_NOTIFICATION_STATE_CHANGED, Source(profile_), Details(&id)); return true; }