diff options
author | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-18 06:43:30 +0000 |
---|---|---|
committer | jam@chromium.org <jam@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-18 06:43:30 +0000 |
commit | b765debf3f3395bf7677643e0c315cb778e77567 (patch) | |
tree | de18b41e644f31ca4909eb0127546359abddae3d | |
parent | 1f1dde8e92b7be25aa5eec4238b2fa1212b86598 (diff) | |
download | chromium_src-b765debf3f3395bf7677643e0c315cb778e77567.zip chromium_src-b765debf3f3395bf7677643e0c315cb778e77567.tar.gz chromium_src-b765debf3f3395bf7677643e0c315cb778e77567.tar.bz2 |
Chrome side of making SharedWorkerRepositoryClient be per RenderFrame instead of RenderView.
This also fixes the TODOs from r241306 in tab_specific_content_settings.cc
The RenderView ID is still being sent to the browser because it's used by ResourceRequestInfo::GetAssociatedRenderView. Fixing that will be a large change by itself, so I'll do that in a followup.
One minor behavior change is that the per-RenderView limit on how many shared workers can be started is now per-RenderFrame. Given that shared workers will be moved to the renderer process, I'm not too concerned about that.
BUG=304341
R=nasko@chromium.org
Review URL: https://codereview.chromium.org/109213006
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@241514 0039d316-1c4b-4281-b951-d872f2087c98
34 files changed, 170 insertions, 187 deletions
diff --git a/android_webview/browser/aw_content_browser_client.cc b/android_webview/browser/aw_content_browser_client.cc index 75a082a..0651bab 100644 --- a/android_webview/browser/aw_content_browser_client.cc +++ b/android_webview/browser/aw_content_browser_client.cc @@ -289,7 +289,7 @@ bool AwContentBrowserClient::AllowWorkerDatabase( const string16& display_name, unsigned long estimated_size, content::ResourceContext* context, - const std::vector<std::pair<int, int> >& render_views) { + const std::vector<std::pair<int, int> >& render_frames) { // Android WebView does not yet support web workers. return false; } @@ -297,7 +297,7 @@ bool AwContentBrowserClient::AllowWorkerDatabase( bool AwContentBrowserClient::AllowWorkerFileSystem( const GURL& url, content::ResourceContext* context, - const std::vector<std::pair<int, int> >& render_views) { + const std::vector<std::pair<int, int> >& render_frames) { // Android WebView does not yet support web workers. return false; } @@ -306,7 +306,7 @@ bool AwContentBrowserClient::AllowWorkerIndexedDB( const GURL& url, const string16& name, content::ResourceContext* context, - const std::vector<std::pair<int, int> >& render_views) { + const std::vector<std::pair<int, int> >& render_frames) { // Android WebView does not yet support web workers. return false; } diff --git a/android_webview/browser/aw_content_browser_client.h b/android_webview/browser/aw_content_browser_client.h index c9e23bc..3f81eca 100644 --- a/android_webview/browser/aw_content_browser_client.h +++ b/android_webview/browser/aw_content_browser_client.h @@ -80,16 +80,16 @@ class AwContentBrowserClient : public content::ContentBrowserClient { const string16& display_name, unsigned long estimated_size, content::ResourceContext* context, - const std::vector<std::pair<int, int> >& render_views) OVERRIDE; + const std::vector<std::pair<int, int> >& render_frames) OVERRIDE; virtual bool AllowWorkerFileSystem( const GURL& url, content::ResourceContext* context, - const std::vector<std::pair<int, int> >& render_views) OVERRIDE; + const std::vector<std::pair<int, int> >& render_frames) OVERRIDE; virtual bool AllowWorkerIndexedDB( const GURL& url, const string16& name, content::ResourceContext* context, - const std::vector<std::pair<int, int> >& render_views) OVERRIDE; + const std::vector<std::pair<int, int> >& render_frames) OVERRIDE; virtual content::QuotaPermissionContext* CreateQuotaPermissionContext() OVERRIDE; virtual void AllowCertificateError( diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 9c23d5c..c395507 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc @@ -1672,7 +1672,7 @@ bool ChromeContentBrowserClient::AllowWorkerDatabase( const base::string16& display_name, unsigned long estimated_size, content::ResourceContext* context, - const std::vector<std::pair<int, int> >& render_views) { + const std::vector<std::pair<int, int> >& render_frames) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); CookieSettings* cookie_settings = io_data->GetCookieSettings(); @@ -1680,7 +1680,7 @@ bool ChromeContentBrowserClient::AllowWorkerDatabase( // Record access to database for potential display in UI. std::vector<std::pair<int, int> >::const_iterator i; - for (i = render_views.begin(); i != render_views.end(); ++i) { + for (i = render_frames.begin(); i != render_frames.end(); ++i) { BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(&TabSpecificContentSettings::WebDatabaseAccessed, @@ -1693,7 +1693,7 @@ bool ChromeContentBrowserClient::AllowWorkerDatabase( bool ChromeContentBrowserClient::AllowWorkerFileSystem( const GURL& url, content::ResourceContext* context, - const std::vector<std::pair<int, int> >& render_views) { + const std::vector<std::pair<int, int> >& render_frames) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); CookieSettings* cookie_settings = io_data->GetCookieSettings(); @@ -1701,7 +1701,7 @@ bool ChromeContentBrowserClient::AllowWorkerFileSystem( // Record access to file system for potential display in UI. std::vector<std::pair<int, int> >::const_iterator i; - for (i = render_views.begin(); i != render_views.end(); ++i) { + for (i = render_frames.begin(); i != render_frames.end(); ++i) { BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(&TabSpecificContentSettings::FileSystemAccessed, @@ -1715,7 +1715,7 @@ bool ChromeContentBrowserClient::AllowWorkerIndexedDB( const GURL& url, const base::string16& name, content::ResourceContext* context, - const std::vector<std::pair<int, int> >& render_views) { + const std::vector<std::pair<int, int> >& render_frames) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); ProfileIOData* io_data = ProfileIOData::FromResourceContext(context); CookieSettings* cookie_settings = io_data->GetCookieSettings(); @@ -1723,7 +1723,7 @@ bool ChromeContentBrowserClient::AllowWorkerIndexedDB( // Record access to IndexedDB for potential display in UI. std::vector<std::pair<int, int> >::const_iterator i; - for (i = render_views.begin(); i != render_views.end(); ++i) { + for (i = render_frames.begin(); i != render_frames.end(); ++i) { BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(&TabSpecificContentSettings::IndexedDBAccessed, diff --git a/chrome/browser/chrome_content_browser_client.h b/chrome/browser/chrome_content_browser_client.h index e12eae1..28bf83d 100644 --- a/chrome/browser/chrome_content_browser_client.h +++ b/chrome/browser/chrome_content_browser_client.h @@ -138,16 +138,16 @@ class ChromeContentBrowserClient : public content::ContentBrowserClient { const base::string16& display_name, unsigned long estimated_size, content::ResourceContext* context, - const std::vector<std::pair<int, int> >& render_views) OVERRIDE; + const std::vector<std::pair<int, int> >& render_frames) OVERRIDE; virtual bool AllowWorkerFileSystem( const GURL& url, content::ResourceContext* context, - const std::vector<std::pair<int, int> >& render_views) OVERRIDE; + const std::vector<std::pair<int, int> >& render_frames) OVERRIDE; virtual bool AllowWorkerIndexedDB( const GURL& url, const base::string16& name, content::ResourceContext* context, - const std::vector<std::pair<int, int> >& render_views) OVERRIDE; + const std::vector<std::pair<int, int> >& render_frames) OVERRIDE; virtual net::URLRequestContext* OverrideRequestContextForURL( const GURL& url, content::ResourceContext* context) OVERRIDE; virtual content::QuotaPermissionContext* diff --git a/chrome/browser/content_settings/tab_specific_content_settings.cc b/chrome/browser/content_settings/tab_specific_content_settings.cc index d7d5edf..f605595 100644 --- a/chrome/browser/content_settings/tab_specific_content_settings.cc +++ b/chrome/browser/content_settings/tab_specific_content_settings.cc @@ -156,12 +156,6 @@ void TabSpecificContentSettings::WebDatabaseAccessed( DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); TabSpecificContentSettings* settings = GetForFrame( render_process_id, render_frame_id); - - // TODO(jam): remove this once WorkerProcessHost knows the RenderFrame IDs for - // a shared worker, which needs SharedWorkerRepository to be per frame. - if (!settings) - settings = Get(render_process_id, render_frame_id); - if (settings) settings->OnWebDatabaseAccessed(url, name, display_name, blocked_by_policy); } @@ -189,12 +183,6 @@ void TabSpecificContentSettings::IndexedDBAccessed( DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); TabSpecificContentSettings* settings = GetForFrame( render_process_id, render_frame_id); - - // TODO(jam): remove this once WorkerProcessHost knows the RenderFrame IDs for - // a shared worker, which needs SharedWorkerRepository to be per frame. - if (!settings) - settings = Get(render_process_id, render_frame_id); - if (settings) settings->OnIndexedDBAccessed(url, description, blocked_by_policy); } @@ -207,12 +195,6 @@ void TabSpecificContentSettings::FileSystemAccessed(int render_process_id, DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); TabSpecificContentSettings* settings = GetForFrame( render_process_id, render_frame_id); - - // TODO(jam): remove this once WorkerProcessHost knows the RenderFrame IDs for - // a shared worker, which needs SharedWorkerRepository to be per frame. - if (!settings) - settings = Get(render_process_id, render_frame_id); - if (settings) settings->OnFileSystemAccessed(url, blocked_by_policy); } diff --git a/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc b/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc index b9575dd..c152907 100644 --- a/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc +++ b/chrome/browser/extensions/api/web_navigation/web_navigation_api.cc @@ -254,9 +254,6 @@ WebNavigationTabObserver::WebNavigationTabObserver( pending_render_view_host_(NULL) { g_tab_observer.Get().insert(TabObserverMap::value_type(web_contents, this)); registrar_.Add(this, - content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT, - content::Source<content::WebContents>(web_contents)); - registrar_.Add(this, content::NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW, content::NotificationService::AllSources()); } @@ -288,36 +285,6 @@ void WebNavigationTabObserver::Observe( const content::NotificationSource& source, const content::NotificationDetails& details) { switch (type) { - case content::NOTIFICATION_RESOURCE_RECEIVED_REDIRECT: { - content::ResourceRedirectDetails* resource_redirect_details = - content::Details<content::ResourceRedirectDetails>(details).ptr(); - ResourceType::Type resource_type = - resource_redirect_details->resource_type; - if (resource_type == ResourceType::MAIN_FRAME || - resource_type == ResourceType::SUB_FRAME) { - content::RenderViewHost* render_view_host = NULL; - if (render_view_host_ && - resource_redirect_details->origin_child_id == - render_view_host_->GetProcess()->GetID() && - resource_redirect_details->origin_route_id == - render_view_host_->GetRoutingID()) { - render_view_host = render_view_host_; - } else if (pending_render_view_host_ && - resource_redirect_details->origin_child_id == - pending_render_view_host_->GetProcess()->GetID() && - resource_redirect_details->origin_route_id == - pending_render_view_host_->GetRoutingID()) { - render_view_host = pending_render_view_host_; - } - if (!render_view_host) - return; - FrameNavigationState::FrameID frame_id( - resource_redirect_details->frame_id, render_view_host); - navigation_state_.SetIsServerRedirected(frame_id); - } - break; - } - case content::NOTIFICATION_RENDER_VIEW_HOST_WILL_CLOSE_RENDER_VIEW: { // The RenderView is technically not yet deleted, but the RenderViewHost // already starts to filter out some IPCs. In order to not get confused, @@ -617,6 +584,13 @@ void WebNavigationTabObserver::DidFailLoad( navigation_state_.SetErrorOccurredInFrame(frame_id); } +void WebNavigationTabObserver::DidGetRedirectForResourceRequest( + content::RenderViewHost* render_view_host, + const content::ResourceRedirectDetails& details) { + FrameNavigationState::FrameID frame_id(details.frame_id, render_view_host); + navigation_state_.SetIsServerRedirected(frame_id); +} + void WebNavigationTabObserver::DidOpenRequestedURL( content::WebContents* new_contents, const GURL& url, diff --git a/chrome/browser/extensions/api/web_navigation/web_navigation_api.h b/chrome/browser/extensions/api/web_navigation/web_navigation_api.h index c0dd107..b445c34 100644 --- a/chrome/browser/extensions/api/web_navigation/web_navigation_api.h +++ b/chrome/browser/extensions/api/web_navigation/web_navigation_api.h @@ -94,6 +94,9 @@ class WebNavigationTabObserver int error_code, const base::string16& error_description, content::RenderViewHost* render_view_host) OVERRIDE; + virtual void DidGetRedirectForResourceRequest( + content::RenderViewHost* render_view_host, + const content::ResourceRedirectDetails& details) OVERRIDE; virtual void DidOpenRequestedURL(content::WebContents* new_contents, const GURL& url, const content::Referrer& referrer, diff --git a/chrome/browser/prerender/prerender_contents.cc b/chrome/browser/prerender/prerender_contents.cc index 8332584..1f6bdba 100644 --- a/chrome/browser/prerender/prerender_contents.cc +++ b/chrome/browser/prerender/prerender_contents.cc @@ -618,6 +618,7 @@ void PrerenderContents::DidNavigateMainFrame( } void PrerenderContents::DidGetRedirectForResourceRequest( + RenderViewHost* render_view_host, const content::ResourceRedirectDetails& details) { // DidGetRedirectForResourceRequest can come for any resource on a page. If // it's a redirect on the top-level resource, the name needs to be remembered diff --git a/chrome/browser/prerender/prerender_contents.h b/chrome/browser/prerender/prerender_contents.h index 0855af6..25cc3e1 100644 --- a/chrome/browser/prerender/prerender_contents.h +++ b/chrome/browser/prerender/prerender_contents.h @@ -234,6 +234,7 @@ class PrerenderContents : public content::NotificationObserver, const content::LoadCommittedDetails& details, const content::FrameNavigateParams& params) OVERRIDE; virtual void DidGetRedirectForResourceRequest( + content::RenderViewHost* render_view_host, const content::ResourceRedirectDetails& details) OVERRIDE; virtual void DidUpdateFaviconURL(int32 page_id, const std::vector<content::FaviconURL>& urls) OVERRIDE; diff --git a/content/browser/frame_host/render_frame_host_delegate.h b/content/browser/frame_host/render_frame_host_delegate.h index 1b9603e..b364ec5 100644 --- a/content/browser/frame_host/render_frame_host_delegate.h +++ b/content/browser/frame_host/render_frame_host_delegate.h @@ -29,6 +29,9 @@ class CONTENT_EXPORT RenderFrameHostDelegate { // Informs the delegate whenever a RenderFrameHost is deleted. virtual void RenderFrameDeleted(RenderFrameHost* render_frame_host) {} + // Notification that a worker process has crashed. + virtual void WorkerCrashed() {} + // Return this object cast to a WebContents, if it is one. If the object is // not a WebContents, returns NULL. virtual WebContents* GetAsWebContents(); diff --git a/content/browser/loader/resource_dispatcher_host_impl.cc b/content/browser/loader/resource_dispatcher_host_impl.cc index 831a368..e860a25 100644 --- a/content/browser/loader/resource_dispatcher_host_impl.cc +++ b/content/browser/loader/resource_dispatcher_host_impl.cc @@ -282,7 +282,7 @@ void NotifyRedirectOnUI(int render_process_id, return; RenderViewHostDelegate* delegate = host->GetDelegate(); - delegate->DidGetRedirectForResourceRequest(*details.get()); + delegate->DidGetRedirectForResourceRequest(host, *details.get()); } void NotifyResponseOnUI(int render_process_id, @@ -779,22 +779,6 @@ void ResourceDispatcherHostImpl::DidFinishLoading(ResourceLoader* loader) { RemovePendingRequest(info->GetChildID(), info->GetRequestID()); } -// static -bool ResourceDispatcherHostImpl::RenderViewForRequest( - const net::URLRequest* request, - int* render_process_id, - int* render_view_id) { - const ResourceRequestInfoImpl* info = - ResourceRequestInfoImpl::ForRequest(request); - if (!info) { - *render_process_id = -1; - *render_view_id = -1; - return false; - } - - return info->GetAssociatedRenderView(render_process_id, render_view_id); -} - void ResourceDispatcherHostImpl::OnInit() { scheduler_.reset(new ResourceScheduler); appcache::AppCacheInterceptor::EnsureRegistered(); diff --git a/content/browser/loader/resource_dispatcher_host_impl.h b/content/browser/loader/resource_dispatcher_host_impl.h index 2e0253a..b6922e5 100644 --- a/content/browser/loader/resource_dispatcher_host_impl.h +++ b/content/browser/loader/resource_dispatcher_host_impl.h @@ -271,14 +271,6 @@ class CONTENT_EXPORT ResourceDispatcherHostImpl virtual void DidReceiveResponse(ResourceLoader* loader) OVERRIDE; virtual void DidFinishLoading(ResourceLoader* loader) OVERRIDE; - // Extracts the render view/process host's identifiers from the given request - // and places them in the given out params (both required). If there are no - // such IDs associated with the request (such as non-page-related requests), - // this function will return false and both out params will be -1. - static bool RenderViewForRequest(const net::URLRequest* request, - int* render_process_host_id, - int* render_view_host_id); - // An init helper that runs on the IO thread. void OnInit(); diff --git a/content/browser/renderer_host/render_view_host_delegate.h b/content/browser/renderer_host/render_view_host_delegate.h index a258c36..7b7d9a9 100644 --- a/content/browser/renderer_host/render_view_host_delegate.h +++ b/content/browser/renderer_host/render_view_host_delegate.h @@ -173,6 +173,7 @@ class CONTENT_EXPORT RenderViewHostDelegate { // A redirect was received while requesting a resource. virtual void DidGetRedirectForResourceRequest( + RenderViewHost* render_view_host, const ResourceRedirectDetails& details) {} // The RenderView was navigated to a different page. @@ -328,9 +329,6 @@ class CONTENT_EXPORT RenderViewHostDelegate { uint64 upload_position, uint64 upload_size) {} - // Notification that a worker process has crashed. - virtual void WorkerCrashed() {} - // The page wants the hosting window to activate/deactivate itself (it // called the JavaScript window.focus()/blur() method). virtual void Activate() {} diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 4d2b3b2..6d04a41 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc @@ -2809,6 +2809,11 @@ void WebContentsImpl::RenderFrameDeleted(RenderFrameHost* render_frame_host) { RenderFrameDeleted(render_frame_host)); } +void WebContentsImpl::WorkerCrashed() { + if (delegate_) + delegate_->WorkerCrashed(this); +} + WebContents* WebContentsImpl::GetAsWebContents() { return this; } @@ -2945,11 +2950,14 @@ void WebContentsImpl::DidGetResourceResponseStart( } void WebContentsImpl::DidGetRedirectForResourceRequest( + RenderViewHost* render_view_host, const ResourceRedirectDetails& details) { controller_.ssl_manager()->DidReceiveResourceRedirect(details); - FOR_EACH_OBSERVER(WebContentsObserver, observers_, - DidGetRedirectForResourceRequest(details)); + FOR_EACH_OBSERVER( + WebContentsObserver, + observers_, + DidGetRedirectForResourceRequest(render_view_host, details)); // TODO(avi): Remove. http://crbug.com/170921 NotificationService::current()->Notify( @@ -3581,11 +3589,6 @@ void WebContentsImpl::LoadStateChanged( } } -void WebContentsImpl::WorkerCrashed() { - if (delegate_) - delegate_->WorkerCrashed(this); -} - void WebContentsImpl::BeforeUnloadFiredFromRenderManager( bool proceed, const base::TimeTicks& proceed_time, bool* proceed_to_fire_unload) { diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index c60b0f7..a87c20bf 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h @@ -287,6 +287,7 @@ class CONTENT_EXPORT WebContentsImpl const IPC::Message& message) OVERRIDE; virtual void RenderFrameCreated(RenderFrameHost* render_frame_host) OVERRIDE; virtual void RenderFrameDeleted(RenderFrameHost* render_frame_host) OVERRIDE; + virtual void WorkerCrashed() OVERRIDE; virtual WebContents* GetAsWebContents() OVERRIDE; // RenderViewHostDelegate ---------------------------------------------------- @@ -320,6 +321,7 @@ class CONTENT_EXPORT WebContentsImpl virtual void DidGetResourceResponseStart( const ResourceRequestDetails& details) OVERRIDE; virtual void DidGetRedirectForResourceRequest( + RenderViewHost* render_view_host, const ResourceRedirectDetails& details) OVERRIDE; virtual void DidNavigate( RenderViewHost* render_view_host, @@ -397,7 +399,6 @@ class CONTENT_EXPORT WebContentsImpl const net::LoadStateWithParam& load_state, uint64 upload_position, uint64 upload_size) OVERRIDE; - virtual void WorkerCrashed() OVERRIDE; virtual void Activate() OVERRIDE; virtual void Deactivate() OVERRIDE; virtual void LostCapture() OVERRIDE; diff --git a/content/browser/worker_host/test/worker_browsertest.cc b/content/browser/worker_host/test/worker_browsertest.cc index acd00fb..f895fb7 100644 --- a/content/browser/worker_host/test/worker_browsertest.cc +++ b/content/browser/worker_host/test/worker_browsertest.cc @@ -148,7 +148,7 @@ IN_PROC_BROWSER_TEST_F(WorkerTest, DISABLED_LimitPerPage) { #else IN_PROC_BROWSER_TEST_F(WorkerTest, LimitPerPage) { #endif - int max_workers_per_tab = WorkerServiceImpl::kMaxWorkersPerTabWhenSeparate; + int max_workers_per_tab = WorkerServiceImpl::kMaxWorkersPerFrameWhenSeparate; std::string query = base::StringPrintf("?count=%d", max_workers_per_tab + 1); GURL url = GetTestURL("many_shared_workers.html", query); @@ -170,7 +170,7 @@ IN_PROC_BROWSER_TEST_F(WorkerTest, LimitTotal) { return; } - int max_workers_per_tab = WorkerServiceImpl::kMaxWorkersPerTabWhenSeparate; + int max_workers_per_tab = WorkerServiceImpl::kMaxWorkersPerFrameWhenSeparate; int total_workers = WorkerServiceImpl::kMaxWorkersWhenSeparate; std::string query = base::StringPrintf("?count=%d", max_workers_per_tab); @@ -208,7 +208,7 @@ IN_PROC_BROWSER_TEST_F(WorkerTest, WorkerClose) { IN_PROC_BROWSER_TEST_F(WorkerTest, DISABLED_QueuedSharedWorkerShutdown) { // Tests to make sure that queued shared workers are started up when shared // workers shut down. - int max_workers_per_tab = WorkerServiceImpl::kMaxWorkersPerTabWhenSeparate; + int max_workers_per_tab = WorkerServiceImpl::kMaxWorkersPerFrameWhenSeparate; std::string query = base::StringPrintf("?count=%d", max_workers_per_tab); RunTest("queued_shared_worker_shutdown.html", query); ASSERT_TRUE(WaitForWorkerProcessCount(max_workers_per_tab)); @@ -220,7 +220,7 @@ IN_PROC_BROWSER_TEST_F(WorkerTest, DISABLED_QueuedSharedWorkerShutdown) { IN_PROC_BROWSER_TEST_F(WorkerTest, DISABLED_MultipleTabsQueuedSharedWorker) { // Tests to make sure that only one instance of queued shared workers are // started up even when those instances are on multiple tabs. - int max_workers_per_tab = WorkerServiceImpl::kMaxWorkersPerTabWhenSeparate; + int max_workers_per_tab = WorkerServiceImpl::kMaxWorkersPerFrameWhenSeparate; std::string query = base::StringPrintf("?count=%d", max_workers_per_tab + 1); GURL url = GetTestURL("many_shared_workers.html", query); NavigateToURL(shell(), url); @@ -243,7 +243,7 @@ IN_PROC_BROWSER_TEST_F(WorkerTest, DISABLED_MultipleTabsQueuedSharedWorker) { IN_PROC_BROWSER_TEST_F(WorkerTest, DISABLED_QueuedSharedWorkerStartedFromOtherTab) { // Tests to make sure that queued shared workers are started up when // an instance is launched from another tab. - int max_workers_per_tab = WorkerServiceImpl::kMaxWorkersPerTabWhenSeparate; + int max_workers_per_tab = WorkerServiceImpl::kMaxWorkersPerFrameWhenSeparate; std::string query = base::StringPrintf("?count=%d", max_workers_per_tab + 1); GURL url = GetTestURL("many_shared_workers.html", query); NavigateToURL(shell(), url); diff --git a/content/browser/worker_host/worker_document_set.cc b/content/browser/worker_host/worker_document_set.cc index 48eaf86..3295b94 100644 --- a/content/browser/worker_host/worker_document_set.cc +++ b/content/browser/worker_host/worker_document_set.cc @@ -14,8 +14,10 @@ WorkerDocumentSet::WorkerDocumentSet() { void WorkerDocumentSet::Add(WorkerMessageFilter* parent, unsigned long long document_id, int render_process_id, - int render_view_id) { - DocumentInfo info(parent, document_id, render_process_id, render_view_id); + int render_view_id, + int render_frame_id) { + DocumentInfo info(parent, document_id, render_process_id, render_view_id, + render_frame_id); document_set_.insert(info); } @@ -60,11 +62,12 @@ void WorkerDocumentSet::RemoveAll(WorkerMessageFilter* parent) { WorkerDocumentSet::DocumentInfo::DocumentInfo( WorkerMessageFilter* filter, unsigned long long document_id, - int render_process_id, int render_view_id) + int render_process_id, int render_view_id, int render_frame_id) : filter_(filter), document_id_(document_id), render_process_id_(render_process_id), - render_view_id_(render_view_id) { + render_view_id_(render_view_id), + render_frame_id_(render_frame_id) { } WorkerDocumentSet::~WorkerDocumentSet() { diff --git a/content/browser/worker_host/worker_document_set.h b/content/browser/worker_host/worker_document_set.h index a4b35ae..97047e4 100644 --- a/content/browser/worker_host/worker_document_set.h +++ b/content/browser/worker_host/worker_document_set.h @@ -25,11 +25,13 @@ class WorkerDocumentSet : public base::RefCounted<WorkerDocumentSet> { class DocumentInfo { public: DocumentInfo(WorkerMessageFilter* filter, unsigned long long document_id, - int renderer_process_id, int render_view_id); + int renderer_process_id, int render_view_id, + int render_frame_id); WorkerMessageFilter* filter() const { return filter_; } unsigned long long document_id() const { return document_id_; } int render_process_id() const { return render_process_id_; } int render_view_id() const { return render_view_id_; } + int render_frame_id() const { return render_frame_id_; } // Define operator "<", which is used to determine uniqueness within // the set. @@ -50,6 +52,7 @@ class WorkerDocumentSet : public base::RefCounted<WorkerDocumentSet> { unsigned long long document_id_; int render_process_id_; int render_view_id_; + int render_frame_id_; }; // Adds a document to a shared worker's document set. Also includes the @@ -58,7 +61,8 @@ class WorkerDocumentSet : public base::RefCounted<WorkerDocumentSet> { void Add(WorkerMessageFilter* parent, unsigned long long document_id, int render_process_id, - int render_view_id); + int render_view_id, + int render_frame_id); // Checks to see if a document is in a shared worker's document set. bool Contains(WorkerMessageFilter* parent, diff --git a/content/browser/worker_host/worker_process_host.cc b/content/browser/worker_host/worker_process_host.cc index fae589b..2707ab6 100644 --- a/content/browser/worker_host/worker_process_host.cc +++ b/content/browser/worker_host/worker_process_host.cc @@ -23,6 +23,8 @@ #include "content/browser/devtools/worker_devtools_manager.h" #include "content/browser/devtools/worker_devtools_message_filter.h" #include "content/browser/fileapi/fileapi_message_filter.h" +#include "content/browser/frame_host/render_frame_host_delegate.h" +#include "content/browser/frame_host/render_frame_host_impl.h" #include "content/browser/indexed_db/indexed_db_dispatcher_host.h" #include "content/browser/loader/resource_message_filter.h" #include "content/browser/message_port_message_filter.h" @@ -80,11 +82,11 @@ class WorkerSandboxedProcessLauncherDelegate } // namespace // Notifies RenderViewHost that one or more worker objects crashed. -void WorkerCrashCallback(int render_process_unique_id, int render_view_id) { - RenderViewHostImpl* host = - RenderViewHostImpl::FromID(render_process_unique_id, render_view_id); +void WorkerCrashCallback(int render_process_unique_id, int render_frame_id) { + RenderFrameHostImpl* host = + RenderFrameHostImpl::FromID(render_process_unique_id, render_frame_id); if (host) - host->GetDelegate()->WorkerCrashed(); + host->delegate()->WorkerCrashed(); } WorkerProcessHost::WorkerProcessHost( @@ -109,7 +111,7 @@ WorkerProcessHost::~WorkerProcessHost() { BrowserThread::PostTask( BrowserThread::UI, FROM_HERE, base::Bind(&WorkerCrashCallback, parent_iter->render_process_id(), - parent_iter->render_view_id())); + parent_iter->render_frame_id())); } WorkerServiceImpl::GetInstance()->NotifyWorkerDestroyed( this, i->worker_route_id()); @@ -378,14 +380,14 @@ void WorkerProcessHost::OnAllowDatabase(int worker_route_id, bool* result) { *result = GetContentClient()->browser()->AllowWorkerDatabase( url, name, display_name, estimated_size, resource_context_, - GetRenderViewIDsForWorker(worker_route_id)); + GetRenderFrameIDsForWorker(worker_route_id)); } void WorkerProcessHost::OnAllowFileSystem(int worker_route_id, const GURL& url, bool* result) { *result = GetContentClient()->browser()->AllowWorkerFileSystem( - url, resource_context_, GetRenderViewIDsForWorker(worker_route_id)); + url, resource_context_, GetRenderFrameIDsForWorker(worker_route_id)); } void WorkerProcessHost::OnAllowIndexedDB(int worker_route_id, @@ -393,7 +395,8 @@ void WorkerProcessHost::OnAllowIndexedDB(int worker_route_id, const base::string16& name, bool* result) { *result = GetContentClient()->browser()->AllowWorkerIndexedDB( - url, name, resource_context_, GetRenderViewIDsForWorker(worker_route_id)); + url, name, resource_context_, + GetRenderFrameIDsForWorker(worker_route_id)); } void WorkerProcessHost::OnForceKillWorkerProcess() { @@ -539,7 +542,7 @@ const ChildProcessData& WorkerProcessHost::GetData() { return process_->GetData(); } -std::vector<std::pair<int, int> > WorkerProcessHost::GetRenderViewIDsForWorker( +std::vector<std::pair<int, int> > WorkerProcessHost::GetRenderFrameIDsForWorker( int worker_route_id) { std::vector<std::pair<int, int> > result; WorkerProcessHost::Instances::const_iterator i; @@ -551,7 +554,7 @@ std::vector<std::pair<int, int> > WorkerProcessHost::GetRenderViewIDsForWorker( for (WorkerDocumentSet::DocumentInfoSet::const_iterator doc = documents.begin(); doc != documents.end(); ++doc) { result.push_back( - std::make_pair(doc->render_process_id(), doc->render_view_id())); + std::make_pair(doc->render_process_id(), doc->render_frame_id())); } break; } @@ -685,15 +688,15 @@ bool WorkerProcessHost::WorkerInstance::HasFilter( return false; } -bool WorkerProcessHost::WorkerInstance::RendererIsParent( - int render_process_id, int render_view_id) const { +bool WorkerProcessHost::WorkerInstance::FrameIsParent( + int render_process_id, int render_frame_id) const { const WorkerDocumentSet::DocumentInfoSet& parents = worker_document_set()->documents(); for (WorkerDocumentSet::DocumentInfoSet::const_iterator parent_iter = parents.begin(); parent_iter != parents.end(); ++parent_iter) { if (parent_iter->render_process_id() == render_process_id && - parent_iter->render_view_id() == render_view_id) { + parent_iter->render_frame_id() == render_frame_id) { return true; } } diff --git a/content/browser/worker_host/worker_process_host.h b/content/browser/worker_host/worker_process_host.h index c3fa64d..e0c0ef2 100644 --- a/content/browser/worker_host/worker_process_host.h +++ b/content/browser/worker_host/worker_process_host.h @@ -79,7 +79,7 @@ class WorkerProcessHost : public BrowserChildProcessHostDelegate, void RemoveFilter(WorkerMessageFilter* filter, int route_id); void RemoveFilters(WorkerMessageFilter* filter); bool HasFilter(WorkerMessageFilter* filter, int route_id) const; - bool RendererIsParent(int render_process_id, int render_view_id) const; + bool FrameIsParent(int render_process_id, int render_frame_id) const; int NumFilters() const { return filters_.size(); } // Returns the single filter (must only be one). FilterInfo GetFilter() const; @@ -222,9 +222,9 @@ class WorkerProcessHost : public BrowserChildProcessHostDelegate, // Updates the title shown in the task manager. void UpdateTitle(); - // Return a vector of all the render process/render view IDs that use the + // Return a vector of all the render process/render frame IDs that use the // given worker. - std::vector<std::pair<int, int> > GetRenderViewIDsForWorker(int route_id); + std::vector<std::pair<int, int> > GetRenderFrameIDsForWorker(int route_id); // Callbacks for ResourceMessageFilter and SocketStreamDispatcherHost. void GetContexts(const ResourceHostMsg_Request& request, diff --git a/content/browser/worker_host/worker_service_impl.cc b/content/browser/worker_host/worker_service_impl.cc index 3ebab46..03c4fb9 100644 --- a/content/browser/worker_host/worker_service_impl.cc +++ b/content/browser/worker_host/worker_service_impl.cc @@ -18,6 +18,7 @@ #include "content/public/browser/child_process_data.h" #include "content/public/browser/notification_service.h" #include "content/public/browser/notification_types.h" +#include "content/public/browser/render_frame_host.h" #include "content/public/browser/render_process_host.h" #include "content/public/browser/render_view_host.h" #include "content/public/browser/render_widget_host.h" @@ -31,8 +32,17 @@ namespace content { +namespace { +void AddRenderFrameID(std::set<std::pair<int, int> >* visible_frame_ids, + RenderFrameHost* rfh) { + visible_frame_ids->insert( + std::pair<int, int>(rfh->GetProcess()->GetID(), + rfh->GetRoutingID())); +} +} + const int WorkerServiceImpl::kMaxWorkersWhenSeparate = 64; -const int WorkerServiceImpl::kMaxWorkersPerTabWhenSeparate = 16; +const int WorkerServiceImpl::kMaxWorkersPerFrameWhenSeparate = 16; class WorkerPrioritySetter : public NotificationObserver, @@ -64,8 +74,8 @@ class WorkerPrioritySetter // widgets being shown. void RegisterObserver(); - // Sets priorities for shared workers given a set of visible tabs (as a - // std::set of std::pair<render_process, render_view> ids. + // Sets priorities for shared workers given a set of visible frames (as a + // std::set of std::pair<render_process, render_frame> ids. void UpdateWorkerPrioritiesFromVisibleSet( const std::set<std::pair<int, int> >* visible); @@ -107,7 +117,7 @@ void WorkerPrioritySetter::PostTaskToGatherAndUpdateWorkerPriorities() { void WorkerPrioritySetter::GatherVisibleIDsAndUpdateWorkerPriorities() { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); - std::set<std::pair<int, int> >* visible_renderer_ids = + std::set<std::pair<int, int> >* visible_frame_ids = new std::set<std::pair<int, int> >(); // Gather up all the visible renderer process/view pairs @@ -116,23 +126,28 @@ void WorkerPrioritySetter::GatherVisibleIDsAndUpdateWorkerPriorities() { while (RenderWidgetHost* widget = widgets->GetNextHost()) { if (widget->GetProcess()->VisibleWidgetCount() == 0) continue; + if (!widget->IsRenderView()) + continue; - RenderWidgetHostView* render_view = widget->GetView(); - if (render_view && render_view->IsShowing()) { - visible_renderer_ids->insert( - std::pair<int, int>(widget->GetProcess()->GetID(), - widget->GetRoutingID())); - } + RenderWidgetHostView* widget_view = widget->GetView(); + if (!widget_view || !widget_view->IsShowing()) + continue; + RenderViewHost* rvh = RenderViewHost::From(widget); + WebContents* web_contents = WebContents::FromRenderViewHost(rvh); + if (!web_contents) + continue; + web_contents->ForEachFrame( + base::Bind(&AddRenderFrameID, visible_frame_ids)); } BrowserThread::PostTask( BrowserThread::IO, FROM_HERE, base::Bind(&WorkerPrioritySetter::UpdateWorkerPrioritiesFromVisibleSet, - this, base::Owned(visible_renderer_ids))); + this, base::Owned(visible_frame_ids))); } void WorkerPrioritySetter::UpdateWorkerPrioritiesFromVisibleSet( - const std::set<std::pair<int, int> >* visible_renderer_ids) { + const std::set<std::pair<int, int> >* visible_frame_ids) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); for (WorkerProcessHostIterator iter; !iter.Done(); ++iter) { @@ -156,8 +171,8 @@ void WorkerPrioritySetter::UpdateWorkerPrioritiesFromVisibleSet( for (; info != first_instance->worker_document_set()->documents().end(); ++info) { std::pair<int, int> id( - info->render_process_id(), info->render_view_id()); - if (visible_renderer_ids->find(id) != visible_renderer_ids->end()) { + info->render_process_id(), info->render_frame_id()); + if (visible_frame_ids->find(id) != visible_frame_ids->end()) { throttle = false; break; } @@ -175,11 +190,11 @@ void WorkerPrioritySetter::UpdateWorkerPrioritiesFromVisibleSet( void WorkerPrioritySetter::OnRenderWidgetVisibilityChanged( std::pair<int, int> id) { DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); - std::set<std::pair<int, int> > visible_renderer_ids; + std::set<std::pair<int, int> > visible_frame_ids; - visible_renderer_ids.insert(id); + visible_frame_ids.insert(id); - UpdateWorkerPrioritiesFromVisibleSet(&visible_renderer_ids); + UpdateWorkerPrioritiesFromVisibleSet(&visible_frame_ids); } void WorkerPrioritySetter::RegisterObserver() { @@ -305,7 +320,7 @@ void WorkerServiceImpl::CreateWorker( instance.AddFilter(filter, route_id); instance.worker_document_set()->Add( filter, params.document_id, filter->render_process_id(), - params.render_view_route_id); + params.render_view_route_id, params.render_frame_route_id); CreateWorkerFromInstance(instance); } @@ -350,7 +365,7 @@ void WorkerServiceImpl::LookupSharedWorker( // worker's document set for nested workers. instance->worker_document_set()->Add( filter, params.document_id, filter->render_process_id(), - params.render_view_route_id); + params.render_view_route_id, params.render_frame_route_id); } } @@ -497,9 +512,9 @@ bool WorkerServiceImpl::CanCreateWorkerProcess( parents.begin(); parent_iter != parents.end(); ++parent_iter) { bool hit_total_worker_limit = false; - if (TabCanCreateWorkerProcess(parent_iter->render_process_id(), - parent_iter->render_view_id(), - &hit_total_worker_limit)) { + if (FrameCanCreateWorkerProcess(parent_iter->render_process_id(), + parent_iter->render_frame_id(), + &hit_total_worker_limit)) { return true; } // Return false if already at the global worker limit (no need to continue @@ -512,9 +527,9 @@ bool WorkerServiceImpl::CanCreateWorkerProcess( return false; } -bool WorkerServiceImpl::TabCanCreateWorkerProcess( +bool WorkerServiceImpl::FrameCanCreateWorkerProcess( int render_process_id, - int render_view_id, + int render_frame_id, bool* hit_total_worker_limit) { int total_workers = 0; int workers_per_tab = 0; @@ -528,9 +543,9 @@ bool WorkerServiceImpl::TabCanCreateWorkerProcess( *hit_total_worker_limit = true; return false; } - if (cur_instance->RendererIsParent(render_process_id, render_view_id)) { + if (cur_instance->FrameIsParent(render_process_id, render_frame_id)) { workers_per_tab++; - if (workers_per_tab >= kMaxWorkersPerTabWhenSeparate) + if (workers_per_tab >= kMaxWorkersPerFrameWhenSeparate) return false; } } diff --git a/content/browser/worker_host/worker_service_impl.h b/content/browser/worker_host/worker_service_impl.h index 4d5127a..de5c462 100644 --- a/content/browser/worker_host/worker_service_impl.h +++ b/content/browser/worker_host/worker_service_impl.h @@ -80,7 +80,7 @@ class CONTENT_EXPORT WorkerServiceImpl // Used when we run each worker in a separate process. static const int kMaxWorkersWhenSeparate; - static const int kMaxWorkersPerTabWhenSeparate; + static const int kMaxWorkersPerFrameWhenSeparate; private: friend struct DefaultSingletonTraits<WorkerServiceImpl>; @@ -96,11 +96,11 @@ class CONTENT_EXPORT WorkerServiceImpl bool CanCreateWorkerProcess( const WorkerProcessHost::WorkerInstance& instance); - // Checks if the tab associated with the passed RenderView can create a + // Checks if the frame associated with the passed RenderFrame can create a // worker process based on the process limit when we're using a strategy of // one worker per process. - bool TabCanCreateWorkerProcess( - int render_process_id, int render_route_id, bool* hit_total_worker_limit); + bool FrameCanCreateWorkerProcess( + int render_process_id, int render_frame_id, bool* hit_total_worker_limit); // Tries to see if any of the queued workers can be created. void TryStartingQueuedWorker(); diff --git a/content/common/view_messages.h b/content/common/view_messages.h index 672acb9..3fe538f 100644 --- a/content/common/view_messages.h +++ b/content/common/view_messages.h @@ -391,9 +391,12 @@ IPC_STRUCT_BEGIN(ViewHostMsg_CreateWorker_Params) // The ID of the parent document (unique within parent renderer). IPC_STRUCT_MEMBER(unsigned long long, document_id) - // RenderView routing id used to send messages back to the parent. + // RenderView routing id. IPC_STRUCT_MEMBER(int, render_view_route_id) + // RenderFrame routing id used to send messages back to the parent. + IPC_STRUCT_MEMBER(int, render_frame_route_id) + // The route ID to associate with the worker. If MSG_ROUTING_NONE is passed, // a new unique ID is created and assigned to the worker. IPC_STRUCT_MEMBER(int, route_id) diff --git a/content/public/browser/content_browser_client.cc b/content/public/browser/content_browser_client.cc index acb9fe8..a55412d 100644 --- a/content/public/browser/content_browser_client.cc +++ b/content/public/browser/content_browser_client.cc @@ -145,14 +145,14 @@ bool ContentBrowserClient::AllowWorkerDatabase( const base::string16& display_name, unsigned long estimated_size, ResourceContext* context, - const std::vector<std::pair<int, int> >& render_views) { + const std::vector<std::pair<int, int> >& render_frames) { return true; } bool ContentBrowserClient::AllowWorkerFileSystem( const GURL& url, ResourceContext* context, - const std::vector<std::pair<int, int> >& render_views) { + const std::vector<std::pair<int, int> >& render_frames) { return true; } @@ -160,7 +160,7 @@ bool ContentBrowserClient::AllowWorkerIndexedDB( const GURL& url, const base::string16& name, ResourceContext* context, - const std::vector<std::pair<int, int> >& render_views) { + const std::vector<std::pair<int, int> >& render_frames) { return true; } diff --git a/content/public/browser/content_browser_client.h b/content/public/browser/content_browser_client.h index 8633105..9cab888 100644 --- a/content/public/browser/content_browser_client.h +++ b/content/public/browser/content_browser_client.h @@ -306,8 +306,8 @@ class CONTENT_EXPORT ContentBrowserClient { virtual bool AllowSaveLocalState(ResourceContext* context); // Allow the embedder to control if access to web database by a shared worker - // is allowed. |render_views| is a vector of pairs of - // RenderProcessID/RenderViewID of RenderViews that are using this worker. + // is allowed. |render_frame| is a vector of pairs of + // RenderProcessID/RenderFrameID of RenderFrame that are using this worker. // This is called on the IO thread. virtual bool AllowWorkerDatabase( const GURL& url, @@ -315,7 +315,7 @@ class CONTENT_EXPORT ContentBrowserClient { const base::string16& display_name, unsigned long estimated_size, ResourceContext* context, - const std::vector<std::pair<int, int> >& render_views); + const std::vector<std::pair<int, int> >& render_frames); // Allow the embedder to control if access to file system by a shared worker // is allowed. @@ -323,7 +323,7 @@ class CONTENT_EXPORT ContentBrowserClient { virtual bool AllowWorkerFileSystem( const GURL& url, ResourceContext* context, - const std::vector<std::pair<int, int> >& render_views); + const std::vector<std::pair<int, int> >& render_frames); // Allow the embedder to control if access to IndexedDB by a shared worker // is allowed. @@ -332,7 +332,7 @@ class CONTENT_EXPORT ContentBrowserClient { const GURL& url, const base::string16& name, ResourceContext* context, - const std::vector<std::pair<int, int> >& render_views); + const std::vector<std::pair<int, int> >& render_frames); // Allow the embedder to override the request context based on the URL for // certain operations, like cookie access. Returns NULL to indicate the diff --git a/content/public/browser/resource_request_details.cc b/content/public/browser/resource_request_details.cc index 7b92c84..06badaf 100644 --- a/content/public/browser/resource_request_details.cc +++ b/content/public/browser/resource_request_details.cc @@ -33,10 +33,10 @@ ResourceRequestDetails::ResourceRequestDetails(const net::URLRequest* request, // of ssl state change (http://crbug.com/25357). For now, just notify // the first one (works for dedicated workers and shared workers with // a single process). + int render_frame_id; if (!WorkerServiceImpl::GetInstance()->GetRendererForWorker( - info->GetChildID(), &origin_child_id, &origin_route_id)) { + info->GetChildID(), &origin_child_id, &render_frame_id)) { origin_child_id = info->GetChildID(); - origin_route_id = info->GetRouteID(); } } diff --git a/content/public/browser/resource_request_details.h b/content/public/browser/resource_request_details.h index 1c20557..a55febd 100644 --- a/content/public/browser/resource_request_details.h +++ b/content/public/browser/resource_request_details.h @@ -34,7 +34,6 @@ struct ResourceRequestDetails { bool has_upload; int load_flags; int origin_child_id; - int origin_route_id; net::URLRequestStatus status; int ssl_cert_id; net::CertStatus ssl_cert_status; diff --git a/content/public/browser/web_contents_observer.h b/content/public/browser/web_contents_observer.h index 10d5e3e..5a2c1f7 100644 --- a/content/public/browser/web_contents_observer.h +++ b/content/public/browser/web_contents_observer.h @@ -209,6 +209,7 @@ class CONTENT_EXPORT WebContentsObserver : public IPC::Listener, // This method is invoked when a redirect was received while requesting a // resource. virtual void DidGetRedirectForResourceRequest( + RenderViewHost* render_view_host, const ResourceRedirectDetails& details) {} // This method is invoked when a new non-pending navigation entry is created. diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index e8212f8..0fd1953 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc @@ -36,6 +36,7 @@ #include "content/renderer/render_view_impl.h" #include "content/renderer/render_widget_fullscreen_pepper.h" #include "content/renderer/renderer_webapplicationcachehost_impl.h" +#include "content/renderer/shared_worker_repository.h" #include "content/renderer/websharedworker_proxy.h" #include "net/base/net_errors.h" #include "net/http/http_util.h" @@ -130,6 +131,7 @@ RenderFrameImpl::RenderFrameImpl(RenderViewImpl* render_view, int routing_id) #if defined(ENABLE_PLUGINS) new PepperBrowserConnection(this); #endif + new SharedWorkerRepository(this); GetContentClient()->renderer()->RenderFrameCreated(this); } diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 041b506..3ccf69a 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -117,7 +117,6 @@ #include "content/renderer/renderer_webcolorchooser_impl.h" #include "content/renderer/resizing_mode_selector.h" #include "content/renderer/savable_resources.h" -#include "content/renderer/shared_worker_repository.h" #include "content/renderer/speech_recognition_dispatcher.h" #include "content/renderer/stats_collection_controller.h" #include "content/renderer/stats_collection_observer.h" @@ -977,8 +976,6 @@ void RenderViewImpl::Initialize(RenderViewImplParams* params) { new TextInputClientObserver(this); #endif // defined(OS_MACOSX) - new SharedWorkerRepository(this); - #if defined(OS_ANDROID) media_player_manager_ = new RendererMediaPlayerManager(this); new JavaBridgeDispatcher(this); diff --git a/content/renderer/shared_worker_repository.cc b/content/renderer/shared_worker_repository.cc index 1ccc9e8..a35e767 100644 --- a/content/renderer/shared_worker_repository.cc +++ b/content/renderer/shared_worker_repository.cc @@ -6,19 +6,23 @@ #include "content/child/child_thread.h" #include "content/common/view_messages.h" +#include "content/renderer/render_frame_impl.h" #include "content/renderer/render_view_impl.h" #include "content/renderer/websharedworker_proxy.h" -#include "third_party/WebKit/public/web/WebView.h" +#include "third_party/WebKit/public/web/WebFrame.h" namespace content { -SharedWorkerRepository::SharedWorkerRepository(RenderViewImpl* render_view) - : RenderViewObserver(render_view) { - render_view->GetWebView()->setSharedWorkerRepositoryClient(this); +SharedWorkerRepository::SharedWorkerRepository(RenderFrameImpl* render_frame) + : RenderFrameObserver(render_frame) { } SharedWorkerRepository::~SharedWorkerRepository() {} +void SharedWorkerRepository::WebFrameCreated(blink::WebFrame* frame) { + frame->setSharedWorkerRepositoryClient(this); +} + blink::WebSharedWorkerConnector* SharedWorkerRepository::createSharedWorkerConnector( const blink::WebURL& url, @@ -31,7 +35,8 @@ SharedWorkerRepository::createSharedWorkerConnector( params.url = url; params.name = name; params.document_id = document_id; - params.render_view_route_id = render_view()->GetRoutingID(); + params.render_view_route_id = render_frame()->GetRenderView()->GetRoutingID(); + params.render_frame_route_id = render_frame()->GetRoutingID(); params.route_id = MSG_ROUTING_NONE; params.script_resource_appcache_id = 0; Send(new ViewHostMsg_LookupSharedWorker( @@ -43,7 +48,8 @@ SharedWorkerRepository::createSharedWorkerConnector( document_id, exists, route_id, - render_view()->GetRoutingID()); + params.render_view_route_id, + params.render_frame_route_id); } void SharedWorkerRepository::documentDetached(DocumentID document) { diff --git a/content/renderer/shared_worker_repository.h b/content/renderer/shared_worker_repository.h index ce3b53c..1263e8c 100644 --- a/content/renderer/shared_worker_repository.h +++ b/content/renderer/shared_worker_repository.h @@ -8,19 +8,22 @@ #include <set> #include "base/basictypes.h" -#include "content/public/renderer/render_view_observer.h" +#include "content/public/renderer/render_frame_observer.h" #include "third_party/WebKit/public/web/WebSharedWorkerRepositoryClient.h" namespace content { -class RenderViewImpl; +class RenderFrameImpl; -class SharedWorkerRepository : public RenderViewObserver, +class SharedWorkerRepository : public RenderFrameObserver, public blink::WebSharedWorkerRepositoryClient { public: - explicit SharedWorkerRepository(RenderViewImpl* render_view); + explicit SharedWorkerRepository(RenderFrameImpl* render_frame); virtual ~SharedWorkerRepository(); + // RenderFrameObserver overrides. + virtual void WebFrameCreated(blink::WebFrame* frame) OVERRIDE; + // WebSharedWorkerRepositoryClient overrides. virtual blink::WebSharedWorkerConnector* createSharedWorkerConnector( const blink::WebURL& url, diff --git a/content/renderer/websharedworker_proxy.cc b/content/renderer/websharedworker_proxy.cc index 815568e..b796e60 100644 --- a/content/renderer/websharedworker_proxy.cc +++ b/content/renderer/websharedworker_proxy.cc @@ -17,9 +17,11 @@ WebSharedWorkerProxy::WebSharedWorkerProxy(ChildThread* child_thread, unsigned long long document_id, bool exists, int route_id, - int render_view_route_id) + int render_view_route_id, + int render_frame_route_id) : route_id_(exists ? route_id : MSG_ROUTING_NONE), render_view_route_id_(render_view_route_id), + render_frame_route_id_(render_frame_route_id), child_thread_(child_thread), document_id_(document_id), pending_route_id_(route_id), @@ -64,6 +66,7 @@ void WebSharedWorkerProxy::CreateWorkerContext( params.name = name; params.document_id = document_id_; params.render_view_route_id = render_view_route_id_; + params.render_frame_route_id = render_frame_route_id_; params.route_id = pending_route_id; params.script_resource_appcache_id = script_resource_appcache_id; IPC::Message* create_message = new ViewHostMsg_CreateWorker( diff --git a/content/renderer/websharedworker_proxy.h b/content/renderer/websharedworker_proxy.h index a7335b3..d0bcc0a 100644 --- a/content/renderer/websharedworker_proxy.h +++ b/content/renderer/websharedworker_proxy.h @@ -31,7 +31,8 @@ class WebSharedWorkerProxy : public blink::WebSharedWorkerConnector, unsigned long long document_id, bool exists, int route_id, - int render_view_route_id); + int render_view_route_id, + int render_frame_route_id); virtual ~WebSharedWorkerProxy(); // Implementations of WebSharedWorker APIs @@ -86,8 +87,9 @@ class WebSharedWorkerProxy : public blink::WebSharedWorkerConnector, // routing ids). int route_id_; - // The routing id for the RenderView that created this worker. + // The routing id for the RenderView and RenderFrame that created this worker. int render_view_route_id_; + int render_frame_route_id_; ChildThread* child_thread_; |