Diff
Modified: branches/safari-537-branch/Source/_javascript_Core/ChangeLog (152236 => 152237)
--- branches/safari-537-branch/Source/_javascript_Core/ChangeLog 2013-07-01 18:54:01 UTC (rev 152236)
+++ branches/safari-537-branch/Source/_javascript_Core/ChangeLog 2013-07-01 19:14:53 UTC (rev 152237)
@@ -1,3 +1,23 @@
+2013-07-01 Lucas Forschler <[email protected]>
+
+ Merge r151978
+
+ 2013-06-25 Ryosuke Niwa <[email protected]>
+
+ JSString should remember AtomicString
+ https://bugs.webkit.org/show_bug.cgi?id=117386
+
+ Reviewed by Geoffrey Garen.
+
+ Added JSValue::toAtomicString and JSString::atomicString. These two functions allow WebCore to update
+ JSString's m_value to set isAtomic flag and avoid the AtomicStringTable lookups in subsequent attempts
+ to obtain the AtomicString of the same value.
+
+ * runtime/JSCJSValue.h:
+ * runtime/JSString.h:
+ (JSC::JSString::atomicString):
+ (JSC::JSValue::toAtomicString):
+
2013-06-25 Lucas Forschler <[email protected]>
Merge r151786
Modified: branches/safari-537-branch/Source/_javascript_Core/runtime/JSCJSValue.h (152236 => 152237)
--- branches/safari-537-branch/Source/_javascript_Core/runtime/JSCJSValue.h 2013-07-01 18:54:01 UTC (rev 152236)
+++ branches/safari-537-branch/Source/_javascript_Core/runtime/JSCJSValue.h 2013-07-01 19:14:53 UTC (rev 152237)
@@ -220,6 +220,7 @@
// been set in the ExecState already.
double toNumber(ExecState*) const;
JSString* toString(ExecState*) const;
+ AtomicString toAtomicString(ExecState*) const;
WTF::String toWTFString(ExecState*) const;
WTF::String toWTFStringInline(ExecState*) const;
JSObject* toObject(ExecState*) const;
Modified: branches/safari-537-branch/Source/_javascript_Core/runtime/JSString.h (152236 => 152237)
--- branches/safari-537-branch/Source/_javascript_Core/runtime/JSString.h 2013-07-01 18:54:01 UTC (rev 152236)
+++ branches/safari-537-branch/Source/_javascript_Core/runtime/JSString.h 2013-07-01 19:14:53 UTC (rev 152237)
@@ -139,6 +139,7 @@
const String& value(ExecState*) const;
const String& tryGetValue() const;
unsigned length() { return m_length; }
+ AtomicString atomicString(ExecState*) const;
JSValue toPrimitive(ExecState*, PreferredPrimitiveType) const;
JS_EXPORT_PRIVATE bool toBoolean() const;
@@ -371,6 +372,19 @@
return m_value;
}
+inline AtomicString JSString::atomicString(ExecState* exec) const
+{
+ if (isRope()) {
+ static_cast<const JSRopeString*>(this)->resolveRope(exec);
+ if (exec->hadException())
+ return nullAtom;
+ }
+ const AtomicString atomicValue(m_value);
+ if (atomicValue.impl() != m_value.impl())
+ m_value = atomicValue;
+ return atomicValue;
+}
+
inline const String& JSString::tryGetValue() const
{
if (isRope())
@@ -516,6 +530,13 @@
return toStringSlowCase(exec);
}
+inline AtomicString JSValue::toAtomicString(ExecState* exec) const
+{
+ if (isString())
+ return jsCast<JSString*>(asCell())->atomicString(exec);
+ return toStringSlowCase(exec)->value(exec);
+}
+
inline String JSValue::toWTFString(ExecState* exec) const
{
if (isString())
Modified: branches/safari-537-branch/Source/WebCore/ChangeLog (152236 => 152237)
--- branches/safari-537-branch/Source/WebCore/ChangeLog 2013-07-01 18:54:01 UTC (rev 152236)
+++ branches/safari-537-branch/Source/WebCore/ChangeLog 2013-07-01 19:14:53 UTC (rev 152237)
@@ -1,3 +1,39 @@
+2013-07-01 Lucas Forschler <[email protected]>
+
+ Merge r151978
+
+ 2013-06-25 Ryosuke Niwa <[email protected]>
+
+ JSString should remember AtomicString
+ https://bugs.webkit.org/show_bug.cgi?id=117386
+
+ Reviewed by Geoffrey Garen.
+
+ Added "Atomic" attribute as a WebKit extension to WebIDL, and deployed it in Element.idl and Node.idl so that
+ the binding code can use newly added JSValue::toAtomic to update JSString's m_value.
+
+ * bindings/js/JSDOMBinding.cpp:
+ (WebCore::valueToAtomicStringWithNullCheck): Added.
+ (WebCore::valueToAtomicStringWithUndefinedOrNullCheck): Added.
+
+ * bindings/js/JSDOMBinding.h:
+
+ * bindings/scripts/CodeGeneratorJS.pm:
+ (GetNativeTypeFromSignature): Return const AtomicString& when either Atomic attribute is specified or the type is
+ Reflect. Note that setAttribute and getAttribute both use AtomicString for all arguments.
+ (JSValueToNative): Use AtomicString equivalents when possible when converting DOMString to a WebCore object.
+
+ * bindings/scripts/IDLAttributes.txt: Added "Atomic" attribute.
+
+ * bindings/scripts/test/JS/JSTestObj.cpp: Baselined test cases.
+ (WebCore::setJSTestObjReflectedStringAttr):
+ (WebCore::setJSTestObjReflectedURLAttr):
+ (WebCore::setJSTestObjReflectedCustomURLAttr):
+
+ * dom/Document.idl:
+ * dom/Element.idl:
+ * dom/Node.idl:
+
2013-06-27 Lucas Forschler <[email protected]>
Merge r152038
Modified: branches/safari-537-branch/Source/WebCore/bindings/js/JSDOMBinding.cpp (152236 => 152237)
--- branches/safari-537-branch/Source/WebCore/bindings/js/JSDOMBinding.cpp 2013-07-01 18:54:01 UTC (rev 152236)
+++ branches/safari-537-branch/Source/WebCore/bindings/js/JSDOMBinding.cpp 2013-07-01 19:14:53 UTC (rev 152237)
@@ -109,6 +109,13 @@
return value.toString(exec)->value(exec);
}
+AtomicString valueToAtomicStringWithNullCheck(ExecState* exec, JSValue value)
+{
+ if (value.isNull())
+ return nullAtom;
+ return value.toAtomicString(exec);
+}
+
String valueToStringWithUndefinedOrNullCheck(ExecState* exec, JSValue value)
{
if (value.isUndefinedOrNull())
@@ -116,6 +123,13 @@
return value.toString(exec)->value(exec);
}
+AtomicString valueToAtomicStringWithUndefinedOrNullCheck(ExecState* exec, JSValue value)
+{
+ if (value.isUndefinedOrNull())
+ return nullAtom;
+ return value.toAtomicString(exec);
+}
+
JSValue jsDateOrNull(ExecState* exec, double value)
{
if (!std::isfinite(value))
Modified: branches/safari-537-branch/Source/WebCore/bindings/js/JSDOMBinding.h (152236 => 152237)
--- branches/safari-537-branch/Source/WebCore/bindings/js/JSDOMBinding.h 2013-07-01 18:54:01 UTC (rev 152236)
+++ branches/safari-537-branch/Source/WebCore/bindings/js/JSDOMBinding.h 2013-07-01 19:14:53 UTC (rev 152237)
@@ -249,7 +249,10 @@
AtomicStringImpl* findAtomicString(JSC::PropertyName);
String valueToStringWithNullCheck(JSC::ExecState*, JSC::JSValue); // null if the value is null
+ AtomicString valueToAtomicStringWithNullCheck(JSC::ExecState*, JSC::JSValue);
+
String valueToStringWithUndefinedOrNullCheck(JSC::ExecState*, JSC::JSValue); // null if the value is null or undefined
+ AtomicString valueToAtomicStringWithUndefinedOrNullCheck(JSC::ExecState*, JSC::JSValue);
inline int32_t finiteInt32Value(JSC::JSValue value, JSC::ExecState* exec, bool& okay)
{
Modified: branches/safari-537-branch/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm (152236 => 152237)
--- branches/safari-537-branch/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm 2013-07-01 18:54:01 UTC (rev 152236)
+++ branches/safari-537-branch/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm 2013-07-01 19:14:53 UTC (rev 152237)
@@ -3364,6 +3364,11 @@
return "int";
}
+ # FIXME: GetNativeType should support Atomic extension.
+ if ($type eq "DOMString" and ($signature->extendedAttributes->{"Atomic"} or $signature->extendedAttributes->{"Reflect"})) {
+ return "const AtomicString&";
+ }
+
return GetNativeType($type);
}
@@ -3503,12 +3508,23 @@
if ($type eq "DOMString") {
# FIXME: This implements [TreatNullAs=NullString] and [TreatUndefinedAs=NullString],
# but the Web IDL spec requires [TreatNullAs=EmptyString] and [TreatUndefinedAs=EmptyString].
- if (($signature->extendedAttributes->{"TreatNullAs"} and $signature->extendedAttributes->{"TreatNullAs"} eq "NullString") and ($signature->extendedAttributes->{"TreatUndefinedAs"} and $signature->extendedAttributes->{"TreatUndefinedAs"} eq "NullString")) {
- return "valueToStringWithUndefinedOrNullCheck(exec, $value)"
+ if (($signature->extendedAttributes->{"TreatNullAs"} and $signature->extendedAttributes->{"TreatNullAs"} eq "NullString")
+ and ($signature->extendedAttributes->{"TreatUndefinedAs"} and $signature->extendedAttributes->{"TreatUndefinedAs"} eq "NullString")) {
+ if ($signature->extendedAttributes->{"Atomic"}) {
+ return "valueToStringWithUndefinedOrNullCheck(exec, $value)";
+ } else {
+ return "valueToAtomicStringWithUndefinedOrNullCheck(exec, $value)";
+ }
}
- if (($signature->extendedAttributes->{"TreatNullAs"} and $signature->extendedAttributes->{"TreatNullAs"} eq "NullString") or $signature->extendedAttributes->{"Reflect"}) {
- return "valueToStringWithNullCheck(exec, $value)"
+ if ($signature->extendedAttributes->{"Reflect"}) {
+ return "valueToAtomicStringWithNullCheck(exec, $value)";
}
+ if ($signature->extendedAttributes->{"TreatNullAs"} and $signature->extendedAttributes->{"TreatNullAs"} eq "NullString") {
+ return "valueToStringWithNullCheck(exec, $value)";
+ }
+ if ($signature->extendedAttributes->{"Atomic"}) {
+ return "$value.isEmpty() ? nullAtom : $value.toAtomicString(exec)";
+ }
# FIXME: Add the case for 'if ($signature->extendedAttributes->{"TreatUndefinedAs"} and $signature->extendedAttributes->{"TreatUndefinedAs"} eq "NullString"))'.
return "$value.isEmpty() ? String() : $value.toString(exec)->value(exec)";
}
Modified: branches/safari-537-branch/Source/WebCore/bindings/scripts/IDLAttributes.txt (152236 => 152237)
--- branches/safari-537-branch/Source/WebCore/bindings/scripts/IDLAttributes.txt 2013-07-01 18:54:01 UTC (rev 152236)
+++ branches/safari-537-branch/Source/WebCore/bindings/scripts/IDLAttributes.txt 2013-07-01 19:14:53 UTC (rev 152237)
@@ -19,6 +19,7 @@
#
ActiveDOMObject
+Atomic
CPPPureInterface
CachedAttribute
CallWith=ScriptExecutionContext|ScriptState|ScriptArguments|CallStack
Modified: branches/safari-537-branch/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp (152236 => 152237)
--- branches/safari-537-branch/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp 2013-07-01 18:54:01 UTC (rev 152236)
+++ branches/safari-537-branch/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp 2013-07-01 19:14:53 UTC (rev 152237)
@@ -1278,7 +1278,7 @@
UNUSED_PARAM(exec);
JSTestObj* castedThis = jsCast<JSTestObj*>(thisObject);
TestObj* impl = static_cast<TestObj*>(castedThis->impl());
- const String& nativeValue(valueToStringWithNullCheck(exec, value));
+ const AtomicString& nativeValue(valueToAtomicStringWithNullCheck(exec, value));
if (exec->hadException())
return;
impl->setAttribute(WebCore::HTMLNames::reflectedstringattrAttr, nativeValue);
@@ -1326,7 +1326,7 @@
UNUSED_PARAM(exec);
JSTestObj* castedThis = jsCast<JSTestObj*>(thisObject);
TestObj* impl = static_cast<TestObj*>(castedThis->impl());
- const String& nativeValue(valueToStringWithNullCheck(exec, value));
+ const AtomicString& nativeValue(valueToAtomicStringWithNullCheck(exec, value));
if (exec->hadException())
return;
impl->setAttribute(WebCore::HTMLNames::reflectedurlattrAttr, nativeValue);
@@ -1338,7 +1338,7 @@
UNUSED_PARAM(exec);
JSTestObj* castedThis = jsCast<JSTestObj*>(thisObject);
TestObj* impl = static_cast<TestObj*>(castedThis->impl());
- const String& nativeValue(valueToStringWithNullCheck(exec, value));
+ const AtomicString& nativeValue(valueToAtomicStringWithNullCheck(exec, value));
if (exec->hadException())
return;
impl->setAttribute(WebCore::HTMLNames::customContentStringAttrAttr, nativeValue);
@@ -1374,7 +1374,7 @@
UNUSED_PARAM(exec);
JSTestObj* castedThis = jsCast<JSTestObj*>(thisObject);
TestObj* impl = static_cast<TestObj*>(castedThis->impl());
- const String& nativeValue(valueToStringWithNullCheck(exec, value));
+ const AtomicString& nativeValue(valueToAtomicStringWithNullCheck(exec, value));
if (exec->hadException())
return;
impl->setAttribute(WebCore::HTMLNames::customContentURLAttrAttr, nativeValue);
Modified: branches/safari-537-branch/Source/WebCore/dom/Document.idl (152236 => 152237)
--- branches/safari-537-branch/Source/WebCore/dom/Document.idl 2013-07-01 18:54:01 UTC (rev 152236)
+++ branches/safari-537-branch/Source/WebCore/dom/Document.idl 2013-07-01 19:14:53 UTC (rev 152237)
@@ -29,7 +29,7 @@
readonly attribute DOMImplementation implementation;
readonly attribute Element documentElement;
- [ReturnNewObject, RaisesException] Element createElement([TreatNullAs=NullString,Default=Undefined] optional DOMString tagName);
+ [ReturnNewObject, RaisesException] Element createElement([TreatNullAs=NullString,Default=Undefined,Atomic] optional DOMString tagName);
DocumentFragment createDocumentFragment();
[ReturnNewObject] Text createTextNode([Default=Undefined] optional DOMString data);
[ReturnNewObject] Comment createComment([Default=Undefined] optional DOMString data);
@@ -38,7 +38,7 @@
[Default=Undefined] optional DOMString data);
[ReturnNewObject, RaisesException] Attr createAttribute([Default=Undefined] optional DOMString name);
[ReturnNewObject, RaisesException] EntityReference createEntityReference([Default=Undefined] optional DOMString name);
- NodeList getElementsByTagName([Default=Undefined] optional DOMString tagname);
+ NodeList getElementsByTagName([Default=Undefined, Atomic] optional DOMString tagname);
// Introduced in DOM Level 2:
@@ -48,9 +48,9 @@
[TreatNullAs=NullString,Default=Undefined] optional DOMString qualifiedName);
[ObjCLegacyUnnamedParameters, ReturnNewObject, RaisesException] Attr createAttributeNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
[TreatNullAs=NullString,Default=Undefined] optional DOMString qualifiedName);
- [ObjCLegacyUnnamedParameters] NodeList getElementsByTagNameNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
- [Default=Undefined] optional DOMString localName);
- Element getElementById([Default=Undefined] optional DOMString elementId);
+ [ObjCLegacyUnnamedParameters] NodeList getElementsByTagNameNS([TreatNullAs=NullString,Default=Undefined,Atomic] optional DOMString namespaceURI,
+ [Default=Undefined,Atomic] optional DOMString localName);
+ Element getElementById([Default=Undefined,Atomic] optional DOMString elementId);
// DOM Level 3 Core
@@ -216,8 +216,8 @@
readonly attribute DOMString compatMode;
// NodeSelector - Selector API
- [RaisesException] Element querySelector(DOMString selectors);
- [RaisesException] NodeList querySelectorAll(DOMString selectors);
+ [RaisesException] Element querySelector([Atomic] DOMString selectors);
+ [RaisesException] NodeList querySelectorAll([Atomic] DOMString selectors);
#if defined(ENABLE_FULLSCREEN_API) && ENABLE_FULLSCREEN_API
// Mozilla version
@@ -338,9 +338,9 @@
#if defined(ENABLE_CUSTOM_ELEMENTS) && ENABLE_CUSTOM_ELEMENTS
[Conditional=CUSTOM_ELEMENTS, ImplementedAs=registerElement, CallWith=ScriptState, RaisesException] CustomElementConstructor webkitRegister(DOMString name, optional Dictionary options);
- [ReturnNewObject, RaisesException] Element createElement(DOMString localName, [TreatNullAs=NullString] DOMString typeExtension);
- [ReturnNewObject, RaisesException] Element createElementNS([TreatNullAs=NullString] DOMString namespaceURI, DOMString qualifiedName,
- [TreatNullAs=NullString] DOMString typeExtension);
+ [ReturnNewObject, RaisesException] Element createElement([Atomic] DOMString localName, [TreatNullAs=NullString, Atomic] DOMString typeExtension);
+ [ReturnNewObject, RaisesException] Element createElementNS([TreatNullAs=NullString, Atomic] DOMString namespaceURI, DOMString qualifiedName,
+ [TreatNullAs=NullString, Atomic] DOMString typeExtension);
#endif
#if defined(LANGUAGE_CPP) && LANGUAGE_CPP
Modified: branches/safari-537-branch/Source/WebCore/dom/Element.idl (152236 => 152237)
--- branches/safari-537-branch/Source/WebCore/dom/Element.idl 2013-07-01 18:54:01 UTC (rev 152236)
+++ branches/safari-537-branch/Source/WebCore/dom/Element.idl 2013-07-01 19:14:53 UTC (rev 152237)
@@ -27,14 +27,14 @@
[TreatReturnedNullStringAs=Null] readonly attribute DOMString tagName;
- [TreatReturnedNullStringAs=Null] DOMString getAttribute([Default=Undefined] optional DOMString name);
- [ObjCLegacyUnnamedParameters, RaisesException] void setAttribute([Default=Undefined] optional DOMString name,
- [Default=Undefined] optional DOMString value);
- void removeAttribute([Default=Undefined] optional DOMString name);
- Attr getAttributeNode([Default=Undefined] optional DOMString name);
+ [TreatReturnedNullStringAs=Null] DOMString getAttribute([Default=Undefined, Atomic] optional DOMString name);
+ [ObjCLegacyUnnamedParameters, RaisesException] void setAttribute([Default=Undefined, Atomic] optional DOMString name,
+ [Default=Undefined, Atomic] optional DOMString value);
+ void removeAttribute([Default=Undefined, Atomic] optional DOMString name);
+ Attr getAttributeNode([Default=Undefined, Atomic] optional DOMString name);
[RaisesException] Attr setAttributeNode([Default=Undefined] optional Attr newAttr);
[RaisesException] Attr removeAttributeNode([Default=Undefined] optional Attr oldAttr);
- NodeList getElementsByTagName([Default=Undefined] optional DOMString name);
+ NodeList getElementsByTagName([Default=Undefined, Atomic] optional DOMString name);
#if !defined(LANGUAGE_OBJECTIVE_C)
// For ObjC this is defined on Node for legacy support.
@@ -44,21 +44,21 @@
// DOM Level 2 Core
- [ObjCLegacyUnnamedParameters] DOMString getAttributeNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
- [Default=Undefined] optional DOMString localName);
- [ObjCLegacyUnnamedParameters, RaisesException] void setAttributeNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
- [Default=Undefined] optional DOMString qualifiedName,
- [Default=Undefined] optional DOMString value);
- [ObjCLegacyUnnamedParameters] void removeAttributeNS([TreatNullAs=NullString] DOMString namespaceURI,
- DOMString localName);
- [ObjCLegacyUnnamedParameters] NodeList getElementsByTagNameNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
- [Default=Undefined] optional DOMString localName);
- [ObjCLegacyUnnamedParameters] Attr getAttributeNodeNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
- [Default=Undefined] optional DOMString localName);
+ [ObjCLegacyUnnamedParameters] DOMString getAttributeNS([TreatNullAs=NullString, Default=Undefined, Atomic] optional DOMString namespaceURI,
+ [Default=Undefined, Atomic] optional DOMString localName);
+ [ObjCLegacyUnnamedParameters, RaisesException] void setAttributeNS([TreatNullAs=NullString, Default=Undefined, Atomic] optional DOMString namespaceURI,
+ [Default=Undefined, Atomic] optional DOMString qualifiedName,
+ [Default=Undefined, Atomic] optional DOMString value);
+ [ObjCLegacyUnnamedParameters] void removeAttributeNS([TreatNullAs=NullString, Atomic] DOMString namespaceURI,
+ [Atomic] DOMString localName);
+ [ObjCLegacyUnnamedParameters] NodeList getElementsByTagNameNS([TreatNullAs=NullString, Default=Undefined, Atomic] optional DOMString namespaceURI,
+ [Default=Undefined, Atomic] optional DOMString localName);
+ [ObjCLegacyUnnamedParameters] Attr getAttributeNodeNS([TreatNullAs=NullString, Default=Undefined, Atomic] optional DOMString namespaceURI,
+ [Default=Undefined, Atomic] optional DOMString localName);
[RaisesException] Attr setAttributeNodeNS([Default=Undefined] optional Attr newAttr);
boolean hasAttribute(DOMString name);
- [ObjCLegacyUnnamedParameters] boolean hasAttributeNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
- [Default=Undefined] optional DOMString localName);
+ [ObjCLegacyUnnamedParameters] boolean hasAttributeNS([TreatNullAs=NullString, Default=Undefined, Atomic] optional DOMString namespaceURI,
+ [Default=Undefined, Atomic] optional DOMString localName);
readonly attribute CSSStyleDeclaration style;
@@ -99,8 +99,8 @@
#endif
// NodeSelector - Selector API
- [RaisesException] Element querySelector(DOMString selectors);
- [RaisesException] NodeList querySelectorAll(DOMString selectors);
+ [RaisesException] Element querySelector([Atomic] DOMString selectors);
+ [RaisesException] NodeList querySelectorAll([Atomic] DOMString selectors);
// WebKit extension, pending specification.
[RaisesException] boolean webkitMatchesSelector([Default=Undefined] optional DOMString selectors);
Modified: branches/safari-537-branch/Source/WebCore/dom/Node.idl (152236 => 152237)
--- branches/safari-537-branch/Source/WebCore/dom/Node.idl 2013-07-01 18:54:01 UTC (rev 152236)
+++ branches/safari-537-branch/Source/WebCore/dom/Node.idl 2013-07-01 19:14:53 UTC (rev 152237)
@@ -126,10 +126,10 @@
#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
- void addEventListener(DOMString type,
+ void addEventListener([Atomic] DOMString type,
EventListener listener,
optional boolean useCapture);
- void removeEventListener(DOMString type,
+ void removeEventListener([Atomic] DOMString type,
EventListener listener,
optional boolean useCapture);
[RaisesException] boolean dispatchEvent(Event event);