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

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..3b2a7fea35ffb2b9f678dedb6fce96e621779af1
--- /dev/null
+++ b/chrome/browser/extensions/extension_install_prompt_show_params.cc
@@ -0,0 +1,100 @@
+// 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_tracker.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 nullptr;
+ return Profile::FromBrowserContext(web_contents->GetBrowserContext());
+}
+
+gfx::NativeWindow NativeWindowForWebContents(content::WebContents* contents) {
+ if (!contents)
+ return nullptr;
+
+ 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_tracker_ = NativeWindowTracker::Create(parent_window_);
+}
+
+ExtensionInstallPromptShowParams::ExtensionInstallPromptShowParams(
+ Profile* profile,
+ gfx::NativeWindow parent_window)
+ : profile_(profile),
+ parent_web_contents_(nullptr),
+ parent_web_contents_destroyed_(false),
+ parent_window_(parent_window) {
+ if (parent_window_)
+ native_window_tracker_ = NativeWindowTracker::Create(parent_window_);
+}
+
+ExtensionInstallPromptShowParams::~ExtensionInstallPromptShowParams() {
+}
+
+content::WebContents* ExtensionInstallPromptShowParams::GetParentWebContents() {
+ return parent_web_contents_;
+}
+
+gfx::NativeWindow ExtensionInstallPromptShowParams::GetParentWindow() {
+ return (native_window_tracker_ &&
+ !native_window_tracker_->WasNativeWindowClosed())
+ ? parent_window_
+ : nullptr;
+}
+
+bool ExtensionInstallPromptShowParams::WasParentDestroyed() {
+ return parent_web_contents_destroyed_ ||
+ (native_window_tracker_ &&
+ native_window_tracker_->WasNativeWindowClosed());
+}
+
+void ExtensionInstallPromptShowParams::WebContentsDestroyed() {
+ parent_web_contents_ = nullptr;
+ parent_web_contents_destroyed_ = true;
+}

Powered by Google App Engine
This is Rietveld 408576698