JSValuePtr toJS(ExecState* exec, HTMLCollection* collection) { if (!collection) return jsNull(); DOMObject* wrapper = getCachedDOMObjectWrapper(exec->globalData(), collection); if (wrapper) return wrapper; switch (collection->type()) { case HTMLCollection::SelectOptions: wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, HTMLOptionsCollection, collection); break; case HTMLCollection::DocAll: typedef HTMLCollection HTMLAllCollection; wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, HTMLAllCollection, collection); break; default: wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, HTMLCollection, collection); break; } return wrapper; }
void JSMessageChannel::markChildren(MarkStack& markStack) { Base::markChildren(markStack); if (MessagePort* port = m_impl->port1()) { DOMObject* wrapper = getCachedDOMObjectWrapper(*Heap::heap(this)->globalData(), port); if (wrapper) markStack.append(wrapper); } if (MessagePort* port = m_impl->port2()) { DOMObject* wrapper = getCachedDOMObjectWrapper(*Heap::heap(this)->globalData(), port); if (wrapper) markStack.append(wrapper); } }
JSValuePtr toJS(ExecState* exec, Document* document) { if (!document) return jsNull(); DOMObject* wrapper = getCachedDOMObjectWrapper(exec->globalData(), document); if (wrapper) return wrapper; if (document->isHTMLDocument()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, HTMLDocument, document); #if ENABLE(SVG) else if (document->isSVGDocument()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, SVGDocument, document); #endif else wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, Document, document); // Make sure the document is kept around by the window object, and works right with the // back/forward cache. if (!document->frame()) { size_t nodeCount = 0; for (Node* n = document; n; n = n->traverseNextNode()) nodeCount++; exec->heap()->reportExtraMemoryCost(nodeCount * sizeof(Node)); } return wrapper; }
JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, Event* event) { JSLock lock(SilenceAssertionsOnly); if (!event) return jsNull(); DOMObject* wrapper = getCachedDOMObjectWrapper(exec->globalData(), event); if (wrapper) return wrapper; if (event->isUIEvent()) { if (event->isKeyboardEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, KeyboardEvent, event); else if (event->isTextEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, TextEvent, event); else if (event->isMouseEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, MouseEvent, event); else if (event->isWheelEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, WheelEvent, event); #if ENABLE(SVG) else if (event->isSVGZoomEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGZoomEvent, event); #endif else wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, UIEvent, event); } else if (event->isMutationEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, MutationEvent, event); else if (event->isOverflowEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, OverflowEvent, event); else if (event->isMessageEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, MessageEvent, event); else if (event->isPageTransitionEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, PageTransitionEvent, event); else if (event->isProgressEvent()) { if (event->isXMLHttpRequestProgressEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, XMLHttpRequestProgressEvent, event); else wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, ProgressEvent, event); } #if ENABLE(DOM_STORAGE) else if (event->isStorageEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, StorageEvent, event); #endif else if (event->isWebKitAnimationEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, WebKitAnimationEvent, event); else if (event->isWebKitTransitionEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, WebKitTransitionEvent, event); #if ENABLE(WORKERS) else if (event->isErrorEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, ErrorEvent, event); #endif else wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, Event, event); return wrapper; }
JSValue JSDOMWindow::location(ExecState* exec) const { Location* location = impl()->location(); if (DOMObject* wrapper = getCachedDOMObjectWrapper(exec->globalData(), location)) return wrapper; JSLocation* jsLocation = new (exec) JSLocation(getDOMStructure<JSLocation>(exec, const_cast<JSDOMWindow*>(this)), location); cacheDOMObjectWrapper(exec->globalData(), location, jsLocation); return jsLocation; }
JSValue JSDOMWindow::history(ExecState* exec) const { History* history = impl()->history(); if (DOMObject* wrapper = getCachedDOMObjectWrapper(exec->globalData(), history)) return wrapper; JSHistory* jsHistory = new (exec) JSHistory(getDOMStructure<JSHistory>(exec, const_cast<JSDOMWindow*>(this)), history); cacheDOMObjectWrapper(exec->globalData(), history, jsHistory); return jsHistory; }
void JSNode::mark() { ASSERT(!marked()); Node* node = m_impl.get(); // Nodes in the document are kept alive by JSDocument::mark, // so we have no special responsibilities and can just call the base class here. if (node->inDocument()) { // But if the document isn't marked we have to mark it to ensure that // nodes reachable from this one are also marked if (Document* doc = node->ownerDocument()) if (DOMObject* docWrapper = getCachedDOMObjectWrapper(*Heap::heap(this)->globalData(), doc)) if (!docWrapper->marked()) docWrapper->mark(); DOMObject::mark(); return; } // This is a node outside the document, so find the root of the tree it is in, // and start marking from there. Node* root = node; for (Node* current = m_impl.get(); current; current = current->parentNode()) root = current; // If we're already marking this tree, then we can simply mark this wrapper // by calling the base class; our caller is iterating the tree. if (root->inSubtreeMark()) { DOMObject::mark(); return; } // Mark the whole tree; use the global set of roots to avoid reentering. root->setInSubtreeMark(true); for (Node* nodeToMark = root; nodeToMark; nodeToMark = nodeToMark->traverseNextNode()) { JSNode* wrapper = getCachedDOMNodeWrapper(m_impl->document(), nodeToMark); if (wrapper) { if (!wrapper->marked()) wrapper->mark(); } else if (nodeToMark == node) { // This is the case where the map from the document to wrappers has // been cleared out, but a wrapper is being marked. For now, we'll // let the rest of the tree of wrappers get collected, because we have // no good way of finding them. Later we should test behavior of other // browsers and see if we need to preserve other wrappers in this case. if (!marked()) mark(); } } root->setInSubtreeMark(false); // Double check that we actually ended up marked. This assert caught problems in the past. ASSERT(marked()); }
JSValue* toJS(ExecState* exec, EventTarget* target) { if (!target) return jsNull(); #if ENABLE(SVG) // SVGElementInstance supports both toSVGElementInstance and toNode since so much mouse handling code depends on toNode returning a valid node. if (SVGElementInstance* instance = target->toSVGElementInstance()) return toJS(exec, instance); #endif if (Node* node = target->toNode()) return toJS(exec, node); if (XMLHttpRequest* xhr = target->toXMLHttpRequest()) // XMLHttpRequest is always created via JS, so we don't need to use cacheDOMObject() here. return getCachedDOMObjectWrapper(exec->globalData(), xhr); if (XMLHttpRequestUpload* upload = target->toXMLHttpRequestUpload()) return toJS(exec, upload); #if ENABLE(OFFLINE_WEB_APPLICATIONS) if (DOMApplicationCache* cache = target->toDOMApplicationCache()) // DOMApplicationCache is always created via JS, so we don't need to use cacheDOMObject() here. return getCachedDOMObjectWrapper(exec->globalData(), cache); #endif if (MessagePort* messagePort = target->toMessagePort()) return toJS(exec, messagePort); #if ENABLE(WORKERS) if (Worker* worker = target->toWorker()) return toJS(exec, worker); if (WorkerContext* workerContext = target->toWorkerContext()) return toJSDOMGlobalObject(workerContext); #endif ASSERT_NOT_REACHED(); return jsNull(); }
JSValue* toJS(ExecState* exec, SVGPathSeg* object, SVGElement* context) { if (!object) return jsNull(); if (DOMObject* wrapper = getCachedDOMObjectWrapper(exec->globalData(), object)) return wrapper; switch (object->pathSegType()) { case SVGPathSeg::PATHSEG_CLOSEPATH: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegClosePath, object, context); case SVGPathSeg::PATHSEG_MOVETO_ABS: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegMovetoAbs, object, context); case SVGPathSeg::PATHSEG_MOVETO_REL: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegMovetoRel, object, context); case SVGPathSeg::PATHSEG_LINETO_ABS: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegLinetoAbs, object, context); case SVGPathSeg::PATHSEG_LINETO_REL: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegLinetoRel, object, context); case SVGPathSeg::PATHSEG_CURVETO_CUBIC_ABS: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegCurvetoCubicAbs, object, context); case SVGPathSeg::PATHSEG_CURVETO_CUBIC_REL: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegCurvetoCubicRel, object, context); case SVGPathSeg::PATHSEG_CURVETO_QUADRATIC_ABS: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegCurvetoQuadraticAbs, object, context); case SVGPathSeg::PATHSEG_CURVETO_QUADRATIC_REL: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegCurvetoQuadraticRel, object, context); case SVGPathSeg::PATHSEG_ARC_ABS: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegArcAbs, object, context); case SVGPathSeg::PATHSEG_ARC_REL: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegArcRel, object, context); case SVGPathSeg::PATHSEG_LINETO_HORIZONTAL_ABS: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegLinetoHorizontalAbs, object, context); case SVGPathSeg::PATHSEG_LINETO_HORIZONTAL_REL: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegLinetoHorizontalRel, object, context); case SVGPathSeg::PATHSEG_LINETO_VERTICAL_ABS: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegLinetoVerticalAbs, object, context); case SVGPathSeg::PATHSEG_LINETO_VERTICAL_REL: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegLinetoVerticalRel, object, context); case SVGPathSeg::PATHSEG_CURVETO_CUBIC_SMOOTH_ABS: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegCurvetoCubicSmoothAbs, object, context); case SVGPathSeg::PATHSEG_CURVETO_CUBIC_SMOOTH_REL: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegCurvetoCubicSmoothRel, object, context); case SVGPathSeg::PATHSEG_CURVETO_QUADRATIC_SMOOTH_ABS: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegCurvetoQuadraticSmoothAbs, object, context); case SVGPathSeg::PATHSEG_CURVETO_QUADRATIC_SMOOTH_REL: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSegCurvetoQuadraticSmoothRel, object, context); case SVGPathSeg::PATHSEG_UNKNOWN: default: return CREATE_SVG_OBJECT_WRAPPER(exec, SVGPathSeg, object, context); } }
JSValue JSDocument::location(ExecState* exec) const { Frame* frame = static_cast<Document*>(impl())->frame(); if (!frame) return jsNull(); Location* location = frame->domWindow()->location(); if (DOMObject* wrapper = getCachedDOMObjectWrapper(exec, location)) return wrapper; JSLocation* jsLocation = new (exec) JSLocation(getDOMStructure<JSLocation>(exec, globalObject()), globalObject(), location); cacheDOMObjectWrapper(exec, location, jsLocation); return jsLocation; }
JSValue* toJS(ExecState* exec, ImageData* imageData) { if (!imageData) return jsNull(); DOMObject* wrapper = getCachedDOMObjectWrapper(exec->globalData(), imageData); if (wrapper) return wrapper; wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, ImageData, imageData); exec->heap()->reportExtraMemoryCost(imageData->data()->length()); return wrapper; }
JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, StyleSheet* styleSheet) { if (!styleSheet) return jsNull(); DOMObject* wrapper = getCachedDOMObjectWrapper(exec, styleSheet); if (wrapper) return wrapper; if (styleSheet->isCSSStyleSheet()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, CSSStyleSheet, styleSheet); else wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, StyleSheet, styleSheet); return wrapper; }
void XMLHttpRequest::dropProtection() { #if USE(JSC) // The XHR object itself holds on to the responseText, and // thus has extra cost even independent of any // responseText or responseXML objects it has handed // out. But it is protected from GC while loading, so this // can't be recouped until the load is done, so only // report the extra cost at that point. if (JSDOMGlobalObject* globalObject = toJSDOMGlobalObject(scriptExecutionContext())) if (DOMObject* wrapper = getCachedDOMObjectWrapper(*globalObject->globalData(), this)) JSC::Heap::heap(wrapper)->reportExtraMemoryCost(m_responseText.size() * 2); #endif unsetPendingActivity(this); }
JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, ImageData* imageData) { if (!imageData) return jsNull(); DOMObject* wrapper = getCachedDOMObjectWrapper(exec, imageData); if (wrapper) return wrapper; wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, ImageData, imageData); Identifier dataName(exec, "data"); DEFINE_STATIC_LOCAL(RefPtr<Structure>, cpaStructure, (JSByteArray::createStructure(jsNull()))); static const ClassInfo cpaClassInfo = { "CanvasPixelArray", 0, 0, 0 }; wrapper->putDirect(dataName, new (exec) JSByteArray(exec, cpaStructure, imageData->data()->data(), &cpaClassInfo), DontDelete | ReadOnly); exec->heap()->reportExtraMemoryCost(imageData->data()->length()); return wrapper; }
JSValuePtr toJS(ExecState* exec, CSSRule* rule) { if (!rule) return jsNull(); DOMObject* wrapper = getCachedDOMObjectWrapper(exec->globalData(), rule); if (wrapper) return wrapper; switch (rule->type()) { case CSSRule::STYLE_RULE: wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, CSSStyleRule, rule); break; case CSSRule::MEDIA_RULE: wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, CSSMediaRule, rule); break; case CSSRule::FONT_FACE_RULE: wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, CSSFontFaceRule, rule); break; case CSSRule::PAGE_RULE: wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, CSSPageRule, rule); break; case CSSRule::IMPORT_RULE: wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, CSSImportRule, rule); break; case CSSRule::CHARSET_RULE: wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, CSSCharsetRule, rule); break; case CSSRule::VARIABLES_RULE: wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, CSSVariablesRule, rule); break; case CSSRule::WEBKIT_KEYFRAME_RULE: wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, WebKitCSSKeyframeRule, rule); break; case CSSRule::WEBKIT_KEYFRAMES_RULE: wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, WebKitCSSKeyframesRule, rule); break; default: wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, CSSRule, rule); } return wrapper; }
JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, HTMLCollection* collection) { if (!collection) return jsNull(); DOMObject* wrapper = getCachedDOMObjectWrapper(exec, collection); if (wrapper) return wrapper; switch (collection->type()) { case SelectOptions: wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, HTMLOptionsCollection, collection); break; case DocAll: wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, HTMLAllCollection, collection); break; default: wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, HTMLCollection, collection); break; } return wrapper; }
void JSXMLHttpRequestUpload::mark() { Base::mark(); if (XMLHttpRequest* xmlHttpRequest = m_impl->associatedXMLHttpRequest()) { DOMObject* wrapper = getCachedDOMObjectWrapper(*Heap::heap(this)->globalData(), xmlHttpRequest); if (wrapper && !wrapper->marked()) wrapper->mark(); } markIfNotNull(m_impl->onabort()); markIfNotNull(m_impl->onerror()); markIfNotNull(m_impl->onload()); markIfNotNull(m_impl->onloadstart()); markIfNotNull(m_impl->onprogress()); typedef XMLHttpRequestUpload::EventListenersMap EventListenersMap; typedef XMLHttpRequestUpload::ListenerVector ListenerVector; EventListenersMap& eventListeners = m_impl->eventListeners(); for (EventListenersMap::iterator mapIter = eventListeners.begin(); mapIter != eventListeners.end(); ++mapIter) { for (ListenerVector::iterator vecIter = mapIter->second.begin(); vecIter != mapIter->second.end(); ++vecIter) (*vecIter)->markJSFunction(); } }
JSValue toJS(ExecState* exec, JSDOMGlobalObject* globalObject, Event* event) { JSLock lock(SilenceAssertionsOnly); if (!event) return jsNull(); DOMObject* wrapper = getCachedDOMObjectWrapper(exec, event); if (wrapper) return wrapper; if (event->isUIEvent()) { if (event->isKeyboardEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, KeyboardEvent, event); else if (event->isTextEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, TextEvent, event); else if (event->isMouseEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, MouseEvent, event); else if (event->isWheelEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, WheelEvent, event); #if ENABLE(SVG) else if (event->isSVGZoomEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SVGZoomEvent, event); #endif else if (event->isCompositionEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, CompositionEvent, event); #if ENABLE(TOUCH_EVENTS) else if (event->isTouchEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, TouchEvent, event); #endif else wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, UIEvent, event); } else if (event->isMutationEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, MutationEvent, event); else if (event->isOverflowEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, OverflowEvent, event); else if (event->isMessageEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, MessageEvent, event); else if (event->isPageTransitionEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, PageTransitionEvent, event); else if (event->isProgressEvent()) { if (event->isXMLHttpRequestProgressEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, XMLHttpRequestProgressEvent, event); else wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, ProgressEvent, event); } else if (event->isBeforeLoadEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, BeforeLoadEvent, event); #if ENABLE(DOM_STORAGE) else if (event->isStorageEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, StorageEvent, event); #endif #if ENABLE(INDEXED_DATABASE) else if (event->isIDBVersionChangeEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, IDBVersionChangeEvent, event); #endif else if (event->isWebKitAnimationEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, WebKitAnimationEvent, event); else if (event->isWebKitTransitionEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, WebKitTransitionEvent, event); #if ENABLE(WORKERS) else if (event->isErrorEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, ErrorEvent, event); #endif else if (event->isHashChangeEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, HashChangeEvent, event); else if (event->isPopStateEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, PopStateEvent, event); else if (event->isCustomEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, CustomEvent, event); #if ENABLE(DEVICE_ORIENTATION) else if (event->isDeviceMotionEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, DeviceMotionEvent, event); else if (event->isDeviceOrientationEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, DeviceOrientationEvent, event); #endif #if ENABLE(WEB_AUDIO) else if (event->isAudioProcessingEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, AudioProcessingEvent, event); #endif #if ENABLE(INPUT_SPEECH) else if (event->isSpeechInputEvent()) wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, SpeechInputEvent, event); #endif else wrapper = CREATE_DOM_OBJECT_WRAPPER(exec, globalObject, Event, event); return wrapper; }