172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 24a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// Use of this source code is governed by a BSD-style license that can be 34a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch// found in the LICENSE file. 44a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 54a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#ifndef CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_POPUP_H_ 64a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_POPUP_H_ 74a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#pragma once 84a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 9ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "base/memory/ref_counted.h" 104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "chrome/browser/extensions/extension_host.h" 1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/browser_bubble.h" 12ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/browser/ui/views/bubble/bubble_border.h" 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/ui/views/extensions/extension_view.h" 14ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "content/common/notification_observer.h" 154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#include "googleurl/src/gurl.h" 164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Browser; 194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass ExtensionHost; 204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Profile; 214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochnamespace views { 234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass Widget; 244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch} 254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdochclass ExtensionPopup : public BrowserBubble, 274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public BrowserBubble::Delegate, 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public ExtensionView::Container, 294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public NotificationObserver, 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen public base::RefCounted<ExtensionPopup> { 314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public: 324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Observer to ExtensionPopup events. 334a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch class Observer { 344a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch public: 354a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Called when the ExtensionPopup is closing. Note that it 364a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // is ref-counted, and thus will be released shortly after 374a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // making this delegate call. 384a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void ExtensionPopupIsClosing(ExtensionPopup* popup) {} 394a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch }; 404a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 414a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual ~ExtensionPopup(); 424a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 434a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Create and show a popup with |url| positioned adjacent to |relative_to| in 444a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // screen coordinates. 454a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // |browser| is the browser to which the pop-up will be attached. NULL is a 464a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // valid parameter for pop-ups not associated with a browser. 474a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The positioning of the pop-up is determined by |arrow_location| according 484a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // to the following logic: The popup is anchored so that the corner indicated 494a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // by value of |arrow_location| remains fixed during popup resizes. 504a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // If |arrow_location| is BOTTOM_*, then the popup 'pops up', otherwise 514a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // the popup 'drops down'. 524a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Pass |inspect_with_devtools| as true to pin the popup open and show the 534a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // devtools window for it. 544a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The actual display of the popup is delayed until the page contents 554a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // finish loading in order to minimize UI flashing and resizing. 564a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch static ExtensionPopup* Show(const GURL& url, Browser* browser, 574a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const gfx::Rect& relative_to, 584a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BubbleBorder::ArrowLocation arrow_location, 594a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool inspect_with_devtools, 604a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Observer* observer); 614a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Closes the ExtensionPopup. 634a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void Close(); 644a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 654a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Some clients wish to do their own custom focus change management. If this 664a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // is set to false, then the ExtensionPopup will not do anything in response 674a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // to the BubbleLostFocus() calls it gets from the BrowserBubble. 684a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch void set_close_on_lost_focus(bool close_on_lost_focus) { 694a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch close_on_lost_focus_ = close_on_lost_focus; 704a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch } 714a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 724a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ExtensionHost* host() const { return extension_host_.get(); } 734a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 744a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // BrowserBubble overrides. 754a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void Show(bool activate); 764a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 774a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // BrowserBubble::Delegate methods. 784a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void BubbleBrowserWindowMoved(BrowserBubble* bubble); 794a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void BubbleBrowserWindowClosing(BrowserBubble* bubble); 804a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void BubbleGotFocus(BrowserBubble* bubble); 814a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void BubbleLostFocus(BrowserBubble* bubble, 824a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool lost_focus_to_child); 834a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 844a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // NotificationObserver overrides. 854a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void Observe(NotificationType type, 864a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const NotificationSource& source, 874a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const NotificationDetails& details); 884a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 894a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // ExtensionView::Container overrides. 904a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void OnExtensionMouseMove(ExtensionView* view) { } 914a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void OnExtensionMouseLeave(ExtensionView* view) { } 924a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch virtual void OnExtensionPreferredSizeChanged(ExtensionView* view); 934a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 944a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The min/max height of popups. 954a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch static const int kMinWidth; 964a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch static const int kMinHeight; 974a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch static const int kMaxWidth; 984a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch static const int kMaxHeight; 994a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1004a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch private: 1014a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch ExtensionPopup(ExtensionHost* host, 1024a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch views::Widget* frame, 1034a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch const gfx::Rect& relative_to, 1044a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch BubbleBorder::ArrowLocation arrow_location, 1054a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool inspect_with_devtools, 1064a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Observer* observer); 1074a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1084a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The area on the screen that the popup should be positioned relative to. 1094a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch gfx::Rect relative_to_; 1104a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1114a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The contained host for the view. 1124a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch scoped_ptr<ExtensionHost> extension_host_; 1134a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1144a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Flag used to indicate if the pop-up should open a devtools window once 1154a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // it is shown inspecting it. 1164a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool inspect_with_devtools_; 1174a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1184a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // If false, ignore BrowserBubble::Delegate::BubbleLostFocus() calls. 1194a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool close_on_lost_focus_; 1204a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1214a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // Whether the ExtensionPopup is current going about closing itself. 1224a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch bool closing_; 1234a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1244a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch NotificationRegistrar registrar_; 1254a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1264a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch // The observer of this popup. 1274a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch Observer* observer_; 1284a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1294a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch DISALLOW_COPY_AND_ASSIGN(ExtensionPopup); 1304a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch}; 1314a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch 1324a5e2dc747d50c653511c68ccb2cfbfb740bd5a7Ben Murdoch#endif // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_POPUP_H_ 133