15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/extensions/extension_dialog.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "chrome/browser/chrome_notification_types.h"
8f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/extensions/extension_view_host.h"
9f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chrome/browser/extensions/extension_view_host_factory.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile.h"
117d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "chrome/browser/ui/views/constrained_window_views.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/views/extensions/extension_dialog_observer.h"
13116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "chrome/browser/ui/views/extensions/extension_view_views.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_details.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_source.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_widget_host_view.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents.h"
1990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/base/base_window.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/screen.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/background.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using content::BrowserContext;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28116680a4aac90f2aa7413d9095a592090648e557Ben Murdochnamespace {
29116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
30116680a4aac90f2aa7413d9095a592090648e557Ben MurdochExtensionViewViews* GetExtensionView(extensions::ExtensionViewHost* host) {
31116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return static_cast<ExtensionViewViews*>(host->view());
32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}
33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch}  // namespace
35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch
36f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)ExtensionDialog::ExtensionDialog(extensions::ExtensionViewHost* host,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 ExtensionDialogObserver* observer)
38f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    : host_(host),
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      observer_(observer) {
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  AddRef();  // Balanced in DeleteDelegate();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  registrar_.Add(this,
435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 extensions::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING,
44f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 content::Source<BrowserContext>(host->browser_context()));
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Listen for the containing view calling window.close();
465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  registrar_.Add(this,
475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 extensions::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE,
48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 content::Source<BrowserContext>(host->browser_context()));
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Listen for a crash or other termination of the extension process.
505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  registrar_.Add(this,
515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                 extensions::NOTIFICATION_EXTENSION_PROCESS_TERMINATED,
52f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                 content::Source<BrowserContext>(host->browser_context()));
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionDialog::~ExtensionDialog() {
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ExtensionDialog* ExtensionDialog::Show(
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const GURL& url,
61a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)    aura::Window* parent_window,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Profile* profile,
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebContents* web_contents,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int width,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int height,
66a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    int min_width,
67a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)    int min_height,
68a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    const base::string16& title,
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ExtensionDialogObserver* observer) {
70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  extensions::ExtensionViewHost* host =
71f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)      extensions::ExtensionViewHostFactory::CreateDialogHost(url, profile);
72fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch  if (!host)
73fb250657ef40d7500f20882d5c9909c1013367d3Ben Murdoch    return NULL;
74a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // Preferred size must be set before views::Widget::CreateWindowWithParent
75a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // is called because CreateWindowWithParent refers the result of CanResize().
76116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  ExtensionViewViews* view = GetExtensionView(host);
77116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  view->SetPreferredSize(gfx::Size(width, height));
78116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  view->set_minimum_size(gfx::Size(min_width, min_height));
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  host->SetAssociatedWebContents(web_contents);
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  DCHECK(parent_window);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ExtensionDialog* dialog = new ExtensionDialog(host, observer);
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dialog->set_title(title);
84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  dialog->InitWindow(parent_window, width, height);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Show a white background while the extension loads.  This is prettier than
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // flashing a black unfilled window frame.
88116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  view->set_background(
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      views::Background::CreateSolidBackground(0xFF, 0xFF, 0xFF));
90116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  view->SetVisible(true);
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure the DOM JavaScript can respond immediately to keyboard shortcuts.
93010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  host->host_contents()->Focus();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return dialog;
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
97a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)void ExtensionDialog::InitWindow(aura::Window* parent,
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 int width,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 int height) {
100a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  views::Widget* window = CreateBrowserModalDialogViews(this, parent);
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Center the window over the browser.
103a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  gfx::Point center = parent->GetBoundsInScreen().CenterPoint();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int x = center.x() - width / 2;
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  int y = center.y() - height / 2;
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Ensure the top left and top right of the window are on screen, with
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // priority given to the top left.
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect screen_rect = gfx::Screen::GetScreenFor(parent)->
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      GetDisplayNearestPoint(center).bounds();
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::Rect bounds_rect = gfx::Rect(x, y, width, height);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bounds_rect.AdjustToFit(screen_rect);
112a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  window->SetBounds(bounds_rect);
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
114a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  window->Show();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(jamescook): Remove redundant call to Activate()?
116a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)  window->Activate();
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionDialog::ObserverDestroyed() {
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  observer_ = NULL;
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionDialog::MaybeFocusRenderView() {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  views::FocusManager* focus_manager = GetWidget()->GetFocusManager();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(focus_manager != NULL);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Already there's a focused view, so no need to switch the focus.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (focus_manager->GetFocusedView())
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  content::RenderWidgetHostView* view = host()->render_view_host()->GetView();
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!view)
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  view->Focus();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////
139a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)// views::DialogDelegate overrides.
140a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)
141a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)int ExtensionDialog::GetDialogButtons() const {
142a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  // The only user, SelectFileDialogExtension, provides its own buttons.
143a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)  return ui::DIALOG_BUTTON_NONE;
144a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)}
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionDialog::CanResize() const {
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Can resize only if minimum contents size set.
148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return GetExtensionView(host_.get())->GetPreferredSize() != gfx::Size();
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionDialog::SetMinimumContentsSize(int width, int height) {
152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  GetExtensionView(host_.get())->SetPreferredSize(gfx::Size(width, height));
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::ModalType ExtensionDialog::GetModalType() const {
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui::MODAL_TYPE_WINDOW;
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool ExtensionDialog::ShouldShowWindowTitle() const {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return !window_title_.empty();
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1635d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ExtensionDialog::GetWindowTitle() const {
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return window_title_;
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionDialog::WindowClosing() {
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (observer_)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    observer_->ExtensionDialogClosing(this);
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionDialog::DeleteDelegate() {
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The window has finished closing.  Allow ourself to be deleted.
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Release();
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::Widget* ExtensionDialog::GetWidget() {
178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return GetExtensionView(host_.get())->GetWidget();
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const views::Widget* ExtensionDialog::GetWidget() const {
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return GetExtensionView(host_.get())->GetWidget();
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)views::View* ExtensionDialog::GetContentsView() {
186116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch  return GetExtensionView(host_.get());
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
189868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)bool ExtensionDialog::UseNewStyleForThisDialog() const {
190868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)  return false;
191868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)}
192868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// content::NotificationObserver overrides.
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ExtensionDialog::Observe(int type,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const content::NotificationSource& source,
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             const content::NotificationDetails& details) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  switch (type) {
2005f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case extensions::NOTIFICATION_EXTENSION_HOST_DID_STOP_LOADING:
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // Avoid potential overdraw by removing the temporary background after
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // the extension finishes loading.
203116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch      GetExtensionView(host_.get())->set_background(NULL);
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // The render view is created during the LoadURL(), so we should
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // set the focus to the view if nobody else takes the focus.
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (content::Details<extensions::ExtensionHost>(host()) == details)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        MaybeFocusRenderView();
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case extensions::NOTIFICATION_EXTENSION_HOST_VIEW_SHOULD_CLOSE:
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      // If we aren't the host of the popup, then disregard the notification.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (content::Details<extensions::ExtensionHost>(host()) != details)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      GetWidget()->Close();
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)    case extensions::NOTIFICATION_EXTENSION_PROCESS_TERMINATED:
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (content::Details<extensions::ExtensionHost>(host()) != details)
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        return;
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      if (observer_)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        observer_->ExtensionTerminated(this);
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    default:
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      NOTREACHED() << L"Received unexpected notification";
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      break;
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
226