In Blink/Chromium's multi-process architecture Web Workers (Dedicated and Shared Worker) are implemented as follows (as of 2013 Oct):
- Dedicated Worker
- Runs in the same renderer process as its parent document, but on a different thread (see Source/core/workers/WorkerThread.* in blink for details). Note that it’s NOT the chromium’s worker process thread implemented in content/worker/worker_thread.*.
- In Chromium the renderer process’s main thread is implemented by content/renderer/render_thread_impl.*, while the Blink’s worker thread does NOT have corresponding message_loop/thread in chromium (yet). You can use webkit_glue::WorkerTaskRunner (webkit/child/worker_task_runner.*) to post tasks to the Blink’s worker threads in chromium.
- The embedder’s platform code in Chromium for Dedicated Worker is /content/renderer/* (in addition to content/child/*), but NOT content/worker/*.
- Platform APIs are accessible in Worker contexts via WebKit::Platform::current(), and it’s implemented in RendererWebKitPlatformSupport (content/renderer/renderer_webkitplatformsupport_impl.cc) in Chromium (as in the case for regular document contexts).
- Note that to call Platform APIs from Worker contexts it needs to be implemented in a thread-safe way in the embedder code (e.g. do not lazily create a shared object without lock), or the worker code should explicitly relay the call onto the renderer’s main thread in Blink (e.g. by WTF::callOnMainThread).
- Shared Worker
- Runs in its own separate process called worker process and is connected to multiple renderer processes via the browser process. Shared Worker also runs in its own worker thread.
- In Chromium the worker process’s main thread is implemented by content/worker/worker_thread.* (note that this is NOT the worker thread you refer in Blink!!). As well as in Dedicated Workers the Blink’s worker thread does not have corresponding message_loop/thread in chromium.
- The embedder’s platform code in Chromium for Shared Worker is /content/worker/* (in addition to content/child/*).
- Platform APIs are accessible in Worker contexts via WebKit::Platform::current(), and it’s implemented in WorkerWebKitPlatformSupportImpl (content/worker/worker_webkitplatformsupport_impl.cc) in Chromium. As well as for Dedicated Worker, to use a platform API in Worker contexts the API needs to be implemented in a thread-safe way in the embedder code, or Blink-side code should explicitly relay the platform API access onto the main thread by WTF::callOnMainThread.