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

Unified Diff: content/browser/shared_worker/shared_worker_host.cc

Issue 182693002: Implement some mothods in SharedWorkerHost and SharedWorkerServiceImpl (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Added null check of instance in SharedWorkerHost Created 6 years, 10 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
Index: content/browser/shared_worker/shared_worker_host.cc
diff --git a/content/browser/shared_worker/shared_worker_host.cc b/content/browser/shared_worker/shared_worker_host.cc
index 79944ecaa09ec2e6baae9b77dd3479140aad2029..6666bf37d6319042c9484ce8496810adb8363e1b 100644
--- a/content/browser/shared_worker/shared_worker_host.cc
+++ b/content/browser/shared_worker/shared_worker_host.cc
@@ -4,14 +4,18 @@
#include "content/browser/shared_worker/shared_worker_host.h"
+#include "content/browser/message_port_service.h"
#include "content/browser/shared_worker/shared_worker_instance.h"
#include "content/browser/shared_worker/shared_worker_message_filter.h"
+#include "content/common/view_messages.h"
+#include "content/common/worker_messages.h"
#include "content/public/browser/browser_thread.h"
namespace content {
SharedWorkerHost::SharedWorkerHost(SharedWorkerInstance* instance)
: instance_(instance),
+ container_render_filter_(NULL),
worker_route_id_(MSG_ROUTING_NONE) {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
}
@@ -20,11 +24,173 @@ SharedWorkerHost::~SharedWorkerHost() {
DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO));
}
+bool SharedWorkerHost::Send(IPC::Message* message) {
+ if (!container_render_filter_) {
+ delete message;
+ return false;
+ }
+ return container_render_filter_->Send(message);
+}
+
void SharedWorkerHost::Init(SharedWorkerMessageFilter* filter) {
+ CHECK(instance_);
DCHECK(worker_route_id_ == MSG_ROUTING_NONE);
+ container_render_filter_ = filter;
worker_route_id_ = filter->GetNextRoutingID();
+
+ WorkerProcessMsg_CreateWorker_Params params;
+ params.url = instance_->url();
+ params.name = instance_->name();
+ params.content_security_policy = instance_->content_security_policy();
+ params.security_policy_type = instance_->security_policy_type();
+ params.route_id = worker_route_id_;
+ Send(new WorkerProcessMsg_CreateWorker(params));
+
+ for (SharedWorkerInstance::FilterList::const_iterator i =
+ instance_->filters().begin();
+ i != instance_->filters().end(); ++i) {
+ i->filter()->Send(new ViewMsg_WorkerCreated(i->route_id()));
+ }
+}
+
+bool SharedWorkerHost::FilterMessage(const IPC::Message& message,
+ SharedWorkerMessageFilter* filter) {
+ if (!instance_)
+ return false;
+
+ if (!instance_->closed() &&
+ instance_->HasFilter(filter, message.routing_id())) {
+ RelayMessage(message, filter);
+ return true;
+ }
+
+ return false;
+}
+
+void SharedWorkerHost::FilterShutdown(SharedWorkerMessageFilter* filter) {
+ if (!instance_)
+ return;
+ instance_->RemoveFilters(filter);
+ instance_->worker_document_set()->RemoveAll(filter);
+ if (instance_->worker_document_set()->IsEmpty()) {
+ // This worker has no more associated documents - shut it down.
+ Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_));
+ }
+}
+
+void SharedWorkerHost::DocumentDetached(SharedWorkerMessageFilter* filter,
+ unsigned long long document_id) {
+ if (!instance_)
+ return;
+ // Walk all instances and remove the document from their document set.
+ instance_->worker_document_set()->Remove(filter, document_id);
+ if (instance_->worker_document_set()->IsEmpty()) {
+ // This worker has no more associated documents - shut it down.
+ Send(new WorkerMsg_TerminateWorkerContext(worker_route_id_));
+ }
+}
+
+void SharedWorkerHost::WorkerContextClosed() {
+ if (!instance_)
+ return;
+ // Set the closed flag - this will stop any further messages from
+ // being sent to the worker (messages can still be sent from the worker,
+ // for exception reporting, etc).
+ instance_->set_closed(true);
+}
+
+void SharedWorkerHost::WorkerContextDestroyed() {
+ if (!instance_)
+ return;
+ instance_.reset();
+}
+
+void SharedWorkerHost::WorkerScriptLoaded() {
// TODO(horo): implement this.
NOTIMPLEMENTED();
}
+void SharedWorkerHost::WorkerScriptLoadFailed() {
+ if (!instance_)
+ return;
+ instance_->set_load_failed(true);
+ for (SharedWorkerInstance::FilterList::const_iterator i =
+ instance_->filters().begin();
+ i != instance_->filters().end(); ++i) {
+ i->filter()->Send(new ViewMsg_WorkerScriptLoadFailed(i->route_id()));
+ }
+}
+
+void SharedWorkerHost::WorkerConnected(int message_port_id) {
+ if (!instance_)
+ return;
+ for (SharedWorkerInstance::FilterList::const_iterator i =
+ instance_->filters().begin();
+ i != instance_->filters().end(); ++i) {
+ if (i->message_port_id() != message_port_id)
+ continue;
+ i->filter()->Send(new ViewMsg_WorkerConnected(i->route_id()));
+ return;
+ }
+}
+
+void SharedWorkerHost::AllowDatabase(const GURL& url,
+ const base::string16& name,
+ const base::string16& display_name,
+ unsigned long estimated_size,
+ bool* result) {
+ // TODO(horo): implement this.
+ NOTIMPLEMENTED();
+}
+
+void SharedWorkerHost::AllowFileSystem(const GURL& url,
+ bool* result) {
+ // TODO(horo): implement this.
+ NOTIMPLEMENTED();
+}
+
+void SharedWorkerHost::AllowIndexedDB(const GURL& url,
+ const base::string16& name,
+ bool* result) {
+ // TODO(horo): implement this.
+ NOTIMPLEMENTED();
+}
+
+void SharedWorkerHost::RelayMessage(
+ const IPC::Message& message,
+ SharedWorkerMessageFilter* incoming_filter) {
+ if (!instance_)
+ return;
+ if (message.type() == WorkerMsg_Connect::ID) {
+ // Crack the SharedWorker Connect message to setup routing for the port.
+ int sent_message_port_id;
+ int new_routing_id;
+ if (!WorkerMsg_Connect::Read(
+ &message, &sent_message_port_id, &new_routing_id)) {
+ return;
+ }
+ DCHECK(container_render_filter_);
+ new_routing_id = container_render_filter_->GetNextRoutingID();
+ MessagePortService::GetInstance()->UpdateMessagePort(
+ sent_message_port_id,
+ container_render_filter_->message_port_message_filter(),
+ new_routing_id);
+ instance_->SetMessagePortID(incoming_filter,
+ message.routing_id(),
+ sent_message_port_id);
+ // Resend the message with the new routing id.
+ Send(new WorkerMsg_Connect(
+ worker_route_id_, sent_message_port_id, new_routing_id));
+
+ // Send any queued messages for the sent port.
+ MessagePortService::GetInstance()->SendQueuedMessagesIfPossible(
+ sent_message_port_id);
+ } else {
+ IPC::Message* new_message = new IPC::Message(message);
+ new_message->set_routing_id(worker_route_id_);
+ Send(new_message);
+ return;
+ }
+}
+
} // namespace content
« no previous file with comments | « content/browser/shared_worker/shared_worker_host.h ('k') | content/browser/shared_worker/shared_worker_message_filter.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698