bool JSTestEventTarget::getOwnPropertySlotByIndex(JSObject* object, ExecState* state, unsigned index, PropertySlot& slot) { auto* thisObject = jsCast<JSTestEventTarget*>(object); ASSERT_GC_OBJECT_INHERITS(thisObject, info()); if (LIKELY(index <= MAX_ARRAY_INDEX)) { if (index < thisObject->wrapped().length()) { auto value = toJS<IDLInterface<Node>>(*state, *thisObject->globalObject(), thisObject->wrapped().item(index)); slot.setValue(thisObject, static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly), value); return true; } return JSObject::getOwnPropertySlotByIndex(object, state, index, slot); } auto propertyName = Identifier::from(state, index); using GetterIDLType = IDLInterface<Node>; auto getterFunctor = [] (auto& thisObject, auto propertyName) -> Optional<typename GetterIDLType::ImplementationType> { auto result = thisObject.wrapped().namedItem(propertyNameToAtomicString(propertyName)); if (!GetterIDLType::isNullValue(result)) return typename GetterIDLType::ImplementationType { GetterIDLType::extractValueFromNullable(result) }; return WTF::nullopt; }; if (auto namedProperty = accessVisibleNamedProperty<OverrideBuiltins::No>(*state, *thisObject, propertyName, getterFunctor)) { auto value = toJS<IDLInterface<Node>>(*state, *thisObject->globalObject(), WTFMove(namedProperty.value())); slot.setValue(thisObject, static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly), value); return true; } return JSObject::getOwnPropertySlotByIndex(object, state, index, slot); }
bool JSUserMessageHandlersNamespace::getOwnPropertySlotDelegate(ExecState* exec, PropertyName propertyName, PropertySlot& slot) { if (UserMessageHandler* handler = wrapped().handler(propertyNameToAtomicString(propertyName), globalObject()->world())) { slot.setValue(this, ReadOnly | DontDelete | DontEnum, toJS(exec, globalObject(), *handler)); return true; } return false; }
bool JSNodeList::getOwnPropertySlotDelegate(ExecState* exec, PropertyName propertyName, PropertySlot& slot) { if (Node* item = impl().namedItem(propertyNameToAtomicString(propertyName))) { slot.setValue(this, ReadOnly | DontDelete | DontEnum, toJS(exec, globalObject(), item)); return true; } return false; }
bool JSNamedNodeMap::nameGetter(ExecState* exec, PropertyName propertyName, JSValue& value) { auto item = wrapped().getNamedItem(propertyNameToAtomicString(propertyName)); if (!item) return false; value = toJS(exec, globalObject(), item); return true; }
bool JSHTMLOptionsCollection::nameGetter(ExecState* exec, PropertyName propertyName, JSValue& value) { auto item = wrapped().namedItem(propertyNameToAtomicString(propertyName)); if (!item) return false; value = toJS(exec, globalObject(), *item); return true; }
bool JSDOMStringMap::deleteProperty(JSCell* cell, ExecState* exec, PropertyName propertyName) { JSDOMStringMap* thisObject = jsCast<JSDOMStringMap*>(cell); AtomicString stringName = propertyNameToAtomicString(propertyName); if (!thisObject->m_impl->contains(stringName)) return false; ExceptionCode ec = 0; thisObject->m_impl->deleteItem(stringName, ec); setDOMException(exec, ec); return !ec; }
JSValue JSHTMLCollection::nameGetter(ExecState* exec, JSValue slotBase, PropertyName propertyName) { JSHTMLCollection* collection = jsCast<JSHTMLCollection*>(asObject(slotBase)); const AtomicString& name = propertyNameToAtomicString(propertyName); HTMLCollection* impl = collection->impl(); #if ENABLE(MICRODATA) if (impl->type() == ItemProperties) return toJS(exec, collection->globalObject(), static_cast<HTMLPropertiesCollection*>(impl)->propertyNodeList(name)); #endif return toJS(exec, collection->globalObject(), impl->namedItem(name)); }
static JSValue namedItems(ExecState& state, JSHTMLAllCollection* collection, PropertyName propertyName) { Vector<Ref<Element>> namedItems = collection->impl().namedItems(propertyNameToAtomicString(propertyName)); if (namedItems.isEmpty()) return jsUndefined(); if (namedItems.size() == 1) return toJS(&state, collection->globalObject(), namedItems[0].ptr()); // FIXME: HTML5 specification says this should be a HTMLCollection. // http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#htmlallcollection return toJS(&state, collection->globalObject(), StaticElementList::adopt(namedItems).get()); }
static JSValue namedItems(ExecState* exec, JSHTMLFormControlsCollection* collection, PropertyName propertyName) { const AtomicString& name = propertyNameToAtomicString(propertyName); Vector<Ref<Element>> namedItems = collection->impl().namedItems(name); if (namedItems.isEmpty()) return jsUndefined(); if (namedItems.size() == 1) return toJS(exec, collection->globalObject(), namedItems[0].ptr()); ASSERT(collection->impl().type() == FormControls); return toJS(exec, collection->globalObject(), collection->impl().ownerNode().radioNodeList(name).get()); }
static JSValue namedItemGetter(ExecState* exec, JSValue slotBase, PropertyName propertyName) { JSDOMWindowBase* thisObj = jsCast<JSDOMWindow*>(asObject(slotBase)); Document* document = thisObj->impl()->frame()->document(); ASSERT(BindingSecurity::shouldAllowAccessToDOMWindow(exec, thisObj->impl())); ASSERT(document); ASSERT(document->isHTMLDocument()); RefPtr<HTMLCollection> collection = document->windowNamedItems(propertyNameToAtomicString(propertyName)); if (collection->hasExactlyOneItem()) return toJS(exec, thisObj, collection->item(0)); return toJS(exec, thisObj, WTF::getPtr(collection)); }
static JSValue getNamedItems(ExecState* exec, JSHTMLFormControlsCollection* collection, PropertyName propertyName) { Vector<RefPtr<Node> > namedItems; const AtomicString& name = propertyNameToAtomicString(propertyName); collection->impl()->namedItems(name, namedItems); if (namedItems.isEmpty()) return jsUndefined(); if (namedItems.size() == 1) return toJS(exec, collection->globalObject(), namedItems[0].get()); ASSERT(collection->impl()->type() == FormControls); return toJS(exec, collection->globalObject(), collection->impl()->base()->radioNodeList(name).get()); }
static JSValue getNamedItems(ExecState* exec, JSHTMLOptionsCollection* collection, PropertyName propertyName) { Vector<RefPtr<Node> > namedItems; const AtomicString& name = propertyNameToAtomicString(propertyName); collection->impl()->namedItems(name, namedItems); if (namedItems.isEmpty()) return jsUndefined(); if (namedItems.size() == 1) return toJS(exec, collection->globalObject(), namedItems[0].get()); // FIXME: HTML5 specifies that this should be a LiveNodeList. return toJS(exec, collection->globalObject(), StaticNodeList::adopt(namedItems).get()); }
bool JSHTMLFormElement::nameGetter(ExecState* exec, PropertyName propertyName, JSValue& value) { Vector<Ref<Element>> namedItems = impl().namedElements(propertyNameToAtomicString(propertyName)); if (namedItems.isEmpty()) return false; if (namedItems.size() == 1) { value = toJS(exec, globalObject(), namedItems[0].ptr()); return true; } // FIXME: HTML5 specifies that this should be a RadioNodeList. value = toJS(exec, globalObject(), StaticElementList::adopt(namedItems).get()); return true; }
JSValue JSHTMLFormElement::nameGetter(ExecState* exec, JSValue slotBase, PropertyName propertyName) { JSHTMLElement* jsForm = jsCast<JSHTMLFormElement*>(asObject(slotBase)); HTMLFormElement* form = toHTMLFormElement(jsForm->impl()); Vector<RefPtr<Node> > namedItems; form->getNamedElements(propertyNameToAtomicString(propertyName), namedItems); if (namedItems.isEmpty()) return jsUndefined(); if (namedItems.size() == 1) return toJS(exec, jsForm->globalObject(), namedItems[0].get()); // FIXME: HTML5 specifies that this should be a RadioNodeList. return toJS(exec, jsForm->globalObject(), StaticNodeList::adopt(namedItems).get()); }
bool JSTestNamedDeleterNoIdentifier::getOwnPropertySlot(JSObject* object, ExecState* state, PropertyName propertyName, PropertySlot& slot) { auto* thisObject = jsCast<JSTestNamedDeleterNoIdentifier*>(object); ASSERT_GC_OBJECT_INHERITS(thisObject, info()); using GetterIDLType = IDLDOMString; auto getterFunctor = [] (auto& thisObject, auto propertyName) -> Optional<typename GetterIDLType::ImplementationType> { auto result = thisObject.wrapped().namedItem(propertyNameToAtomicString(propertyName)); if (!GetterIDLType::isNullValue(result)) return typename GetterIDLType::ImplementationType { GetterIDLType::extractValueFromNullable(result) }; return WTF::nullopt; }; if (auto namedProperty = accessVisibleNamedProperty<OverrideBuiltins::No>(*state, *thisObject, propertyName, getterFunctor)) { auto value = toJS<IDLDOMString>(*state, WTFMove(namedProperty.value())); slot.setValue(thisObject, static_cast<unsigned>(JSC::PropertyAttribute::ReadOnly), value); return true; } return JSObject::getOwnPropertySlot(object, state, propertyName, slot); }
bool JSDOMWindow::getOwnPropertySlot(JSCell* cell, ExecState* exec, PropertyName propertyName, PropertySlot& slot) { JSDOMWindow* thisObject = jsCast<JSDOMWindow*>(cell); // When accessing a Window cross-domain, functions are always the native built-in ones, and they // are not affected by properties changed on the Window or anything in its prototype chain. // This is consistent with the behavior of Firefox. const HashEntry* entry; // We don't want any properties other than "close" and "closed" on a frameless window (i.e. one whose page got closed, // or whose iframe got removed). // FIXME: This doesn't fully match Firefox, which allows at least toString in addition to those. if (!thisObject->impl()->frame()) { // The following code is safe for cross-domain and same domain use. // It ignores any custom properties that might be set on the DOMWindow (including a custom prototype). entry = s_info.propHashTable(exec)->entry(exec, propertyName); if (entry && !(entry->attributes() & JSC::Function) && entry->propertyGetter() == jsDOMWindowClosed) { slot.setCustom(thisObject, entry->propertyGetter()); return true; } entry = JSDOMWindowPrototype::s_info.propHashTable(exec)->entry(exec, propertyName); if (entry && (entry->attributes() & JSC::Function) && entry->function() == jsDOMWindowPrototypeFunctionClose) { slot.setCustom(thisObject, nonCachingStaticFunctionGetter<jsDOMWindowPrototypeFunctionClose, 0>); return true; } // FIXME: We should have a message here that explains why the property access/function call was // not allowed. slot.setUndefined(); return true; } // We need to check for cross-domain access here without printing the generic warning message // because we always allow access to some function, just different ones depending whether access // is allowed. String errorMessage; bool allowsAccess = shouldAllowAccessToDOMWindow(exec, thisObject->impl(), errorMessage); // Look for overrides before looking at any of our own properties, but ignore overrides completely // if this is cross-domain access. if (allowsAccess && JSGlobalObject::getOwnPropertySlot(thisObject, exec, propertyName, slot)) return true; // We need this code here because otherwise JSDOMWindowBase will stop the search before we even get to the // prototype due to the blanket same origin (shouldAllowAccessToDOMWindow) check at the end of getOwnPropertySlot. // Also, it's important to get the implementation straight out of the DOMWindow prototype regardless of // what prototype is actually set on this object. entry = JSDOMWindowPrototype::s_info.propHashTable(exec)->entry(exec, propertyName); if (entry) { if (entry->attributes() & JSC::Function) { if (entry->function() == jsDOMWindowPrototypeFunctionBlur) { if (!allowsAccess) { slot.setCustom(thisObject, nonCachingStaticFunctionGetter<jsDOMWindowPrototypeFunctionBlur, 0>); return true; } } else if (entry->function() == jsDOMWindowPrototypeFunctionClose) { if (!allowsAccess) { slot.setCustom(thisObject, nonCachingStaticFunctionGetter<jsDOMWindowPrototypeFunctionClose, 0>); return true; } } else if (entry->function() == jsDOMWindowPrototypeFunctionFocus) { if (!allowsAccess) { slot.setCustom(thisObject, nonCachingStaticFunctionGetter<jsDOMWindowPrototypeFunctionFocus, 0>); return true; } } else if (entry->function() == jsDOMWindowPrototypeFunctionPostMessage) { if (!allowsAccess) { slot.setCustom(thisObject, nonCachingStaticFunctionGetter<jsDOMWindowPrototypeFunctionPostMessage, 2>); return true; } } else if (entry->function() == jsDOMWindowPrototypeFunctionShowModalDialog) { if (!DOMWindow::canShowModalDialog(thisObject->impl()->frame())) { slot.setUndefined(); return true; } } } } else { // Allow access to toString() cross-domain, but always Object.prototype.toString. if (propertyName == exec->propertyNames().toString) { if (!allowsAccess) { slot.setCustom(thisObject, objectToStringFunctionGetter); return true; } } } entry = JSDOMWindow::s_info.propHashTable(exec)->entry(exec, propertyName); if (entry) { slot.setCustom(thisObject, entry->propertyGetter()); return true; } // Check for child frames by name before built-in properties to // match Mozilla. This does not match IE, but some sites end up // naming frames things that conflict with window properties that // are in Moz but not IE. Since we have some of these, we have to do // it the Moz way. if (thisObject->impl()->frame()->tree()->scopedChild(propertyNameToAtomicString(propertyName))) { slot.setCustom(thisObject, childFrameGetter); return true; } // Do prototype lookup early so that functions and attributes in the prototype can have // precedence over the index and name getters. JSValue proto = thisObject->prototype(); if (proto.isObject()) { if (asObject(proto)->getPropertySlot(exec, propertyName, slot)) { if (!allowsAccess) { thisObject->printErrorMessage(errorMessage); slot.setUndefined(); } return true; } } // FIXME: Search the whole frame hierarchy somewhere around here. // We need to test the correct priority order. // allow window[1] or parent[1] etc. (#56983) unsigned i = propertyName.asIndex(); if (i < thisObject->impl()->frame()->tree()->scopedChildCount()) { ASSERT(i != PropertyName::NotAnIndex); slot.setCustomIndex(thisObject, i, indexGetter); return true; } if (!allowsAccess) { thisObject->printErrorMessage(errorMessage); slot.setUndefined(); return true; } // Allow shortcuts like 'Image1' instead of document.images.Image1 Document* document = thisObject->impl()->frame()->document(); if (document->isHTMLDocument()) { AtomicStringImpl* atomicPropertyName = findAtomicString(propertyName); if (atomicPropertyName && (toHTMLDocument(document)->hasNamedItem(atomicPropertyName) || document->hasElementWithId(atomicPropertyName))) { slot.setCustom(thisObject, namedItemGetter); return true; } } return Base::getOwnPropertySlot(thisObject, exec, propertyName, slot); }
bool JSHTMLFormControlsCollection::canGetItemsForName(ExecState*, HTMLFormControlsCollection* collection, PropertyName propertyName) { return collection->hasNamedItem(propertyNameToAtomicString(propertyName)); }
bool JSDOMWindow::getOwnPropertyDescriptor(JSObject* object, ExecState* exec, PropertyName propertyName, PropertyDescriptor& descriptor) { JSDOMWindow* thisObject = jsCast<JSDOMWindow*>(object); // Never allow cross-domain getOwnPropertyDescriptor if (!BindingSecurity::shouldAllowAccessToDOMWindow(exec, thisObject->impl())) return false; const HashEntry* entry; // We don't want any properties other than "close" and "closed" on a closed window. if (!thisObject->impl()->frame()) { // The following code is safe for cross-domain and same domain use. // It ignores any custom properties that might be set on the DOMWindow (including a custom prototype). entry = s_info.propHashTable(exec)->entry(exec, propertyName); if (entry && !(entry->attributes() & JSC::Function) && entry->propertyGetter() == jsDOMWindowClosed) { descriptor.setDescriptor(jsBoolean(true), ReadOnly | DontDelete | DontEnum); return true; } entry = JSDOMWindowPrototype::s_info.propHashTable(exec)->entry(exec, propertyName); if (entry && (entry->attributes() & JSC::Function) && entry->function() == jsDOMWindowPrototypeFunctionClose) { PropertySlot slot; slot.setCustom(thisObject, nonCachingStaticFunctionGetter<jsDOMWindowPrototypeFunctionClose, 0>); descriptor.setDescriptor(slot.getValue(exec, propertyName), ReadOnly | DontDelete | DontEnum); return true; } descriptor.setUndefined(); return true; } entry = JSDOMWindow::s_info.propHashTable(exec)->entry(exec, propertyName); if (entry) { PropertySlot slot; slot.setCustom(thisObject, entry->propertyGetter()); descriptor.setDescriptor(slot.getValue(exec, propertyName), entry->attributes()); return true; } // Check for child frames by name before built-in properties to // match Mozilla. This does not match IE, but some sites end up // naming frames things that conflict with window properties that // are in Moz but not IE. Since we have some of these, we have to do // it the Moz way. if (thisObject->impl()->frame()->tree()->scopedChild(propertyNameToAtomicString(propertyName))) { PropertySlot slot; slot.setCustom(thisObject, childFrameGetter); descriptor.setDescriptor(slot.getValue(exec, propertyName), ReadOnly | DontDelete | DontEnum); return true; } unsigned i = propertyName.asIndex(); if (i < thisObject->impl()->frame()->tree()->scopedChildCount()) { ASSERT(i != PropertyName::NotAnIndex); PropertySlot slot; slot.setCustomIndex(thisObject, i, indexGetter); descriptor.setDescriptor(slot.getValue(exec, propertyName), ReadOnly | DontDelete | DontEnum); return true; } // Allow shortcuts like 'Image1' instead of document.images.Image1 Document* document = thisObject->impl()->frame()->document(); if (document->isHTMLDocument()) { AtomicStringImpl* atomicPropertyName = findAtomicString(propertyName); if (atomicPropertyName && (toHTMLDocument(document)->hasNamedItem(atomicPropertyName) || document->hasElementWithId(atomicPropertyName))) { PropertySlot slot; slot.setCustom(thisObject, namedItemGetter); descriptor.setDescriptor(slot.getValue(exec, propertyName), ReadOnly | DontDelete | DontEnum); return true; } } return Base::getOwnPropertyDescriptor(thisObject, exec, propertyName, descriptor); }
bool JSDOMWindow::getOwnPropertySlotByIndex(JSCell* cell, ExecState* exec, unsigned index, PropertySlot& slot) { JSDOMWindow* thisObject = jsCast<JSDOMWindow*>(cell); if (!thisObject->impl()->frame()) { // FIXME: We should have a message here that explains why the property access/function call was // not allowed. slot.setUndefined(); return true; } // We need to check for cross-domain access here without printing the generic warning message // because we always allow access to some function, just different ones depending whether access // is allowed. String errorMessage; bool allowsAccess = shouldAllowAccessToDOMWindow(exec, thisObject->impl(), errorMessage); // Look for overrides before looking at any of our own properties, but ignore overrides completely // if this is cross-domain access. if (allowsAccess && JSGlobalObject::getOwnPropertySlotByIndex(thisObject, exec, index, slot)) return true; PropertyName propertyName = Identifier::from(exec, index); // Check for child frames by name before built-in properties to // match Mozilla. This does not match IE, but some sites end up // naming frames things that conflict with window properties that // are in Moz but not IE. Since we have some of these, we have to do // it the Moz way. if (thisObject->impl()->frame()->tree()->scopedChild(propertyNameToAtomicString(propertyName))) { slot.setCustom(thisObject, childFrameGetter); return true; } // Do prototype lookup early so that functions and attributes in the prototype can have // precedence over the index and name getters. JSValue proto = thisObject->prototype(); if (proto.isObject()) { if (asObject(proto)->getPropertySlot(exec, index, slot)) { if (!allowsAccess) { thisObject->printErrorMessage(errorMessage); slot.setUndefined(); } return true; } } // FIXME: Search the whole frame hierarchy somewhere around here. // We need to test the correct priority order. // allow window[1] or parent[1] etc. (#56983) if (index < thisObject->impl()->frame()->tree()->scopedChildCount()) { ASSERT(index != PropertyName::NotAnIndex); slot.setCustomIndex(thisObject, index, indexGetter); return true; } if (!allowsAccess) { thisObject->printErrorMessage(errorMessage); slot.setUndefined(); return true; } // Allow shortcuts like 'Image1' instead of document.images.Image1 Document* document = thisObject->impl()->frame()->document(); if (document->isHTMLDocument()) { AtomicStringImpl* atomicPropertyName = findAtomicString(propertyName); if (atomicPropertyName && (toHTMLDocument(document)->hasNamedItem(atomicPropertyName) || document->hasElementWithId(atomicPropertyName))) { slot.setCustom(thisObject, namedItemGetter); return true; } } return Base::getOwnPropertySlotByIndex(thisObject, exec, index, slot); }
EncodedJSValue JSDOMNamedFlowCollection::nameGetter(ExecState* exec, EncodedJSValue slotBase, EncodedJSValue, PropertyName propertyName) { JSDOMNamedFlowCollection* thisObj = jsCast<JSDOMNamedFlowCollection*>(JSValue::decode(slotBase)); return JSValue::encode(toJS(exec, thisObj->globalObject(), thisObj->impl().namedItem(propertyNameToAtomicString(propertyName)))); }
static bool jsDOMWindowGetOwnPropertySlotRestrictedAccess(JSDOMWindow* thisObject, Frame* frame, ExecState* exec, PropertyName propertyName, PropertySlot& slot, const String& errorMessage) { VM& vm = exec->vm(); auto scope = DECLARE_THROW_SCOPE(vm); // We don't want any properties other than "close" and "closed" on a frameless window // (i.e. one whose page got closed, or whose iframe got removed). // FIXME: This handling for frameless windows duplicates similar behaviour for cross-origin // access below; we should try to find a way to merge the two. if (!frame) { if (propertyName == exec->propertyNames().closed) { slot.setCustom(thisObject, ReadOnly | DontDelete | DontEnum, jsDOMWindowClosed); return true; } if (propertyName == exec->propertyNames().close) { slot.setCustom(thisObject, ReadOnly | DontDelete | DontEnum, nonCachingStaticFunctionGetter<jsDOMWindowInstanceFunctionClose, 0>); return true; } // FIXME: We should have a message here that explains why the property access/function call was // not allowed. slot.setUndefined(); return true; } // These are the functions we allow access to cross-origin (DoNotCheckSecurity in IDL). // Always provide the original function, on a fresh uncached function object. if (propertyName == exec->propertyNames().blur) { slot.setCustom(thisObject, ReadOnly | DontEnum, nonCachingStaticFunctionGetter<jsDOMWindowInstanceFunctionBlur, 0>); return true; } if (propertyName == exec->propertyNames().close) { slot.setCustom(thisObject, ReadOnly | DontEnum, nonCachingStaticFunctionGetter<jsDOMWindowInstanceFunctionClose, 0>); return true; } if (propertyName == exec->propertyNames().focus) { slot.setCustom(thisObject, ReadOnly | DontEnum, nonCachingStaticFunctionGetter<jsDOMWindowInstanceFunctionFocus, 0>); return true; } if (propertyName == exec->propertyNames().postMessage) { slot.setCustom(thisObject, ReadOnly | DontEnum, nonCachingStaticFunctionGetter<jsDOMWindowInstanceFunctionPostMessage, 2>); return true; } // When accessing cross-origin known Window properties, we always use the original property getter, // even if the property was removed / redefined. As of early 2016, this matches Firefox and Chrome's // behavior. if (auto* entry = JSDOMWindow::info()->staticPropHashTable->entry(propertyName)) { // Only allow access to these specific properties. if (propertyName == exec->propertyNames().location || propertyName == exec->propertyNames().closed || propertyName == exec->propertyNames().length || propertyName == exec->propertyNames().self || propertyName == exec->propertyNames().window || propertyName == exec->propertyNames().frames || propertyName == exec->propertyNames().opener || propertyName == exec->propertyNames().parent || propertyName == exec->propertyNames().top) { bool shouldExposeSetter = propertyName == exec->propertyNames().location; CustomGetterSetter* customGetterSetter = CustomGetterSetter::create(vm, entry->propertyGetter(), shouldExposeSetter ? entry->propertyPutter() : nullptr); slot.setCustomGetterSetter(thisObject, DontEnum | CustomAccessor, customGetterSetter); return true; } // For any other entries in the static property table, deny access. (Early return also prevents // named getter from returning frames with matching names - this seems a little questionable, see // FIXME comment on prototype search below.) throwSecurityError(*exec, scope, errorMessage); slot.setUndefined(); return true; } // Check for child frames by name before built-in properties to match Mozilla. This does // not match IE, but some sites end up naming frames things that conflict with window // properties that are in Moz but not IE. Since we have some of these, we have to do it // the Moz way. if (auto* scopedChild = frame->tree().scopedChild(propertyNameToAtomicString(propertyName))) { slot.setValue(thisObject, ReadOnly | DontDelete | DontEnum, toJS(exec, scopedChild->document()->domWindow())); return true; } throwSecurityError(*exec, scope, errorMessage); slot.setUndefined(); return true; }
bool JSRTCStatsResponse::canGetItemsForName(ExecState*, RTCStatsResponse* response, PropertyName propertyName) { return response->canGetItemsForName(propertyNameToAtomicString(propertyName)); }
bool JSDOMNamedFlowCollection::canGetItemsForName(ExecState*, DOMNamedFlowCollection* collection, PropertyName propertyName) { return collection->hasNamedItem(propertyNameToAtomicString(propertyName)); }
static JSValue childFrameGetter(ExecState* exec, JSValue slotBase, PropertyName propertyName) { return toJS(exec, jsCast<JSDOMWindow*>(asObject(slotBase))->impl()->frame()->tree()->scopedChild(propertyNameToAtomicString(propertyName))->document()->domWindow()); }
JSValue JSNodeList::nameGetter(ExecState* exec, JSValue slotBase, PropertyName propertyName) { JSNodeList* thisObj = jsCast<JSNodeList*>(asObject(slotBase)); return toJS(exec, thisObj->globalObject(), thisObj->impl()->itemWithName(propertyNameToAtomicString(propertyName))); }
bool JSNamedNodeMap::canGetItemsForName(ExecState*, NamedNodeMap* impl, PropertyName propertyName) { return impl->getNamedItem(propertyNameToAtomicString(propertyName)); }
JSValue JSNamedNodeMap::nameGetter(ExecState* exec, JSValue slotBase, PropertyName propertyName) { JSNamedNodeMap* thisObj = jsCast<JSNamedNodeMap*>(asObject(slotBase)); return toJS(exec, thisObj->globalObject(), thisObj->impl()->getNamedItem(propertyNameToAtomicString(propertyName))); }
JSValue JSHTMLCollection::nameGetter(ExecState* exec, JSValue slotBase, PropertyName propertyName) { JSHTMLCollection* collection = jsCast<JSHTMLCollection*>(asObject(slotBase)); const AtomicString& name = propertyNameToAtomicString(propertyName); return toJS(exec, collection->globalObject(), collection->impl()->namedItem(name)); }
bool JSNodeList::canGetItemsForName(ExecState*, NodeList* impl, PropertyName propertyName) { return impl->itemWithName(propertyNameToAtomicString(propertyName)); }
EncodedJSValue JSRTCStatsResponse::nameGetter(ExecState* exec, JSObject* slotBase, EncodedJSValue, PropertyName propertyName) { JSRTCStatsResponse* thisObj = jsCast<JSRTCStatsResponse*>(slotBase); return JSValue::encode(toJS(exec, thisObj->globalObject(), thisObj->impl().namedItem(propertyNameToAtomicString(propertyName)))); }