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

Unified Diff: chrome/browser/extensions/api/extension_action/extension_action_api.cc

Issue 502033003: Move ExtensionActionStorageManager out of extension_action_api.* (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Latest master for CQ Created 6 years, 4 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/api/extension_action/extension_action_api.cc
diff --git a/chrome/browser/extensions/api/extension_action/extension_action_api.cc b/chrome/browser/extensions/api/extension_action/extension_action_api.cc
index c5bd072967886b92167df700657358b75713e9b8..291aac2d7ccbc504473a9e8a75c4976e418803f2 100644
--- a/chrome/browser/extensions/api/extension_action/extension_action_api.cc
+++ b/chrome/browser/extensions/api/extension_action/extension_action_api.cc
@@ -4,14 +4,10 @@
#include "chrome/browser/extensions/api/extension_action/extension_action_api.h"
-#include "base/base64.h"
#include "base/lazy_instance.h"
#include "base/strings/string_number_conversions.h"
-#include "base/strings/string_util.h"
#include "base/values.h"
#include "chrome/browser/extensions/active_script_controller.h"
-#include "chrome/browser/extensions/api/extension_action/extension_page_actions_api_constants.h"
-#include "chrome/browser/extensions/extension_action.h"
#include "chrome/browser/extensions/extension_action_manager.h"
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/extensions/extension_toolbar_model.h"
@@ -25,51 +21,23 @@
#include "chrome/browser/ui/tabs/tab_strip_model.h"
#include "chrome/common/extensions/api/extension_action/action_info.h"
#include "chrome/common/render_messages.h"
-#include "content/public/browser/navigation_entry.h"
#include "content/public/browser/notification_service.h"
#include "extensions/browser/event_router.h"
#include "extensions/browser/extension_function_registry.h"
#include "extensions/browser/extension_host.h"
#include "extensions/browser/extension_registry.h"
-#include "extensions/browser/extension_system.h"
#include "extensions/browser/image_util.h"
#include "extensions/browser/notification_types.h"
-#include "extensions/browser/state_store.h"
#include "extensions/common/error_utils.h"
-#include "ui/gfx/codec/png_codec.h"
#include "ui/gfx/image/image.h"
#include "ui/gfx/image/image_skia.h"
using content::WebContents;
-namespace page_actions_keys = extension_page_actions_api_constants;
-
namespace extensions {
namespace {
-const char kBrowserActionStorageKey[] = "browser_action";
-const char kPopupUrlStorageKey[] = "poupup_url";
-const char kTitleStorageKey[] = "title";
-const char kIconStorageKey[] = "icon";
-const char kBadgeTextStorageKey[] = "badge_text";
-const char kBadgeBackgroundColorStorageKey[] = "badge_background_color";
-const char kBadgeTextColorStorageKey[] = "badge_text_color";
-const char kAppearanceStorageKey[] = "appearance";
-
-// Only add values to the end of this enum, since it's stored in the user's
-// Extension State, under the kAppearanceStorageKey. It represents the
-// ExtensionAction's default visibility.
-enum StoredAppearance {
- // The action icon is hidden.
- INVISIBLE = 0,
- // The action is trying to get the user's attention but isn't yet
- // running on the page. Was only used for script badges.
- OBSOLETE_WANTS_ATTENTION = 1,
- // The action icon is visible with its normal appearance.
- ACTIVE = 2,
-};
-
// Whether the browser action is visible in the toolbar.
const char kBrowserActionVisible[] = "browser_action_visible";
@@ -82,156 +50,6 @@ const char kOpenPopupError[] =
"error occurred.";
const char kInternalError[] = "Internal error.";
-struct IconRepresentationInfo {
- // Size as a string that will be used to retrieve representation value from
- // SetIcon function arguments.
- const char* size_string;
- // Scale factor for which the represantion should be used.
- ui::ScaleFactor scale;
-};
-
-const IconRepresentationInfo kIconSizes[] = {
- { "19", ui::SCALE_FACTOR_100P },
- { "38", ui::SCALE_FACTOR_200P }
-};
-
-// Conversion function for reading/writing to storage.
-SkColor RawStringToSkColor(const std::string& str) {
- uint64 value = 0;
- base::StringToUint64(str, &value);
- SkColor color = static_cast<SkColor>(value);
- DCHECK(value == color); // ensure value fits into color's 32 bits
- return color;
-}
-
-// Conversion function for reading/writing to storage.
-std::string SkColorToRawString(SkColor color) {
- return base::Uint64ToString(color);
-}
-
-// Conversion function for reading/writing to storage.
-bool StringToSkBitmap(const std::string& str, SkBitmap* bitmap) {
- // TODO(mpcomplete): Remove the base64 encode/decode step when
- // http://crbug.com/140546 is fixed.
- std::string raw_str;
- if (!base::Base64Decode(str, &raw_str))
- return false;
-
- bool success = gfx::PNGCodec::Decode(
- reinterpret_cast<unsigned const char*>(raw_str.data()), raw_str.size(),
- bitmap);
- return success;
-}
-
-// Conversion function for reading/writing to storage.
-std::string RepresentationToString(const gfx::ImageSkia& image, float scale) {
- SkBitmap bitmap = image.GetRepresentation(scale).sk_bitmap();
- SkAutoLockPixels lock_image(bitmap);
- std::vector<unsigned char> data;
- bool success = gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, false, &data);
- if (!success)
- return std::string();
-
- base::StringPiece raw_str(
- reinterpret_cast<const char*>(&data[0]), data.size());
- std::string base64_str;
- base::Base64Encode(raw_str, &base64_str);
- return base64_str;
-}
-
-// Set |action|'s default values to those specified in |dict|.
-void SetDefaultsFromValue(const base::DictionaryValue* dict,
- ExtensionAction* action) {
- const int kDefaultTabId = ExtensionAction::kDefaultTabId;
- std::string str_value;
- int int_value;
- SkBitmap bitmap;
- gfx::ImageSkia icon;
-
- // For each value, don't set it if it has been modified already.
- if (dict->GetString(kPopupUrlStorageKey, &str_value) &&
- !action->HasPopupUrl(kDefaultTabId)) {
- action->SetPopupUrl(kDefaultTabId, GURL(str_value));
- }
- if (dict->GetString(kTitleStorageKey, &str_value) &&
- !action->HasTitle(kDefaultTabId)) {
- action->SetTitle(kDefaultTabId, str_value);
- }
- if (dict->GetString(kBadgeTextStorageKey, &str_value) &&
- !action->HasBadgeText(kDefaultTabId)) {
- action->SetBadgeText(kDefaultTabId, str_value);
- }
- if (dict->GetString(kBadgeBackgroundColorStorageKey, &str_value) &&
- !action->HasBadgeBackgroundColor(kDefaultTabId)) {
- action->SetBadgeBackgroundColor(kDefaultTabId,
- RawStringToSkColor(str_value));
- }
- if (dict->GetString(kBadgeTextColorStorageKey, &str_value) &&
- !action->HasBadgeTextColor(kDefaultTabId)) {
- action->SetBadgeTextColor(kDefaultTabId, RawStringToSkColor(str_value));
- }
- if (dict->GetInteger(kAppearanceStorageKey, &int_value) &&
- !action->HasIsVisible(kDefaultTabId)) {
- switch (int_value) {
- case INVISIBLE:
- case OBSOLETE_WANTS_ATTENTION:
- action->SetIsVisible(kDefaultTabId, false);
- break;
- case ACTIVE:
- action->SetIsVisible(kDefaultTabId, true);
- break;
- }
- }
-
- const base::DictionaryValue* icon_value = NULL;
- if (dict->GetDictionary(kIconStorageKey, &icon_value) &&
- !action->HasIcon(kDefaultTabId)) {
- for (size_t i = 0; i < arraysize(kIconSizes); i++) {
- if (icon_value->GetString(kIconSizes[i].size_string, &str_value) &&
- StringToSkBitmap(str_value, &bitmap)) {
- CHECK(!bitmap.isNull());
- float scale = ui::GetScaleForScaleFactor(kIconSizes[i].scale);
- icon.AddRepresentation(gfx::ImageSkiaRep(bitmap, scale));
- }
- }
- action->SetIcon(kDefaultTabId, gfx::Image(icon));
- }
-}
-
-// Store |action|'s default values in a DictionaryValue for use in storing to
-// disk.
-scoped_ptr<base::DictionaryValue> DefaultsToValue(ExtensionAction* action) {
- const int kDefaultTabId = ExtensionAction::kDefaultTabId;
- scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
-
- dict->SetString(kPopupUrlStorageKey,
- action->GetPopupUrl(kDefaultTabId).spec());
- dict->SetString(kTitleStorageKey, action->GetTitle(kDefaultTabId));
- dict->SetString(kBadgeTextStorageKey, action->GetBadgeText(kDefaultTabId));
- dict->SetString(
- kBadgeBackgroundColorStorageKey,
- SkColorToRawString(action->GetBadgeBackgroundColor(kDefaultTabId)));
- dict->SetString(kBadgeTextColorStorageKey,
- SkColorToRawString(action->GetBadgeTextColor(kDefaultTabId)));
- dict->SetInteger(kAppearanceStorageKey,
- action->GetIsVisible(kDefaultTabId) ? ACTIVE : INVISIBLE);
-
- gfx::ImageSkia icon = action->GetExplicitlySetIcon(kDefaultTabId);
- if (!icon.isNull()) {
- base::DictionaryValue* icon_value = new base::DictionaryValue();
- for (size_t i = 0; i < arraysize(kIconSizes); i++) {
- float scale = ui::GetScaleForScaleFactor(kIconSizes[i].scale);
- if (icon.HasRepresentation(scale)) {
- icon_value->SetString(
- kIconSizes[i].size_string,
- RepresentationToString(icon, scale));
- }
- }
- dict->Set(kIconStorageKey, icon_value);
- }
- return dict.Pass();
-}
-
} // namespace
//
@@ -486,91 +304,6 @@ void ExtensionActionAPI::Shutdown() {
}
//
-// ExtensionActionStorageManager
-//
-
-ExtensionActionStorageManager::ExtensionActionStorageManager(Profile* profile)
- : profile_(profile),
- extension_action_observer_(this),
- extension_registry_observer_(this) {
- extension_action_observer_.Add(ExtensionActionAPI::Get(profile_));
- extension_registry_observer_.Add(ExtensionRegistry::Get(profile_));
-
- StateStore* storage = ExtensionSystem::Get(profile_)->state_store();
- if (storage)
- storage->RegisterKey(kBrowserActionStorageKey);
-}
-
-ExtensionActionStorageManager::~ExtensionActionStorageManager() {
-}
-
-void ExtensionActionStorageManager::OnExtensionLoaded(
- content::BrowserContext* browser_context,
- const Extension* extension) {
- if (!ExtensionActionManager::Get(profile_)->GetBrowserAction(*extension))
- return;
-
- StateStore* storage = ExtensionSystem::Get(profile_)->state_store();
- if (storage) {
- storage->GetExtensionValue(
- extension->id(),
- kBrowserActionStorageKey,
- base::Bind(&ExtensionActionStorageManager::ReadFromStorage,
- AsWeakPtr(),
- extension->id()));
- }
-}
-
-void ExtensionActionStorageManager::OnExtensionActionUpdated(
- ExtensionAction* extension_action,
- content::WebContents* web_contents,
- content::BrowserContext* browser_context) {
- if (profile_ == browser_context &&
- extension_action->action_type() == ActionInfo::TYPE_BROWSER)
- WriteToStorage(extension_action);
-}
-
-void ExtensionActionStorageManager::OnExtensionActionAPIShuttingDown() {
- extension_action_observer_.RemoveAll();
-}
-
-void ExtensionActionStorageManager::WriteToStorage(
- ExtensionAction* extension_action) {
- StateStore* storage = ExtensionSystem::Get(profile_)->state_store();
- if (!storage)
- return;
-
- scoped_ptr<base::DictionaryValue> defaults =
- DefaultsToValue(extension_action);
- storage->SetExtensionValue(extension_action->extension_id(),
- kBrowserActionStorageKey,
- defaults.PassAs<base::Value>());
-}
-
-void ExtensionActionStorageManager::ReadFromStorage(
- const std::string& extension_id, scoped_ptr<base::Value> value) {
- const Extension* extension = ExtensionRegistry::Get(profile_)->
- enabled_extensions().GetByID(extension_id);
- if (!extension)
- return;
-
- ExtensionAction* browser_action =
- ExtensionActionManager::Get(profile_)->GetBrowserAction(*extension);
- if (!browser_action) {
- // This can happen if the extension is updated between startup and when the
- // storage read comes back, and the update removes the browser action.
- // http://crbug.com/349371
- return;
- }
-
- const base::DictionaryValue* dict = NULL;
- if (!value.get() || !value->GetAsDictionary(&dict))
- return;
-
- SetDefaultsFromValue(dict, browser_action);
-}
-
-//
// ExtensionActionFunction
//
@@ -689,11 +422,6 @@ bool ExtensionActionFunction::SetVisible(bool visible) {
return true;
}
-TabHelper& ExtensionActionFunction::tab_helper() const {
- CHECK(contents_);
- return *TabHelper::FromWebContents(contents_);
-}
-
bool ExtensionActionShowFunction::RunExtensionAction() {
return SetVisible(true);
}
@@ -712,15 +440,17 @@ bool ExtensionActionSetIconFunction::RunExtensionAction() {
if (details_->GetDictionary("imageData", &canvas_set)) {
gfx::ImageSkia icon;
// Extract icon representations from the ImageDataSet dictionary.
- for (size_t i = 0; i < arraysize(kIconSizes); i++) {
- base::BinaryValue* binary;
- if (canvas_set->GetBinary(kIconSizes[i].size_string, &binary)) {
+ for (size_t i = 0; i < extension_misc::kNumExtensionActionIconSizes; i++) {
+ base::BinaryValue* binary = NULL;
+ const extension_misc::IconRepresentationInfo& icon_info =
+ extension_misc::kExtensionActionIconSizes[i];
+ if (canvas_set->GetBinary(icon_info.size_string, &binary)) {
IPC::Message pickle(binary->GetBuffer(), binary->GetSize());
PickleIterator iter(pickle);
SkBitmap bitmap;
EXTENSION_FUNCTION_VALIDATE(IPC::ReadParam(&pickle, &iter, &bitmap));
CHECK(!bitmap.isNull());
- float scale = ui::GetScaleForScaleFactor(kIconSizes[i].scale);
+ float scale = ui::GetScaleForScaleFactor(icon_info.scale);
icon.AddRepresentation(gfx::ImageSkiaRep(bitmap, scale));
}
}
« no previous file with comments | « chrome/browser/extensions/api/extension_action/extension_action_api.h ('k') | chrome/browser/extensions/extension_action.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698