| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009 Google Inc. All rights reserved. | 2 * Copyright (C) 2009 Google Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
| 6 * met: | 6 * met: |
| 7 * | 7 * |
| 8 * * Redistributions of source code must retain the above copyright | 8 * * Redistributions of source code must retain the above copyright |
| 9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
| 10 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 54 | 54 |
| 55 class Document; | 55 class Document; |
| 56 using WebKit::WebMessagePortChannel; | 56 using WebKit::WebMessagePortChannel; |
| 57 using WebKit::WebSharedWorker; | 57 using WebKit::WebSharedWorker; |
| 58 using WebKit::WebSharedWorkerRepository; | 58 using WebKit::WebSharedWorkerRepository; |
| 59 | 59 |
| 60 // Callback class that keeps the Worker object alive while loads are potentially happening, and also translates load errors into error events on the worker. | 60 // Callback class that keeps the Worker object alive while loads are potentially happening, and also translates load errors into error events on the worker. |
| 61 class SharedWorkerScriptLoader : public RefCounted<SharedWorkerScriptLoader>, private WorkerScriptLoaderClient { | 61 class SharedWorkerScriptLoader : public RefCounted<SharedWorkerScriptLoader>, private WorkerScriptLoaderClient { |
| 62 public: | 62 public: |
| 63 SharedWorkerScriptLoader(PassRefPtr<SharedWorker> worker, PassOwnPtr<MessagePortChannel> port, PassOwnPtr<WebSharedWorker> webWorker) | 63 SharedWorkerScriptLoader(PassRefPtr<SharedWorker> worker, PassOwnPtr<MessagePortChannel> port, PassOwnPtr<WebSharedWorker> webWorker) |
| 64 : m_worker(worker), | 64 : m_worker(worker) |
| 65 m_webWorker(webWorker), | 65 , m_webWorker(webWorker) |
| 66 m_port(port) | 66 , m_port(port) |
| 67 { | 67 { |
| 68 } | 68 } |
| 69 | 69 |
| 70 void load(const KURL&); | 70 void load(const KURL&); |
| 71 | 71 |
| 72 private: | 72 private: |
| 73 // WorkerScriptLoaderClient callback | 73 // WorkerScriptLoaderClient callback |
| 74 virtual void notifyFinished(); | 74 virtual void notifyFinished(); |
| 75 | 75 |
| 76 RefPtr<SharedWorker> m_worker; | 76 RefPtr<SharedWorker> m_worker; |
| 77 OwnPtr<WebSharedWorker> m_webWorker; | 77 OwnPtr<WebSharedWorker> m_webWorker; |
| 78 OwnPtr<MessagePortChannel> m_port; | 78 OwnPtr<MessagePortChannel> m_port; |
| 79 WorkerScriptLoader m_scriptLoader; | 79 WorkerScriptLoader m_scriptLoader; |
| 80 }; | 80 }; |
| 81 | 81 |
| 82 void SharedWorkerScriptLoader::load(const KURL& url) | 82 void SharedWorkerScriptLoader::load(const KURL& url) |
| 83 { | 83 { |
| 84 m_scriptLoader.loadAsynchronously(m_worker->scriptExecutionContext(), url, DenyCrossOriginRequests, this); | 84 m_scriptLoader.loadAsynchronously(m_worker->scriptExecutionContext(), url, DenyCrossOriginRequests, this); |
| 85 } | 85 } |
| 86 | 86 |
| 87 // Extracts a WebMessagePortChannel from a MessagePortChannel. | 87 // Extracts a WebMessagePortChannel from a MessagePortChannel. |
| 88 static WebMessagePortChannel* getWebPort(PassOwnPtr<MessagePortChannel> port) { | 88 static WebMessagePortChannel* getWebPort(PassOwnPtr<MessagePortChannel> port) |
| 89 { |
| 89 // Extract the WebMessagePortChannel to send to the worker. | 90 // Extract the WebMessagePortChannel to send to the worker. |
| 90 PlatformMessagePortChannel* platformChannel = port->channel(); | 91 PlatformMessagePortChannel* platformChannel = port->channel(); |
| 91 WebMessagePortChannel* webPort = platformChannel->webChannelRelease(); | 92 WebMessagePortChannel* webPort = platformChannel->webChannelRelease(); |
| 92 webPort->setClient(0); | 93 webPort->setClient(0); |
| 93 return webPort; | 94 return webPort; |
| 94 } | 95 } |
| 95 | 96 |
| 96 void SharedWorkerScriptLoader::notifyFinished() | 97 void SharedWorkerScriptLoader::notifyFinished() |
| 97 { | 98 { |
| 98 if (m_scriptLoader.failed()) | 99 if (m_scriptLoader.failed()) |
| 99 m_worker->dispatchEvent(Event::create(eventNames().errorEvent, false, true)); | 100 m_worker->dispatchEvent(Event::create(eventNames().errorEvent, false, true)); |
| 100 else { | 101 else { |
| 101 m_webWorker->startWorkerContext(m_scriptLoader.url(), m_worker->scriptExecutionContext()->userAgent(m_scriptLoader.url()), m_scriptLoader.script()); | 102 m_webWorker->startWorkerContext(m_scriptLoader.url(), m_worker->scriptExecutionContext()->userAgent(m_scriptLoader.url()), m_scriptLoader.script()); |
| 102 m_webWorker->connect(getWebPort(m_port.release())); | 103 m_webWorker->connect(getWebPort(m_port.release())); |
| 103 } | 104 } |
| 104 | 105 |
| 105 // Connect event has been sent, so free ourselves (this releases the SharedWorker so it can be freed as well if unreferenced). | 106 // Connect event has been sent, so free ourselves (this releases the SharedWorker so it can be freed as well if unreferenced). |
| 106 delete this; | 107 delete this; |
| 107 } | 108 } |
| 108 | 109 |
| 109 bool SharedWorkerRepository::isAvailable() | 110 bool SharedWorkerRepository::isAvailable() |
| 110 { | 111 { |
| 111 // SharedWorkers are disabled for now until the implementation is further along. | 112 // SharedWorkers are disabled for now until the implementation is further along. |
| 112 // TODO(atwilson): Add code to check for a runtime flag like so: | 113 // FIXME(atwilson): Add code to check for a runtime flag like so: |
| 113 // return commandLineFlag && WebKit::webKitClient()->sharedWorkerRepository(); | 114 // return commandLineFlag && WebKit::webKitClient()->sharedWorkerRepository(); |
| 114 return false; | 115 return false; |
| 115 } | 116 } |
| 116 | 117 |
| 117 static WebSharedWorkerRepository::DocumentID getId(void* document) | 118 static WebSharedWorkerRepository::DocumentID getId(void* document) |
| 118 { | 119 { |
| 119 ASSERT(document); | 120 ASSERT(document); |
| 120 return reinterpret_cast<WebSharedWorkerRepository::DocumentID>(document); | 121 return reinterpret_cast<WebSharedWorkerRepository::DocumentID>(document); |
| 121 } | 122 } |
| 122 | 123 |
| (...skipping 15 matching lines...) Expand all Loading... |
| 138 if (!webWorker->isStarted()) { | 139 if (!webWorker->isStarted()) { |
| 139 // 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. | 140 // 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. |
| 140 SharedWorkerScriptLoader* loader = new SharedWorkerScriptLoader(worker, port.release(), webWorker.release()); | 141 SharedWorkerScriptLoader* loader = new SharedWorkerScriptLoader(worker, port.release(), webWorker.release()); |
| 141 loader->load(url); | 142 loader->load(url); |
| 142 } else | 143 } else |
| 143 webWorker->connect(getWebPort(port.release())); | 144 webWorker->connect(getWebPort(port.release())); |
| 144 } | 145 } |
| 145 | 146 |
| 146 void SharedWorkerRepository::documentDetached(Document* document) | 147 void SharedWorkerRepository::documentDetached(Document* document) |
| 147 { | 148 { |
| 148 WebKit::WebSharedWorkerRepository* repo = WebKit::webKitClient()->sharedWorkerRepository(); | 149 WebSharedWorkerRepository* repo = WebKit::webKitClient()->sharedWorkerRepository(); |
| 149 if (repo) | 150 if (repo) |
| 150 repo->documentDetached(getId(document)); | 151 repo->documentDetached(getId(document)); |
| 151 } | 152 } |
| 152 | 153 |
| 153 bool SharedWorkerRepository::hasSharedWorkers(Document* document) | 154 bool SharedWorkerRepository::hasSharedWorkers(Document* document) |
| 154 { | 155 { |
| 155 WebKit::WebSharedWorkerRepository* repo = WebKit::webKitClient()->sharedWorkerRepository(); | 156 WebSharedWorkerRepository* repo = WebKit::webKitClient()->sharedWorkerRepository(); |
| 156 return repo && repo->hasSharedWorkers(getId(document)); | 157 return repo && repo->hasSharedWorkers(getId(document)); |
| 157 } | 158 } |
| 158 | 159 |
| 159 | 160 |
| 160 | 161 |
| 161 } // namespace WebCore | 162 } // namespace WebCore |
| 162 | 163 |
| 163 #endif // ENABLE(SHARED_WORKERS) | 164 #endif // ENABLE(SHARED_WORKERS) |
| OLD | NEW |