Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(976)

Unified Diff: webkit/glue/webworker_impl.cc

Issue 337057: Move webworker{client}_impl.{h,cc} into webkit/api/src (Closed)
Patch Set: mulitple workers per process comment fixed Created 11 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « webkit/glue/webworker_impl.h ('k') | webkit/glue/webworkerclient_impl.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: webkit/glue/webworker_impl.cc
diff --git a/webkit/glue/webworker_impl.cc b/webkit/glue/webworker_impl.cc
deleted file mode 100644
index 172ba4dd377345b9d02b2d144e1f7fa5e2821538..0000000000000000000000000000000000000000
--- a/webkit/glue/webworker_impl.cc
+++ /dev/null
@@ -1,409 +0,0 @@
-// Copyright (c) 2009 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 "config.h"
-
-#include "DedicatedWorkerContext.h"
-#include "DedicatedWorkerThread.h"
-#include "GenericWorkerTask.h"
-#include "KURL.h"
-#include "MessageEvent.h"
-#include "MessagePort.h"
-#include "MessagePortChannel.h"
-#include "ScriptExecutionContext.h"
-#include "SecurityOrigin.h"
-#include "SerializedScriptValue.h"
-#include "SubstituteData.h"
-#include <wtf/MainThread.h>
-#include <wtf/Threading.h>
-
-#undef LOG
-
-#include "webkit/api/public/WebFrameClient.h"
-#include "webkit/api/public/WebMessagePortChannel.h"
-#include "webkit/api/public/WebScreenInfo.h"
-#include "webkit/api/public/WebString.h"
-#include "webkit/api/public/WebURL.h"
-#include "webkit/api/public/WebView.h"
-#include "webkit/api/public/WebWorkerClient.h"
-#include "webkit/api/src/PlatformMessagePortChannel.h"
-#include "webkit/api/src/WebDataSourceImpl.h"
-#include "webkit/glue/empty_webframeclient.h"
-#include "webkit/glue/glue_util.h"
-#include "webkit/glue/webframe_impl.h"
-#include "webkit/glue/webpreferences.h"
-#include "webkit/glue/webworker_impl.h"
-
-using WebKit::WebCursorInfo;
-using WebKit::WebDataSource;
-using WebKit::WebDataSourceImpl;
-using WebKit::WebFrame;
-using WebKit::WebFrameClient;
-using WebKit::WebMessagePortChannel;
-using WebKit::WebMessagePortChannelArray;
-using WebKit::WebNavigationPolicy;
-using WebKit::WebRect;
-using WebKit::WebScreenInfo;
-using WebKit::WebString;
-using WebKit::WebURL;
-using WebKit::WebWorker;
-using WebKit::WebWorkerClient;
-using WebKit::WebView;
-
-#if ENABLE(WORKERS)
-
-// Dummy WebViewDelegate - we only need it in Worker process to load a
-// 'shadow page' which will initialize WebCore loader.
-class WorkerWebFrameClient : public webkit_glue::EmptyWebFrameClient {
- public:
- // Tell the loader to load the data into the 'shadow page' synchronously,
- // so we can grab the resulting Document right after load.
- virtual void didCreateDataSource(WebFrame* frame, WebDataSource* ds) {
- static_cast<WebDataSourceImpl*>(ds)->setDeferMainResourceDataLoad(false);
- }
-
- // Lazy allocate and leak this instance.
- static WorkerWebFrameClient* GetSharedInstance() {
- static WorkerWebFrameClient client;
- return &client;
- }
-
- private:
- WorkerWebFrameClient() {}
-};
-
-namespace WebKit {
-
-WebWorker* WebWorker::create(WebWorkerClient* client) {
- return new WebWorkerImpl(client);
-}
-
-}
-
-// This function is called on the main thread to force to initialize some static
-// values used in WebKit before any worker thread is started. This is because in
-// our worker processs, we do not run any WebKit code in main thread and thus
-// when multiple workers try to start at the same time, we might hit crash due
-// to contention for initializing static values.
-void InitializeWebKitStaticValues() {
- static bool initialized = false;
- if (!initialized) {
- initialized= true;
- // Note that we have to pass a URL with valid protocol in order to follow
- // the path to do static value initializations.
- WTF::RefPtr<WebCore::SecurityOrigin> origin =
- WebCore::SecurityOrigin::create(WebCore::KURL(WebCore::ParsedURLString,
- "http://localhost"));
- origin.release();
- }
-}
-
-WebWorkerImpl::WebWorkerImpl(WebWorkerClient* client)
- : client_(client),
- web_view_(NULL),
- asked_to_terminate_(false) {
- InitializeWebKitStaticValues();
-}
-
-WebWorkerImpl::~WebWorkerImpl() {
- web_view_->close();
-}
-
-void WebWorkerImpl::PostMessageToWorkerContextTask(
- WebCore::ScriptExecutionContext* context,
- WebWorkerImpl* this_ptr,
- const WebCore::String& message,
- WTF::PassOwnPtr<WebCore::MessagePortChannelArray> channels) {
- ASSERT(context->isWorkerContext());
- WebCore::DedicatedWorkerContext* worker_context =
- static_cast<WebCore::DedicatedWorkerContext*>(context);
-
- WTF::OwnPtr<WebCore::MessagePortArray> ports =
- WebCore::MessagePort::entanglePorts(*context, channels.release());
- WTF::RefPtr<WebCore::SerializedScriptValue> serialized_message =
- WebCore::SerializedScriptValue::create(message);
- worker_context->dispatchEvent(
- WebCore::MessageEvent::create(ports.release(),
- serialized_message.release()));
-
- this_ptr->confirmMessageFromWorkerObject(
- worker_context->hasPendingActivity());
-}
-
-// WebWorker -------------------------------------------------------------------
-
-void WebWorkerImpl::startWorkerContext(const WebURL& script_url,
- const WebString& user_agent,
- const WebString& source_code) {
- // Create 'shadow page'. This page is never displayed, it is used to proxy the
- // loading requests from the worker context to the rest of WebKit and Chromium
- // infrastructure.
- ASSERT(!web_view_);
- web_view_ = WebView::create(NULL);
- WebPreferences().Apply(web_view_);
- web_view_->initializeMainFrame(WorkerWebFrameClient::GetSharedInstance());
-
- WebFrameImpl* web_frame = static_cast<WebFrameImpl*>(web_view_->mainFrame());
-
- // Construct substitute data source for the 'shadow page'. We only need it
- // to have same origin as the worker so the loading checks work correctly.
- WebCore::CString content("");
- int len = static_cast<int>(content.length());
- RefPtr<WebCore::SharedBuffer> buf(
- WebCore::SharedBuffer::create(content.data(), len));
- WebCore::SubstituteData subst_data(buf,
- WebCore::String("text/html"),
- WebCore::String("UTF-8"),
- WebCore::KURL());
- WebCore::ResourceRequest request(webkit_glue::GURLToKURL(script_url),
- WebCore::CString());
- web_frame->frame()->loader()->load(request, subst_data, false);
-
- // This document will be used as 'loading context' for the worker.
- loading_document_ = web_frame->frame()->document();
-
- worker_thread_ = WebCore::DedicatedWorkerThread::create(
- webkit_glue::WebURLToKURL(script_url),
- webkit_glue::WebStringToString(user_agent),
- webkit_glue::WebStringToString(source_code),
- *this,
- *this);
-
- // Worker initialization means a pending activity.
- reportPendingActivity(true);
-
- worker_thread_->start();
-}
-
-void WebWorkerImpl::terminateWorkerContext() {
- if (asked_to_terminate_)
- return;
- asked_to_terminate_ = true;
-
- if (worker_thread_)
- worker_thread_->stop();
-}
-
-void WebWorkerImpl::postMessageToWorkerContext(
- const WebString& message,
- const WebMessagePortChannelArray& webchannels) {
-
- WTF::OwnPtr<WebCore::MessagePortChannelArray> channels;
- if (webchannels.size()) {
- channels = new WebCore::MessagePortChannelArray(webchannels.size());
- for (size_t i = 0; i < webchannels.size(); ++i) {
- RefPtr<WebCore::PlatformMessagePortChannel> platform_channel =
- WebCore::PlatformMessagePortChannel::create(webchannels[i]);
- webchannels[i]->setClient(platform_channel.get());
- (*channels)[i] = WebCore::MessagePortChannel::create(platform_channel);
- }
- }
-
- worker_thread_->runLoop().postTask(WebCore::createCallbackTask(
- &PostMessageToWorkerContextTask,
- this,
- webkit_glue::WebStringToString(message),
- channels.release()));
-}
-
-void WebWorkerImpl::workerObjectDestroyed() {
- // Worker object in the renderer was destroyed, perhaps a result of GC.
- // For us, it's a signal to start terminating the WorkerContext too.
- // TODO(dimich): when 'kill a worker' html5 spec algorithm is implemented, it
- // should be used here instead of 'terminate a worker'.
- terminateWorkerContext();
-}
-
-void WebWorkerImpl::clientDestroyed() {
- client_ = NULL;
-}
-
-void WebWorkerImpl::DispatchTaskToMainThread(
- PassRefPtr<WebCore::ScriptExecutionContext::Task> task) {
- return WTF::callOnMainThread(InvokeTaskMethod, task.releaseRef());
-}
-
-void WebWorkerImpl::InvokeTaskMethod(void* param) {
- WebCore::ScriptExecutionContext::Task* task =
- static_cast<WebCore::ScriptExecutionContext::Task*>(param);
- task->performTask(NULL);
- task->deref();
-}
-
-// WorkerObjectProxy -----------------------------------------------------------
-
-void WebWorkerImpl::postMessageToWorkerObject(
- WTF::PassRefPtr<WebCore::SerializedScriptValue> message,
- WTF::PassOwnPtr<WebCore::MessagePortChannelArray> channels) {
- DispatchTaskToMainThread(WebCore::createCallbackTask(
- &PostMessageTask,
- this,
- message->toString(),
- channels));
-}
-
-void WebWorkerImpl::PostMessageTask(
- WebCore::ScriptExecutionContext* context,
- WebWorkerImpl* this_ptr,
- WebCore::String message,
- WTF::PassOwnPtr<WebCore::MessagePortChannelArray> channels) {
- if (!this_ptr->client_)
- return;
-
- WebMessagePortChannelArray web_channels(
- channels.get() ? channels->size() : 0);
- for (size_t i = 0; i < web_channels.size(); ++i) {
- web_channels[i] = (*channels)[i]->channel()->webChannelRelease();
- web_channels[i]->setClient(0);
- }
-
- this_ptr->client_->postMessageToWorkerObject(
- webkit_glue::StringToWebString(message), web_channels);
-}
-
-void WebWorkerImpl::postExceptionToWorkerObject(
- const WebCore::String& error_message,
- int line_number,
- const WebCore::String& source_url) {
- DispatchTaskToMainThread(WebCore::createCallbackTask(
- &PostExceptionTask,
- this,
- error_message,
- line_number,
- source_url));
-}
-
-void WebWorkerImpl::PostExceptionTask(
- WebCore::ScriptExecutionContext* context,
- WebWorkerImpl* this_ptr,
- const WebCore::String& error_message,
- int line_number,
- const WebCore::String& source_url) {
- if (!this_ptr->client_)
- return;
-
- this_ptr->client_->postExceptionToWorkerObject(
- webkit_glue::StringToWebString(error_message),
- line_number,
- webkit_glue::StringToWebString(source_url));
-}
-
-void WebWorkerImpl::postConsoleMessageToWorkerObject(
- WebCore::MessageDestination destination,
- WebCore::MessageSource source,
- WebCore::MessageType type,
- WebCore::MessageLevel level,
- const WebCore::String& message,
- int line_number,
- const WebCore::String& source_url) {
- DispatchTaskToMainThread(WebCore::createCallbackTask(
- &PostConsoleMessageTask,
- this,
- static_cast<int>(destination),
- static_cast<int>(source),
- static_cast<int>(type),
- static_cast<int>(level),
- message,
- line_number,
- source_url));
-}
-
-void WebWorkerImpl::PostConsoleMessageTask(
- WebCore::ScriptExecutionContext* context,
- WebWorkerImpl* this_ptr,
- int destination,
- int source,
- int type,
- int level,
- const WebCore::String& message,
- int line_number,
- const WebCore::String& source_url) {
- if (!this_ptr->client_)
- return;
-
- this_ptr->client_->postConsoleMessageToWorkerObject(
- destination,
- source,
- type,
- level,
- webkit_glue::StringToWebString(message),
- line_number,
- webkit_glue::StringToWebString(source_url));
-}
-
-void WebWorkerImpl::confirmMessageFromWorkerObject(bool has_pending_activity) {
- DispatchTaskToMainThread(WebCore::createCallbackTask(
- &ConfirmMessageTask,
- this,
- has_pending_activity));
-}
-
-void WebWorkerImpl::ConfirmMessageTask(
- WebCore::ScriptExecutionContext* context,
- WebWorkerImpl* this_ptr,
- bool has_pending_activity) {
- if (!this_ptr->client_)
- return;
-
- this_ptr->client_->confirmMessageFromWorkerObject(has_pending_activity);
-}
-
-void WebWorkerImpl::reportPendingActivity(bool has_pending_activity) {
- DispatchTaskToMainThread(WebCore::createCallbackTask(
- &ReportPendingActivityTask,
- this,
- has_pending_activity));
-}
-
-void WebWorkerImpl::ReportPendingActivityTask(
- WebCore::ScriptExecutionContext* context,
- WebWorkerImpl* this_ptr,
- bool has_pending_activity) {
- if (!this_ptr->client_)
- return;
-
- this_ptr->client_->reportPendingActivity(has_pending_activity);
-}
-
-void WebWorkerImpl::workerContextDestroyed() {
- DispatchTaskToMainThread(WebCore::createCallbackTask(
- &WorkerContextDestroyedTask,
- this));
-}
-
-// WorkerLoaderProxy -----------------------------------------------------------
-
-void WebWorkerImpl::postTaskToLoader(
- PassRefPtr<WebCore::ScriptExecutionContext::Task> task) {
- ASSERT(loading_document_->isDocument());
- loading_document_->postTask(task);
-}
-
-void WebWorkerImpl::postTaskForModeToWorkerContext(
- PassRefPtr<WebCore::ScriptExecutionContext::Task> task,
- const WebCore::String& mode) {
- worker_thread_->runLoop().postTaskForMode(task, mode);
-}
-
-void WebWorkerImpl::WorkerContextDestroyedTask(
- WebCore::ScriptExecutionContext* context,
- WebWorkerImpl* this_ptr) {
- if (this_ptr->client_)
- this_ptr->client_->workerContextDestroyed();
-
- // The lifetime of this proxy is controlled by the worker context.
- delete this_ptr;
-}
-
-#else
-
-namespace WebKit {
-
-WebWorker* WebWorker::create(WebWorkerClient* client) {
- return NULL;
-}
-
-}
-
-#endif
« no previous file with comments | « webkit/glue/webworker_impl.h ('k') | webkit/glue/webworkerclient_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698