| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_toolbar_model.h" | 5 #include "chrome/browser/extensions/extension_toolbar_model.h" |
| 6 | 6 |
| 7 #include <string> | 7 #include <string> |
| 8 | 8 |
| 9 #include "base/prefs/pref_service.h" | 9 #include "base/prefs/pref_service.h" |
| 10 #include "chrome/browser/chrome_notification_types.h" | 10 #include "chrome/browser/chrome_notification_types.h" |
| 11 #include "chrome/browser/extensions/api/extension_action/extension_action_api.h" | 11 #include "chrome/browser/extensions/api/extension_action/extension_action_api.h" |
| 12 #include "chrome/browser/extensions/extension_action.h" | 12 #include "chrome/browser/extensions/extension_action.h" |
| 13 #include "chrome/browser/extensions/extension_action_manager.h" | 13 #include "chrome/browser/extensions/extension_action_manager.h" |
| 14 #include "chrome/browser/extensions/extension_prefs.h" | 14 #include "chrome/browser/extensions/extension_prefs.h" |
| 15 #include "chrome/browser/extensions/extension_service.h" | 15 #include "chrome/browser/extensions/extension_service.h" |
| 16 #include "chrome/browser/extensions/extension_tab_util.h" | 16 #include "chrome/browser/extensions/extension_tab_util.h" |
| 17 #include "chrome/browser/extensions/extension_toolbar_model_factory.h" |
| 17 #include "chrome/browser/extensions/extension_util.h" | 18 #include "chrome/browser/extensions/extension_util.h" |
| 18 #include "chrome/browser/extensions/tab_helper.h" | 19 #include "chrome/browser/extensions/tab_helper.h" |
| 19 #include "chrome/browser/profiles/profile.h" | 20 #include "chrome/browser/profiles/profile.h" |
| 20 #include "chrome/browser/ui/browser.h" | 21 #include "chrome/browser/ui/browser.h" |
| 21 #include "chrome/browser/ui/tabs/tab_strip_model.h" | 22 #include "chrome/browser/ui/tabs/tab_strip_model.h" |
| 22 #include "chrome/common/extensions/extension.h" | 23 #include "chrome/common/extensions/extension.h" |
| 23 #include "chrome/common/extensions/feature_switch.h" | 24 #include "chrome/common/extensions/feature_switch.h" |
| 24 #include "chrome/common/pref_names.h" | 25 #include "chrome/common/pref_names.h" |
| 25 #include "content/public/browser/notification_details.h" | 26 #include "content/public/browser/notification_details.h" |
| 26 #include "content/public/browser/notification_source.h" | 27 #include "content/public/browser/notification_source.h" |
| (...skipping 15 matching lines...) Expand all Loading... |
| 42 return false; | 43 return false; |
| 43 } | 44 } |
| 44 | 45 |
| 45 } // namespace | 46 } // namespace |
| 46 | 47 |
| 47 bool ExtensionToolbarModel::Observer::BrowserActionShowPopup( | 48 bool ExtensionToolbarModel::Observer::BrowserActionShowPopup( |
| 48 const extensions::Extension* extension) { | 49 const extensions::Extension* extension) { |
| 49 return false; | 50 return false; |
| 50 } | 51 } |
| 51 | 52 |
| 52 ExtensionToolbarModel::ExtensionToolbarModel(ExtensionService* service) | 53 ExtensionToolbarModel::ExtensionToolbarModel( |
| 53 : service_(service), | 54 Profile* profile, |
| 54 prefs_(service->profile()->GetPrefs()), | 55 extensions::ExtensionPrefs* extension_prefs) |
| 56 : profile_(profile), |
| 57 extension_prefs_(extension_prefs), |
| 58 prefs_(profile_->GetPrefs()), |
| 55 extensions_initialized_(false), | 59 extensions_initialized_(false), |
| 56 weak_ptr_factory_(this) { | 60 weak_ptr_factory_(this) { |
| 57 DCHECK(service_); | |
| 58 | |
| 59 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, | 61 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_LOADED, |
| 60 content::Source<Profile>(service_->profile())); | 62 content::Source<Profile>(profile_)); |
| 61 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, | 63 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNLOADED, |
| 62 content::Source<Profile>(service_->profile())); | 64 content::Source<Profile>(profile_)); |
| 63 registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY, | 65 registrar_.Add(this, chrome::NOTIFICATION_EXTENSIONS_READY, |
| 64 content::Source<Profile>(service_->profile())); | 66 content::Source<Profile>(profile_)); |
| 65 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNINSTALLED, | 67 registrar_.Add(this, chrome::NOTIFICATION_EXTENSION_UNINSTALLED, |
| 66 content::Source<Profile>(service_->profile())); | 68 content::Source<Profile>(profile_)); |
| 67 registrar_.Add( | 69 registrar_.Add( |
| 68 this, chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED, | 70 this, chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED, |
| 69 content::Source<extensions::ExtensionPrefs>(service_->extension_prefs())); | 71 content::Source<extensions::ExtensionPrefs>(extension_prefs_)); |
| 70 | 72 |
| 71 visible_icon_count_ = prefs_->GetInteger(prefs::kExtensionToolbarSize); | 73 visible_icon_count_ = prefs_->GetInteger(prefs::kExtensionToolbarSize); |
| 72 | 74 |
| 73 pref_change_registrar_.Init(prefs_); | 75 pref_change_registrar_.Init(prefs_); |
| 74 pref_change_callback_ = | 76 pref_change_callback_ = |
| 75 base::Bind(&ExtensionToolbarModel::OnExtensionToolbarPrefChange, | 77 base::Bind(&ExtensionToolbarModel::OnExtensionToolbarPrefChange, |
| 76 base::Unretained(this)); | 78 base::Unretained(this)); |
| 77 pref_change_registrar_.Add(prefs::kExtensionToolbar, pref_change_callback_); | 79 pref_change_registrar_.Add(prefs::kExtensionToolbar, pref_change_callback_); |
| 78 } | 80 } |
| 79 | 81 |
| 80 ExtensionToolbarModel::~ExtensionToolbarModel() { | 82 ExtensionToolbarModel::~ExtensionToolbarModel() { |
| 81 } | 83 } |
| 82 | 84 |
| 85 // static |
| 86 ExtensionToolbarModel* ExtensionToolbarModel::Get(Profile* profile) { |
| 87 return ExtensionToolbarModelFactory::GetForProfile(profile); |
| 88 } |
| 89 |
| 83 void ExtensionToolbarModel::AddObserver(Observer* observer) { | 90 void ExtensionToolbarModel::AddObserver(Observer* observer) { |
| 84 observers_.AddObserver(observer); | 91 observers_.AddObserver(observer); |
| 85 } | 92 } |
| 86 | 93 |
| 87 void ExtensionToolbarModel::RemoveObserver(Observer* observer) { | 94 void ExtensionToolbarModel::RemoveObserver(Observer* observer) { |
| 88 observers_.RemoveObserver(observer); | 95 observers_.RemoveObserver(observer); |
| 89 } | 96 } |
| 90 | 97 |
| 91 void ExtensionToolbarModel::MoveBrowserAction(const Extension* extension, | 98 void ExtensionToolbarModel::MoveBrowserAction(const Extension* extension, |
| 92 int index) { | 99 int index) { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 137 const Extension* extension, | 144 const Extension* extension, |
| 138 Browser* browser, | 145 Browser* browser, |
| 139 GURL* popup_url_out, | 146 GURL* popup_url_out, |
| 140 bool should_grant) { | 147 bool should_grant) { |
| 141 content::WebContents* web_contents = NULL; | 148 content::WebContents* web_contents = NULL; |
| 142 int tab_id = 0; | 149 int tab_id = 0; |
| 143 if (!ExtensionTabUtil::GetDefaultTab(browser, &web_contents, &tab_id)) | 150 if (!ExtensionTabUtil::GetDefaultTab(browser, &web_contents, &tab_id)) |
| 144 return ACTION_NONE; | 151 return ACTION_NONE; |
| 145 | 152 |
| 146 ExtensionAction* browser_action = | 153 ExtensionAction* browser_action = |
| 147 extensions::ExtensionActionManager::Get(service_->profile())-> | 154 extensions::ExtensionActionManager::Get(profile_)-> |
| 148 GetBrowserAction(*extension); | 155 GetBrowserAction(*extension); |
| 149 | 156 |
| 150 // For browser actions, visibility == enabledness. | 157 // For browser actions, visibility == enabledness. |
| 151 if (!browser_action->GetIsVisible(tab_id)) | 158 if (!browser_action->GetIsVisible(tab_id)) |
| 152 return ACTION_NONE; | 159 return ACTION_NONE; |
| 153 | 160 |
| 154 if (should_grant) { | 161 if (should_grant) { |
| 155 extensions::TabHelper::FromWebContents(web_contents)-> | 162 extensions::TabHelper::FromWebContents(web_contents)-> |
| 156 active_tab_permission_granter()->GrantIfRequested(extension); | 163 active_tab_permission_granter()->GrantIfRequested(extension); |
| 157 } | 164 } |
| (...skipping 12 matching lines...) Expand all Loading... |
| 170 void ExtensionToolbarModel::SetVisibleIconCount(int count) { | 177 void ExtensionToolbarModel::SetVisibleIconCount(int count) { |
| 171 visible_icon_count_ = | 178 visible_icon_count_ = |
| 172 count == static_cast<int>(toolbar_items_.size()) ? -1 : count; | 179 count == static_cast<int>(toolbar_items_.size()) ? -1 : count; |
| 173 prefs_->SetInteger(prefs::kExtensionToolbarSize, visible_icon_count_); | 180 prefs_->SetInteger(prefs::kExtensionToolbarSize, visible_icon_count_); |
| 174 } | 181 } |
| 175 | 182 |
| 176 void ExtensionToolbarModel::Observe( | 183 void ExtensionToolbarModel::Observe( |
| 177 int type, | 184 int type, |
| 178 const content::NotificationSource& source, | 185 const content::NotificationSource& source, |
| 179 const content::NotificationDetails& details) { | 186 const content::NotificationDetails& details) { |
| 187 ExtensionService* extension_service = |
| 188 extensions::ExtensionSystem::Get(profile_)->extension_service(); |
| 189 if (!extension_service || !extension_service->is_ready()) |
| 190 return; |
| 191 |
| 180 if (type == chrome::NOTIFICATION_EXTENSIONS_READY) { | 192 if (type == chrome::NOTIFICATION_EXTENSIONS_READY) { |
| 181 InitializeExtensionList(); | 193 InitializeExtensionList(extension_service); |
| 182 return; | 194 return; |
| 183 } | 195 } |
| 184 | 196 |
| 185 if (!service_->is_ready()) | |
| 186 return; | |
| 187 | |
| 188 const Extension* extension = NULL; | 197 const Extension* extension = NULL; |
| 189 if (type == chrome::NOTIFICATION_EXTENSION_UNLOADED) { | 198 if (type == chrome::NOTIFICATION_EXTENSION_UNLOADED) { |
| 190 extension = content::Details<extensions::UnloadedExtensionInfo>( | 199 extension = content::Details<extensions::UnloadedExtensionInfo>( |
| 191 details)->extension; | 200 details)->extension; |
| 192 } else if (type == | 201 } else if (type == |
| 193 chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED) { | 202 chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED) { |
| 194 extension = service_->GetExtensionById( | 203 extension = extension_service->GetExtensionById( |
| 195 *content::Details<const std::string>(details).ptr(), true); | 204 *content::Details<const std::string>(details).ptr(), true); |
| 196 } else { | 205 } else { |
| 197 extension = content::Details<const Extension>(details).ptr(); | 206 extension = content::Details<const Extension>(details).ptr(); |
| 198 } | 207 } |
| 199 if (type == chrome::NOTIFICATION_EXTENSION_LOADED) { | 208 if (type == chrome::NOTIFICATION_EXTENSION_LOADED) { |
| 200 // We don't want to add the same extension twice. It may have already been | 209 // We don't want to add the same extension twice. It may have already been |
| 201 // added by EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED below, if the user | 210 // added by EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED below, if the user |
| 202 // hides the browser action and then disables and enables the extension. | 211 // hides the browser action and then disables and enables the extension. |
| 203 for (size_t i = 0; i < toolbar_items_.size(); i++) { | 212 for (size_t i = 0; i < toolbar_items_.size(); i++) { |
| 204 if (toolbar_items_[i].get() == extension) | 213 if (toolbar_items_[i].get() == extension) |
| 205 return; // Already exists. | 214 return; // Already exists. |
| 206 } | 215 } |
| 207 if (extensions::ExtensionActionAPI::GetBrowserActionVisibility( | 216 if (extensions::ExtensionActionAPI::GetBrowserActionVisibility( |
| 208 service_->extension_prefs(), extension->id())) { | 217 extension_prefs_, extension->id())) { |
| 209 AddExtension(extension); | 218 AddExtension(extension); |
| 210 } | 219 } |
| 211 } else if (type == chrome::NOTIFICATION_EXTENSION_UNLOADED) { | 220 } else if (type == chrome::NOTIFICATION_EXTENSION_UNLOADED) { |
| 212 RemoveExtension(extension); | 221 RemoveExtension(extension); |
| 213 } else if (type == chrome::NOTIFICATION_EXTENSION_UNINSTALLED) { | 222 } else if (type == chrome::NOTIFICATION_EXTENSION_UNINSTALLED) { |
| 214 UninstalledExtension(extension); | 223 UninstalledExtension(extension); |
| 215 } else if (type == | 224 } else if (type == |
| 216 chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED) { | 225 chrome::NOTIFICATION_EXTENSION_BROWSER_ACTION_VISIBILITY_CHANGED) { |
| 217 if (extensions::ExtensionActionAPI::GetBrowserActionVisibility( | 226 if (extensions::ExtensionActionAPI::GetBrowserActionVisibility( |
| 218 service_->extension_prefs(), extension->id())) { | 227 extension_prefs_, extension->id())) { |
| 219 AddExtension(extension); | 228 AddExtension(extension); |
| 220 } else { | 229 } else { |
| 221 RemoveExtension(extension); | 230 RemoveExtension(extension); |
| 222 } | 231 } |
| 223 } else { | 232 } else { |
| 224 NOTREACHED() << "Received unexpected notification"; | 233 NOTREACHED() << "Received unexpected notification"; |
| 225 } | 234 } |
| 226 } | 235 } |
| 227 | 236 |
| 228 size_t ExtensionToolbarModel::FindNewPositionFromLastKnownGood( | 237 size_t ExtensionToolbarModel::FindNewPositionFromLastKnownGood( |
| (...skipping 15 matching lines...) Expand all Loading... |
| 244 break; | 253 break; |
| 245 } | 254 } |
| 246 } | 255 } |
| 247 } | 256 } |
| 248 | 257 |
| 249 return -1; | 258 return -1; |
| 250 } | 259 } |
| 251 | 260 |
| 252 void ExtensionToolbarModel::AddExtension(const Extension* extension) { | 261 void ExtensionToolbarModel::AddExtension(const Extension* extension) { |
| 253 // We only care about extensions with browser actions. | 262 // We only care about extensions with browser actions. |
| 254 if (!extensions::ExtensionActionManager::Get(service_->profile())-> | 263 if (!extensions::ExtensionActionManager::Get(profile_)-> |
| 255 GetBrowserAction(*extension)) { | 264 GetBrowserAction(*extension)) { |
| 256 return; | 265 return; |
| 257 } | 266 } |
| 258 | 267 |
| 259 size_t new_index = -1; | 268 size_t new_index = -1; |
| 260 | 269 |
| 261 // See if we have a last known good position for this extension. | 270 // See if we have a last known good position for this extension. |
| 262 ExtensionIdList::iterator last_pos = std::find(last_known_positions_.begin(), | 271 ExtensionIdList::iterator last_pos = std::find(last_known_positions_.begin(), |
| 263 last_known_positions_.end(), | 272 last_known_positions_.end(), |
| 264 extension->id()); | 273 extension->id()); |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 309 } | 318 } |
| 310 } | 319 } |
| 311 | 320 |
| 312 // Combine the currently enabled extensions that have browser actions (which | 321 // Combine the currently enabled extensions that have browser actions (which |
| 313 // we get from the ExtensionService) with the ordering we get from the | 322 // we get from the ExtensionService) with the ordering we get from the |
| 314 // pref service. For robustness we use a somewhat inefficient process: | 323 // pref service. For robustness we use a somewhat inefficient process: |
| 315 // 1. Create a vector of extensions sorted by their pref values. This vector may | 324 // 1. Create a vector of extensions sorted by their pref values. This vector may |
| 316 // have holes. | 325 // have holes. |
| 317 // 2. Create a vector of extensions that did not have a pref value. | 326 // 2. Create a vector of extensions that did not have a pref value. |
| 318 // 3. Remove holes from the sorted vector and append the unsorted vector. | 327 // 3. Remove holes from the sorted vector and append the unsorted vector. |
| 319 void ExtensionToolbarModel::InitializeExtensionList() { | 328 void ExtensionToolbarModel::InitializeExtensionList(ExtensionService* service) { |
| 320 DCHECK(service_->is_ready()); | 329 DCHECK(service->is_ready()); |
| 321 | 330 |
| 322 last_known_positions_ = service_->extension_prefs()->GetToolbarOrder(); | 331 last_known_positions_ = extension_prefs_->GetToolbarOrder(); |
| 323 Populate(last_known_positions_); | 332 Populate(last_known_positions_, service); |
| 324 | 333 |
| 325 extensions_initialized_ = true; | 334 extensions_initialized_ = true; |
| 326 FOR_EACH_OBSERVER(Observer, observers_, ModelLoaded()); | 335 FOR_EACH_OBSERVER(Observer, observers_, ModelLoaded()); |
| 327 } | 336 } |
| 328 | 337 |
| 329 void ExtensionToolbarModel::Populate( | 338 void ExtensionToolbarModel::Populate( |
| 330 const extensions::ExtensionIdList& positions) { | 339 const extensions::ExtensionIdList& positions, |
| 340 ExtensionService* service) { |
| 331 // Items that have explicit positions. | 341 // Items that have explicit positions. |
| 332 ExtensionList sorted; | 342 ExtensionList sorted; |
| 333 sorted.resize(positions.size(), NULL); | 343 sorted.resize(positions.size(), NULL); |
| 334 // The items that don't have explicit positions. | 344 // The items that don't have explicit positions. |
| 335 ExtensionList unsorted; | 345 ExtensionList unsorted; |
| 336 | 346 |
| 337 extensions::ExtensionActionManager* extension_action_manager = | 347 extensions::ExtensionActionManager* extension_action_manager = |
| 338 extensions::ExtensionActionManager::Get(service_->profile()); | 348 extensions::ExtensionActionManager::Get(profile_); |
| 339 | 349 |
| 340 // Create the lists. | 350 // Create the lists. |
| 341 for (ExtensionSet::const_iterator it = service_->extensions()->begin(); | 351 for (ExtensionSet::const_iterator it = service->extensions()->begin(); |
| 342 it != service_->extensions()->end(); ++it) { | 352 it != service->extensions()->end(); ++it) { |
| 343 const Extension* extension = it->get(); | 353 const Extension* extension = it->get(); |
| 344 if (!extension_action_manager->GetBrowserAction(*extension)) | 354 if (!extension_action_manager->GetBrowserAction(*extension)) |
| 345 continue; | 355 continue; |
| 346 if (!extensions::ExtensionActionAPI::GetBrowserActionVisibility( | 356 if (!extensions::ExtensionActionAPI::GetBrowserActionVisibility( |
| 347 service_->extension_prefs(), extension->id())) { | 357 extension_prefs_, extension->id())) { |
| 348 continue; | 358 continue; |
| 349 } | 359 } |
| 350 | 360 |
| 351 extensions::ExtensionIdList::const_iterator pos = | 361 extensions::ExtensionIdList::const_iterator pos = |
| 352 std::find(positions.begin(), positions.end(), extension->id()); | 362 std::find(positions.begin(), positions.end(), extension->id()); |
| 353 if (pos != positions.end()) | 363 if (pos != positions.end()) |
| 354 sorted[pos - positions.begin()] = extension; | 364 sorted[pos - positions.begin()] = extension; |
| 355 else | 365 else |
| 356 unsorted.push_back(make_scoped_refptr(extension)); | 366 unsorted.push_back(make_scoped_refptr(extension)); |
| 357 } | 367 } |
| (...skipping 21 matching lines...) Expand all Loading... |
| 379 toolbar_items_.insert(toolbar_items_.end(), unsorted.begin(), | 389 toolbar_items_.insert(toolbar_items_.end(), unsorted.begin(), |
| 380 unsorted.end()); | 390 unsorted.end()); |
| 381 | 391 |
| 382 // Inform observers. | 392 // Inform observers. |
| 383 for (size_t i = 0; i < toolbar_items_.size(); i++) { | 393 for (size_t i = 0; i < toolbar_items_.size(); i++) { |
| 384 FOR_EACH_OBSERVER( | 394 FOR_EACH_OBSERVER( |
| 385 Observer, observers_, BrowserActionAdded(toolbar_items_[i].get(), i)); | 395 Observer, observers_, BrowserActionAdded(toolbar_items_[i].get(), i)); |
| 386 } | 396 } |
| 387 } | 397 } |
| 388 | 398 |
| 389 void ExtensionToolbarModel::FillExtensionList( | |
| 390 const extensions::ExtensionIdList& order) { | |
| 391 toolbar_items_.clear(); | |
| 392 toolbar_items_.reserve(order.size()); | |
| 393 for (size_t i = 0; i < order.size(); ++i) { | |
| 394 const extensions::Extension* extension = | |
| 395 service_->GetExtensionById(order[i], false); | |
| 396 if (extension) | |
| 397 AddExtension(extension); | |
| 398 } | |
| 399 } | |
| 400 | |
| 401 void ExtensionToolbarModel::UpdatePrefs() { | 399 void ExtensionToolbarModel::UpdatePrefs() { |
| 402 if (!service_->extension_prefs()) | 400 if (!extension_prefs_) |
| 403 return; | 401 return; |
| 404 | 402 |
| 405 // Don't observe change caused by self. | 403 // Don't observe change caused by self. |
| 406 pref_change_registrar_.Remove(prefs::kExtensionToolbar); | 404 pref_change_registrar_.Remove(prefs::kExtensionToolbar); |
| 407 service_->extension_prefs()->SetToolbarOrder(last_known_positions_); | 405 extension_prefs_->SetToolbarOrder(last_known_positions_); |
| 408 pref_change_registrar_.Add(prefs::kExtensionToolbar, pref_change_callback_); | 406 pref_change_registrar_.Add(prefs::kExtensionToolbar, pref_change_callback_); |
| 409 } | 407 } |
| 410 | 408 |
| 411 int ExtensionToolbarModel::IncognitoIndexToOriginal(int incognito_index) { | 409 int ExtensionToolbarModel::IncognitoIndexToOriginal(int incognito_index) { |
| 412 int original_index = 0, i = 0; | 410 int original_index = 0, i = 0; |
| 411 ExtensionService* extension_service = |
| 412 extensions::ExtensionSystem::Get(profile_)->extension_service(); |
| 413 for (ExtensionList::iterator iter = toolbar_items_.begin(); | 413 for (ExtensionList::iterator iter = toolbar_items_.begin(); |
| 414 iter != toolbar_items_.end(); | 414 iter != toolbar_items_.end(); |
| 415 ++iter, ++original_index) { | 415 ++iter, ++original_index) { |
| 416 if (extension_util::IsIncognitoEnabled((*iter)->id(), service_)) { | 416 if (extension_util::IsIncognitoEnabled((*iter)->id(), extension_service)) { |
| 417 if (incognito_index == i) | 417 if (incognito_index == i) |
| 418 break; | 418 break; |
| 419 ++i; | 419 ++i; |
| 420 } | 420 } |
| 421 } | 421 } |
| 422 return original_index; | 422 return original_index; |
| 423 } | 423 } |
| 424 | 424 |
| 425 int ExtensionToolbarModel::OriginalIndexToIncognito(int original_index) { | 425 int ExtensionToolbarModel::OriginalIndexToIncognito(int original_index) { |
| 426 int incognito_index = 0, i = 0; | 426 int incognito_index = 0, i = 0; |
| 427 ExtensionService* extension_service = |
| 428 extensions::ExtensionSystem::Get(profile_)->extension_service(); |
| 427 for (ExtensionList::iterator iter = toolbar_items_.begin(); | 429 for (ExtensionList::iterator iter = toolbar_items_.begin(); |
| 428 iter != toolbar_items_.end(); | 430 iter != toolbar_items_.end(); |
| 429 ++iter, ++i) { | 431 ++iter, ++i) { |
| 430 if (original_index == i) | 432 if (original_index == i) |
| 431 break; | 433 break; |
| 432 if (extension_util::IsIncognitoEnabled((*iter)->id(), service_)) | 434 if (extension_util::IsIncognitoEnabled((*iter)->id(), extension_service)) |
| 433 ++incognito_index; | 435 ++incognito_index; |
| 434 } | 436 } |
| 435 return incognito_index; | 437 return incognito_index; |
| 436 } | 438 } |
| 437 | 439 |
| 438 void ExtensionToolbarModel::OnExtensionToolbarPrefChange() { | 440 void ExtensionToolbarModel::OnExtensionToolbarPrefChange() { |
| 439 // If extensions are not ready, defer to later Populate() call. | 441 // If extensions are not ready, defer to later Populate() call. |
| 440 if (!extensions_initialized_) | 442 if (!extensions_initialized_) |
| 441 return; | 443 return; |
| 442 | 444 |
| 443 // Recalculate |last_known_positions_| to be |pref_positions| followed by | 445 // Recalculate |last_known_positions_| to be |pref_positions| followed by |
| 444 // ones that are only in |last_known_positions_|. | 446 // ones that are only in |last_known_positions_|. |
| 445 extensions::ExtensionIdList pref_positions = | 447 extensions::ExtensionIdList pref_positions = |
| 446 service_->extension_prefs()->GetToolbarOrder(); | 448 extension_prefs_->GetToolbarOrder(); |
| 447 size_t pref_position_size = pref_positions.size(); | 449 size_t pref_position_size = pref_positions.size(); |
| 448 for (size_t i = 0; i < last_known_positions_.size(); ++i) { | 450 for (size_t i = 0; i < last_known_positions_.size(); ++i) { |
| 449 if (std::find(pref_positions.begin(), pref_positions.end(), | 451 if (std::find(pref_positions.begin(), pref_positions.end(), |
| 450 last_known_positions_[i]) == pref_positions.end()) { | 452 last_known_positions_[i]) == pref_positions.end()) { |
| 451 pref_positions.push_back(last_known_positions_[i]); | 453 pref_positions.push_back(last_known_positions_[i]); |
| 452 } | 454 } |
| 453 } | 455 } |
| 454 last_known_positions_.swap(pref_positions); | 456 last_known_positions_.swap(pref_positions); |
| 455 | 457 |
| 456 // Re-populate. | 458 // Re-populate. |
| 457 Populate(last_known_positions_); | 459 Populate(last_known_positions_, |
| 460 extensions::ExtensionSystem::Get(profile_)->extension_service()); |
| 458 | 461 |
| 459 if (last_known_positions_.size() > pref_position_size) { | 462 if (last_known_positions_.size() > pref_position_size) { |
| 460 // Need to update pref because we have extra icons. But can't call | 463 // Need to update pref because we have extra icons. But can't call |
| 461 // UpdatePrefs() directly within observation closure. | 464 // UpdatePrefs() directly within observation closure. |
| 462 base::MessageLoop::current()->PostTask( | 465 base::MessageLoop::current()->PostTask( |
| 463 FROM_HERE, | 466 FROM_HERE, |
| 464 base::Bind(&ExtensionToolbarModel::UpdatePrefs, | 467 base::Bind(&ExtensionToolbarModel::UpdatePrefs, |
| 465 weak_ptr_factory_.GetWeakPtr())); | 468 weak_ptr_factory_.GetWeakPtr())); |
| 466 } | 469 } |
| 467 } | 470 } |
| 468 | 471 |
| 469 bool ExtensionToolbarModel::ShowBrowserActionPopup( | 472 bool ExtensionToolbarModel::ShowBrowserActionPopup( |
| 470 const extensions::Extension* extension) { | 473 const extensions::Extension* extension) { |
| 471 ObserverListBase<Observer>::Iterator it(observers_); | 474 ObserverListBase<Observer>::Iterator it(observers_); |
| 472 Observer* obs = NULL; | 475 Observer* obs = NULL; |
| 473 while ((obs = it.GetNext()) != NULL) { | 476 while ((obs = it.GetNext()) != NULL) { |
| 474 // Stop after first popup since it should only show in the active window. | 477 // Stop after first popup since it should only show in the active window. |
| 475 if (obs->BrowserActionShowPopup(extension)) | 478 if (obs->BrowserActionShowPopup(extension)) |
| 476 return true; | 479 return true; |
| 477 } | 480 } |
| 478 return false; | 481 return false; |
| 479 } | 482 } |
| OLD | NEW |