diff options
author | horo@chromium.org <horo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-14 15:30:22 +0000 |
---|---|---|
committer | horo@chromium.org <horo@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-02-14 15:30:22 +0000 |
commit | df960c46d1dadbd7d13827cf651f1993a604ed61 (patch) | |
tree | 06f0d1813be26b78481f6b0fb06284bacd630187 /content | |
parent | 890919a5d8c4bb8cfa0d04bffdacfcd8b500902f (diff) | |
download | chromium_src-df960c46d1dadbd7d13827cf651f1993a604ed61.zip chromium_src-df960c46d1dadbd7d13827cf651f1993a604ed61.tar.gz chromium_src-df960c46d1dadbd7d13827cf651f1993a604ed61.tar.bz2 |
Implementations of SharedWorker in the renderer process.
In this CL I introduce 2 classes (EmbeddedSharedWorkerDevToolsAgent, EmbeddedSharedWorkerStub).
EmbeddedSharedWorkerStub and EmbeddedSharedWorkerDevToolsAgent are almost same as WebSharedWorkerStub and SharedWorkerDevToolsAgent which are used in the worker process now.
These classes are not used yet.
EmbeddedSharedWorkerStub will be created when CreateWorker message is received by RenderThreadImpl.
In this CL I move shared_worker_devtools_agent.* from content/worker/ to content/child/ because I want use it from content/renderer/shared_worker.
BUG=327256
Review URL: https://codereview.chromium.org/158953008
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@251335 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content')
-rw-r--r-- | content/child/shared_worker_devtools_agent.cc (renamed from content/worker/shared_worker_devtools_agent.cc) | 8 | ||||
-rw-r--r-- | content/child/shared_worker_devtools_agent.h (renamed from content/worker/shared_worker_devtools_agent.h) | 8 | ||||
-rw-r--r-- | content/content_child.gypi | 2 | ||||
-rw-r--r-- | content/content_renderer.gypi | 2 | ||||
-rw-r--r-- | content/content_worker.gypi | 2 | ||||
-rw-r--r-- | content/renderer/shared_worker/embedded_shared_worker_stub.cc | 159 | ||||
-rw-r--r-- | content/renderer/shared_worker/embedded_shared_worker_stub.h | 85 | ||||
-rw-r--r-- | content/worker/websharedworker_stub.cc | 2 | ||||
-rw-r--r-- | content/worker/websharedworkerclient_proxy.cc | 2 |
9 files changed, 258 insertions, 12 deletions
diff --git a/content/worker/shared_worker_devtools_agent.cc b/content/child/shared_worker_devtools_agent.cc index 733dae1..475f55f 100644 --- a/content/worker/shared_worker_devtools_agent.cc +++ b/content/child/shared_worker_devtools_agent.cc @@ -1,11 +1,11 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// 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. -#include "content/worker/shared_worker_devtools_agent.h" +#include "content/child/shared_worker_devtools_agent.h" +#include "content/child/child_thread.h" #include "content/common/devtools_messages.h" -#include "content/worker/worker_thread.h" #include "third_party/WebKit/public/platform/WebCString.h" #include "third_party/WebKit/public/platform/WebString.h" #include "third_party/WebKit/public/web/WebSharedWorker.h" @@ -82,7 +82,7 @@ void SharedWorkerDevToolsAgent::OnResumeWorkerContext() { } bool SharedWorkerDevToolsAgent::Send(IPC::Message* message) { - return WorkerThread::current()->Send(message); + return ChildThread::current()->Send(message); } } // namespace content diff --git a/content/worker/shared_worker_devtools_agent.h b/content/child/shared_worker_devtools_agent.h index bfe0fef..8106989 100644 --- a/content/worker/shared_worker_devtools_agent.h +++ b/content/child/shared_worker_devtools_agent.h @@ -1,9 +1,9 @@ -// Copyright (c) 2012 The Chromium Authors. All rights reserved. +// 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 CONTENT_WORKER_SHARED_WORKER_DEVTOOLS_AGENT_H_ -#define CONTENT_WORKER_SHARED_WORKER_DEVTOOLS_AGENT_H_ +#ifndef CONTENT_CHILD_SHARED_WORKER_DEVTOOLS_AGENT_H_ +#define CONTENT_CHILD_SHARED_WORKER_DEVTOOLS_AGENT_H_ #include <string> @@ -47,4 +47,4 @@ class SharedWorkerDevToolsAgent { } // namespace content -#endif // CONTENT_WORKER_SHARED_WORKER_DEVTOOLS_AGENT_H_ +#endif // CONTENT_CHILD_SHARED_WORKER_DEVTOOLS_AGENT_H_ diff --git a/content/content_child.gypi b/content/content_child.gypi index 9014c7a..a275f8d 100644 --- a/content/content_child.gypi +++ b/content/content_child.gypi @@ -139,6 +139,8 @@ 'child/service_worker/web_service_worker_impl.h', 'child/service_worker/web_service_worker_provider_impl.cc', 'child/service_worker/web_service_worker_provider_impl.h', + 'child/shared_worker_devtools_agent.cc', + 'child/shared_worker_devtools_agent.h', 'child/simple_webmimeregistry_impl.cc', 'child/simple_webmimeregistry_impl.h', 'child/site_isolation_policy.cc', diff --git a/content/content_renderer.gypi b/content/content_renderer.gypi index f7e3c5d..30c102a 100644 --- a/content/content_renderer.gypi +++ b/content/content_renderer.gypi @@ -492,6 +492,8 @@ 'renderer/shared_memory_seqlock_reader.h', 'renderer/shared_worker_repository.cc', 'renderer/shared_worker_repository.h', + 'renderer/shared_worker/embedded_shared_worker_stub.cc', + 'renderer/shared_worker/embedded_shared_worker_stub.h', 'renderer/skia_benchmarking_extension.cc', 'renderer/skia_benchmarking_extension.h', 'renderer/speech_recognition_dispatcher.cc', diff --git a/content/content_worker.gypi b/content/content_worker.gypi index 4ee1599..95d5292 100644 --- a/content/content_worker.gypi +++ b/content/content_worker.gypi @@ -9,8 +9,6 @@ '../third_party/WebKit/public/blink.gyp:blink', ], 'sources': [ - 'worker/shared_worker_devtools_agent.cc', - 'worker/shared_worker_devtools_agent.h', 'worker/websharedworker_stub.cc', 'worker/websharedworker_stub.h', 'worker/websharedworkerclient_proxy.cc', diff --git a/content/renderer/shared_worker/embedded_shared_worker_stub.cc b/content/renderer/shared_worker/embedded_shared_worker_stub.cc new file mode 100644 index 0000000..b3066a8 --- /dev/null +++ b/content/renderer/shared_worker/embedded_shared_worker_stub.cc @@ -0,0 +1,159 @@ +// 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. + +#include "content/renderer/shared_worker/embedded_shared_worker_stub.h" + +#include "base/message_loop/message_loop_proxy.h" +#include "content/child/scoped_child_process_reference.h" +#include "content/child/shared_worker_devtools_agent.h" +#include "content/child/webmessageportchannel_impl.h" +#include "content/common/worker_messages.h" +#include "content/renderer/render_thread_impl.h" +#include "ipc/ipc_message_macros.h" +#include "third_party/WebKit/public/web/WebSharedWorker.h" +#include "third_party/WebKit/public/web/WebSharedWorkerClient.h" + +namespace content { + +EmbeddedSharedWorkerStub::EmbeddedSharedWorkerStub( + const GURL& url, + const base::string16& name, + const base::string16& content_security_policy, + blink::WebContentSecurityPolicyType security_policy_type, + int route_id) + : route_id_(route_id), + name_(name), + runing_(false), + url_(url) { + RenderThreadImpl::current()->AddRoute(route_id_, this); + impl_ = blink::WebSharedWorker::create(this); + worker_devtools_agent_.reset( + new SharedWorkerDevToolsAgent(route_id, impl_)); + impl_->startWorkerContext(url, name_, + content_security_policy, security_policy_type); +} + +EmbeddedSharedWorkerStub::~EmbeddedSharedWorkerStub() { + RenderThreadImpl::current()->RemoveRoute(route_id_); +} + +bool EmbeddedSharedWorkerStub::OnMessageReceived( + const IPC::Message& message) { + if (worker_devtools_agent_->OnMessageReceived(message)) + return true; + bool handled = true; + IPC_BEGIN_MESSAGE_MAP(EmbeddedSharedWorkerStub, message) + IPC_MESSAGE_HANDLER(WorkerMsg_TerminateWorkerContext, + OnTerminateWorkerContext) + IPC_MESSAGE_HANDLER(WorkerMsg_Connect, OnConnect) + IPC_MESSAGE_UNHANDLED(handled = false) + IPC_END_MESSAGE_MAP() + return handled; +} + +void EmbeddedSharedWorkerStub::OnChannelError() { + OnTerminateWorkerContext(); +} + +void EmbeddedSharedWorkerStub::workerScriptLoaded() { + Send(new WorkerHostMsg_WorkerScriptLoaded(route_id_)); + runing_ = true; + // Process any pending connections. + for (PendingChannelList::const_iterator iter = pending_channels_.begin(); + iter != pending_channels_.end(); + ++iter) { + impl_->connect(*iter); + Send(new WorkerHostMsg_WorkerConnected((*iter)->message_port_id(), + route_id_)); + } + pending_channels_.clear(); +} + +void EmbeddedSharedWorkerStub::workerScriptLoadFailed() { + Send(new WorkerHostMsg_WorkerScriptLoadFailed(route_id_)); + for (PendingChannelList::const_iterator iter = pending_channels_.begin(); + iter != pending_channels_.end(); + ++iter) { + blink::WebMessagePortChannel* channel = *iter; + channel->destroy(); + } + pending_channels_.clear(); + Shutdown(); +} + +void EmbeddedSharedWorkerStub::workerContextClosed() { + Send(new WorkerHostMsg_WorkerContextClosed(route_id_)); +} + +void EmbeddedSharedWorkerStub::workerContextDestroyed() { + Send(new WorkerHostMsg_WorkerContextDestroyed(route_id_)); + Shutdown(); +} + +void EmbeddedSharedWorkerStub::selectAppCacheID(long long) { + // TODO(horo): implement this. +} + +blink::WebNotificationPresenter* +EmbeddedSharedWorkerStub::notificationPresenter() { + // TODO(horo): delete this method if we have no plan to implement this. + NOTREACHED(); + return NULL; +} + +blink::WebApplicationCacheHost* + EmbeddedSharedWorkerStub::createApplicationCacheHost( + blink::WebApplicationCacheHostClient*) { + // TODO(horo): implement this. + return NULL; +} + +blink::WebWorkerPermissionClientProxy* + EmbeddedSharedWorkerStub::createWorkerPermissionClientProxy( + const blink::WebSecurityOrigin& origin) { + // TODO(horo): implement this. + return NULL; +} + +void EmbeddedSharedWorkerStub::dispatchDevToolsMessage( + const blink::WebString& message) { + worker_devtools_agent_->SendDevToolsMessage(message); +} + +void EmbeddedSharedWorkerStub::saveDevToolsAgentState( + const blink::WebString& state) { + worker_devtools_agent_->SaveDevToolsAgentState(state); +} + +void EmbeddedSharedWorkerStub::Shutdown() { + delete this; +} + +bool EmbeddedSharedWorkerStub::Send(IPC::Message* message) { + return RenderThreadImpl::current()->Send(message); +} + +void EmbeddedSharedWorkerStub::OnConnect(int sent_message_port_id, + int routing_id) { + WebMessagePortChannelImpl* channel = + new WebMessagePortChannelImpl(routing_id, + sent_message_port_id, + base::MessageLoopProxy::current().get()); + if (runing_) { + impl_->connect(channel); + } else { + // If two documents try to load a SharedWorker at the same time, the + // WorkerMsg_Connect for one of the documents can come in before the + // worker is started. Just queue up the connect and deliver it once the + // worker starts. + pending_channels_.push_back(channel); + } +} + +void EmbeddedSharedWorkerStub::OnTerminateWorkerContext() { + runing_ = false; + impl_->terminateWorkerContext(); +} + +} // namespace content diff --git a/content/renderer/shared_worker/embedded_shared_worker_stub.h b/content/renderer/shared_worker/embedded_shared_worker_stub.h new file mode 100644 index 0000000..51325e6 --- /dev/null +++ b/content/renderer/shared_worker/embedded_shared_worker_stub.h @@ -0,0 +1,85 @@ +// 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 CONTENT_RENDERER_SHARED_WORKER_EMBEDDED_SHARED_WORKER_STUB_H +#define CONTENT_RENDERER_SHARED_WORKER_EMBEDDED_SHARED_WORKER_STUB_H + +#include "content/child/child_message_filter.h" +#include "content/child/scoped_child_process_reference.h" +#include "ipc/ipc_listener.h" +#include "third_party/WebKit/public/platform/WebString.h" +#include "third_party/WebKit/public/web/WebContentSecurityPolicy.h" +#include "third_party/WebKit/public/web/WebSharedWorkerClient.h" +#include "url/gurl.h" + +namespace blink { +class WebApplicationCacheHost; +class WebApplicationCacheHostClient; +class WebMessagePortChannel; +class WebNotificationPresenter; +class WebSecurityOrigin; +class WebSharedWorker; +class WebWorkerPermissionClientProxy; +} + +namespace content { +class SharedWorkerDevToolsAgent; +class WebMessagePortChannelImpl; + +class EmbeddedSharedWorkerStub : public IPC::Listener, + public blink::WebSharedWorkerClient { + public: + EmbeddedSharedWorkerStub( + const GURL& url, + const base::string16& name, + const base::string16& content_security_policy, + blink::WebContentSecurityPolicyType security_policy_type, + int route_id); + + // IPC::Listener implementation. + virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE; + virtual void OnChannelError() OVERRIDE; + + // blink::WebSharedWorkerClient implementation. + virtual void workerContextClosed() OVERRIDE; + virtual void workerContextDestroyed() OVERRIDE; + virtual void workerScriptLoaded() OVERRIDE; + virtual void workerScriptLoadFailed() OVERRIDE; + virtual void selectAppCacheID(long long) OVERRIDE; + virtual blink::WebNotificationPresenter* notificationPresenter() OVERRIDE; + virtual blink::WebApplicationCacheHost* createApplicationCacheHost( + blink::WebApplicationCacheHostClient*) OVERRIDE; + virtual blink::WebWorkerPermissionClientProxy* + createWorkerPermissionClientProxy( + const blink::WebSecurityOrigin& origin) OVERRIDE; + virtual void dispatchDevToolsMessage( + const blink::WebString& message) OVERRIDE; + virtual void saveDevToolsAgentState(const blink::WebString& state) OVERRIDE; + + private: + virtual ~EmbeddedSharedWorkerStub(); + + void Shutdown(); + bool Send(IPC::Message* message); + + void OnConnect(int sent_message_port_id, int routing_id); + void OnTerminateWorkerContext(); + + int route_id_; + base::string16 name_; + bool runing_; + GURL url_; + blink::WebSharedWorker* impl_; + scoped_ptr<SharedWorkerDevToolsAgent> worker_devtools_agent_; + + typedef std::vector<WebMessagePortChannelImpl*> PendingChannelList; + PendingChannelList pending_channels_; + + ScopedChildProcessReference process_ref_; + DISALLOW_COPY_AND_ASSIGN(EmbeddedSharedWorkerStub); +}; + +} // namespace content + +#endif // CONTENT_RENDERER_SHARED_WORKER_EMBEDDED_SHARED_WORKER_STUB_H diff --git a/content/worker/websharedworker_stub.cc b/content/worker/websharedworker_stub.cc index 19d3ec9..a2471df 100644 --- a/content/worker/websharedworker_stub.cc +++ b/content/worker/websharedworker_stub.cc @@ -8,9 +8,9 @@ #include "content/child/child_process.h" #include "content/child/child_thread.h" #include "content/child/fileapi/file_system_dispatcher.h" +#include "content/child/shared_worker_devtools_agent.h" #include "content/child/webmessageportchannel_impl.h" #include "content/common/worker_messages.h" -#include "content/worker/shared_worker_devtools_agent.h" #include "content/worker/worker_thread.h" #include "third_party/WebKit/public/web/WebSharedWorker.h" #include "third_party/WebKit/public/platform/WebString.h" diff --git a/content/worker/websharedworkerclient_proxy.cc b/content/worker/websharedworkerclient_proxy.cc index ade6fa6..486479a 100644 --- a/content/worker/websharedworkerclient_proxy.cc +++ b/content/worker/websharedworkerclient_proxy.cc @@ -7,10 +7,10 @@ #include "base/bind.h" #include "base/command_line.h" #include "base/message_loop/message_loop.h" +#include "content/child/shared_worker_devtools_agent.h" #include "content/child/webmessageportchannel_impl.h" #include "content/common/worker_messages.h" #include "content/public/common/content_switches.h" -#include "content/worker/shared_worker_devtools_agent.h" #include "content/worker/shared_worker_permission_client_proxy.h" #include "content/worker/websharedworker_stub.h" #include "content/worker/worker_thread.h" |