// Copyright (c) 2011 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.
#ifndef CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_POPUP_H_
#define CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_POPUP_H_
#pragma once
#include "base/memory/ref_counted.h"
#include "chrome/browser/extensions/extension_host.h"
#include "chrome/browser/ui/views/browser_bubble.h"
#include "chrome/browser/ui/views/bubble/bubble_border.h"
#include "chrome/browser/ui/views/extensions/extension_view.h"
#include "content/common/notification_observer.h"
#include "googleurl/src/gurl.h"
class Browser;
class ExtensionHost;
class Profile;
namespace views {
class Widget;
}
class ExtensionPopup : public BrowserBubble,
public BrowserBubble::Delegate,
public ExtensionView::Container,
public NotificationObserver,
public base::RefCounted<ExtensionPopup> {
public:
// Observer to ExtensionPopup events.
class Observer {
public:
// Called when the ExtensionPopup is closing. Note that it
// is ref-counted, and thus will be released shortly after
// making this delegate call.
virtual void ExtensionPopupIsClosing(ExtensionPopup* popup) {}
};
virtual ~ExtensionPopup();
// Create and show a popup with |url| positioned adjacent to |relative_to| in
// screen coordinates.
// |browser| is the browser to which the pop-up will be attached. NULL is a
// valid parameter for pop-ups not associated with a browser.
// The positioning of the pop-up is determined by |arrow_location| according
// to the following logic: The popup is anchored so that the corner indicated
// by value of |arrow_location| remains fixed during popup resizes.
// If |arrow_location| is BOTTOM_*, then the popup 'pops up', otherwise
// the popup 'drops down'.
// Pass |inspect_with_devtools| as true to pin the popup open and show the
// devtools window for it.
// The actual display of the popup is delayed until the page contents
// finish loading in order to minimize UI flashing and resizing.
static ExtensionPopup* Show(const GURL& url, Browser* browser,
const gfx::Rect& relative_to,
BubbleBorder::ArrowLocation arrow_location,
bool inspect_with_devtools,
Observer* observer);
// Closes the ExtensionPopup.
void Close();
// Some clients wish to do their own custom focus change management. If this
// is set to false, then the ExtensionPopup will not do anything in response
// to the BubbleLostFocus() calls it gets from the BrowserBubble.
void set_close_on_lost_focus(bool close_on_lost_focus) {
close_on_lost_focus_ = close_on_lost_focus;
}
ExtensionHost* host() const { return extension_host_.get(); }
// BrowserBubble overrides.
virtual void Show(bool activate);
// BrowserBubble::Delegate methods.
virtual void BubbleBrowserWindowMoved(BrowserBubble* bubble);
virtual void BubbleBrowserWindowClosing(BrowserBubble* bubble);
virtual void BubbleGotFocus(BrowserBubble* bubble);
virtual void BubbleLostFocus(BrowserBubble* bubble,
bool lost_focus_to_child);
// NotificationObserver overrides.
virtual void Observe(NotificationType type,
const NotificationSource& source,
const NotificationDetails& details);
// ExtensionView::Container overrides.
virtual void OnExtensionMouseMove(ExtensionView* view) { }
virtual void OnExtensionMouseLeave(ExtensionView* view) { }
virtual void OnExtensionPreferredSizeChanged(ExtensionView* view);
// The min/max height of popups.
static const int kMinWidth;
static const int kMinHeight;
static const int kMaxWidth;
static const int kMaxHeight;
private:
ExtensionPopup(ExtensionHost* host,
views::Widget* frame,
const gfx::Rect& relative_to,
BubbleBorder::ArrowLocation arrow_location,
bool inspect_with_devtools,
Observer* observer);
// The area on the screen that the popup should be positioned relative to.
gfx::Rect relative_to_;
// The contained host for the view.
scoped_ptr<ExtensionHost> extension_host_;
// Flag used to indicate if the pop-up should open a devtools window once
// it is shown inspecting it.
bool inspect_with_devtools_;
// If false, ignore BrowserBubble::Delegate::BubbleLostFocus() calls.
bool close_on_lost_focus_;
// Whether the ExtensionPopup is current going about closing itself.
bool closing_;
NotificationRegistrar registrar_;
// The observer of this popup.
Observer* observer_;
DISALLOW_COPY_AND_ASSIGN(ExtensionPopup);
};
#endif // CHROME_BROWSER_UI_VIEWS_EXTENSIONS_EXTENSION_POPUP_H_