static void removeAllDOMObjectsInCurrentThreadHelper() { v8::HandleScope scope; // Deref all objects in the delayed queue. DOMData::getCurrent()->derefDelayedObjects(); // The DOM objects with the following types only exist on the main thread. if (WTF::isMainThread()) { // Remove all DOM nodes. DOMData::removeObjectsFromWrapperMap<Node>(getDOMNodeMap()); #if ENABLE(SVG) // Remove all SVG element instances in the wrapper map. DOMData::removeObjectsFromWrapperMap<SVGElementInstance>(getDOMSVGElementInstanceMap()); // Remove all SVG objects with context in the wrapper map. DOMData::removeObjectsFromWrapperMap<void>(getDOMSVGObjectWithContextMap()); #endif } // Remove all DOM objects in the wrapper map. DOMData::removeObjectsFromWrapperMap<void>(getDOMObjectMap()); // Remove all active DOM objects in the wrapper map. DOMData::removeObjectsFromWrapperMap<void>(getActiveDOMObjectMap()); }
static v8::Handle<v8::Value> port2AttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) { INC_STATS("DOM.MessageChannel.port2._get"); MessageChannel* imp = V8MessageChannel::toNative(info.Holder()); RefPtr<MessagePort> result = imp->port2(); v8::Handle<v8::Value> wrapper = result.get() ? getActiveDOMObjectMap().get(result.get()) : v8::Handle<v8::Value>(); if (wrapper.IsEmpty()) { wrapper = toV8(result.get()); if (!wrapper.IsEmpty()) V8DOMWrapper::setNamedHiddenReference(info.Holder(), "port2", wrapper); } return wrapper; }
v8::Handle<v8::Object> V8TestNamedConstructor::wrapSlow(PassRefPtr<TestNamedConstructor> impl) { v8::Handle<v8::Object> wrapper; V8Proxy* proxy = 0; wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl.get()); if (UNLIKELY(wrapper.IsEmpty())) return wrapper; v8::Persistent<v8::Object> wrapperHandle = v8::Persistent<v8::Object>::New(wrapper); if (!hasDependentLifetime) wrapperHandle.MarkIndependent(); getActiveDOMObjectMap().set(impl.leakRef(), wrapperHandle); return wrapper; }
// The caller must have increased obj's ref count. void V8DOMWrapper::setJSWrapperForActiveDOMObject(void* object, v8::Persistent<v8::Object> wrapper) { ASSERT(V8DOMWrapper::maybeDOMWrapper(wrapper)); #ifndef NDEBUG V8ClassIndex::V8WrapperType type = V8DOMWrapper::domWrapperType(wrapper); switch (type) { #define MAKE_CASE(TYPE, NAME) case V8ClassIndex::TYPE: break; ACTIVE_DOM_OBJECT_TYPES(MAKE_CASE) default: ASSERT_NOT_REACHED(); #undef MAKE_CASE } #endif getActiveDOMObjectMap().set(object, wrapper); }
v8::Handle<v8::Object> V8TestInterface::wrapSlow(TestInterface* impl) { v8::Handle<v8::Object> wrapper; V8Proxy* proxy = 0; wrapper = V8DOMWrapper::instantiateV8Object(proxy, &info, impl); if (wrapper.IsEmpty()) return wrapper; impl->ref(); v8::Persistent<v8::Object> wrapperHandle = v8::Persistent<v8::Object>::New(wrapper); if (!hasDependentLifetime) wrapperHandle.MarkIndependent(); getActiveDOMObjectMap().set(impl, wrapperHandle); return wrapper; }
// A JS object of type EventTarget is limited to a small number of possible classes. // Check EventTarget.h for new type conversion methods v8::Handle<v8::Value> V8DOMWrapper::convertEventTargetToV8Object(EventTarget* target) { if (!target) return v8::Null(); #if ENABLE(SVG) if (SVGElementInstance* instance = target->toSVGElementInstance()) return toV8(instance); #endif #if ENABLE(WORKERS) if (Worker* worker = target->toWorker()) return toV8(worker); if (DedicatedWorkerContext* workerContext = target->toDedicatedWorkerContext()) return toV8(workerContext); #endif // WORKERS #if ENABLE(SHARED_WORKERS) if (SharedWorker* sharedWorker = target->toSharedWorker()) return toV8(sharedWorker); if (SharedWorkerContext* sharedWorkerContext = target->toSharedWorkerContext()) return toV8(sharedWorkerContext); #endif // SHARED_WORKERS #if ENABLE(NOTIFICATIONS) if (Notification* notification = target->toNotification()) return toV8(notification); #endif #if ENABLE(INDEXED_DATABASE) if (IDBDatabase* idbDatabase = target->toIDBDatabase()) return toV8(idbDatabase); if (IDBRequest* idbRequest = target->toIDBRequest()) return toV8(idbRequest); if (IDBTransaction* idbTransaction = target->toIDBTransaction()) return toV8(idbTransaction); #endif #if ENABLE(WEB_SOCKETS) if (WebSocket* webSocket = target->toWebSocket()) return toV8(webSocket); #endif if (Node* node = target->toNode()) return toV8(node); if (DOMWindow* domWindow = target->toDOMWindow()) return toV8(domWindow); // XMLHttpRequest is created within its JS counterpart. if (XMLHttpRequest* xmlHttpRequest = target->toXMLHttpRequest()) { v8::Handle<v8::Object> wrapper = getActiveDOMObjectMap().get(xmlHttpRequest); ASSERT(!wrapper.IsEmpty()); return wrapper; } // MessagePort is created within its JS counterpart if (MessagePort* port = target->toMessagePort()) { v8::Handle<v8::Object> wrapper = getActiveDOMObjectMap().get(port); ASSERT(!wrapper.IsEmpty()); return wrapper; } if (XMLHttpRequestUpload* upload = target->toXMLHttpRequestUpload()) { v8::Handle<v8::Object> wrapper = getDOMObjectMap().get(upload); ASSERT(!wrapper.IsEmpty()); return wrapper; } #if ENABLE(OFFLINE_WEB_APPLICATIONS) if (DOMApplicationCache* domAppCache = target->toDOMApplicationCache()) return toV8(domAppCache); #endif #if ENABLE(EVENTSOURCE) if (EventSource* eventSource = target->toEventSource()) return toV8(eventSource); #endif #if ENABLE(BLOB) if (FileReader* fileReader = target->toFileReader()) return toV8(fileReader); #endif #if ENABLE(FILE_SYSTEM) if (FileWriter* fileWriter = target->toFileWriter()) return toV8(fileWriter); #endif #if ENABLE(WEB_AUDIO) if (JavaScriptAudioNode* jsAudioNode = target->toJavaScriptAudioNode()) return toV8(jsAudioNode); if (AudioContext* audioContext = target->toAudioContext()) return toV8(audioContext); #endif ASSERT(0); return notHandledByInterceptor(); }
// The caller must have increased obj's ref count. void V8DOMWrapper::setJSWrapperForActiveDOMObject(void* object, v8::Persistent<v8::Object> wrapper) { ASSERT(V8DOMWrapper::maybeDOMWrapper(wrapper)); ASSERT(domWrapperType(wrapper)->toActiveDOMObjectFunction); getActiveDOMObjectMap().set(object, wrapper); }