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

Unified Diff: chrome/browser/ui/startup/startup_browser_creator_impl.cc

Issue 10700145: chromeos: Fix StartupBrowserCreatorImpl::Launch crash. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase + fix comment in #1 Created 8 years, 5 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/ui/startup/startup_browser_creator_impl.cc
diff --git a/chrome/browser/ui/startup/startup_browser_creator_impl.cc b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
index c0fd4d272428803515090a84d750f100f73561f2..a6a09e89bc733940ecffef1f92fa44c9dd3dce59 100644
--- a/chrome/browser/ui/startup/startup_browser_creator_impl.cc
+++ b/chrome/browser/ui/startup/startup_browser_creator_impl.cc
@@ -72,6 +72,8 @@
#include "chrome/common/url_constants.h"
#include "chrome/installer/util/browser_distribution.h"
#include "content/public/browser/child_process_security_policy.h"
+#include "content/public/browser/notification_observer.h"
+#include "content/public/browser/notification_registrar.h"
#include "content/public/browser/web_contents.h"
#include "content/public/browser/web_contents_view.h"
#include "grit/locale_settings.h"
@@ -225,6 +227,37 @@ void RecordAppLaunches(Profile* profile,
}
}
+class WebContentsCloseObserver : public content::NotificationObserver {
+ public:
+ WebContentsCloseObserver() : contents_(NULL) {}
+ virtual ~WebContentsCloseObserver() {}
+
+ void SetContents(content::WebContents* contents) {
+ DCHECK(!contents_);
+ contents_ = contents;
+
+ registrar_.Add(this,
+ content::NOTIFICATION_WEB_CONTENTS_DESTROYED,
+ content::Source<content::WebContents>(contents_));
+ }
+
+ content::WebContents* contents() { return contents_; }
+
+ private:
+ // content::NotificationObserver overrides:
+ virtual void Observe(int type,
+ const content::NotificationSource& source,
+ const content::NotificationDetails& details) OVERRIDE {
+ DCHECK_EQ(type, content::NOTIFICATION_WEB_CONTENTS_DESTROYED);
+ contents_ = NULL;
+ }
+
+ content::WebContents* contents_;
+ content::NotificationRegistrar registrar_;
+
+ DISALLOW_COPY_AND_ASSIGN(WebContentsCloseObserver);
+};
+
} // namespace
StartupBrowserCreatorImpl::StartupBrowserCreatorImpl(
@@ -308,6 +341,13 @@ bool StartupBrowserCreatorImpl::Launch(Profile* profile,
// affecting browser startup have been detected.
CheckPreferencesBackup(profile);
+ // Watch for |app_contents| closing since ProcessLaunchURLs might run a
+ // synchronous session restore which has a nested message loop and could
+ // close |app_contents|.
+ WebContentsCloseObserver app_contents_observer;
+ if (browser_defaults::kAppRestoreSession && app_contents)
+ app_contents_observer.SetContents(app_contents);
+
ProcessLaunchURLs(process_startup, urls_to_open);
// If this is an app launch, but we didn't open an app window, it may
@@ -315,8 +355,8 @@ bool StartupBrowserCreatorImpl::Launch(Profile* profile,
OpenApplicationTab(profile);
// In case of app mode + session restore we want to focus that app.
- if (browser_defaults::kAppRestoreSession && app_contents)
- app_contents->GetView()->SetInitialFocus();
+ if (app_contents_observer.contents())
+ app_contents_observer.contents()->GetView()->SetInitialFocus();
if (process_startup) {
if (browser_defaults::kOSSupportsOtherBrowsers &&
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698