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

Side by Side Diff: chrome/browser/background/background_contents_service.cc

Issue 2310463002: Update component extension reload backoff logic. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 3 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 unified diff | Download patch
« no previous file with comments | « chrome/browser/background/background_contents_service.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/background/background_contents_service.h" 5 #include "chrome/browser/background/background_contents_service.h"
6 6
7 #include <utility> 7 #include <utility>
8 8
9 #include "apps/app_load_service.h" 9 #include "apps/app_load_service.h"
10 #include "base/bind.h" 10 #include "base/bind.h"
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 287
288 // Listen for events to tell us when to load/unload persisted background 288 // Listen for events to tell us when to load/unload persisted background
289 // contents. 289 // contents.
290 StartObserving(profile); 290 StartObserving(profile);
291 } 291 }
292 292
293 BackgroundContentsService::~BackgroundContentsService() { 293 BackgroundContentsService::~BackgroundContentsService() {
294 // BackgroundContents should be shutdown before we go away, as otherwise 294 // BackgroundContents should be shutdown before we go away, as otherwise
295 // our browser process refcount will be off. 295 // our browser process refcount will be off.
296 DCHECK(contents_map_.empty()); 296 DCHECK(contents_map_.empty());
297
298 // Clear any remaining BackoffEntry objects for extensions. This resets the
299 // backoff with a change in profile (e.g. when the browser restarts), as
300 // |this| is a keyed service.
301 backoff_map_.clear();
Wez 2016/09/02 23:54:44 This will just clear the map on browser shutdown,
apacible 2016/09/03 01:14:26 Component extensions are "installed" but are loade
297 } 302 }
298 303
299 // static 304 // static
300 void BackgroundContentsService:: 305 void BackgroundContentsService::
301 SetRestartDelayForForceInstalledAppsAndExtensionsForTesting( 306 SetRestartDelayForForceInstalledAppsAndExtensionsForTesting(
302 int restart_delay_in_ms) { 307 int restart_delay_in_ms) {
303 restart_delay_in_ms_ = restart_delay_in_ms; 308 restart_delay_in_ms_ = restart_delay_in_ms;
304 } 309 }
305 310
306 // static 311 // static
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
471 // Now load the manifest-specified background page. If service isn't 476 // Now load the manifest-specified background page. If service isn't
472 // ready, then the background page will be loaded from the 477 // ready, then the background page will be loaded from the
473 // EXTENSIONS_READY callback. 478 // EXTENSIONS_READY callback.
474 LoadBackgroundContents(profile, 479 LoadBackgroundContents(profile,
475 BackgroundInfo::GetBackgroundURL(extension), 480 BackgroundInfo::GetBackgroundURL(extension),
476 "background", 481 "background",
477 base::UTF8ToUTF16(extension->id())); 482 base::UTF8ToUTF16(extension->id()));
478 } 483 }
479 } 484 }
480 485
486 // If there is an existing BackoffEntry for the extension, clear it if
487 // the component extension stays loaded for 60 seconds. This avoids the
488 // situation of effectively disabling an extension for the entire browser
489 // session if there was a periodic crash (sometimes caused by another source).
490 if (extensions::Manifest::IsComponentLocation(extension->location())) {
491 ExtensionBackoffEntryMap::const_iterator it =
492 backoff_map_.find(extension->id());
493 if (it != backoff_map_.end()) {
494 net::BackoffEntry* entry = backoff_map_[extension->id()].get();
495 base::ThreadTaskRunnerHandle::Get()->PostDelayedTask(FROM_HERE,
496 base::Bind(&BackgroundContentsService::MaybeClearBackoffEntry,
497 base::Unretained(this), extension->id(), entry->failure_count()),
Wez 2016/09/02 23:54:44 What happens if you reach here but the BackgroundC
apacible 2016/09/03 01:14:27 Talked offline -- switching to using weak ptr.
498 base::TimeDelta::FromMilliseconds(60000 /* 60 seconds */));
499 }
500 }
501
481 // Close the crash notification balloon for the app/extension, if any. 502 // Close the crash notification balloon for the app/extension, if any.
482 ScheduleCloseBalloon(extension->id(), profile); 503 ScheduleCloseBalloon(extension->id(), profile);
483 SendChangeNotification(profile); 504 SendChangeNotification(profile);
484 } 505 }
485 506
486 void BackgroundContentsService::OnExtensionUnloaded( 507 void BackgroundContentsService::OnExtensionUnloaded(
487 content::BrowserContext* browser_context, 508 content::BrowserContext* browser_context,
488 const extensions::Extension* extension, 509 const extensions::Extension* extension,
489 extensions::UnloadedExtensionInfo::Reason reason) { 510 extensions::UnloadedExtensionInfo::Reason reason) {
490 switch (reason) { 511 switch (reason) {
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
597 } 618 }
598 } 619 }
599 620
600 void BackgroundContentsService::SendChangeNotification(Profile* profile) { 621 void BackgroundContentsService::SendChangeNotification(Profile* profile) {
601 content::NotificationService::current()->Notify( 622 content::NotificationService::current()->Notify(
602 chrome::NOTIFICATION_BACKGROUND_CONTENTS_SERVICE_CHANGED, 623 chrome::NOTIFICATION_BACKGROUND_CONTENTS_SERVICE_CHANGED,
603 content::Source<Profile>(profile), 624 content::Source<Profile>(profile),
604 content::Details<BackgroundContentsService>(this)); 625 content::Details<BackgroundContentsService>(this));
605 } 626 }
606 627
628 void BackgroundContentsService::MaybeClearBackoffEntry(
629 const std::string extension_id,
630 int expected_failure_count) {
631 ExtensionBackoffEntryMap::const_iterator it =
632 backoff_map_.find(extension_id);
633 if (it == backoff_map_.end())
634 return;
635
636 net::BackoffEntry* entry = backoff_map_[extension_id].get();
637
638 // Only remove the BackoffEntry if there has has been no extension failure
639 // since loading.
Wez 2016/09/02 23:54:43 You mean no additional failure since expected_fail
apacible 2016/09/03 01:14:27 Correct, or more specifically, "no additional fail
640 if (entry->failure_count() == expected_failure_count)
641 backoff_map_.erase(it);
642 }
643
607 void BackgroundContentsService::LoadBackgroundContentsForExtension( 644 void BackgroundContentsService::LoadBackgroundContentsForExtension(
608 Profile* profile, 645 Profile* profile,
609 const std::string& extension_id) { 646 const std::string& extension_id) {
610 // First look if the manifest specifies a background page. 647 // First look if the manifest specifies a background page.
611 const Extension* extension = 648 const Extension* extension =
612 extensions::ExtensionSystem::Get(profile)->extension_service()-> 649 extensions::ExtensionSystem::Get(profile)->extension_service()->
613 GetExtensionById(extension_id, false); 650 GetExtensionById(extension_id, false);
614 DCHECK(!extension || extension->is_hosted_app()); 651 DCHECK(!extension || extension->is_hosted_app());
615 if (extension && BackgroundInfo::HasBackgroundPage(extension)) { 652 if (extension && BackgroundInfo::HasBackgroundPage(extension)) {
616 LoadBackgroundContents(profile, 653 LoadBackgroundContents(profile,
(...skipping 206 matching lines...) Expand 10 before | Expand all | Expand 10 after
823 const gfx::Rect& initial_rect, 860 const gfx::Rect& initial_rect,
824 bool user_gesture, 861 bool user_gesture,
825 bool* was_blocked) { 862 bool* was_blocked) {
826 Browser* browser = chrome::FindLastActiveWithProfile( 863 Browser* browser = chrome::FindLastActiveWithProfile(
827 Profile::FromBrowserContext(new_contents->GetBrowserContext())); 864 Profile::FromBrowserContext(new_contents->GetBrowserContext()));
828 if (browser) { 865 if (browser) {
829 chrome::AddWebContents(browser, NULL, new_contents, disposition, 866 chrome::AddWebContents(browser, NULL, new_contents, disposition,
830 initial_rect, user_gesture, was_blocked); 867 initial_rect, user_gesture, was_blocked);
831 } 868 }
832 } 869 }
OLDNEW
« no previous file with comments | « chrome/browser/background/background_contents_service.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698