diff options
Diffstat (limited to 'WebCore/bindings/v8/custom/V8WorkerContextCustom.cpp')
-rwxr-xr-x | WebCore/bindings/v8/custom/V8WorkerContextCustom.cpp | 71 |
1 files changed, 46 insertions, 25 deletions
diff --git a/WebCore/bindings/v8/custom/V8WorkerContextCustom.cpp b/WebCore/bindings/v8/custom/V8WorkerContextCustom.cpp index a67cb10..b526040 100755 --- a/WebCore/bindings/v8/custom/V8WorkerContextCustom.cpp +++ b/WebCore/bindings/v8/custom/V8WorkerContextCustom.cpp @@ -32,11 +32,8 @@ #if ENABLE(WORKERS) -#include "WorkerContextExecutionProxy.h" - -#include "ExceptionCode.h" #include "DOMTimer.h" -#include "NotImplemented.h" +#include "ExceptionCode.h" #include "ScheduledAction.h" #include "V8Binding.h" #include "V8CustomBinding.h" @@ -44,50 +41,51 @@ #include "V8Utilities.h" #include "V8WorkerContextEventListener.h" #include "WorkerContext.h" +#include "WorkerContextExecutionProxy.h" namespace WebCore { ACCESSOR_GETTER(WorkerContextSelf) { INC_STATS(L"DOM.WorkerContext.self._get"); - WorkerContext* workerContext = V8Proxy::ToNativeObject<WorkerContext>(V8ClassIndex::WORKERCONTEXT, info.Holder()); - return WorkerContextExecutionProxy::WorkerContextToV8Object(workerContext); + WorkerContext* workerContext = V8DOMWrapper::convertDOMWrapperToNative<WorkerContext>(info.Holder()); + return WorkerContextExecutionProxy::convertWorkerContextToV8Object(workerContext); } -ACCESSOR_GETTER(WorkerContextOnmessage) +ACCESSOR_GETTER(WorkerContextOnerror) { - INC_STATS(L"DOM.WorkerContext.onmessage._get"); - WorkerContext* workerContext = V8Proxy::ToNativeObject<WorkerContext>(V8ClassIndex::WORKERCONTEXT, info.Holder()); - if (workerContext->onmessage()) { - V8WorkerContextEventListener* listener = static_cast<V8WorkerContextEventListener*>(workerContext->onmessage()); + INC_STATS(L"DOM.WorkerContext.onerror._get"); + WorkerContext* workerContext = V8DOMWrapper::convertToNativeObject<WorkerContext>(V8ClassIndex::WORKERCONTEXT, info.Holder()); + if (workerContext->onerror()) { + V8WorkerContextEventListener* listener = static_cast<V8WorkerContextEventListener*>(workerContext->onerror()); v8::Local<v8::Object> v8Listener = listener->getListenerObject(); return v8Listener; } return v8::Undefined(); } -ACCESSOR_SETTER(WorkerContextOnmessage) +ACCESSOR_SETTER(WorkerContextOnerror) { - INC_STATS(L"DOM.WorkerContext.onmessage._set"); - WorkerContext* workerContext = V8Proxy::ToNativeObject<WorkerContext>(V8ClassIndex::WORKERCONTEXT, info.Holder()); - V8WorkerContextEventListener* oldListener = static_cast<V8WorkerContextEventListener*>(workerContext->onmessage()); + INC_STATS(L"DOM.WorkerContext.onerror._set"); + WorkerContext* workerContext = V8DOMWrapper::convertToNativeObject<WorkerContext>(V8ClassIndex::WORKERCONTEXT, info.Holder()); + V8WorkerContextEventListener* oldListener = static_cast<V8WorkerContextEventListener*>(workerContext->onerror()); if (value->IsNull()) { - if (workerContext->onmessage()) { + if (workerContext->onerror()) { v8::Local<v8::Object> oldV8Listener = oldListener->getListenerObject(); removeHiddenDependency(info.Holder(), oldV8Listener, V8Custom::kWorkerContextRequestCacheIndex); } // Clear the listener. - workerContext->setOnmessage(0); + workerContext->setOnerror(0); } else { - RefPtr<V8EventListener> listener = workerContext->script()->proxy()->findOrCreateEventListener(v8::Local<v8::Object>::Cast(value), false, false); + RefPtr<V8EventListener> listener = workerContext->script()->proxy()->findOrCreateEventListener(v8::Local<v8::Object>::Cast(value), true, false); if (listener) { if (oldListener) { v8::Local<v8::Object> oldV8Listener = oldListener->getListenerObject(); removeHiddenDependency(info.Holder(), oldV8Listener, V8Custom::kWorkerContextRequestCacheIndex); } - workerContext->setOnmessage(listener); + workerContext->setOnerror(listener); createHiddenDependency(info.Holder(), value, V8Custom::kWorkerContextRequestCacheIndex); } } @@ -95,7 +93,7 @@ ACCESSOR_SETTER(WorkerContextOnmessage) v8::Handle<v8::Value> SetTimeoutOrInterval(const v8::Arguments& args, bool singleShot) { - WorkerContext* workerContext = V8Proxy::ToNativeObject<WorkerContext>(V8ClassIndex::WORKERCONTEXT, args.Holder()); + WorkerContext* workerContext = V8DOMWrapper::convertDOMWrapperToNative<WorkerContext>(args.Holder()); int argumentCount = args.Length(); if (argumentCount < 1) @@ -106,7 +104,7 @@ v8::Handle<v8::Value> SetTimeoutOrInterval(const v8::Arguments& args, bool singl int timerId; if (function->IsString()) { - WebCore::String stringFunction = ToWebCoreString(function); + WebCore::String stringFunction = toWebCoreString(function); timerId = DOMTimer::install(workerContext, new ScheduledAction(stringFunction, workerContext->url()), timeout, singleShot); } else if (function->IsFunction()) { size_t paramCount = argumentCount >= 2 ? argumentCount - 2 : 0; @@ -129,7 +127,29 @@ v8::Handle<v8::Value> SetTimeoutOrInterval(const v8::Arguments& args, bool singl CALLBACK_FUNC_DECL(WorkerContextImportScripts) { INC_STATS(L"DOM.WorkerContext.importScripts()"); - notImplemented(); + if (!args.Length()) + return v8::Undefined(); + + String callerURL = V8Proxy::sourceName(); + int callerLine = V8Proxy::sourceLineNumber() + 1; + + Vector<String> urls; + for (int i = 0; i < args.Length(); i++) { + v8::TryCatch tryCatch; + v8::Handle<v8::String> scriptUrl = args[i]->ToString(); + if (tryCatch.HasCaught() || scriptUrl.IsEmpty()) + return v8::Undefined(); + urls.append(toWebCoreString(scriptUrl)); + } + + WorkerContext* workerContext = V8DOMWrapper::convertDOMWrapperToNative<WorkerContext>(args.Holder()); + + ExceptionCode ec = 0; + workerContext->importScripts(urls, callerURL, callerLine, ec); + + if (ec) + return throwError(ec); + return v8::Undefined(); } @@ -139,7 +159,8 @@ CALLBACK_FUNC_DECL(WorkerContextSetTimeout) return SetTimeoutOrInterval(args, true); } -CALLBACK_FUNC_DECL(WorkerContextSetInterval) { +CALLBACK_FUNC_DECL(WorkerContextSetInterval) +{ INC_STATS(L"DOM.WorkerContext.setInterval()"); return SetTimeoutOrInterval(args, false); } @@ -147,7 +168,7 @@ CALLBACK_FUNC_DECL(WorkerContextSetInterval) { CALLBACK_FUNC_DECL(WorkerContextAddEventListener) { INC_STATS(L"DOM.WorkerContext.addEventListener()"); - WorkerContext* workerContext = V8Proxy::ToNativeObject<WorkerContext>(V8ClassIndex::WORKERCONTEXT, args.Holder()); + WorkerContext* workerContext = V8DOMWrapper::convertDOMWrapperToNative<WorkerContext>(args.Holder()); RefPtr<V8EventListener> listener = workerContext->script()->proxy()->findOrCreateEventListener(v8::Local<v8::Object>::Cast(args[1]), false, false); @@ -164,7 +185,7 @@ CALLBACK_FUNC_DECL(WorkerContextAddEventListener) CALLBACK_FUNC_DECL(WorkerContextRemoveEventListener) { INC_STATS(L"DOM.WorkerContext.removeEventListener()"); - WorkerContext* workerContext = V8Proxy::ToNativeObject<WorkerContext>(V8ClassIndex::WORKERCONTEXT, args.Holder()); + WorkerContext* workerContext = V8DOMWrapper::convertDOMWrapperToNative<WorkerContext>(args.Holder()); WorkerContextExecutionProxy* proxy = workerContext->script()->proxy(); RefPtr<V8EventListener> listener = proxy->findOrCreateEventListener(v8::Local<v8::Object>::Cast(args[1]), false, true); |