// 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; }