// Copyright 2014 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 EXTENSIONS_BROWSER_EXTENSION_WEB_CONTENTS_OBSERVER_H_ #define EXTENSIONS_BROWSER_EXTENSION_WEB_CONTENTS_OBSERVER_H_ #include #include "base/compiler_specific.h" #include "base/macros.h" #include "content/public/browser/web_contents_observer.h" #include "extensions/browser/extension_function_dispatcher.h" namespace content { class BrowserContext; class RenderViewHost; class WebContents; } namespace extensions { class Extension; // A web contents observer used for renderer and extension processes. Grants the // renderer access to certain URL scheme patterns for extensions and notifies // the renderer that the extension was loaded. // // Extension system embedders must create an instance for every extension // WebContents. It must be a subclass so that creating an instance via // content::WebContentsUserData::CreateForWebContents() provides an object of // the correct type. For an example, see ChromeExtensionWebContentsObserver. class ExtensionWebContentsObserver : public content::WebContentsObserver, public ExtensionFunctionDispatcher::Delegate { public: // Returns the ExtensionWebContentsObserver for the given |web_contents|. static ExtensionWebContentsObserver* GetForWebContents( content::WebContents* web_contents); ExtensionFunctionDispatcher* dispatcher() { return &dispatcher_; } protected: explicit ExtensionWebContentsObserver(content::WebContents* web_contents); ~ExtensionWebContentsObserver() override; content::BrowserContext* browser_context() { return browser_context_; } // Initializes a new render frame. Subclasses should invoke this // implementation if extending. virtual void InitializeRenderFrame( content::RenderFrameHost* render_frame_host); // ExtensionFunctionDispatcher::Delegate overrides. content::WebContents* GetAssociatedWebContents() const override; // content::WebContentsObserver overrides. // A subclass should invoke this method to finish extension process setup. void RenderViewCreated(content::RenderViewHost* render_view_host) override; void RenderFrameCreated(content::RenderFrameHost* render_frame_host) override; void RenderFrameDeleted(content::RenderFrameHost* render_frame_host) override; // Subclasses should call this first before doing their own message handling. bool OnMessageReceived(const IPC::Message& message, content::RenderFrameHost* render_frame_host) override; // Per the documentation in WebContentsObserver, these two methods are invoked // when a Pepper plugin instance is attached/detached in the page DOM. void PepperInstanceCreated() override; void PepperInstanceDeleted() override; // Returns the extension id associated with the given |render_frame_host|, or // the empty string if there is none. std::string GetExtensionIdFromFrame( content::RenderFrameHost* render_frame_host) const; // Returns the extension associated with the given |render_frame_host|, or // null if there is none. const Extension* GetExtensionFromFrame( content::RenderFrameHost* render_frame_host) const; // TODO(devlin): Remove these once callers are updated to use the FromFrame // equivalents. // Returns the extension or app associated with a render view host. Returns // NULL if the render view host is not for a valid extension. const Extension* GetExtension(content::RenderViewHost* render_view_host); // Returns the extension or app ID associated with a render view host. Returns // the empty string if the render view host is not for a valid extension. static std::string GetExtensionId(content::RenderViewHost* render_view_host); private: void OnRequest(content::RenderFrameHost* render_frame_host, const ExtensionHostMsg_Request_Params& params); // A helper function for initializing render frames at the creation of the // observer. void InitializeFrameHelper(content::RenderFrameHost* render_frame_host); // The BrowserContext associated with the WebContents being observed. content::BrowserContext* browser_context_; ExtensionFunctionDispatcher dispatcher_; DISALLOW_COPY_AND_ASSIGN(ExtensionWebContentsObserver); }; } // namespace extensions #endif // EXTENSIONS_BROWSER_EXTENSION_WEB_CONTENTS_OBSERVER_H_