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