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