diff options
Diffstat (limited to 'WebCore/bindings/v8/custom/V8WorkerCustom.cpp')
-rwxr-xr-x | WebCore/bindings/v8/custom/V8WorkerCustom.cpp | 114 |
1 files changed, 20 insertions, 94 deletions
diff --git a/WebCore/bindings/v8/custom/V8WorkerCustom.cpp b/WebCore/bindings/v8/custom/V8WorkerCustom.cpp index 3edaa8e..32450b8 100755 --- a/WebCore/bindings/v8/custom/V8WorkerCustom.cpp +++ b/WebCore/bindings/v8/custom/V8WorkerCustom.cpp @@ -50,23 +50,17 @@ CALLBACK_FUNC_DECL(WorkerConstructor) { INC_STATS(L"DOM.Worker.Constructor"); - if (!WorkerContextExecutionProxy::isWebWorkersEnabled()) { - return throwError("Worker is not enabled.", V8Proxy::SYNTAX_ERROR); - } - - if (!args.IsConstructCall()) { + if (!args.IsConstructCall()) return throwError("DOM object constructor cannot be called as a function."); - } - if (args.Length() == 0) { - return throwError("Not enough arguments", V8Proxy::SYNTAX_ERROR); - } + if (!args.Length()) + return throwError("Not enough arguments", V8Proxy::SyntaxError); v8::TryCatch tryCatch; v8::Handle<v8::String> scriptUrl = args[0]->ToString(); - if (tryCatch.HasCaught()) { + if (tryCatch.HasCaught()) return throwError(tryCatch.Exception()); - } + if (scriptUrl.IsEmpty()) return v8::Undefined(); @@ -76,38 +70,42 @@ CALLBACK_FUNC_DECL(WorkerConstructor) if (proxy) context = proxy->workerContext(); else { - Frame* frame = V8Proxy::retrieveFrame(); + Frame* frame = V8Proxy::retrieveFrameForCurrentContext(); if (!frame) return v8::Undefined(); context = frame->document(); } // Create the worker object. - // Note: it's OK to let this RefPtr go out of scope because we also call SetDOMWrapper(), which effectively holds a reference to obj. + // Note: it's OK to let this RefPtr go out of scope because we also call setDOMWrapper(), which effectively holds a reference to obj. ExceptionCode ec = 0; RefPtr<Worker> obj = Worker::create(toWebCoreString(scriptUrl), context, ec); + if (ec) + return throwError(ec); // Setup the standard wrapper object internal fields. v8::Handle<v8::Object> wrapperObject = args.Holder(); - V8Proxy::SetDOMWrapper(wrapperObject, V8ClassIndex::WORKER, obj.get()); + V8DOMWrapper::setDOMWrapper(wrapperObject, V8ClassIndex::WORKER, obj.get()); obj->ref(); - V8Proxy::SetJSWrapperForActiveDOMObject(obj.get(), v8::Persistent<v8::Object>::New(wrapperObject)); + V8DOMWrapper::setJSWrapperForActiveDOMObject(obj.get(), v8::Persistent<v8::Object>::New(wrapperObject)); return wrapperObject; } -PassRefPtr<EventListener> getEventListener(Worker* worker, v8::Local<v8::Value> value, bool findOnly) +PassRefPtr<EventListener> getEventListener(Worker* worker, v8::Local<v8::Value> value, bool isAttribute, bool findOnly) { if (worker->scriptExecutionContext()->isWorkerContext()) { WorkerContextExecutionProxy* workerContextProxy = WorkerContextExecutionProxy::retrieve(); ASSERT(workerContextProxy); - return workerContextProxy->findOrCreateObjectEventListener(value, false, findOnly); + return workerContextProxy->findOrCreateObjectEventListener(value, isAttribute, findOnly); } V8Proxy* proxy = V8Proxy::retrieve(worker->scriptExecutionContext()); - if (proxy) - return findOnly ? proxy->FindObjectEventListener(value, false) : proxy->FindOrCreateObjectEventListener(value, false); + if (proxy) { + V8EventListenerList* list = proxy->objectListeners(); + return findOnly ? list->findWrapper(value, isAttribute) : list->findOrCreateWrapper<V8ObjectEventListener>(proxy->frame(), value, isAttribute); + } return 0; } @@ -115,7 +113,7 @@ PassRefPtr<EventListener> getEventListener(Worker* worker, v8::Local<v8::Value> ACCESSOR_GETTER(WorkerOnmessage) { INC_STATS(L"DOM.Worker.onmessage._get"); - Worker* worker = V8Proxy::ToNativeObject<Worker>(V8ClassIndex::WORKER, info.Holder()); + Worker* worker = V8DOMWrapper::convertToNativeObject<Worker>(V8ClassIndex::WORKER, info.Holder()); if (worker->onmessage()) { V8ObjectEventListener* listener = static_cast<V8ObjectEventListener*>(worker->onmessage()); v8::Local<v8::Object> v8Listener = listener->getListenerObject(); @@ -127,7 +125,7 @@ ACCESSOR_GETTER(WorkerOnmessage) ACCESSOR_SETTER(WorkerOnmessage) { INC_STATS(L"DOM.Worker.onmessage._set"); - Worker* worker = V8Proxy::ToNativeObject<Worker>(V8ClassIndex::WORKER, info.Holder()); + Worker* worker = V8DOMWrapper::convertToNativeObject<Worker>(V8ClassIndex::WORKER, info.Holder()); V8ObjectEventListener* oldListener = static_cast<V8ObjectEventListener*>(worker->onmessage()); if (value->IsNull()) { if (oldListener) { @@ -138,7 +136,7 @@ ACCESSOR_SETTER(WorkerOnmessage) // Clear the listener. worker->setOnmessage(0); } else { - RefPtr<EventListener> listener = getEventListener(worker, value, false); + RefPtr<EventListener> listener = getEventListener(worker, value, true, false); if (listener) { if (oldListener) { v8::Local<v8::Object> oldV8Listener = oldListener->getListenerObject(); @@ -151,78 +149,6 @@ ACCESSOR_SETTER(WorkerOnmessage) } } -ACCESSOR_GETTER(WorkerOnerror) -{ - INC_STATS(L"DOM.Worker.onerror._get"); - Worker* worker = V8Proxy::ToNativeObject<Worker>(V8ClassIndex::WORKER, info.Holder()); - if (worker->onerror()) { - V8ObjectEventListener* listener = static_cast<V8ObjectEventListener*>(worker->onerror()); - v8::Local<v8::Object> v8Listener = listener->getListenerObject(); - return v8Listener; - } - return v8::Undefined(); -} - -ACCESSOR_SETTER(WorkerOnerror) -{ - INC_STATS(L"DOM.Worker.onerror._set"); - Worker* worker = V8Proxy::ToNativeObject<Worker>(V8ClassIndex::WORKER, info.Holder()); - V8ObjectEventListener* oldListener = static_cast<V8ObjectEventListener*>(worker->onerror()); - if (value->IsNull()) { - if (oldListener) { - v8::Local<v8::Object> oldV8Listener = oldListener->getListenerObject(); - removeHiddenDependency(info.Holder(), oldV8Listener, V8Custom::kWorkerRequestCacheIndex); - } - - // Clear the listener. - worker->setOnerror(0); - } else { - RefPtr<EventListener> listener = getEventListener(worker, value, false); - if (listener) { - if (oldListener) { - v8::Local<v8::Object> oldV8Listener = oldListener->getListenerObject(); - removeHiddenDependency(info.Holder(), oldV8Listener, V8Custom::kWorkerRequestCacheIndex); - } - - worker->setOnerror(listener); - createHiddenDependency(info.Holder(), value, V8Custom::kWorkerRequestCacheIndex); - } - } -} - -CALLBACK_FUNC_DECL(WorkerAddEventListener) -{ - INC_STATS(L"DOM.Worker.addEventListener()"); - Worker* worker = V8Proxy::ToNativeObject<Worker>(V8ClassIndex::WORKER, args.Holder()); - - RefPtr<EventListener> listener = getEventListener(worker, args[1], false); - if (listener) { - String type = toWebCoreString(args[0]); - bool useCapture = args[2]->BooleanValue(); - worker->addEventListener(type, listener, useCapture); - - createHiddenDependency(args.Holder(), args[1], V8Custom::kWorkerRequestCacheIndex); - } - return v8::Undefined(); -} - -CALLBACK_FUNC_DECL(WorkerRemoveEventListener) -{ - INC_STATS(L"DOM.Worker.removeEventListener()"); - Worker* worker = V8Proxy::ToNativeObject<Worker>(V8ClassIndex::WORKER, args.Holder()); - - RefPtr<EventListener> listener = getEventListener(worker, args[1], true); - if (listener) { - String type = toWebCoreString(args[0]); - bool useCapture = args[2]->BooleanValue(); - worker->removeEventListener(type, listener.get(), useCapture); - - removeHiddenDependency(args.Holder(), args[1], V8Custom::kWorkerRequestCacheIndex); - } - - return v8::Undefined(); -} - } // namespace WebCore #endif // ENABLE(WORKERS) |