1 /* 2 * Copyright (C) 2009 Google Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions are 6 * met: 7 * 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following disclaimer 12 * in the documentation and/or other materials provided with the 13 * distribution. 14 * * Neither the name of Google Inc. nor the names of its 15 * contributors may be used to endorse or promote products derived from 16 * this software without specific prior written permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29 */ 30 31 #include "config.h" 32 #include "V8WorkerGlobalScope.h" 33 34 #include "bindings/v8/ExceptionState.h" 35 #include "bindings/v8/ScheduledAction.h" 36 #include "bindings/v8/V8Binding.h" 37 #include "bindings/v8/V8Utilities.h" 38 #include "bindings/v8/V8WorkerGlobalScopeEventListener.h" 39 #include "bindings/v8/WorkerScriptController.h" 40 #include "core/inspector/ScriptCallStack.h" 41 #include "core/page/ContentSecurityPolicy.h" 42 #include "core/page/DOMTimer.h" 43 #include "core/page/DOMWindowTimers.h" 44 #include "core/workers/WorkerGlobalScope.h" 45 #include "modules/websockets/WebSocket.h" 46 #include "wtf/OwnArrayPtr.h" 47 48 namespace WebCore { 49 50 void SetTimeoutOrInterval(const v8::FunctionCallbackInfo<v8::Value>& args, bool singleShot) 51 { 52 WorkerGlobalScope* workerGlobalScope = V8WorkerGlobalScope::toNative(args.Holder()); 53 54 int argumentCount = args.Length(); 55 if (argumentCount < 1) 56 return; 57 58 v8::Handle<v8::Value> function = args[0]; 59 60 WorkerScriptController* script = workerGlobalScope->script(); 61 if (!script) 62 return; 63 64 OwnPtr<ScheduledAction> action; 65 v8::Handle<v8::Context> v8Context = script->context(); 66 if (function->IsString()) { 67 if (ContentSecurityPolicy* policy = workerGlobalScope->contentSecurityPolicy()) { 68 if (!policy->allowEval()) { 69 v8SetReturnValue(args, 0); 70 return; 71 } 72 } 73 action = adoptPtr(new ScheduledAction(v8Context, toWebCoreString(function), workerGlobalScope->url(), args.GetIsolate())); 74 } else if (function->IsFunction()) { 75 size_t paramCount = argumentCount >= 2 ? argumentCount - 2 : 0; 76 OwnArrayPtr<v8::Local<v8::Value> > params; 77 if (paramCount > 0) { 78 params = adoptArrayPtr(new v8::Local<v8::Value>[paramCount]); 79 for (size_t i = 0; i < paramCount; ++i) 80 params[i] = args[i+2]; 81 } 82 // ScheduledAction takes ownership of actual params and releases them in its destructor. 83 action = adoptPtr(new ScheduledAction(v8Context, v8::Handle<v8::Function>::Cast(function), paramCount, params.get(), args.GetIsolate())); 84 } else 85 return; 86 87 int32_t timeout = argumentCount >= 2 ? args[1]->Int32Value() : 0; 88 int timerId; 89 if (singleShot) 90 timerId = DOMWindowTimers::setTimeout(workerGlobalScope, action.release(), timeout); 91 else 92 timerId = DOMWindowTimers::setInterval(workerGlobalScope, action.release(), timeout); 93 94 v8SetReturnValue(args, timerId); 95 } 96 97 void V8WorkerGlobalScope::importScriptsMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& args) 98 { 99 if (!args.Length()) 100 return; 101 102 Vector<String> urls; 103 for (int i = 0; i < args.Length(); i++) { 104 V8TRYCATCH_VOID(v8::Handle<v8::String>, scriptUrl, args[i]->ToString()); 105 if (scriptUrl.IsEmpty()) 106 return; 107 urls.append(toWebCoreString(scriptUrl)); 108 } 109 110 WorkerGlobalScope* workerGlobalScope = V8WorkerGlobalScope::toNative(args.Holder()); 111 112 ExceptionState es(args.GetIsolate()); 113 workerGlobalScope->importScripts(urls, es); 114 es.throwIfNeeded(); 115 } 116 117 void V8WorkerGlobalScope::setTimeoutMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& args) 118 { 119 return SetTimeoutOrInterval(args, true); 120 } 121 122 void V8WorkerGlobalScope::setIntervalMethodCustom(const v8::FunctionCallbackInfo<v8::Value>& args) 123 { 124 return SetTimeoutOrInterval(args, false); 125 } 126 127 v8::Handle<v8::Value> toV8(WorkerGlobalScope* impl, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate) 128 { 129 // Notice that we explicitly ignore creationContext because the WorkerGlobalScope is its own creationContext. 130 131 if (!impl) 132 return v8NullWithCheck(isolate); 133 134 WorkerScriptController* script = impl->script(); 135 if (!script) 136 return v8NullWithCheck(isolate); 137 138 v8::Handle<v8::Object> global = script->context()->Global(); 139 ASSERT(!global.IsEmpty()); 140 return global; 141 } 142 143 v8::Handle<v8::Value> toV8ForMainWorld(WorkerGlobalScope* impl, v8::Handle<v8::Object> creationContext, v8::Isolate* isolate) 144 { 145 return toV8(impl, creationContext, isolate); 146 } 147 148 } // namespace WebCore 149