summaryrefslogtreecommitdiffstats
path: root/webkit
diff options
context:
space:
mode:
Diffstat (limited to 'webkit')
-rw-r--r--webkit/api/WebKit.gyp5
-rw-r--r--webkit/api/public/WebCommonWorkerClient.h77
-rw-r--r--webkit/api/public/WebSharedWorker.h15
-rw-r--r--webkit/api/public/WebWorkerClient.h25
-rw-r--r--webkit/api/src/SharedWorkerRepository.cpp24
-rw-r--r--webkit/api/src/WebSharedWorkerImpl.cpp49
-rw-r--r--webkit/api/src/WebSharedWorkerImpl.h78
7 files changed, 238 insertions, 35 deletions
diff --git a/webkit/api/WebKit.gyp b/webkit/api/WebKit.gyp
index 49c8966..1efd323 100644
--- a/webkit/api/WebKit.gyp
+++ b/webkit/api/WebKit.gyp
@@ -76,6 +76,7 @@
'public/WebColor.h',
'public/WebColorName.h',
'public/WebCommon.h',
+ 'public/WebCommonWorkerClient.h',
'public/WebCompositionCommand.h',
'public/WebConsoleMessage.h',
'public/WebContextMenuData.h',
@@ -134,6 +135,8 @@
'public/WebSecurityOrigin.h',
'public/WebSecurityPolicy.h',
'public/WebSettings.h',
+ 'public/WebSharedWorker.h'
+ 'public/WebSharedWorkerRepository.h',
'public/WebSize.h',
'public/WebSocketStreamError.h',
'public/WebSocketStreamHandle.h',
@@ -259,6 +262,8 @@
'src/WebSecurityPolicy.cpp',
'src/WebSettingsImpl.cpp',
'src/WebSettingsImpl.h',
+ 'src/WebSharedWorkerImpl.cpp',
+ 'src/WebSharedWorkerImpl.h',
'src/WebStorageAreaImpl.cpp',
'src/WebStorageAreaImpl.h',
'src/WebStorageEventDispatcherImpl.cpp',
diff --git a/webkit/api/public/WebCommonWorkerClient.h b/webkit/api/public/WebCommonWorkerClient.h
new file mode 100644
index 0000000..fd7e399
--- /dev/null
+++ b/webkit/api/public/WebCommonWorkerClient.h
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebCommonWorkerClient_h
+#define WebCommonWorkerClient_h
+
+namespace WebKit {
+ class WebNotificationPresenter;
+ class WebString;
+ class WebWorker;
+ class WebWorkerClient;
+
+ // Provides an interface back to the in-page script object for a worker.
+ // This interface contains common APIs used by both shared and dedicated
+ // workers.
+ // All functions are expected to be called back on the thread that created
+ // the Worker object, unless noted.
+ class WebCommonWorkerClient {
+ public:
+ virtual void postExceptionToWorkerObject(
+ const WebString& errorString, int lineNumber,
+ const WebString& sourceURL) = 0;
+
+ virtual void postConsoleMessageToWorkerObject(
+ int destinationIdentifier,
+ int sourceIdentifier,
+ int messageType,
+ int messageLevel,
+ const WebString& message,
+ int lineNumber,
+ const WebString& sourceURL) = 0;
+
+ virtual void workerContextDestroyed() = 0;
+
+ // Returns the notification presenter for this worker context. Pointer
+ // is owned by the object implementing WebCommonWorkerClient.
+ virtual WebNotificationPresenter* notificationPresenter() = 0;
+
+ // This can be called on any thread to create a nested WebWorker.
+ // WebSharedWorkers are not instantiated via this API - instead
+ // they are created via the WebSharedWorkerRepository.
+ virtual WebWorker* createWorker(WebWorkerClient* client) = 0;
+
+ protected:
+ ~WebCommonWorkerClient() { }
+ };
+
+} // namespace WebKit
+
+#endif
diff --git a/webkit/api/public/WebSharedWorker.h b/webkit/api/public/WebSharedWorker.h
index 37f0ad6..a580882 100644
--- a/webkit/api/public/WebSharedWorker.h
+++ b/webkit/api/public/WebSharedWorker.h
@@ -37,24 +37,35 @@ namespace WebKit {
class ScriptExecutionContext;
class WebString;
class WebMessagePortChannel;
+ class WebCommonWorkerClient;
class WebURL;
// This is the interface to a SharedWorker thread.
// Since SharedWorkers communicate entirely through MessagePorts this interface only contains APIs for starting up a SharedWorker.
class WebSharedWorker {
public:
- virtual ~WebSharedWorker() {}
+ // Invoked from the worker thread to instantiate a WebSharedWorker that interacts with the WebKit worker components.
+ WEBKIT_API static WebSharedWorker* create(WebCommonWorkerClient*);
+
+ virtual ~WebSharedWorker() {};
// Returns false if the thread hasn't been started yet (script loading has not taken place).
// FIXME(atwilson): Remove this when we move the initial script loading into the worker process.
virtual bool isStarted() = 0;
virtual void startWorkerContext(const WebURL& scriptURL,
+ const WebString& name,
const WebString& userAgent,
const WebString& sourceCode) = 0;
- // Sends a connect event to the SharedWorker thread.
+ // Sends a connect event to the SharedWorker context.
virtual void connect(WebMessagePortChannel*) = 0;
+
+ // Invoked to shutdown the worker when there are no more associated documents.
+ virtual void terminateWorkerContext() = 0;
+
+ // Notification when the WebCommonWorkerClient is destroyed.
+ virtual void clientDestroyed() = 0;
};
} // namespace WebKit
diff --git a/webkit/api/public/WebWorkerClient.h b/webkit/api/public/WebWorkerClient.h
index c0aa1bd..044ba52 100644
--- a/webkit/api/public/WebWorkerClient.h
+++ b/webkit/api/public/WebWorkerClient.h
@@ -32,6 +32,7 @@
#define WebWorkerClient_h
#include "WebMessagePortChannel.h"
+#include "WebCommonWorkerClient.h"
namespace WebKit {
class WebNotificationPresenter;
@@ -41,37 +42,15 @@ namespace WebKit {
// Provides an interface back to the in-page script object for a worker.
// All functions are expected to be called back on the thread that created
// the Worker object, unless noted.
- class WebWorkerClient {
+ class WebWorkerClient : public WebCommonWorkerClient {
public:
virtual void postMessageToWorkerObject(
const WebString&,
const WebMessagePortChannelArray&) = 0;
- virtual void postExceptionToWorkerObject(
- const WebString& errorString, int lineNumber,
- const WebString& sourceURL) = 0;
-
- virtual void postConsoleMessageToWorkerObject(
- int destinationIdentifier,
- int sourceIdentifier,
- int messageType,
- int messageLevel,
- const WebString& message,
- int lineNumber,
- const WebString& sourceURL) = 0;
-
virtual void confirmMessageFromWorkerObject(bool hasPendingActivity) = 0;
virtual void reportPendingActivity(bool hasPendingActivity) = 0;
- virtual void workerContextDestroyed() = 0;
-
- // Returns the notification presenter for this worker context. Pointer
- // is owned by the object implementing WebWorkerClient.
- virtual WebNotificationPresenter* notificationPresenter() = 0;
-
- // This can be called on any thread to create a nested worker.
- virtual WebWorker* createWorker(WebWorkerClient* client) = 0;
-
protected:
~WebWorkerClient() { }
};
diff --git a/webkit/api/src/SharedWorkerRepository.cpp b/webkit/api/src/SharedWorkerRepository.cpp
index ddc6238..32e8fd7 100644
--- a/webkit/api/src/SharedWorkerRepository.cpp
+++ b/webkit/api/src/SharedWorkerRepository.cpp
@@ -60,28 +60,32 @@ using WebKit::WebSharedWorkerRepository;
// Callback class that keeps the Worker object alive while loads are potentially happening, and also translates load errors into error events on the worker.
class SharedWorkerScriptLoader : public RefCounted<SharedWorkerScriptLoader>, private WorkerScriptLoaderClient {
public:
- SharedWorkerScriptLoader(PassRefPtr<SharedWorker> worker, PassOwnPtr<MessagePortChannel> port, PassOwnPtr<WebSharedWorker> webWorker)
- : m_worker(worker)
- , m_webWorker(webWorker)
- , m_port(port)
+ SharedWorkerScriptLoader(PassRefPtr<SharedWorker> worker, const KURL& url, const String& name, PassOwnPtr<MessagePortChannel> port, PassOwnPtr<WebSharedWorker> webWorker)
+ : m_worker(worker),
+ m_url(url),
+ m_name(name),
+ m_webWorker(webWorker),
+ m_port(port)
{
}
- void load(const KURL&);
+ void load();
private:
// WorkerScriptLoaderClient callback
virtual void notifyFinished();
RefPtr<SharedWorker> m_worker;
+ KURL m_url;
+ String m_name;
OwnPtr<WebSharedWorker> m_webWorker;
OwnPtr<MessagePortChannel> m_port;
WorkerScriptLoader m_scriptLoader;
};
-void SharedWorkerScriptLoader::load(const KURL& url)
+void SharedWorkerScriptLoader::load()
{
- m_scriptLoader.loadAsynchronously(m_worker->scriptExecutionContext(), url, DenyCrossOriginRequests, this);
+ m_scriptLoader.loadAsynchronously(m_worker->scriptExecutionContext(), m_url, DenyCrossOriginRequests, this);
}
// Extracts a WebMessagePortChannel from a MessagePortChannel.
@@ -99,7 +103,7 @@ void SharedWorkerScriptLoader::notifyFinished()
if (m_scriptLoader.failed())
m_worker->dispatchEvent(Event::create(eventNames().errorEvent, false, true));
else {
- m_webWorker->startWorkerContext(m_scriptLoader.url(), m_worker->scriptExecutionContext()->userAgent(m_scriptLoader.url()), m_scriptLoader.script());
+ m_webWorker->startWorkerContext(m_url, m_name, m_worker->scriptExecutionContext()->userAgent(m_url), m_scriptLoader.script());
m_webWorker->connect(getWebPort(m_port.release()));
}
@@ -138,8 +142,8 @@ void SharedWorkerRepository::connect(PassRefPtr<SharedWorker> worker, PassOwnPtr
if (!webWorker->isStarted()) {
// Need to kick off a load for the worker. The loader will connect to the worker once the script has been loaded, then free itself.
- SharedWorkerScriptLoader* loader = new SharedWorkerScriptLoader(worker, port.release(), webWorker.release());
- loader->load(url);
+ SharedWorkerScriptLoader* loader = new SharedWorkerScriptLoader(worker, url, name, port.release(), webWorker.release());
+ loader->load();
} else
webWorker->connect(getWebPort(port.release()));
}
diff --git a/webkit/api/src/WebSharedWorkerImpl.cpp b/webkit/api/src/WebSharedWorkerImpl.cpp
new file mode 100644
index 0000000..e5c9fc5
--- /dev/null
+++ b/webkit/api/src/WebSharedWorkerImpl.cpp
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "config.h"
+#include "WebSharedWorkerImpl.h"
+
+using namespace WebCore;
+
+namespace WebKit {
+
+#if ENABLE(SHARED_WORKERS)
+
+WebSharedWorker* WebSharedWorker::create(WebCommonWorkerClient* client)
+{
+ // FIXME: Return an instance of WebSharedWorkerImpl once the implementation is complete.
+ ASSERT_NOT_REACHED();
+ return NULL;
+}
+
+#endif // ENABLE(SHARED_WORKERS)
+
+} // namespace WebKit
diff --git a/webkit/api/src/WebSharedWorkerImpl.h b/webkit/api/src/WebSharedWorkerImpl.h
new file mode 100644
index 0000000..fad0f5a
--- /dev/null
+++ b/webkit/api/src/WebSharedWorkerImpl.h
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) 2009 Google Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * * Redistributions in binary form must reproduce the above
+ * copyright notice, this list of conditions and the following disclaimer
+ * in the documentation and/or other materials provided with the
+ * distribution.
+ * * Neither the name of Google Inc. nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef WebSharedWorkerImpl_h
+#define WebSharedWorkerImpl_h
+
+#include "WebSharedWorker.h"
+
+#if ENABLE(SHARED_WORKERS)
+
+#include "ScriptExecutionContext.h"
+#include "WorkerLoaderProxy.h"
+#include "WorkerObjectProxy.h"
+#include <wtf/PassOwnPtr.h>
+#include <wtf/RefPtr.h>
+
+namespace WebCore {
+class SharedWorkerThread;
+}
+
+namespace WebKit {
+class WebView;
+
+// This class is used by the worker process code to talk to the WebCore::SharedWorker implementation.
+// It can't use it directly since it uses WebKit types, so this class converts the data types.
+// When the WebCore::SharedWorker object wants to call WebCore::WorkerReportingProxy, this class will
+// convert to Chrome data types first and then call the supplied WebCommonWorkerClient.
+class WebSharedWorkerImpl : public WebCore::WorkerLoaderProxy {
+public:
+ explicit WebSharedWorkerImpl(WebCommonWorkerClient* client);
+
+ // WebSharedWorker methods:
+ virtual bool isStarted();
+ virtual void startWorkerContext(const WebURL&, const WebString& name, const WebString& userAgent, const WebString& sourceCode);
+ virtual void connect(WebMessagePortChannel*);
+
+ WebCommonWorkerClient* client() { return m_client; }
+
+private:
+ virtual ~WebSharedWorkerImpl();
+
+ WebCommonWorkerClient* m_client;
+
+ RefPtr<WebCore::SharedWorkerThread> m_workerThread;
+};
+
+} // namespace WebKit
+
+#endif // ENABLE(SHARED_WORKERS)
+
+#endif