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

Unified Diff: chrome/browser/extensions/extension_install_prompt_show_params.cc

Issue 662073002: Fix crash when user closes window prior to the "Confirm Install" prompt showing (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git/+/install_prompt_navigator
Patch Set: Created 6 years, 2 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
Index: chrome/browser/extensions/extension_install_prompt_show_params.cc
diff --git a/chrome/browser/extensions/extension_install_prompt_show_params.cc b/chrome/browser/extensions/extension_install_prompt_show_params.cc
new file mode 100644
index 0000000000000000000000000000000000000000..cebc55d891e6db4844517df3a9d545cab6ed215a
--- /dev/null
+++ b/chrome/browser/extensions/extension_install_prompt_show_params.cc
@@ -0,0 +1,104 @@
+// Copyright 2014 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "chrome/browser/extensions/extension_install_prompt_show_params.h"
+
+#include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/native_window_deletion_observer.h"
+#include "content/public/browser/web_contents.h"
+#include "content/public/browser/web_contents_observer.h"
+
+namespace {
+
+Profile* ProfileForWebContents(content::WebContents* web_contents) {
+ if (!web_contents)
+ return NULL;
+ return Profile::FromBrowserContext(web_contents->GetBrowserContext());
+}
+
+gfx::NativeWindow NativeWindowForWebContents(content::WebContents* contents) {
+ if (!contents)
+ return NULL;
+
+ return contents->GetTopLevelNativeWindow();
+}
+
+} // namespace
+
+class ExtensionInstallPromptShowParams::WebContentsDestructionObserver
+ : public content::WebContentsObserver {
+ public:
+ explicit WebContentsDestructionObserver(
+ ExtensionInstallPromptShowParams* params)
+ : content::WebContentsObserver(params->GetParentWebContents()),
+ params_(params) {
+ }
+
+ virtual ~WebContentsDestructionObserver() {
+ }
+
+ virtual void WebContentsDestroyed() override {
+ params_->WebContentsDestroyed();
+ }
+
+ private:
+ // Not owned.
+ ExtensionInstallPromptShowParams* params_;
+
+ DISALLOW_COPY_AND_ASSIGN(WebContentsDestructionObserver);
+};
+
+ExtensionInstallPromptShowParams::ExtensionInstallPromptShowParams(
+ content::WebContents* contents)
+ : profile_(ProfileForWebContents(contents)),
+ parent_web_contents_(contents),
+ parent_web_contents_destroyed_(false),
+ parent_window_(NativeWindowForWebContents(contents)) {
+ if (contents) {
+ web_contents_destruction_observer_.reset(
+ new WebContentsDestructionObserver(this));
+ }
+ if (parent_window_) {
+ native_window_deletion_observer_ =
+ NativeWindowDeletionObserver::Create(parent_window_);
+ }
+}
+
+ExtensionInstallPromptShowParams::ExtensionInstallPromptShowParams(
+ Profile* profile,
+ gfx::NativeWindow parent_window)
+ : profile_(profile),
+ parent_web_contents_(NULL),
+ parent_web_contents_destroyed_(false),
+ parent_window_(parent_window) {
+ if (parent_window_) {
+ native_window_deletion_observer_ =
+ NativeWindowDeletionObserver::Create(parent_window_);
+ }
+}
+
+ExtensionInstallPromptShowParams::~ExtensionInstallPromptShowParams() {
+}
+
+content::WebContents* ExtensionInstallPromptShowParams::GetParentWebContents() {
+ return parent_web_contents_;
+}
+
+gfx::NativeWindow ExtensionInstallPromptShowParams::GetParentWindow() {
+ return (native_window_deletion_observer_ &&
+ native_window_deletion_observer_->IsNativeWindowAlive())
+ ? parent_window_
+ : NULL;
+}
+
+bool ExtensionInstallPromptShowParams::WasParentDestroyed() {
+ return parent_web_contents_destroyed_ ||
+ (native_window_deletion_observer_ &&
+ !native_window_deletion_observer_->IsNativeWindowAlive());
+}
+
+void ExtensionInstallPromptShowParams::WebContentsDestroyed() {
+ parent_web_contents_ = NULL;
+ parent_web_contents_destroyed_ = true;
+}

Powered by Google App Engine
This is Rietveld 408576698