Index: chrome/browser/sessions/session_restore.cc |
=================================================================== |
--- chrome/browser/sessions/session_restore.cc (revision 66663) |
+++ chrome/browser/sessions/session_restore.cc (working copy) |
@@ -272,7 +272,8 @@ |
synchronous_(synchronous), |
clobber_existing_window_(clobber_existing_window), |
always_create_tabbed_browser_(always_create_tabbed_browser), |
- urls_to_open_(urls_to_open) { |
+ urls_to_open_(urls_to_open), |
+ waiting_for_extension_service_(false) { |
} |
void Restore() { |
@@ -338,6 +339,19 @@ |
delete this; |
return; |
+ case NotificationType::EXTENSIONS_READY: { |
+ if (!waiting_for_extension_service_) |
+ return; |
+ |
+ waiting_for_extension_service_ = false; |
+ if (synchronous_) { |
+ MessageLoop::current()->Quit(); |
+ return; |
+ } |
+ ProcessSessionWindows(&windows_); |
+ return; |
+ } |
+ |
default: |
NOTREACHED(); |
break; |
@@ -382,6 +396,18 @@ |
void OnGotSession(SessionService::Handle handle, |
std::vector<SessionWindow*>* windows) { |
+ if (HasExtensionApps(*windows) && profile_->GetExtensionsService() && |
+ !profile_->GetExtensionsService()->is_ready()) { |
+ // At least one tab is an app tab and the extension service hasn't |
+ // finished loading. Wait to continue processing until the extensions |
+ // service finishes loading. |
+ registrar_.Add(this, NotificationType::EXTENSIONS_READY, |
+ Source<Profile>(profile_)); |
+ windows_.swap(*windows); |
+ waiting_for_extension_service_ = true; |
+ return; |
+ } |
+ |
if (synchronous_) { |
// See comment above windows_ as to why we don't process immediately. |
windows_.swap(*windows); |
@@ -392,6 +418,28 @@ |
ProcessSessionWindows(windows); |
} |
+ // Returns true if any tab in |windows| has an application extension id. |
+ bool HasExtensionApps(const std::vector<SessionWindow*>& windows) { |
+ for (std::vector<SessionWindow*>::const_iterator i = windows.begin(); |
+ i != windows.end(); ++i) { |
+ if (HasExtensionApps((*i)->tabs)) |
+ return true; |
+ } |
+ |
+ return false; |
+ } |
+ |
+ // Returns true if any tab in |tabs| has an application extension id. |
+ bool HasExtensionApps(const std::vector<SessionTab*>& tabs) { |
+ for (std::vector<SessionTab*>::const_iterator i = tabs.begin(); |
+ i != tabs.end(); ++i) { |
+ if (!(*i)->extension_app_id.empty()) |
+ return true; |
+ } |
+ |
+ return false; |
+ } |
+ |
void ProcessSessionWindows(std::vector<SessionWindow*>* windows) { |
if (windows->empty()) { |
// Restore was unsuccessful. |
@@ -553,6 +601,10 @@ |
// windows when the nested message loop exits. |
std::vector<SessionWindow*> windows_; |
+ // If true, indicates at least one tab has an application extension id and |
+ // we're waiting for the extension service to finish loading. |
+ bool waiting_for_extension_service_; |
+ |
NotificationRegistrar registrar_; |
}; |