15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2009 Google Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2010 Apple Inc. All rights reserved. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions are 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met: 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions of source code must retain the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Redistributions in binary form must reproduce the above 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution. 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * * Neither the name of Google Inc. nor the names of its 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission. 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 3353e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/workers/SharedWorker.h" 3453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles) 35197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#include "bindings/core/v8/ExceptionState.h" 3653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h" 371e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "core/dom/ExecutionContext.h" 3853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/MessageChannel.h" 3953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/MessagePort.h" 40d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)#include "core/frame/LocalFrame.h" 4151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "core/frame/UseCounter.h" 4209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/inspector/InspectorInstrumentation.h" 4309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/loader/FrameLoader.h" 4409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "core/loader/FrameLoaderClient.h" 45f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles)#include "core/workers/SharedWorkerRepositoryClient.h" 4651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/KURL.h" 4751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)#include "platform/weborigin/SecurityOrigin.h" 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 49c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 511e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)inline SharedWorker::SharedWorker(ExecutionContext* context) 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : AbstractWorker(context) 53197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch , m_isBeingConnected(false) 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 57d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)PassRefPtrWillBeRawPtr<SharedWorker> SharedWorker::create(ExecutionContext* context, const String& url, const String& name, ExceptionState& exceptionState) 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(isMainThread()); 60f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) ASSERT_WITH_SECURITY_IMPLICATION(context->isDocument()); 61f79f16f17ddc4f842d7b7a38603e280e94be826aTorne (Richard Coles) 6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) UseCounter::count(context, UseCounter::SharedWorkerStart); 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 649e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles) RefPtrWillBeRawPtr<SharedWorker> worker = adoptRefWillBeNoop(new SharedWorker(context)); 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 665d92fedcae5e801a8b224de090094f2d9df0b54aTorne (Richard Coles) RefPtrWillBeRawPtr<MessageChannel> channel = MessageChannel::create(context); 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) worker->m_port = channel->port1(); 6851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) OwnPtr<blink::WebMessagePortChannel> remotePort = channel->port2()->disentangle(); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) ASSERT(remotePort); 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) worker->suspendIfNeeded(); 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // We don't currently support nested workers, so workers can only be created from documents. 74591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch Document* document = toDocument(context); 757757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch if (!document->securityOrigin()->canAccessSharedWorkers()) { 76a854de003a23bf3c7f95ec0f8154ada64092ff5cTorne (Richard Coles) exceptionState.throwSecurityError("Access to shared workers is denied to origin '" + document->securityOrigin()->toString() + "'."); 77d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 8051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) KURL scriptURL = worker->resolveURL(url, exceptionState); 81e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) if (scriptURL.isEmpty()) 82d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) return nullptr; 83e1f1df5f01594c0e62e751e4b46e779b85c2faa5Torne (Richard Coles) 8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) if (document->frame()->loader().client()->sharedWorkerRepositoryClient()) 8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles) document->frame()->loader().client()->sharedWorkerRepositoryClient()->connect(worker.get(), remotePort.release(), scriptURL, name, exceptionState); 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return worker.release(); 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SharedWorker::~SharedWorker() 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)const AtomicString& SharedWorker::interfaceName() const 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) return EventTargetNames::SharedWorker; 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 99197021e6b966cfb06891637935ef33fff06433d1Ben Murdochbool SharedWorker::hasPendingActivity() const 10051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles){ 101197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch return m_isBeingConnected; 10251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} 10351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles) 104d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)void SharedWorker::trace(Visitor* visitor) 105d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){ 1067242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#if ENABLE(OILPAN) 107197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch visitor->trace(m_port); 1087242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci HeapSupplementable<SharedWorker>::trace(visitor); 1097242dc3dbeb210b5e876a3c42d1ec1a667fc621aPrimiano Tucci#endif 110d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) AbstractWorker::trace(visitor); 111d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)} 112d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) 113c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 114