Index: content/browser/shared_worker/shared_worker_service_impl.cc |
diff --git a/content/browser/shared_worker/shared_worker_service_impl.cc b/content/browser/shared_worker/shared_worker_service_impl.cc |
index d1e245a4268825a414649040c9779c02e974ddd9..12c3ebbfe54696ecdc390533f7810802357f81db 100644 |
--- a/content/browser/shared_worker/shared_worker_service_impl.cc |
+++ b/content/browser/shared_worker/shared_worker_service_impl.cc |
@@ -4,7 +4,11 @@ |
#include "content/browser/shared_worker/shared_worker_service_impl.h" |
+#include "content/browser/shared_worker/shared_worker_host.h" |
+#include "content/browser/shared_worker/shared_worker_instance.h" |
#include "content/browser/shared_worker/shared_worker_message_filter.h" |
+#include "content/browser/worker_host/worker_document_set.h" |
+#include "content/common/view_messages.h" |
#include "content/common/worker_messages.h" |
#include "content/public/browser/browser_thread.h" |
#include "content/public/browser/worker_service_observer.h" |
@@ -50,8 +54,51 @@ void SharedWorkerServiceImpl::CreateWorker( |
ResourceContext* resource_context, |
const WorkerStoragePartition& partition, |
bool* url_mismatch) { |
- // TODO(horo): implement this. |
- NOTIMPLEMENTED(); |
+ DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
+ *url_mismatch = false; |
+ SharedWorkerInstance* existing_instance = |
+ FindSharedWorkerInstance( |
+ params.url, params.name, partition, resource_context); |
+ if (existing_instance) { |
+ if (params.url != existing_instance->url()) { |
+ *url_mismatch = true; |
+ return; |
+ } |
+ if (existing_instance->load_failed()) { |
+ filter->Send(new ViewMsg_WorkerScriptLoadFailed(route_id)); |
+ return; |
+ } |
+ existing_instance->AddFilter(filter, route_id); |
+ existing_instance->worker_document_set()->Add( |
+ filter, params.document_id, filter->render_process_id(), |
+ params.render_frame_route_id); |
+ filter->Send(new ViewMsg_WorkerCreated(route_id)); |
+ return; |
+ } |
+ |
+ scoped_ptr<SharedWorkerInstance> instance(new SharedWorkerInstance( |
+ params.url, |
+ params.name, |
+ params.content_security_policy, |
+ params.security_policy_type, |
+ resource_context, |
+ partition)); |
+ instance->AddFilter(filter, route_id); |
+ instance->worker_document_set()->Add( |
+ filter, params.document_id, filter->render_process_id(), |
+ params.render_frame_route_id); |
+ |
+ scoped_ptr<SharedWorkerHost> worker(new SharedWorkerHost(instance.release())); |
+ worker->Init(filter); |
+ const int worker_route_id = worker->worker_route_id(); |
+ worker_hosts_.push_back(worker.release()); |
+ |
+ FOR_EACH_OBSERVER( |
+ WorkerServiceObserver, observers_, |
+ WorkerCreated(params.url, |
+ params.name, |
+ filter->render_process_id(), |
+ worker_route_id)); |
} |
void SharedWorkerServiceImpl::ForwardToWorker( |
@@ -141,4 +188,21 @@ void SharedWorkerServiceImpl::OnSharedWorkerMessageFilterClosing( |
NOTIMPLEMENTED(); |
} |
+SharedWorkerInstance* SharedWorkerServiceImpl::FindSharedWorkerInstance( |
+ const GURL& url, |
+ const base::string16& name, |
+ const WorkerStoragePartition& partition, |
+ ResourceContext* resource_context) { |
+ for (ScopedVector<SharedWorkerHost>::const_iterator iter = |
+ worker_hosts_.begin(); |
+ iter != worker_hosts_.end(); |
+ ++iter) { |
+ SharedWorkerInstance* instance = (*iter)->instance(); |
+ if (instance && |
+ instance->Matches(url, name, partition, resource_context)) |
+ return instance; |
+ } |
+ return NULL; |
+} |
+ |
} // namespace content |