summaryrefslogtreecommitdiffstats
path: root/chrome/browser/extensions/extension_host.h
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/extensions/extension_host.h')
-rw-r--r--chrome/browser/extensions/extension_host.h278
1 files changed, 278 insertions, 0 deletions
diff --git a/chrome/browser/extensions/extension_host.h b/chrome/browser/extensions/extension_host.h
new file mode 100644
index 0000000..4eb81d9
--- /dev/null
+++ b/chrome/browser/extensions/extension_host.h
@@ -0,0 +1,278 @@
+// Copyright (c) 2010 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_EXTENSIONS_EXTENSION_HOST_H_
+#define CHROME_BROWSER_EXTENSIONS_EXTENSION_HOST_H_
+
+#include <string>
+
+#include "base/perftimer.h"
+#include "base/scoped_ptr.h"
+#include "chrome/browser/extensions/extension_function_dispatcher.h"
+#include "chrome/browser/jsmessage_box_client.h"
+#include "chrome/browser/renderer_host/render_view_host_delegate.h"
+#include "chrome/browser/tab_contents/render_view_host_delegate_helper.h"
+#if defined(TOOLKIT_VIEWS)
+#include "chrome/browser/views/extensions/extension_view.h"
+#elif defined(OS_MACOSX)
+#include "chrome/browser/cocoa/extension_view_mac.h"
+#elif defined(TOOLKIT_GTK)
+#include "chrome/browser/gtk/extension_view_gtk.h"
+#endif
+#include "chrome/common/notification_registrar.h"
+
+
+class Browser;
+class Extension;
+class ExtensionProcessManager;
+class RenderProcessHost;
+class RenderWidgetHost;
+class RenderWidgetHostView;
+class TabContents;
+struct WebPreferences;
+
+// This class is the browser component of an extension component's RenderView.
+// It handles setting up the renderer process, if needed, with special
+// privileges available to extensions. It may have a view to be shown in the
+// in the browser UI, or it may be hidden.
+class ExtensionHost : public RenderViewHostDelegate,
+ public RenderViewHostDelegate::View,
+ public ExtensionFunctionDispatcher::Delegate,
+ public NotificationObserver,
+ public JavaScriptMessageBoxClient {
+ public:
+ class ProcessCreationQueue;
+
+ // Enable DOM automation in created render view hosts.
+ static void EnableDOMAutomation() { enable_dom_automation_ = true; }
+
+ ExtensionHost(Extension* extension, SiteInstance* site_instance,
+ const GURL& url, ViewType::Type host_type);
+ ~ExtensionHost();
+
+#if defined(TOOLKIT_VIEWS)
+ void set_view(ExtensionView* view) { view_.reset(view); }
+ ExtensionView* view() const { return view_.get(); }
+#elif defined(OS_MACOSX)
+ ExtensionViewMac* view() const { return view_.get(); }
+#elif defined(TOOLKIT_GTK)
+ ExtensionViewGtk* view() const { return view_.get(); }
+#else
+ // TODO(port): implement
+ void* view() const { return NULL; }
+#endif
+
+ // Create an ExtensionView and tie it to this host and |browser|. Note NULL
+ // is a valid argument for |browser|. Extension views may be bound to
+ // tab-contents hosted in ExternalTabContainer objects, which do not
+ // instantiate Browser objects.
+ void CreateView(Browser* browser);
+
+ Extension* extension() { return extension_; }
+ RenderViewHost* render_view_host() const { return render_view_host_; }
+ RenderProcessHost* render_process_host() const;
+ SiteInstance* site_instance() const;
+ bool did_stop_loading() const { return did_stop_loading_; }
+ bool document_element_available() const {
+ return document_element_available_;
+ }
+
+ Profile* profile() const { return profile_; }
+
+ ViewType::Type extension_host_type() const { return extension_host_type_; }
+
+ // ExtensionFunctionDispatcher::Delegate
+ virtual TabContents* associated_tab_contents() {
+ return associated_tab_contents_;
+ }
+ void set_associated_tab_contents(TabContents* associated_tab_contents) {
+ associated_tab_contents_ = associated_tab_contents;
+ }
+
+ // Sets the the ViewType of this host (e.g. mole, toolstrip).
+ void SetRenderViewType(ViewType::Type type);
+
+ // Returns true if the render view is initialized and didn't crash.
+ bool IsRenderViewLive() const;
+
+ // Prepares to initializes our RenderViewHost by creating its RenderView and
+ // navigating to this host's url. Uses host_view for the RenderViewHost's view
+ // (can be NULL). This happens delayed to avoid locking the UI.
+ void CreateRenderViewSoon(RenderWidgetHostView* host_view);
+
+ // Sets |url_| and navigates |render_view_host_|.
+ void NavigateToURL(const GURL& url);
+
+ // Insert a default style sheet for Extension Infobars.
+ void InsertInfobarCSS();
+
+ // Insert the theme CSS for a toolstrip/mole.
+ void InsertThemedToolstripCSS();
+
+ // Tell the renderer not to draw scrollbars on windows smaller than
+ // |size_limit| in both width and height.
+ void DisableScrollbarsForSmallWindows(const gfx::Size& size_limit);
+
+ // RenderViewHostDelegate implementation.
+ virtual RenderViewHostDelegate::View* GetViewDelegate();
+ virtual const GURL& GetURL() const { return url_; }
+ virtual void RenderViewCreated(RenderViewHost* render_view_host);
+ virtual ViewType::Type GetRenderViewType() const;
+ virtual int GetBrowserWindowID() const;
+ virtual void RenderViewGone(RenderViewHost* render_view_host);
+ virtual void DidNavigate(RenderViewHost* render_view_host,
+ const ViewHostMsg_FrameNavigate_Params& params);
+ virtual void DidStopLoading();
+ virtual void DocumentAvailableInMainFrame(RenderViewHost* render_view_host);
+ virtual void DocumentOnLoadCompletedInMainFrame(
+ RenderViewHost* render_view_host);
+
+ virtual WebPreferences GetWebkitPrefs();
+ virtual void ProcessDOMUIMessage(const std::string& message,
+ const ListValue* content,
+ const GURL& source_url,
+ int request_id,
+ bool has_callback);
+ virtual void RunJavaScriptMessage(const std::wstring& message,
+ const std::wstring& default_prompt,
+ const GURL& frame_url,
+ const int flags,
+ IPC::Message* reply_msg,
+ bool* did_suppress_message);
+ virtual void Close(RenderViewHost* render_view_host);
+ virtual RendererPreferences GetRendererPrefs(Profile* profile) const;
+
+ // RenderViewHostDelegate::View
+ virtual void CreateNewWindow(
+ int route_id,
+ WindowContainerType window_container_type,
+ const string16& frame_name);
+ virtual void CreateNewWidget(int route_id, WebKit::WebPopupType popup_type);
+ virtual void ShowCreatedWindow(int route_id,
+ WindowOpenDisposition disposition,
+ const gfx::Rect& initial_pos,
+ bool user_gesture);
+ virtual void ShowCreatedWidget(int route_id,
+ const gfx::Rect& initial_pos);
+ virtual void ShowContextMenu(const ContextMenuParams& params);
+ virtual void StartDragging(const WebDropData& drop_data,
+ WebKit::WebDragOperationsMask allowed_operations,
+ const SkBitmap& image,
+ const gfx::Point& image_offset);
+ virtual void UpdateDragCursor(WebKit::WebDragOperation operation);
+ virtual void GotFocus();
+ virtual void TakeFocus(bool reverse);
+ virtual bool PreHandleKeyboardEvent(const NativeWebKeyboardEvent& event,
+ bool* is_keyboard_shortcut);
+ virtual void HandleKeyboardEvent(const NativeWebKeyboardEvent& event);
+ virtual void HandleMouseEvent();
+ virtual void HandleMouseLeave();
+ virtual void UpdatePreferredSize(const gfx::Size& new_size);
+
+ // NotificationObserver
+ virtual void Observe(NotificationType type,
+ const NotificationSource& source,
+ const NotificationDetails& details);
+
+ // JavaScriptMessageBoxClient
+ virtual std::wstring GetMessageBoxTitle(const GURL& frame_url,
+ bool is_alert);
+ virtual gfx::NativeWindow GetMessageBoxRootWindow();
+ virtual void OnMessageBoxClosed(IPC::Message* reply_msg,
+ bool success,
+ const std::wstring& prompt);
+ virtual void SetSuppressMessageBoxes(bool suppress_message_boxes) {}
+ virtual TabContents* AsTabContents() { return NULL; }
+ virtual ExtensionHost* AsExtensionHost() { return this; }
+
+ protected:
+ // Internal functions used to support the CreateNewWidget() method. If a
+ // platform requires plugging into widget creation at a lower level, then a
+ // subclass might want to override these functions, but otherwise they should
+ // be fine just implementing RenderWidgetHostView::InitAsPopup().
+ //
+ // The Create function returns the newly created widget so it can be
+ // associated with the given route. When the widget needs to be shown later,
+ // we'll look it up again and pass the object to the Show functions rather
+ // than the route ID.
+ virtual RenderWidgetHostView* CreateNewWidgetInternal(
+ int route_id,
+ WebKit::WebPopupType popup_type);
+ virtual void ShowCreatedWidgetInternal(RenderWidgetHostView* widget_host_view,
+ const gfx::Rect& initial_pos);
+ private:
+ friend class ProcessCreationQueue;
+
+ // Whether to allow DOM automation for created RenderViewHosts. This is used
+ // for testing.
+ static bool enable_dom_automation_;
+
+ // Actually create the RenderView for this host. See CreateRenderViewSoon.
+ void CreateRenderViewNow();
+
+ // ExtensionFunctionDispatcher::Delegate
+ virtual Browser* GetBrowser() const {
+ return view() ? view()->browser() : NULL;
+ }
+ virtual gfx::NativeView GetNativeViewOfHost() {
+ return view() ? view()->native_view() : NULL;
+ }
+
+ // Handles keyboard events that were not handled by HandleKeyboardEvent().
+ // Platform specific implementation may override this method to handle the
+ // event in platform specific way.
+ virtual void UnhandledKeyboardEvent(const NativeWebKeyboardEvent& event) {}
+
+ // Returns true if we're hosting a background page.
+ // This isn't valid until CreateRenderView is called.
+ bool is_background_page() const { return !view(); }
+
+ // The extension that we're hosting in this view.
+ Extension* extension_;
+
+ // The profile that this host is tied to.
+ Profile* profile_;
+
+ // Optional view that shows the rendered content in the UI.
+#if defined(TOOLKIT_VIEWS)
+ scoped_ptr<ExtensionView> view_;
+#elif defined(OS_MACOSX)
+ scoped_ptr<ExtensionViewMac> view_;
+#elif defined(TOOLKIT_GTK)
+ scoped_ptr<ExtensionViewGtk> view_;
+#endif
+
+ // The host for our HTML content.
+ RenderViewHost* render_view_host_;
+
+ // Common implementations of some RenderViewHostDelegate::View methods.
+ RenderViewHostDelegateViewHelper delegate_view_helper_;
+
+ // Whether the RenderWidget has reported that it has stopped loading.
+ bool did_stop_loading_;
+
+ // True if the main frame has finished parsing.
+ bool document_element_available_;
+
+ // The URL being hosted.
+ GURL url_;
+
+ NotificationRegistrar registrar_;
+
+ scoped_ptr<ExtensionFunctionDispatcher> extension_function_dispatcher_;
+
+ // Only EXTENSION_TOOLSTRIP, EXTENSION_POPUP, and EXTENSION_BACKGROUND_PAGE
+ // are used here, others are not hosted by ExtensionHost.
+ ViewType::Type extension_host_type_;
+
+ // The relevant TabContents associated with this ExtensionHost, if any.
+ TabContents* associated_tab_contents_;
+
+ // Used to measure how long it's been since the host was created.
+ PerfTimer since_created_;
+
+ DISALLOW_COPY_AND_ASSIGN(ExtensionHost);
+};
+
+#endif // CHROME_BROWSER_EXTENSIONS_EXTENSION_HOST_H_