• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "chrome/browser/extensions/extension_host.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 
13 #if defined(TOOLKIT_VIEWS)
14 #include "chrome/browser/ui/views/extensions/extension_view_views.h"
15 #elif defined(OS_MACOSX)
16 #include "chrome/browser/ui/cocoa/extensions/extension_view_mac.h"
17 #elif defined(TOOLKIT_GTK)
18 #include "chrome/browser/ui/gtk/extensions/extension_view_gtk.h"
19 #elif defined(OS_ANDROID)
20 #include "chrome/browser/ui/android/extensions/extension_view_android.h"
21 #endif
22 
23 class Browser;
24 
25 namespace content {
26 class SiteInstance;
27 class WebContents;
28 }
29 
30 namespace extensions {
31 
32 // The ExtensionHost for an extension that backs a view in the browser UI. For
33 // example, this could be an extension popup, infobar or dialog, but not a
34 // background page.
35 class ExtensionViewHost
36     : public ExtensionHost,
37       public web_modal::WebContentsModalDialogManagerDelegate,
38       public web_modal::WebContentsModalDialogHost {
39  public:
40   ExtensionViewHost(const Extension* extension,
41                     content::SiteInstance* site_instance,
42                     const GURL& url,
43                     ViewType host_type);
44   virtual ~ExtensionViewHost();
45 
46   // TODO(jamescook): Create platform specific subclasses?
47 #if defined(TOOLKIT_VIEWS)
48   typedef ExtensionViewViews PlatformExtensionView;
49 #elif defined(OS_MACOSX)
50   typedef ExtensionViewMac PlatformExtensionView;
51 #elif defined(TOOLKIT_GTK)
52   typedef ExtensionViewGtk PlatformExtensionView;
53 #elif defined(OS_ANDROID)
54   // Android does not support extensions.
55   typedef ExtensionViewAndroid PlatformExtensionView;
56 #endif
57 
view()58   PlatformExtensionView* view() { return view_.get(); }
59 
60   // Create an ExtensionView and tie it to this host and |browser|.  Note NULL
61   // is a valid argument for |browser|.  Extension views may be bound to
62   // tab-contents hosted in ExternalTabContainer objects, which do not
63   // instantiate Browser objects.
64   void CreateView(Browser* browser);
65 
66   void SetAssociatedWebContents(content::WebContents* web_contents);
67 
68   // Handles keyboard events that were not handled by HandleKeyboardEvent().
69   // Platform specific implementation may override this method to handle the
70   // event in platform specific way.
71   virtual void UnhandledKeyboardEvent(
72       content::WebContents* source,
73       const content::NativeWebKeyboardEvent& event);
74 
75   // ExtensionHost
76   virtual void OnDidStopLoading() OVERRIDE;
77   virtual void OnDocumentAvailable() OVERRIDE;
78   virtual void LoadInitialURL() OVERRIDE;
79   virtual bool IsBackgroundPage() const OVERRIDE;
80 
81   // content::WebContentsDelegate
82   virtual content::WebContents* OpenURLFromTab(
83       content::WebContents* source,
84       const content::OpenURLParams& params) OVERRIDE;
85   virtual bool PreHandleKeyboardEvent(
86       content::WebContents* source,
87       const content::NativeWebKeyboardEvent& event,
88       bool* is_keyboard_shortcut) OVERRIDE;
89   virtual void HandleKeyboardEvent(
90       content::WebContents* source,
91       const content::NativeWebKeyboardEvent& event) OVERRIDE;
92   virtual content::ColorChooser* OpenColorChooser(
93       content::WebContents* web_contents,
94       SkColor color,
95       const std::vector<content::ColorSuggestion>& suggestions) OVERRIDE;
96   virtual void RunFileChooser(
97       content::WebContents* tab,
98       const content::FileChooserParams& params) OVERRIDE;
99   virtual void ResizeDueToAutoResize(content::WebContents* source,
100                                      const gfx::Size& new_size) OVERRIDE;
101 
102   // content::WebContentsObserver
103   virtual void RenderViewCreated(
104       content::RenderViewHost* render_view_host) OVERRIDE;
105 
106   // web_modal::WebContentsModalDialogManagerDelegate
107   virtual web_modal::WebContentsModalDialogHost*
108       GetWebContentsModalDialogHost() OVERRIDE;
109   virtual bool IsWebContentsVisible(
110       content::WebContents* web_contents) OVERRIDE;
111 
112   // web_modal::WebContentsModalDialogHost
113   virtual gfx::NativeView GetHostView() const OVERRIDE;
114   virtual gfx::Point GetDialogPosition(const gfx::Size& size) OVERRIDE;
115   virtual gfx::Size GetMaximumDialogSize() OVERRIDE;
116   virtual void AddObserver(
117       web_modal::ModalDialogHostObserver* observer) OVERRIDE;
118   virtual void RemoveObserver(
119       web_modal::ModalDialogHostObserver* observer) OVERRIDE;
120 
121   // ExtensionFunctionDispatcher::Delegate
122   virtual WindowController* GetExtensionWindowController() const OVERRIDE;
123   virtual content::WebContents* GetAssociatedWebContents() const OVERRIDE;
124   virtual content::WebContents* GetVisibleWebContents() const OVERRIDE;
125 
126   // content::NotificationObserver
127   virtual void Observe(int type,
128                        const content::NotificationSource& source,
129                        const content::NotificationDetails& details) OVERRIDE;
130 
131  private:
132   // Insert a default style sheet for Extension Infobars.
133   void InsertInfobarCSS();
134 
135   // Optional view that shows the rendered content in the UI.
136   scoped_ptr<PlatformExtensionView> view_;
137 
138   // The relevant WebContents associated with this ExtensionViewHost, if any.
139   content::WebContents* associated_web_contents_;
140 
141   // Observer to detect when the associated web contents is destroyed.
142   class AssociatedWebContentsObserver;
143   scoped_ptr<AssociatedWebContentsObserver> associated_web_contents_observer_;
144 
145   DISALLOW_COPY_AND_ASSIGN(ExtensionViewHost);
146 };
147 
148 }  // namespace extensions
149 
150 #endif  // CHROME_BROWSER_EXTENSIONS_EXTENSION_VIEW_HOST_H_
151