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

Side by Side Diff: chrome/browser/extensions/extension_action_storage_manager.cc

Issue 1492073003: Handle more scale factors for extension Browser Action icons (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: better docs Created 5 years 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 unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/extension_action_storage_manager.h" 5 #include "chrome/browser/extensions/extension_action_storage_manager.h"
6 6
7 #include "base/base64.h" 7 #include "base/base64.h"
8 #include "base/bind.h" 8 #include "base/bind.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/strings/string_number_conversions.h" 10 #include "base/strings/string_number_conversions.h"
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
68 if (!base::Base64Decode(str, &raw_str)) 68 if (!base::Base64Decode(str, &raw_str))
69 return false; 69 return false;
70 70
71 bool success = gfx::PNGCodec::Decode( 71 bool success = gfx::PNGCodec::Decode(
72 reinterpret_cast<unsigned const char*>(raw_str.data()), raw_str.size(), 72 reinterpret_cast<unsigned const char*>(raw_str.data()), raw_str.size(),
73 bitmap); 73 bitmap);
74 return success; 74 return success;
75 } 75 }
76 76
77 // Conversion function for reading/writing to storage. 77 // Conversion function for reading/writing to storage.
78 std::string RepresentationToString(const gfx::ImageSkia& image, float scale) { 78 std::string BitmapToString(const SkBitmap& bitmap) {
79 SkBitmap bitmap = image.GetRepresentation(scale).sk_bitmap();
80 SkAutoLockPixels lock_image(bitmap); 79 SkAutoLockPixels lock_image(bitmap);
81 std::vector<unsigned char> data; 80 std::vector<unsigned char> data;
82 bool success = gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, false, &data); 81 bool success = gfx::PNGCodec::EncodeBGRASkBitmap(bitmap, false, &data);
83 if (!success) 82 if (!success)
84 return std::string(); 83 return std::string();
85 84
86 base::StringPiece raw_str( 85 base::StringPiece raw_str(
87 reinterpret_cast<const char*>(&data[0]), data.size()); 86 reinterpret_cast<const char*>(&data[0]), data.size());
88 std::string base64_str; 87 std::string base64_str;
89 base::Base64Encode(raw_str, &base64_str); 88 base::Base64Encode(raw_str, &base64_str);
90 return base64_str; 89 return base64_str;
91 } 90 }
92 91
93 // Set |action|'s default values to those specified in |dict|. 92 // Set |action|'s default values to those specified in |dict|.
94 void SetDefaultsFromValue(const base::DictionaryValue* dict, 93 void SetDefaultsFromValue(const base::DictionaryValue* dict,
95 ExtensionAction* action) { 94 ExtensionAction* action) {
96 const int kDefaultTabId = ExtensionAction::kDefaultTabId; 95 const int kDefaultTabId = ExtensionAction::kDefaultTabId;
97 std::string str_value; 96 std::string str_value;
98 int int_value; 97 int int_value;
Devlin 2015/12/03 00:00:38 while you're here, could you also initialize this?
Evan Stade 2015/12/04 01:29:53 Done.
99 SkBitmap bitmap;
100 gfx::ImageSkia icon;
101 98
102 // For each value, don't set it if it has been modified already. 99 // For each value, don't set it if it has been modified already.
103 if (dict->GetString(kPopupUrlStorageKey, &str_value) && 100 if (dict->GetString(kPopupUrlStorageKey, &str_value) &&
104 !action->HasPopupUrl(kDefaultTabId)) { 101 !action->HasPopupUrl(kDefaultTabId)) {
105 action->SetPopupUrl(kDefaultTabId, GURL(str_value)); 102 action->SetPopupUrl(kDefaultTabId, GURL(str_value));
106 } 103 }
107 if (dict->GetString(kTitleStorageKey, &str_value) && 104 if (dict->GetString(kTitleStorageKey, &str_value) &&
108 !action->HasTitle(kDefaultTabId)) { 105 !action->HasTitle(kDefaultTabId)) {
109 action->SetTitle(kDefaultTabId, str_value); 106 action->SetTitle(kDefaultTabId, str_value);
110 } 107 }
(...skipping 19 matching lines...) Expand all
130 break; 127 break;
131 case ACTIVE: 128 case ACTIVE:
132 action->SetIsVisible(kDefaultTabId, true); 129 action->SetIsVisible(kDefaultTabId, true);
133 break; 130 break;
134 } 131 }
135 } 132 }
136 133
137 const base::DictionaryValue* icon_value = NULL; 134 const base::DictionaryValue* icon_value = NULL;
138 if (dict->GetDictionary(kIconStorageKey, &icon_value) && 135 if (dict->GetDictionary(kIconStorageKey, &icon_value) &&
139 !action->HasIcon(kDefaultTabId)) { 136 !action->HasIcon(kDefaultTabId)) {
140 for (size_t i = 0; i < extension_misc::kNumExtensionActionIconSizes; i++) { 137 gfx::ImageSkia icon;
141 const extension_misc::IconRepresentationInfo& icon_info = 138 SkBitmap bitmap;
142 extension_misc::kExtensionActionIconSizes[i]; 139 for (base::DictionaryValue::Iterator iter(*icon_value); !iter.IsAtEnd();
143 if (icon_value->GetString(icon_info.size_string, &str_value) && 140 iter.Advance()) {
144 StringToSkBitmap(str_value, &bitmap)) { 141 int icon_size = 0;
142 std::string icon_string;
143 if (base::StringToInt(iter.key(), &icon_size) &&
144 iter.value().GetAsString(&icon_string) &&
145 StringToSkBitmap(icon_string, &bitmap)) {
145 CHECK(!bitmap.isNull()); 146 CHECK(!bitmap.isNull());
146 float scale = ui::GetScaleForScaleFactor(icon_info.scale); 147 float scale =
148 static_cast<float>(ExtensionAction::ActionIconSize()) / icon_size;
147 icon.AddRepresentation(gfx::ImageSkiaRep(bitmap, scale)); 149 icon.AddRepresentation(gfx::ImageSkiaRep(bitmap, scale));
148 } 150 }
149 } 151 }
150 action->SetIcon(kDefaultTabId, gfx::Image(icon)); 152 action->SetIcon(kDefaultTabId, gfx::Image(icon));
151 } 153 }
152 } 154 }
153 155
154 // Store |action|'s default values in a DictionaryValue for use in storing to 156 // Store |action|'s default values in a DictionaryValue for use in storing to
155 // disk. 157 // disk.
156 scoped_ptr<base::DictionaryValue> DefaultsToValue(ExtensionAction* action) { 158 scoped_ptr<base::DictionaryValue> DefaultsToValue(ExtensionAction* action) {
157 const int kDefaultTabId = ExtensionAction::kDefaultTabId; 159 const int kDefaultTabId = ExtensionAction::kDefaultTabId;
158 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue()); 160 scoped_ptr<base::DictionaryValue> dict(new base::DictionaryValue());
159 161
160 dict->SetString(kPopupUrlStorageKey, 162 dict->SetString(kPopupUrlStorageKey,
161 action->GetPopupUrl(kDefaultTabId).spec()); 163 action->GetPopupUrl(kDefaultTabId).spec());
162 dict->SetString(kTitleStorageKey, action->GetTitle(kDefaultTabId)); 164 dict->SetString(kTitleStorageKey, action->GetTitle(kDefaultTabId));
163 dict->SetString(kBadgeTextStorageKey, action->GetBadgeText(kDefaultTabId)); 165 dict->SetString(kBadgeTextStorageKey, action->GetBadgeText(kDefaultTabId));
164 dict->SetString( 166 dict->SetString(
165 kBadgeBackgroundColorStorageKey, 167 kBadgeBackgroundColorStorageKey,
166 SkColorToRawString(action->GetBadgeBackgroundColor(kDefaultTabId))); 168 SkColorToRawString(action->GetBadgeBackgroundColor(kDefaultTabId)));
167 dict->SetString(kBadgeTextColorStorageKey, 169 dict->SetString(kBadgeTextColorStorageKey,
168 SkColorToRawString(action->GetBadgeTextColor(kDefaultTabId))); 170 SkColorToRawString(action->GetBadgeTextColor(kDefaultTabId)));
169 dict->SetInteger(kAppearanceStorageKey, 171 dict->SetInteger(kAppearanceStorageKey,
170 action->GetIsVisible(kDefaultTabId) ? ACTIVE : INVISIBLE); 172 action->GetIsVisible(kDefaultTabId) ? ACTIVE : INVISIBLE);
171 173
172 gfx::ImageSkia icon = 174 gfx::ImageSkia icon =
173 action->GetExplicitlySetIcon(kDefaultTabId).AsImageSkia(); 175 action->GetExplicitlySetIcon(kDefaultTabId).AsImageSkia();
174 if (!icon.isNull()) { 176 if (!icon.isNull()) {
175 scoped_ptr<base::DictionaryValue> icon_value(new base::DictionaryValue()); 177 scoped_ptr<base::DictionaryValue> icon_value(new base::DictionaryValue());
176 for (size_t i = 0; i < extension_misc::kNumExtensionActionIconSizes; i++) { 178 std::vector<gfx::ImageSkiaRep> image_reps = icon.image_reps();
177 const extension_misc::IconRepresentationInfo& icon_info = 179 for (const gfx::ImageSkiaRep& rep : image_reps) {
178 extension_misc::kExtensionActionIconSizes[i]; 180 int size = static_cast<int>(rep.scale() * icon.width());
179 float scale = ui::GetScaleForScaleFactor(icon_info.scale); 181 std::string size_string = base::IntToString(size);
180 if (icon.HasRepresentation(scale)) { 182 icon_value->SetString(size_string, BitmapToString(rep.sk_bitmap()));
181 icon_value->SetString(icon_info.size_string,
182 RepresentationToString(icon, scale));
183 }
184 } 183 }
185 dict->Set(kIconStorageKey, icon_value.release()); 184 dict->Set(kIconStorageKey, icon_value.Pass());
186 } 185 }
187 return dict.Pass(); 186 return dict;
188 } 187 }
189 188
190 } // namespace 189 } // namespace
191 190
192 ExtensionActionStorageManager::ExtensionActionStorageManager( 191 ExtensionActionStorageManager::ExtensionActionStorageManager(
193 content::BrowserContext* context) 192 content::BrowserContext* context)
194 : browser_context_(context), 193 : browser_context_(context),
195 extension_action_observer_(this), 194 extension_action_observer_(this),
196 extension_registry_observer_(this), 195 extension_registry_observer_(this),
197 weak_factory_(this) { 196 weak_factory_(this) {
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after
271 return; 270 return;
272 271
273 SetDefaultsFromValue(dict, browser_action); 272 SetDefaultsFromValue(dict, browser_action);
274 } 273 }
275 274
276 StateStore* ExtensionActionStorageManager::GetStateStore() { 275 StateStore* ExtensionActionStorageManager::GetStateStore() {
277 return ExtensionSystem::Get(browser_context_)->state_store(); 276 return ExtensionSystem::Get(browser_context_)->state_store();
278 } 277 }
279 278
280 } // namespace extensions 279 } // namespace extensions
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698