1/* 2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. 3 * Copyright (C) 2009 Google Inc. All Rights Reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 15 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 17 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 18 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 19 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 20 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 21 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 22 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 24 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25 * 26 */ 27 28#include "config.h" 29 30#include "JSWorkerGlobalScopeBase.h" 31 32#include "DOMWrapperWorld.h" 33#include "JSDOMGlobalObjectTask.h" 34#include "JSDedicatedWorkerGlobalScope.h" 35#include "JSWorkerGlobalScope.h" 36#include "WorkerGlobalScope.h" 37#include <runtime/JSCJSValueInlines.h> 38#include <runtime/Microtask.h> 39 40#if ENABLE(SHARED_WORKERS) 41#include "JSSharedWorkerGlobalScope.h" 42#endif 43 44using namespace JSC; 45 46namespace WebCore { 47 48const ClassInfo JSWorkerGlobalScopeBase::s_info = { "WorkerGlobalScope", &JSDOMGlobalObject::s_info, 0, 0, CREATE_METHOD_TABLE(JSWorkerGlobalScopeBase) }; 49 50const GlobalObjectMethodTable JSWorkerGlobalScopeBase::s_globalObjectMethodTable = { &allowsAccessFrom, &supportsProfiling, &supportsRichSourceInfo, &shouldInterruptScript, &javaScriptExperimentsEnabled, &queueTaskToEventLoop, &shouldInterruptScriptBeforeTimeout }; 51 52JSWorkerGlobalScopeBase::JSWorkerGlobalScopeBase(JSC::VM& vm, JSC::Structure* structure, PassRefPtr<WorkerGlobalScope> impl) 53 : JSDOMGlobalObject(vm, structure, &normalWorld(vm), &s_globalObjectMethodTable) 54 , m_impl(impl) 55{ 56} 57 58void JSWorkerGlobalScopeBase::finishCreation(VM& vm) 59{ 60 Base::finishCreation(vm); 61 ASSERT(inherits(info())); 62} 63 64void JSWorkerGlobalScopeBase::destroy(JSCell* cell) 65{ 66 static_cast<JSWorkerGlobalScopeBase*>(cell)->JSWorkerGlobalScopeBase::~JSWorkerGlobalScopeBase(); 67} 68 69ScriptExecutionContext* JSWorkerGlobalScopeBase::scriptExecutionContext() const 70{ 71 return m_impl.get(); 72} 73 74bool JSWorkerGlobalScopeBase::allowsAccessFrom(const JSGlobalObject* object, ExecState* exec) 75{ 76 return JSGlobalObject::allowsAccessFrom(object, exec); 77} 78 79bool JSWorkerGlobalScopeBase::supportsProfiling(const JSGlobalObject* object) 80{ 81 return JSGlobalObject::supportsProfiling(object); 82} 83 84bool JSWorkerGlobalScopeBase::supportsRichSourceInfo(const JSGlobalObject* object) 85{ 86 return JSGlobalObject::supportsRichSourceInfo(object); 87} 88 89bool JSWorkerGlobalScopeBase::shouldInterruptScript(const JSGlobalObject* object) 90{ 91 return JSGlobalObject::shouldInterruptScript(object); 92} 93 94bool JSWorkerGlobalScopeBase::shouldInterruptScriptBeforeTimeout(const JSGlobalObject* object) 95{ 96 return JSGlobalObject::shouldInterruptScriptBeforeTimeout(object); 97} 98 99bool JSWorkerGlobalScopeBase::javaScriptExperimentsEnabled(const JSGlobalObject* object) 100{ 101 return JSGlobalObject::javaScriptExperimentsEnabled(object); 102} 103 104void JSWorkerGlobalScopeBase::queueTaskToEventLoop(const JSGlobalObject* object, PassRefPtr<Microtask> task) 105{ 106 const JSWorkerGlobalScopeBase* thisObject = static_cast<const JSWorkerGlobalScopeBase*>(object); 107 thisObject->scriptExecutionContext()->postTask(JSGlobalObjectTask((JSDOMGlobalObject*)thisObject, task)); 108} 109 110JSValue toJS(ExecState* exec, JSDOMGlobalObject*, WorkerGlobalScope* workerGlobalScope) 111{ 112 return toJS(exec, workerGlobalScope); 113} 114 115JSValue toJS(ExecState*, WorkerGlobalScope* workerGlobalScope) 116{ 117 if (!workerGlobalScope) 118 return jsNull(); 119 WorkerScriptController* script = workerGlobalScope->script(); 120 if (!script) 121 return jsNull(); 122 JSWorkerGlobalScope* contextWrapper = script->workerGlobalScopeWrapper(); 123 ASSERT(contextWrapper); 124 return contextWrapper; 125} 126 127JSDedicatedWorkerGlobalScope* toJSDedicatedWorkerGlobalScope(JSValue value) 128{ 129 if (!value.isObject()) 130 return 0; 131 const ClassInfo* classInfo = asObject(value)->classInfo(); 132 if (classInfo == JSDedicatedWorkerGlobalScope::info()) 133 return jsCast<JSDedicatedWorkerGlobalScope*>(asObject(value)); 134 if (classInfo == JSProxy::info()) 135 return jsDynamicCast<JSDedicatedWorkerGlobalScope*>(jsCast<JSProxy*>(asObject(value))->target()); 136 return 0; 137} 138 139#if ENABLE(SHARED_WORKERS) 140JSSharedWorkerGlobalScope* toJSSharedWorkerGlobalScope(JSValue value) 141{ 142 if (!value.isObject()) 143 return 0; 144 const ClassInfo* classInfo = asObject(value)->classInfo(); 145 if (classInfo == JSSharedWorkerGlobalScope::info()) 146 return jsCast<JSSharedWorkerGlobalScope*>(asObject(value)); 147 if (classInfo == JSProxy::info()) 148 return jsDynamicCast<JSSharedWorkerGlobalScope*>(jsCast<JSProxy*>(asObject(value))->target()); 149 return 0; 150} 151#endif 152 153JSWorkerGlobalScope* toJSWorkerGlobalScope(JSValue value) 154{ 155 JSWorkerGlobalScope* context = toJSDedicatedWorkerGlobalScope(value); 156#if ENABLE(SHARED_WORKERS) 157 if (!context) 158 context = toJSSharedWorkerGlobalScope(value); 159#endif 160 return context; 161} 162 163} // namespace WebCore 164