123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#ifndef EXTENSIONS_BROWSER_EXTENSION_HOST_H_ 623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define EXTENSIONS_BROWSER_EXTENSION_HOST_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string> 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector> 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#include "base/timer/elapsed_timer.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_observer.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/notification_registrar.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h" 18a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "extensions/browser/extension_function_dispatcher.h" 1958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)#include "extensions/common/stack_frame.h" 20c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "extensions/common/view_type.h" 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PrefsTabHelper; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 251e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)class BrowserContext; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderProcessHost; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderWidgetHostView; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SiteInstance; 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension; 3323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class ExtensionHostDelegate; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WindowController; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This class is the browser component of an extension component's RenderView. 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// It handles setting up the renderer process, if needed, with special 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// privileges available to extensions. It may have a view to be shown in the 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// browser UI, or it may be hidden. 4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// 4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// If you are adding code that only affects visible extension views (and not 4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// invisible background pages) you should add it to ExtensionViewHost. 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ExtensionHost : public content::WebContentsDelegate, 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::WebContentsObserver, 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public ExtensionFunctionDispatcher::Delegate, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public content::NotificationObserver { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class ProcessCreationQueue; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionHost(const Extension* extension, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::SiteInstance* site_instance, 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL& url, ViewType host_type); 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~ExtensionHost(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension() const { return extension_; } 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& extension_id() const { return extension_id_; } 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* host_contents() const { return host_contents_.get(); } 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* render_view_host() const; 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderProcessHost* render_process_host() const; 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_stop_loading() const { return did_stop_loading_; } 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool document_element_available() const { 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return document_element_available_; 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 65f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* browser_context() { return browser_context_; } 661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ViewType extension_host_type() const { return extension_host_type_; } 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& GetURL() const; 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the render view is initialized and didn't crash. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool IsRenderViewLive() const; 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Prepares to initializes our RenderViewHost by creating its RenderView and 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // navigating to this host's url. Uses host_view for the RenderViewHost's view 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (can be NULL). This happens delayed to avoid locking the UI. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateRenderViewSoon(); 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::WebContentsObserver 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RenderViewCreated( 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* render_view_host) OVERRIDE; 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RenderViewDeleted( 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* render_view_host) OVERRIDE; 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RenderViewReady() OVERRIDE; 857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch virtual void RenderProcessGone(base::TerminationStatus status) OVERRIDE; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DocumentAvailableInMainFrame() OVERRIDE; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DidStopLoading( 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* render_view_host) OVERRIDE; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::WebContentsDelegate 912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual content::JavaScriptDialogManager* 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetJavaScriptDialogManager() OVERRIDE; 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddNewContents(content::WebContents* source, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* new_contents, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos, 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture, 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* was_blocked) OVERRIDE; 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CloseContents(content::WebContents* contents) OVERRIDE; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RequestMediaAccessPermission( 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* web_contents, 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const content::MediaStreamRequest& request, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::MediaResponseCallback& callback) OVERRIDE; 1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual bool CheckMediaAccessPermission( 1051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::WebContents* web_contents, 1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const GURL& security_origin, 1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci content::MediaStreamType type) OVERRIDE; 1080529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch virtual bool IsNeverVisible(content::WebContents* web_contents) OVERRIDE; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // content::NotificationObserver 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Observe(int type, 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationSource& source, 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NotificationDetails& details) OVERRIDE; 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) protected: 116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) content::NotificationRegistrar* registrar() { return ®istrar_; } 117a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Called after the extension page finishes loading but before the 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // EXTENSION_HOST_DID_STOP_LOADING notification is sent. 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnDidStopLoading(); 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Called once when the document first becomes available. 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void OnDocumentAvailable(); 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 125a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Navigates to the initial page. 126a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) virtual void LoadInitialURL(); 127a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns true if we're hosting a background page. 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual bool IsBackgroundPage() const; 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Closes this host (results in deletion). 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void Close(); 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class ProcessCreationQueue; 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Actually create the RenderView for this host. See CreateRenderViewSoon. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void CreateRenderViewNow(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Message handlers. 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnRequest(const ExtensionHostMsg_Request_Params& params); 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnEventAck(); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnIncrementLazyKeepaliveCount(); 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnDecrementLazyKeepaliveCount(); 14523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) 14623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) // Delegate for functionality that cannot exist in the extensions module. 14723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) scoped_ptr<ExtensionHostDelegate> delegate_; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The extension that we're hosting in this view. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const Extension* extension_; 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Id of extension that we're hosting in this view. 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string extension_id_; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The browser context that this host is tied to. 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) content::BrowserContext* browser_context_; 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The host for our HTML content. 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<content::WebContents> host_contents_; 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // A weak pointer to the current or pending RenderViewHost. We don't access 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // this through the host_contents because we want to deal with the pending 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // host, so we can send messages to it before it finishes loading. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::RenderViewHost* render_view_host_; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether the RenderWidget has reported that it has stopped loading. 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool did_stop_loading_; 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // True if the main frame has finished parsing. 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool document_element_available_; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The original URL of the page being hosted. 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GURL initial_url_; 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::NotificationRegistrar registrar_; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ExtensionFunctionDispatcher extension_function_dispatcher_; 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The type of view being hosted. 180c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ViewType extension_host_type_; 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Used to measure how long it's been since the host was created. 1834e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) base::ElapsedTimer since_created_; 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(ExtensionHost); 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace extensions 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 19023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif // EXTENSIONS_BROWSER_EXTENSION_HOST_H_ 191