Home | History | Annotate | Download | only in extensions
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef CHROME_BROWSER_EXTENSIONS_EXTENSION_VIEW_HOST_H_
      6 #define CHROME_BROWSER_EXTENSIONS_EXTENSION_VIEW_HOST_H_
      7 
      8 #include "base/memory/scoped_ptr.h"
      9 #include "components/web_modal/popup_manager.h"
     10 #include "components/web_modal/web_contents_modal_dialog_host.h"
     11 #include "components/web_modal/web_contents_modal_dialog_manager_delegate.h"
     12 #include "extensions/browser/extension_host.h"
     13 
     14 class Browser;
     15 
     16 namespace content {
     17 class SiteInstance;
     18 class WebContents;
     19 }
     20 
     21 namespace extensions {
     22 
     23 class ExtensionView;
     24 
     25 // The ExtensionHost for an extension that backs a view in the browser UI. For
     26 // example, this could be an extension popup, infobar or dialog, but not a
     27 // background page.
     28 // TODO(gbillock): See if we can remove WebContentsModalDialogManager here.
     29 class ExtensionViewHost
     30     : public ExtensionHost,
     31       public web_modal::WebContentsModalDialogManagerDelegate,
     32       public web_modal::WebContentsModalDialogHost {
     33  public:
     34   ExtensionViewHost(const Extension* extension,
     35                     content::SiteInstance* site_instance,
     36                     const GURL& url,
     37                     ViewType host_type);
     38   virtual ~ExtensionViewHost();
     39 
     40   ExtensionView* view() { return view_.get(); }
     41   const ExtensionView* view() const { return view_.get(); }
     42 
     43   // Create an ExtensionView and tie it to this host and |browser|.  Note NULL
     44   // is a valid argument for |browser|.  Extension views may be bound to
     45   // tab-contents hosted in ExternalTabContainer objects, which do not
     46   // instantiate Browser objects.
     47   void CreateView(Browser* browser);
     48 
     49   void SetAssociatedWebContents(content::WebContents* web_contents);
     50 
     51   // Handles keyboard events that were not handled by HandleKeyboardEvent().
     52   // Platform specific implementation may override this method to handle the
     53   // event in platform specific way.
     54   virtual void UnhandledKeyboardEvent(
     55       content::WebContents* source,
     56       const content::NativeWebKeyboardEvent& event);
     57 
     58   // ExtensionHost
     59   virtual void OnDidStopLoading() OVERRIDE;
     60   virtual void OnDocumentAvailable() OVERRIDE;
     61   virtual void LoadInitialURL() OVERRIDE;
     62   virtual bool IsBackgroundPage() const OVERRIDE;
     63 
     64   // content::WebContentsDelegate
     65   virtual content::WebContents* OpenURLFromTab(
     66       content::WebContents* source,
     67       const content::OpenURLParams& params) OVERRIDE;
     68   virtual bool PreHandleKeyboardEvent(
     69       content::WebContents* source,
     70       const content::NativeWebKeyboardEvent& event,
     71       bool* is_keyboard_shortcut) OVERRIDE;
     72   virtual void HandleKeyboardEvent(
     73       content::WebContents* source,
     74       const content::NativeWebKeyboardEvent& event) OVERRIDE;
     75   virtual bool PreHandleGestureEvent(
     76       content::WebContents* source,
     77       const blink::WebGestureEvent& event) OVERRIDE;
     78   virtual content::ColorChooser* OpenColorChooser(
     79       content::WebContents* web_contents,
     80       SkColor color,
     81       const std::vector<content::ColorSuggestion>& suggestions) OVERRIDE;
     82   virtual void RunFileChooser(
     83       content::WebContents* tab,
     84       const content::FileChooserParams& params) OVERRIDE;
     85   virtual void ResizeDueToAutoResize(content::WebContents* source,
     86                                      const gfx::Size& new_size) OVERRIDE;
     87 
     88   // content::WebContentsObserver
     89   virtual void RenderViewCreated(
     90       content::RenderViewHost* render_view_host) OVERRIDE;
     91 
     92   // web_modal::WebContentsModalDialogManagerDelegate
     93   virtual web_modal::WebContentsModalDialogHost*
     94       GetWebContentsModalDialogHost() OVERRIDE;
     95   virtual bool IsWebContentsVisible(
     96       content::WebContents* web_contents) OVERRIDE;
     97 
     98   // web_modal::WebContentsModalDialogHost
     99   virtual gfx::NativeView GetHostView() const OVERRIDE;
    100   virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE;
    101   virtual gfx::Size GetMaximumDialogSize() OVERRIDE;
    102   virtual void AddObserver(
    103       web_modal::ModalDialogHostObserver* observer) OVERRIDE;
    104   virtual void RemoveObserver(
    105       web_modal::ModalDialogHostObserver* observer) OVERRIDE;
    106 
    107   // extensions::ExtensionFunctionDispatcher::Delegate
    108   virtual WindowController* GetExtensionWindowController() const OVERRIDE;
    109   virtual content::WebContents* GetAssociatedWebContents() const OVERRIDE;
    110   virtual content::WebContents* GetVisibleWebContents() const OVERRIDE;
    111 
    112   // content::NotificationObserver
    113   virtual void Observe(int type,
    114                        const content::NotificationSource& source,
    115                        const content::NotificationDetails& details) OVERRIDE;
    116 
    117  private:
    118   // Implemented per-platform. Create the platform-specific ExtensionView.
    119   static scoped_ptr<ExtensionView> CreateExtensionView(ExtensionViewHost* host,
    120                                                        Browser* browser);
    121 
    122   // Insert a default style sheet for Extension Infobars.
    123   void InsertInfobarCSS();
    124 
    125   // Optional view that shows the rendered content in the UI.
    126   scoped_ptr<ExtensionView> view_;
    127 
    128   // The relevant WebContents associated with this ExtensionViewHost, if any.
    129   content::WebContents* associated_web_contents_;
    130 
    131   // Observer to detect when the associated web contents is destroyed.
    132   class AssociatedWebContentsObserver;
    133   scoped_ptr<AssociatedWebContentsObserver> associated_web_contents_observer_;
    134 
    135   // Manage popups overlaying the WebContents in this EVH.
    136   // TODO(gbillock): should usually not be used -- instead use the parent
    137   // window's popup manager. Should only be used when the EVH is created without
    138   // a parent window.
    139   scoped_ptr<web_modal::PopupManager> popup_manager_;
    140 
    141   DISALLOW_COPY_AND_ASSIGN(ExtensionViewHost);
    142 };
    143 
    144 }  // namespace extensions
    145 
    146 #endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_VIEW_HOST_H_
    147