summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/extension_popup_host.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/extensions/extension_popup_host.cc')
-rw-r--r--chrome/browser/extensions/extension_popup_host.cc95
1 files changed, 95 insertions, 0 deletions
diff --git a/chrome/browser/extensions/extension_popup_host.cc b/chrome/browser/extensions/extension_popup_host.cc
new file mode 100644
index 0000000..20dd1a1
--- /dev/null
+++ b/chrome/browser/extensions/extension_popup_host.cc
@@ -0,0 +1,95 @@
+// Copyright (c) 2009 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_popup_host.h"
+
+#if defined(TOOLKIT_VIEWS)
+#include "chrome/browser/extensions/extension_popup_api.h"
+#endif
+#include "chrome/browser/profile.h"
+#include "chrome/browser/browser.h"
+#include "chrome/browser/renderer_host/render_view_host.h"
+#if defined(TOOLKIT_VIEWS)
+#include "chrome/browser/views/extensions/extension_popup.h"
+#endif
+#include "chrome/common/notification_details.h"
+#include "chrome/common/notification_source.h"
+#include "chrome/common/notification_type.h"
+
+
+ExtensionPopupHost* ExtensionPopupHost::PopupDelegate::popup_host() {
+ if (!popup_host_.get())
+ popup_host_.reset(new ExtensionPopupHost(this));
+
+ return popup_host_.get();
+}
+
+ExtensionPopupHost::ExtensionPopupHost(PopupDelegate* delegate)
+ : // NO LINT
+#if defined(TOOLKIT_VIEWS)
+ child_popup_(NULL),
+#endif
+ delegate_(delegate) {
+ DCHECK(delegate_);
+
+ // Listen for view close requests, so that we can dismiss a hosted pop-up
+ // view, if necessary.
+ registrar_.Add(this, NotificationType::EXTENSION_HOST_VIEW_SHOULD_CLOSE,
+ Source<Profile>(delegate_->GetBrowser()->profile()));
+}
+
+ExtensionPopupHost::~ExtensionPopupHost() {
+ DismissPopup();
+}
+
+#if defined(TOOLKIT_VIEWS)
+void ExtensionPopupHost::BubbleBrowserWindowMoved(BrowserBubble* bubble) {
+ DismissPopup();
+}
+
+void ExtensionPopupHost::BubbleBrowserWindowClosing(BrowserBubble* bubble) {
+ DismissPopup();
+}
+
+void ExtensionPopupHost::BubbleGotFocus(BrowserBubble* bubble) {
+}
+
+void ExtensionPopupHost::BubbleLostFocus(BrowserBubble* bubble) {
+ // TODO(twiz): Dismiss the pop-up upon loss of focus of the bubble, but not
+ // if the focus is transitioning to the host which owns the popup!
+ // DismissPopup();
+}
+#endif // defined(TOOLKIT_VIEWS)
+
+void ExtensionPopupHost::Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details) {
+ if (type == NotificationType::EXTENSION_HOST_VIEW_SHOULD_CLOSE) {
+#if defined(TOOLKIT_VIEWS)
+ // If we aren't the host of the popup, then disregard the notification.
+ if (!child_popup_ ||
+ Details<ExtensionHost>(child_popup_->host()) != details) {
+ return;
+ }
+ DismissPopup();
+#endif
+ } else {
+ NOTREACHED();
+ }
+}
+
+void ExtensionPopupHost::DismissPopup() {
+#if defined(TOOLKIT_VIEWS)
+ if (child_popup_) {
+ child_popup_->Hide();
+ child_popup_->DetachFromBrowser();
+ delete child_popup_;
+ child_popup_ = NULL;
+
+ PopupEventRouter::OnPopupClosed(
+ delegate_->GetBrowser()->profile(),
+ delegate_->GetRenderViewHost()->routing_id());
+ }
+#endif // defined(TOOLKIT_VIEWS)
+}