15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/worker/websharedworkerclient_proxy.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/command_line.h"
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/fileapi/file_system_dispatcher.h"
11868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/fileapi/webfilesystem_callback_adapters.h"
12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/quota_dispatcher.h"
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "content/child/webmessageportchannel_impl.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/worker_messages.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/content_switches.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/worker/shared_worker_devtools_agent.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/worker/websharedworker_stub.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/worker/worker_thread.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/worker/worker_webapplicationcachehost_impl.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ipc/ipc_logging.h"
219ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "third_party/WebKit/public/platform/WebString.h"
229ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "third_party/WebKit/public/platform/WebURL.h"
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebDocument.h"
247d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFileSystemCallbacks.h"
257d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebFrame.h"
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/web/WebSecurityOrigin.h"
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebApplicationCacheHost;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebFrame;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMessagePortChannel;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebMessagePortChannelArray;
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSecurityOrigin;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebString;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebWorker;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using WebKit::WebSharedWorkerClient;
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// How long to wait for worker to finish after it's been told to terminate.
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define kMaxTimeForRunawayWorkerSeconds 3
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebSharedWorkerClientProxy::WebSharedWorkerClientProxy(
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int route_id, WebSharedWorkerStub* stub)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    : route_id_(route_id),
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      appcache_host_id_(0),
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      stub_(stub),
47c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      weak_factory_(this),
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      devtools_agent_(NULL) {
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebSharedWorkerClientProxy::~WebSharedWorkerClientProxy() {
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebSharedWorkerClientProxy::postMessageToWorkerObject(
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebString& message,
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebMessagePortChannelArray& channels) {
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<int> message_port_ids(channels.size());
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::vector<int> routing_ids(channels.size());
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (size_t i = 0; i < channels.size(); ++i) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebMessagePortChannelImpl* webchannel =
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        static_cast<WebMessagePortChannelImpl*>(channels[i]);
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    message_port_ids[i] = webchannel->message_port_id();
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    webchannel->QueueMessages();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    DCHECK(message_port_ids[i] != MSG_ROUTING_NONE);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    routing_ids[i] = MSG_ROUTING_NONE;
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new WorkerMsg_PostMessage(
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      route_id_, message, message_port_ids, routing_ids));
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebSharedWorkerClientProxy::postExceptionToWorkerObject(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebString& error_message,
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int line_number,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebString& source_url) {
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new WorkerHostMsg_PostExceptionToWorkerObject(
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      route_id_, error_message, line_number, source_url));
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebSharedWorkerClientProxy::postConsoleMessageToWorkerObject(
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int source,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int type,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int level,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebString& message,
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    int line_number,
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebString& source_url) {
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WorkerHostMsg_PostConsoleMessageToWorkerObject_Params params;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.source_identifier = source;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.message_type = type;
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.message_level = level;
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.message = message;
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.line_number = line_number;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  params.source_url = source_url;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new WorkerHostMsg_PostConsoleMessageToWorkerObject(route_id_, params));
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebSharedWorkerClientProxy::confirmMessageFromWorkerObject(
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool has_pending_activity) {
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new WorkerHostMsg_ConfirmMessageFromWorkerObject(
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      route_id_, has_pending_activity));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebSharedWorkerClientProxy::reportPendingActivity(
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool has_pending_activity) {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new WorkerHostMsg_ReportPendingActivity(
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      route_id_, has_pending_activity));
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebSharedWorkerClientProxy::workerContextClosed() {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new WorkerHostMsg_WorkerContextClosed(route_id_));
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebSharedWorkerClientProxy::workerContextDestroyed() {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new WorkerHostMsg_WorkerContextDestroyed(route_id_));
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Tell the stub that the worker has shutdown - frees this object.
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (stub_)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    stub_->Shutdown();
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebKit::WebNotificationPresenter*
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebSharedWorkerClientProxy::notificationPresenter() {
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // TODO(johnnyg): Notifications are not yet hooked up to workers.
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Coming soon.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  NOTREACHED();
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return NULL;
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)WebApplicationCacheHost* WebSharedWorkerClientProxy::createApplicationCacheHost(
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebKit::WebApplicationCacheHostClient* client) {
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WorkerWebApplicationCacheHostImpl* host =
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new WorkerWebApplicationCacheHostImpl(stub_->appcache_init_info(),
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                            client);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Remember the id of the instance we create so we have access to that
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // value when creating nested dedicated workers in createWorker.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  appcache_host_id_ = host->host_id();
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return host;
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// TODO(abarth): Security checks should use WebDocument or WebSecurityOrigin,
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// not WebFrame as the context object because WebFrames can contain different
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// WebDocuments at different times.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebSharedWorkerClientProxy::allowDatabase(WebFrame* frame,
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const WebString& name,
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         const WebString& display_name,
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                         unsigned long estimated_size) {
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WebSecurityOrigin origin = frame->document().securityOrigin();
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (origin.isUnique())
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = false;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new WorkerProcessHostMsg_AllowDatabase(
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      route_id_, GURL(origin.toString().utf8()), name, display_name,
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      estimated_size, &result));
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebSharedWorkerClientProxy::allowFileSystem() {
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = false;
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new WorkerProcessHostMsg_AllowFileSystem(
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      route_id_, stub_->url().GetOrigin(), &result));
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebSharedWorkerClientProxy::openFileSystem(
1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebKit::WebFileSystemType type,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    long long size,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    bool create,
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    WebKit::WebFileSystemCallbacks* callbacks) {
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ChildThread::current()->file_system_dispatcher()->OpenFileSystem(
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      stub_->url().GetOrigin(), static_cast<fileapi::FileSystemType>(type),
17190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      size, create,
17290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&OpenFileSystemCallbackAdapter, callbacks),
17390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)      base::Bind(&FileStatusCallbackAdapter, callbacks));
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebSharedWorkerClientProxy::allowIndexedDB(const WebKit::WebString& name) {
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  bool result = false;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Send(new WorkerProcessHostMsg_AllowIndexedDB(
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      route_id_, stub_->url().GetOrigin(), name, &result));
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return result;
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void WebSharedWorkerClientProxy::queryUsageAndQuota(
1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebKit::WebStorageQuotaType type,
1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    WebKit::WebStorageQuotaCallbacks* callbacks) {
1862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  ChildThread::current()->quota_dispatcher()->QueryStorageUsageAndQuota(
1872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      stub_->url().GetOrigin(), static_cast<quota::StorageType>(type),
1882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      QuotaDispatcher::CreateWebStorageQuotaCallbacksWrapper(callbacks));
1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebSharedWorkerClientProxy::dispatchDevToolsMessage(
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebString& message) {
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (devtools_agent_)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    devtools_agent_->SendDevToolsMessage(message);
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebSharedWorkerClientProxy::saveDevToolsAgentState(
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const WebKit::WebString& state) {
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (devtools_agent_)
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    devtools_agent_->SaveDevToolsAgentState(state);
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool WebSharedWorkerClientProxy::Send(IPC::Message* message) {
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return WorkerThread::current()->Send(message);
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void WebSharedWorkerClientProxy::EnsureWorkerContextTerminates() {
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This shuts down the process cleanly from the perspective of the browser
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // process, and avoids the crashed worker infobar from appearing to the new
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // page. It's ok to post several of theese, because the first executed task
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // will exit the message loop and subsequent ones won't be executed.
212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  base::MessageLoop::current()->PostDelayedTask(
213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      FROM_HERE,
214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      base::Bind(&WebSharedWorkerClientProxy::workerContextDestroyed,
215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)                 weak_factory_.GetWeakPtr()),
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::TimeDelta::FromSeconds(kMaxTimeForRunawayWorkerSeconds));
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
220