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