Changeset 63057 in webkit
- Timestamp:
- Jul 10, 2010 11:54:44 PM (14 years ago)
- Location:
- trunk
- Files:
-
- 3 added
- 27 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r63051 r63057 1 2010-07-10 Darin Adler <darin@apple.com> 2 3 Reviewed by Anders Carlsson. 4 5 Enhance content attribute reflection for URL attributes, including adding a non-empty option 6 https://bugs.webkit.org/show_bug.cgi?id=42040 7 8 The current test results show many failures, and we should follow up with fixes 9 either to the DOM implementation, or to the test result expectations. 10 11 * fast/dom/URL-attribute-reflection-expected.txt: Added. 12 * fast/dom/URL-attribute-reflection.html: Added. 13 * fast/dom/script-tests/URL-attribute-reflection.js: Added. 14 1 15 2010-07-10 Sam Weinig <sam@webkit.org> 2 16 -
trunk/WebCore/ChangeLog
r63054 r63057 1 2010-07-10 Darin Adler <darin@apple.com> 2 3 Reviewed by Anders Carlsson. 4 5 Enhance content attribute reflection for URL attributes, including adding a non-empty option 6 https://bugs.webkit.org/show_bug.cgi?id=42040 7 8 Test: fast/dom/URL-attribute-reflection.html 9 10 Changed syntax from [ReflectURL] to [Reflect,URL] and also added support for 11 a new option, NonEmpty, which implements the non-empty URL concept from the 12 HTML5 specification. 13 14 * bindings/scripts/CodeGenerator.pm: Changed code to expect the Reflect and URL 15 extended attributes to come in separately. The URL one simply means "the string 16 of this attribute is a URL", since we don't have a distinct type for URL. Also 17 added a new NonEmpty extended attribute. 18 19 * bindings/scripts/CodeGeneratorJS.pm: Removed now-unneeded code to handle ReflectURL. 20 * bindings/scripts/CodeGeneratorV8.pm: Ditto. 21 22 * bindings/scripts/test/CPP/WebDOMTestObj.cpp: Updated for new added test cases 23 and the fix I made to the reflectedCustomURLAttr test. 24 * bindings/scripts/test/CPP/WebDOMTestObj.h: Ditto. 25 * bindings/scripts/test/GObject/WebKitDOMTestObj.cpp: Ditto. 26 * bindings/scripts/test/GObject/WebKitDOMTestObj.h: Ditto. 27 * bindings/scripts/test/JS/JSTestObj.cpp: Ditto. 28 * bindings/scripts/test/JS/JSTestObj.h: Ditto. 29 * bindings/scripts/test/ObjC/DOMTestObj.h: Ditto. 30 * bindings/scripts/test/ObjC/DOMTestObj.mm: Ditto. 31 * bindings/scripts/test/V8/V8TestObj.cpp: Ditto. Also, for some reason the V8 32 bindig writes out the keywords into the generated file as comments, so the keyword 33 change had a direct efffect on the output file. 34 35 * bindings/scripts/test/TestObj.idl: Changed the test cases for ReflectURL to use 36 the new syntax. Added test cases for NonEmpty. Fixed the name of 37 reflectedNonEmptyURLAttr, which accidentally was repeating reflectedURLAttr 38 instead; never noticed because we never compile the test output. 39 40 * dom/Element.cpp: 41 (WebCore::Element::getNonEmptyURLAttribute): Added. For use by NonEmpty and also 42 by any code that wants to implement the non-empty URL content attribute semantic. 43 * dom/Element.h: Ditto. 44 45 * html/HTMLAnchorElement.idl: Use Reflect,URL instead of ReflectURL. 46 * html/HTMLAreaElement.idl: Ditto. 47 * html/HTMLFrameElement.idl: Ditto. 48 * html/HTMLImageElement.idl: Ditto. 49 * html/HTMLInputElement.idl: Ditto. 50 * html/HTMLLinkElement.idl: Ditto. 51 * html/HTMLMediaElement.idl: Ditto. 52 * html/HTMLObjectElement.idl: Ditto. 53 * html/HTMLScriptElement.idl: Ditto. 54 * html/HTMLVideoElement.idl: Ditto. 55 1 56 2010-07-10 Tony Gentilcore <tonyg@chromium.org> 2 57 -
trunk/WebCore/bindings/scripts/CodeGenerator.pm
r62549 r63057 4 4 # Copyright (C) 2005 Nikolas Zimmermann <wildfox@kde.org> 5 5 # Copyright (C) 2006 Samuel Weinig <sam.weinig@gmail.com> 6 # Copyright (C) 2007 Apple Inc. All rights reserved.6 # Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved. 7 7 # Copyright (C) 2009 Cameron McCormack <cam@mcc.id.au> 8 8 # … … 403 403 my ($generator, $implIncludes, $interfaceName, $attribute) = @_; 404 404 405 my $contentAttributeName = $attribute->signature->extendedAttributes->{"Reflect"} 406 || $attribute->signature->extendedAttributes->{"ReflectURL"}; 405 my $contentAttributeName = $attribute->signature->extendedAttributes->{"Reflect"}; 407 406 return undef if !$contentAttributeName; 408 407 … … 426 425 427 426 my $functionName; 428 if ($attribute->signature->extendedAttributes->{"ReflectURL"}) { 429 $functionName = "getURLAttribute"; 427 if ($attribute->signature->extendedAttributes->{"URL"}) { 428 if ($attribute->signature->extendedAttributes->{"NonEmpty"}) { 429 $functionName = "getNonEmptyURLAttribute"; 430 } else { 431 $functionName = "getURLAttribute"; 432 } 430 433 } elsif ($attribute->signature->type eq "boolean") { 431 434 $functionName = "hasAttribute"; -
trunk/WebCore/bindings/scripts/CodeGeneratorJS.pm
r62577 r63057 2323 2323 2324 2324 if ($type eq "DOMString") { 2325 return "valueToStringWithNullCheck(exec, $value)" if $signature->extendedAttributes->{"ConvertNullToNullString"} || $signature->extendedAttributes->{"Reflect"} || $signature->extendedAttributes->{"ReflectURL"};2325 return "valueToStringWithNullCheck(exec, $value)" if $signature->extendedAttributes->{"ConvertNullToNullString"} || $signature->extendedAttributes->{"Reflect"}; 2326 2326 return "valueToStringWithUndefinedOrNullCheck(exec, $value)" if $signature->extendedAttributes->{"ConvertUndefinedOrNullToNullString"}; 2327 2327 return "ustringToString($value.toString(exec))"; -
trunk/WebCore/bindings/scripts/CodeGeneratorV8.pm
r62452 r63057 864 864 my $attrType = GetTypeFromSignature($attribute->signature); 865 865 my $reflect = $attribute->signature->extendedAttributes->{"Reflect"}; 866 my $reflectURL = $attribute->signature->extendedAttributes->{"ReflectURL"}; 867 if (($reflect || $reflectURL) && IsNodeSubType($dataNode) && $codeGenerator->IsStringType($attrType)) { 866 if ($reflect && IsNodeSubType($dataNode) && $codeGenerator->IsStringType($attrType)) { 868 867 # Generate super-compact call for regular attribute setter: 869 my $contentAttributeName = ($reflect || $reflectURL) eq "1" ? lc $attrName : ($reflect || $reflectURL);868 my $contentAttributeName = $reflect eq "1" ? lc $attrName : $reflect; 870 869 my $namespace = $codeGenerator->NamespaceForAttributeName($interfaceName, $contentAttributeName); 871 870 $implIncludes{"${namespace}.h"} = 1; … … 2679 2678 if ($signature->extendedAttributes->{"ConvertUndefinedOrNullToNullString"}) { 2680 2679 $mode = "WithUndefinedOrNullCheck"; 2681 } elsif ($signature->extendedAttributes->{"ConvertNullToNullString"} || $signature->extendedAttributes->{"Reflect"} || $signature->extendedAttributes->{"ReflectURL"}) {2680 } elsif ($signature->extendedAttributes->{"ConvertNullToNullString"} || $signature->extendedAttributes->{"Reflect"}) { 2682 2681 $mode = "WithNullCheck"; 2683 2682 } -
trunk/WebCore/bindings/scripts/test/CPP/WebDOMTestObj.cpp
r62452 r63057 241 241 } 242 242 243 WebDOMString WebDOMTestObj::reflectedNonEmptyURLAttr() const 244 { 245 if (!impl()) 246 return WebDOMString(); 247 248 return static_cast<const WebCore::String&>(impl()->getNonEmptyURLAttribute(WebCore::HTMLNames::reflectednonemptyurlattrAttr)); 249 } 250 251 void WebDOMTestObj::setReflectedNonEmptyURLAttr(const WebDOMString& newReflectedNonEmptyURLAttr) 252 { 253 if (!impl()) 254 return; 255 256 impl()->setAttribute(WebCore::HTMLNames::reflectednonemptyurlattrAttr, newReflectedNonEmptyURLAttr); 257 } 258 243 259 WebDOMString WebDOMTestObj::reflectedStringAttr() const 244 260 { … … 289 305 } 290 306 291 WebDOMString WebDOMTestObj::reflected URLAttr() const307 WebDOMString WebDOMTestObj::reflectedCustomURLAttr() const 292 308 { 293 309 if (!impl()) … … 297 313 } 298 314 299 void WebDOMTestObj::setReflectedURLAttr(const WebDOMString& newReflectedURLAttr) 300 { 301 if (!impl()) 302 return; 303 304 impl()->setAttribute(WebCore::HTMLNames::customContentURLAttrAttr, newReflectedURLAttr); 315 void WebDOMTestObj::setReflectedCustomURLAttr(const WebDOMString& newReflectedCustomURLAttr) 316 { 317 if (!impl()) 318 return; 319 320 impl()->setAttribute(WebCore::HTMLNames::customContentURLAttrAttr, newReflectedCustomURLAttr); 321 } 322 323 WebDOMString WebDOMTestObj::reflectedCustomNonEmptyURLAttr() const 324 { 325 if (!impl()) 326 return WebDOMString(); 327 328 return static_cast<const WebCore::String&>(impl()->getNonEmptyURLAttribute(WebCore::HTMLNames::customContentNonEmptyURLAttrAttr)); 329 } 330 331 void WebDOMTestObj::setReflectedCustomNonEmptyURLAttr(const WebDOMString& newReflectedCustomNonEmptyURLAttr) 332 { 333 if (!impl()) 334 return; 335 336 impl()->setAttribute(WebCore::HTMLNames::customContentNonEmptyURLAttrAttr, newReflectedCustomNonEmptyURLAttr); 305 337 } 306 338 -
trunk/WebCore/bindings/scripts/test/CPP/WebDOMTestObj.h
r62452 r63057 64 64 WebDOMString reflectedURLAttr() const; 65 65 void setReflectedURLAttr(const WebDOMString&); 66 WebDOMString reflectedNonEmptyURLAttr() const; 67 void setReflectedNonEmptyURLAttr(const WebDOMString&); 66 68 WebDOMString reflectedStringAttr() const; 67 69 void setReflectedStringAttr(const WebDOMString&); … … 70 72 bool reflectedCustomBooleanAttr() const; 71 73 void setReflectedCustomBooleanAttr(bool); 72 WebDOMString reflectedURLAttr() const; 73 void setReflectedURLAttr(const WebDOMString&); 74 WebDOMString reflectedCustomURLAttr() const; 75 void setReflectedCustomURLAttr(const WebDOMString&); 76 WebDOMString reflectedCustomNonEmptyURLAttr() const; 77 void setReflectedCustomNonEmptyURLAttr(const WebDOMString&); 74 78 int attrWithGetterException() const; 75 79 void setAttrWithGetterException(int); -
trunk/WebCore/bindings/scripts/test/GObject/WebKitDOMTestObj.cpp
r62452 r63057 181 181 webkit_dom_test_obj_idb_key(WebKitDOMTestObj* self, WebKitDOMIDBKey* key) 182 182 { 183 WebCore::JSMainThreadNullState state; 183 184 g_return_if_fail(self); 184 185 WebCore::TestObj * item = WebKit::core(self); … … 556 557 557 558 gchar* 559 webkit_dom_test_obj_get_reflected_non_empty_url_attr(WebKitDOMTestObj* self) 560 { 561 WebCore::JSMainThreadNullState state; 562 g_return_val_if_fail(self, 0); 563 WebCore::TestObj * item = WebKit::core(self); 564 gchar* res = convertToUTF8String(item->getNonEmptyURLAttribute(WebCore::HTMLNames::reflectednonemptyurlattrAttr)); 565 return res; 566 } 567 568 void 569 webkit_dom_test_obj_set_reflected_non_empty_url_attr(WebKitDOMTestObj* self, gchar* value) 570 { 571 WebCore::JSMainThreadNullState state; 572 g_return_if_fail(self); 573 WebCore::TestObj * item = WebKit::core(self); 574 g_return_if_fail(value); 575 WebCore::String converted_value = WebCore::String::fromUTF8(value); 576 item->setAttribute(WebCore::HTMLNames::reflectednonemptyurlattrAttr, converted_value); 577 } 578 579 gchar* 558 580 webkit_dom_test_obj_get_reflected_string_attr(WebKitDOMTestObj* self) 559 581 { … … 615 637 616 638 gchar* 617 webkit_dom_test_obj_get_reflected_ url_attr(WebKitDOMTestObj* self)639 webkit_dom_test_obj_get_reflected_custom_url_attr(WebKitDOMTestObj* self) 618 640 { 619 641 WebCore::JSMainThreadNullState state; … … 625 647 626 648 void 627 webkit_dom_test_obj_set_reflected_ url_attr(WebKitDOMTestObj* self, gchar* value)649 webkit_dom_test_obj_set_reflected_custom_url_attr(WebKitDOMTestObj* self, gchar* value) 628 650 { 629 651 WebCore::JSMainThreadNullState state; … … 633 655 WebCore::String converted_value = WebCore::String::fromUTF8(value); 634 656 item->setAttribute(WebCore::HTMLNames::customContentURLAttrAttr, converted_value); 657 } 658 659 gchar* 660 webkit_dom_test_obj_get_reflected_custom_non_empty_url_attr(WebKitDOMTestObj* self) 661 { 662 WebCore::JSMainThreadNullState state; 663 g_return_val_if_fail(self, 0); 664 WebCore::TestObj * item = WebKit::core(self); 665 gchar* res = convertToUTF8String(item->getNonEmptyURLAttribute(WebCore::HTMLNames::customContentNonEmptyURLAttrAttr)); 666 return res; 667 } 668 669 void 670 webkit_dom_test_obj_set_reflected_custom_non_empty_url_attr(WebKitDOMTestObj* self, gchar* value) 671 { 672 WebCore::JSMainThreadNullState state; 673 g_return_if_fail(self); 674 WebCore::TestObj * item = WebKit::core(self); 675 g_return_if_fail(value); 676 WebCore::String converted_value = WebCore::String::fromUTF8(value); 677 item->setAttribute(WebCore::HTMLNames::customContentNonEmptyURLAttrAttr, converted_value); 635 678 } 636 679 … … 894 937 PROP_REFLECTED_BOOLEAN_ATTR, 895 938 PROP_REFLECTED_URL_ATTR, 939 PROP_REFLECTED_NON_EMPTY_URL_ATTR, 896 940 PROP_REFLECTED_STRING_ATTR, 897 941 PROP_REFLECTED_CUSTOM_INTEGRAL_ATTR, 898 942 PROP_REFLECTED_CUSTOM_BOOLEAN_ATTR, 899 PROP_REFLECTED_URL_ATTR, 943 PROP_REFLECTED_CUSTOM_URL_ATTR, 944 PROP_REFLECTED_CUSTOM_NON_EMPTY_URL_ATTR, 900 945 PROP_ATTR_WITH_GETTER_EXCEPTION, 901 946 PROP_ATTR_WITH_SETTER_EXCEPTION, … … 976 1021 break; 977 1022 } 1023 case PROP_REFLECTED_NON_EMPTY_URL_ATTR: 1024 { 1025 coreSelf->setAttribute(WebCore::HTMLNames::reflectednonemptyurlattrAttr, WebCore::String::fromUTF8(g_value_get_string(value))); 1026 break; 1027 } 978 1028 case PROP_REFLECTED_STRING_ATTR: 979 1029 { … … 991 1041 break; 992 1042 } 993 case PROP_REFLECTED_ URL_ATTR:1043 case PROP_REFLECTED_CUSTOM_URL_ATTR: 994 1044 { 995 1045 coreSelf->setAttribute(WebCore::HTMLNames::customContentURLAttrAttr, WebCore::String::fromUTF8(g_value_get_string(value))); 1046 break; 1047 } 1048 case PROP_REFLECTED_CUSTOM_NON_EMPTY_URL_ATTR: 1049 { 1050 coreSelf->setAttribute(WebCore::HTMLNames::customContentNonEmptyURLAttrAttr, WebCore::String::fromUTF8(g_value_get_string(value))); 996 1051 break; 997 1052 } … … 1121 1176 break; 1122 1177 } 1178 case PROP_REFLECTED_NON_EMPTY_URL_ATTR: 1179 { 1180 g_value_take_string(value, convertToUTF8String(coreSelf->getNonEmptyURLAttribute(WebCore::HTMLNames::reflectednonemptyurlattrAttr))); 1181 break; 1182 } 1123 1183 case PROP_REFLECTED_STRING_ATTR: 1124 1184 { … … 1136 1196 break; 1137 1197 } 1138 case PROP_REFLECTED_ URL_ATTR:1198 case PROP_REFLECTED_CUSTOM_URL_ATTR: 1139 1199 { 1140 1200 g_value_take_string(value, convertToUTF8String(coreSelf->getURLAttribute(WebCore::HTMLNames::customContentURLAttrAttr))); 1201 break; 1202 } 1203 case PROP_REFLECTED_CUSTOM_NON_EMPTY_URL_ATTR: 1204 { 1205 g_value_take_string(value, convertToUTF8String(coreSelf->getNonEmptyURLAttribute(WebCore::HTMLNames::customContentNonEmptyURLAttrAttr))); 1141 1206 break; 1142 1207 } … … 1321 1386 WEBKIT_PARAM_READWRITE)); 1322 1387 g_object_class_install_property(gobjectClass, 1388 PROP_REFLECTED_NON_EMPTY_URL_ATTR, 1389 g_param_spec_string("reflected-non-empty-url-attr", /* name */ 1390 "test_obj_reflected-non-empty-url-attr", /* short description */ 1391 "read-write gchar* TestObj.reflected-non-empty-url-attr", /* longer - could do with some extra doc stuff here */ 1392 "", /* default */ 1393 WEBKIT_PARAM_READWRITE)); 1394 g_object_class_install_property(gobjectClass, 1323 1395 PROP_REFLECTED_STRING_ATTR, 1324 1396 g_param_spec_string("reflected-string-attr", /* name */ … … 1344 1416 WEBKIT_PARAM_READWRITE)); 1345 1417 g_object_class_install_property(gobjectClass, 1346 PROP_REFLECTED_URL_ATTR, 1347 g_param_spec_string("reflected-url-attr", /* name */ 1348 "test_obj_reflected-url-attr", /* short description */ 1349 "read-write gchar* TestObj.reflected-url-attr", /* longer - could do with some extra doc stuff here */ 1418 PROP_REFLECTED_CUSTOM_URL_ATTR, 1419 g_param_spec_string("reflected-custom-url-attr", /* name */ 1420 "test_obj_reflected-custom-url-attr", /* short description */ 1421 "read-write gchar* TestObj.reflected-custom-url-attr", /* longer - could do with some extra doc stuff here */ 1422 "", /* default */ 1423 WEBKIT_PARAM_READWRITE)); 1424 g_object_class_install_property(gobjectClass, 1425 PROP_REFLECTED_CUSTOM_NON_EMPTY_URL_ATTR, 1426 g_param_spec_string("reflected-custom-non-empty-url-attr", /* name */ 1427 "test_obj_reflected-custom-non-empty-url-attr", /* short description */ 1428 "read-write gchar* TestObj.reflected-custom-non-empty-url-attr", /* longer - could do with some extra doc stuff here */ 1350 1429 "", /* default */ 1351 1430 WEBKIT_PARAM_READWRITE)); -
trunk/WebCore/bindings/scripts/test/GObject/WebKitDOMTestObj.h
r62452 r63057 189 189 190 190 WEBKIT_API gchar* 191 webkit_dom_test_obj_get_reflected_non_empty_url_attr(WebKitDOMTestObj* self); 192 193 WEBKIT_API void 194 webkit_dom_test_obj_set_reflected_non_empty_url_attr(WebKitDOMTestObj* self, gchar* value); 195 196 WEBKIT_API gchar* 191 197 webkit_dom_test_obj_get_reflected_string_attr(WebKitDOMTestObj* self); 192 198 … … 207 213 208 214 WEBKIT_API gchar* 209 webkit_dom_test_obj_get_reflected_url_attr(WebKitDOMTestObj* self); 210 211 WEBKIT_API void 212 webkit_dom_test_obj_set_reflected_url_attr(WebKitDOMTestObj* self, gchar* value); 215 webkit_dom_test_obj_get_reflected_custom_url_attr(WebKitDOMTestObj* self); 216 217 WEBKIT_API void 218 webkit_dom_test_obj_set_reflected_custom_url_attr(WebKitDOMTestObj* self, gchar* value); 219 220 WEBKIT_API gchar* 221 webkit_dom_test_obj_get_reflected_custom_non_empty_url_attr(WebKitDOMTestObj* self); 222 223 WEBKIT_API void 224 webkit_dom_test_obj_set_reflected_custom_non_empty_url_attr(WebKitDOMTestObj* self, gchar* value); 213 225 214 226 WEBKIT_API glong -
trunk/WebCore/bindings/scripts/test/JS/JSTestObj.cpp
r62452 r63057 50 50 #endif 51 51 52 static const HashTableValue JSTestObjTableValues[3 0] =52 static const HashTableValue JSTestObjTableValues[32] = 53 53 { 54 54 { "readOnlyIntAttr", DontDelete | ReadOnly, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjReadOnlyIntAttr), (intptr_t)0 THUNK_GENERATOR(0) }, … … 64 64 { "reflectedBooleanAttr", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjReflectedBooleanAttr), (intptr_t)setJSTestObjReflectedBooleanAttr THUNK_GENERATOR(0) }, 65 65 { "reflectedURLAttr", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjReflectedURLAttr), (intptr_t)setJSTestObjReflectedURLAttr THUNK_GENERATOR(0) }, 66 { "reflectedNonEmptyURLAttr", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjReflectedNonEmptyURLAttr), (intptr_t)setJSTestObjReflectedNonEmptyURLAttr THUNK_GENERATOR(0) }, 66 67 { "reflectedStringAttr", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjReflectedStringAttr), (intptr_t)setJSTestObjReflectedStringAttr THUNK_GENERATOR(0) }, 67 68 { "reflectedCustomIntegralAttr", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjReflectedCustomIntegralAttr), (intptr_t)setJSTestObjReflectedCustomIntegralAttr THUNK_GENERATOR(0) }, 68 69 { "reflectedCustomBooleanAttr", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjReflectedCustomBooleanAttr), (intptr_t)setJSTestObjReflectedCustomBooleanAttr THUNK_GENERATOR(0) }, 69 { "reflectedURLAttr", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjReflectedURLAttr), (intptr_t)setJSTestObjReflectedURLAttr THUNK_GENERATOR(0) }, 70 { "reflectedCustomURLAttr", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjReflectedCustomURLAttr), (intptr_t)setJSTestObjReflectedCustomURLAttr THUNK_GENERATOR(0) }, 71 { "reflectedCustomNonEmptyURLAttr", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjReflectedCustomNonEmptyURLAttr), (intptr_t)setJSTestObjReflectedCustomNonEmptyURLAttr THUNK_GENERATOR(0) }, 70 72 { "attrWithGetterException", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjAttrWithGetterException), (intptr_t)setJSTestObjAttrWithGetterException THUNK_GENERATOR(0) }, 71 73 { "attrWithSetterException", DontDelete, (intptr_t)static_cast<PropertySlot::GetValueFunc>(jsTestObjAttrWithSetterException), (intptr_t)setJSTestObjAttrWithSetterException THUNK_GENERATOR(0) }, … … 91 93 92 94 #undef THUNK_GENERATOR 93 static JSC_CONST_HASHTABLE HashTable JSTestObjTable = { 6 9, 63, JSTestObjTableValues, 0 };95 static JSC_CONST_HASHTABLE HashTable JSTestObjTable = { 68, 63, JSTestObjTableValues, 0 }; 94 96 /* Hash table for constructor */ 95 97 #if ENABLE(JIT) … … 337 339 } 338 340 341 JSValue jsTestObjReflectedNonEmptyURLAttr(ExecState* exec, JSValue slotBase, const Identifier&) 342 { 343 JSTestObj* castedThis = static_cast<JSTestObj*>(asObject(slotBase)); 344 UNUSED_PARAM(exec); 345 TestObj* imp = static_cast<TestObj*>(castedThis->impl()); 346 JSValue result = jsString(exec, imp->getNonEmptyURLAttribute(WebCore::HTMLNames::reflectednonemptyurlattrAttr)); 347 return result; 348 } 349 339 350 JSValue jsTestObjReflectedStringAttr(ExecState* exec, JSValue slotBase, const Identifier&) 340 351 { … … 364 375 } 365 376 366 JSValue jsTestObjReflected URLAttr(ExecState* exec, JSValue slotBase, const Identifier&)377 JSValue jsTestObjReflectedCustomURLAttr(ExecState* exec, JSValue slotBase, const Identifier&) 367 378 { 368 379 JSTestObj* castedThis = static_cast<JSTestObj*>(asObject(slotBase)); … … 370 381 TestObj* imp = static_cast<TestObj*>(castedThis->impl()); 371 382 JSValue result = jsString(exec, imp->getURLAttribute(WebCore::HTMLNames::customContentURLAttrAttr)); 383 return result; 384 } 385 386 JSValue jsTestObjReflectedCustomNonEmptyURLAttr(ExecState* exec, JSValue slotBase, const Identifier&) 387 { 388 JSTestObj* castedThis = static_cast<JSTestObj*>(asObject(slotBase)); 389 UNUSED_PARAM(exec); 390 TestObj* imp = static_cast<TestObj*>(castedThis->impl()); 391 JSValue result = jsString(exec, imp->getNonEmptyURLAttribute(WebCore::HTMLNames::customContentNonEmptyURLAttrAttr)); 372 392 return result; 373 393 } … … 559 579 } 560 580 581 void setJSTestObjReflectedNonEmptyURLAttr(ExecState* exec, JSObject* thisObject, JSValue value) 582 { 583 JSTestObj* castedThis = static_cast<JSTestObj*>(thisObject); 584 TestObj* imp = static_cast<TestObj*>(castedThis->impl()); 585 imp->setAttribute(WebCore::HTMLNames::reflectednonemptyurlattrAttr, valueToStringWithNullCheck(exec, value)); 586 } 587 561 588 void setJSTestObjReflectedStringAttr(ExecState* exec, JSObject* thisObject, JSValue value) 562 589 { … … 580 607 } 581 608 582 void setJSTestObjReflected URLAttr(ExecState* exec, JSObject* thisObject, JSValue value)609 void setJSTestObjReflectedCustomURLAttr(ExecState* exec, JSObject* thisObject, JSValue value) 583 610 { 584 611 JSTestObj* castedThis = static_cast<JSTestObj*>(thisObject); 585 612 TestObj* imp = static_cast<TestObj*>(castedThis->impl()); 586 613 imp->setAttribute(WebCore::HTMLNames::customContentURLAttrAttr, valueToStringWithNullCheck(exec, value)); 614 } 615 616 void setJSTestObjReflectedCustomNonEmptyURLAttr(ExecState* exec, JSObject* thisObject, JSValue value) 617 { 618 JSTestObj* castedThis = static_cast<JSTestObj*>(thisObject); 619 TestObj* imp = static_cast<TestObj*>(castedThis->impl()); 620 imp->setAttribute(WebCore::HTMLNames::customContentNonEmptyURLAttrAttr, valueToStringWithNullCheck(exec, value)); 587 621 } 588 622 -
trunk/WebCore/bindings/scripts/test/JS/JSTestObj.h
r62452 r63057 140 140 JSC::JSValue jsTestObjReflectedURLAttr(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&); 141 141 void setJSTestObjReflectedURLAttr(JSC::ExecState*, JSC::JSObject*, JSC::JSValue); 142 JSC::JSValue jsTestObjReflectedNonEmptyURLAttr(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&); 143 void setJSTestObjReflectedNonEmptyURLAttr(JSC::ExecState*, JSC::JSObject*, JSC::JSValue); 142 144 JSC::JSValue jsTestObjReflectedStringAttr(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&); 143 145 void setJSTestObjReflectedStringAttr(JSC::ExecState*, JSC::JSObject*, JSC::JSValue); … … 146 148 JSC::JSValue jsTestObjReflectedCustomBooleanAttr(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&); 147 149 void setJSTestObjReflectedCustomBooleanAttr(JSC::ExecState*, JSC::JSObject*, JSC::JSValue); 148 JSC::JSValue jsTestObjReflectedURLAttr(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&); 149 void setJSTestObjReflectedURLAttr(JSC::ExecState*, JSC::JSObject*, JSC::JSValue); 150 JSC::JSValue jsTestObjReflectedCustomURLAttr(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&); 151 void setJSTestObjReflectedCustomURLAttr(JSC::ExecState*, JSC::JSObject*, JSC::JSValue); 152 JSC::JSValue jsTestObjReflectedCustomNonEmptyURLAttr(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&); 153 void setJSTestObjReflectedCustomNonEmptyURLAttr(JSC::ExecState*, JSC::JSObject*, JSC::JSValue); 150 154 JSC::JSValue jsTestObjAttrWithGetterException(JSC::ExecState*, JSC::JSValue, const JSC::Identifier&); 151 155 void setJSTestObjAttrWithGetterException(JSC::ExecState*, JSC::JSObject*, JSC::JSValue); -
trunk/WebCore/bindings/scripts/test/ObjC/DOMTestObj.h
r62452 r63057 57 57 - (NSString *)reflectedURLAttr; 58 58 - (void)setReflectedURLAttr:(NSString *)newReflectedURLAttr; 59 - (NSString *)reflectedNonEmptyURLAttr; 60 - (void)setReflectedNonEmptyURLAttr:(NSString *)newReflectedNonEmptyURLAttr; 59 61 - (NSString *)reflectedStringAttr; 60 62 - (void)setReflectedStringAttr:(NSString *)newReflectedStringAttr; … … 63 65 - (BOOL)reflectedCustomBooleanAttr; 64 66 - (void)setReflectedCustomBooleanAttr:(BOOL)newReflectedCustomBooleanAttr; 65 - (NSString *)reflectedURLAttr; 66 - (void)setReflectedURLAttr:(NSString *)newReflectedURLAttr; 67 - (NSString *)reflectedCustomURLAttr; 68 - (void)setReflectedCustomURLAttr:(NSString *)newReflectedCustomURLAttr; 69 - (NSString *)reflectedCustomNonEmptyURLAttr; 70 - (void)setReflectedCustomNonEmptyURLAttr:(NSString *)newReflectedCustomNonEmptyURLAttr; 67 71 - (int)attrWithGetterException; 68 72 - (void)setAttrWithGetterException:(int)newAttrWithGetterException; -
trunk/WebCore/bindings/scripts/test/ObjC/DOMTestObj.mm
r62452 r63057 203 203 } 204 204 205 - (NSString *)reflectedNonEmptyURLAttr 206 { 207 WebCore::JSMainThreadNullState state; 208 return IMPL->getNonEmptyURLAttribute(WebCore::HTMLNames::reflectednonemptyurlattrAttr); 209 } 210 211 - (void)setReflectedNonEmptyURLAttr:(NSString *)newReflectedNonEmptyURLAttr 212 { 213 WebCore::JSMainThreadNullState state; 214 IMPL->setAttribute(WebCore::HTMLNames::reflectednonemptyurlattrAttr, newReflectedNonEmptyURLAttr); 215 } 216 205 217 - (NSString *)reflectedStringAttr 206 218 { … … 239 251 } 240 252 241 - (NSString *)reflected URLAttr253 - (NSString *)reflectedCustomURLAttr 242 254 { 243 255 WebCore::JSMainThreadNullState state; … … 245 257 } 246 258 247 - (void)setReflectedURLAttr:(NSString *)newReflectedURLAttr 248 { 249 WebCore::JSMainThreadNullState state; 250 IMPL->setAttribute(WebCore::HTMLNames::customContentURLAttrAttr, newReflectedURLAttr); 259 - (void)setReflectedCustomURLAttr:(NSString *)newReflectedCustomURLAttr 260 { 261 WebCore::JSMainThreadNullState state; 262 IMPL->setAttribute(WebCore::HTMLNames::customContentURLAttrAttr, newReflectedCustomURLAttr); 263 } 264 265 - (NSString *)reflectedCustomNonEmptyURLAttr 266 { 267 WebCore::JSMainThreadNullState state; 268 return IMPL->getNonEmptyURLAttribute(WebCore::HTMLNames::customContentNonEmptyURLAttrAttr); 269 } 270 271 - (void)setReflectedCustomNonEmptyURLAttr:(NSString *)newReflectedCustomNonEmptyURLAttr 272 { 273 WebCore::JSMainThreadNullState state; 274 IMPL->setAttribute(WebCore::HTMLNames::customContentNonEmptyURLAttrAttr, newReflectedCustomNonEmptyURLAttr); 251 275 } 252 276 -
trunk/WebCore/bindings/scripts/test/TestObj.idl
r62452 r63057 1 1 /* 2 2 * Copyright (C) 2009 Google Inc. All rights reserved. 3 * Copyright (C) 2010 Apple Inc. All rights reserved. 3 4 * 4 5 * Redistribution and use in source and binary formstrArg, with or without … … 45 46 attribute [Reflect] long reflectedIntegralAttr; 46 47 attribute [Reflect] boolean reflectedBooleanAttr; 47 attribute [ReflectURL] DOMString reflectedURLAttr; 48 attribute [Reflect,URL] DOMString reflectedURLAttr; 49 attribute [Reflect,NonEmpty,URL] DOMString reflectedNonEmptyURLAttr; 48 50 attribute [Reflect=customContentStringAttr] DOMString reflectedStringAttr; 49 51 attribute [Reflect=customContentIntegralAttr] long reflectedCustomIntegralAttr; 50 52 attribute [Reflect=customContentBooleanAttr] boolean reflectedCustomBooleanAttr; 51 attribute [ReflectURL=customContentURLAttr] DOMString reflectedURLAttr; 53 attribute [Reflect=customContentURLAttr,URL] DOMString reflectedCustomURLAttr; 54 attribute [Reflect=customContentNonEmptyURLAttr,NonEmpty,URL] DOMString reflectedCustomNonEmptyURLAttr; 52 55 53 56 // Methods -
trunk/WebCore/bindings/scripts/test/V8/V8TestObj.cpp
r62452 r63057 219 219 } 220 220 221 static v8::Handle<v8::Value> reflectedNonEmptyURLAttrAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) 222 { 223 INC_STATS("DOM.TestObj.reflectedNonEmptyURLAttr._get"); 224 TestObj* imp = V8TestObj::toNative(info.Holder()); 225 return v8String(imp->getNonEmptyURLAttribute(WebCore::HTMLNames::reflectednonemptyurlattrAttr)); 226 } 227 228 static void reflectedNonEmptyURLAttrAttrSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info) 229 { 230 INC_STATS("DOM.TestObj.reflectedNonEmptyURLAttr._set"); 231 TestObj* imp = V8TestObj::toNative(info.Holder()); 232 V8Parameter<WithNullCheck> v = value; 233 imp->setAttribute(WebCore::HTMLNames::reflectednonemptyurlattrAttr, v); 234 return; 235 } 236 221 237 static v8::Handle<v8::Value> reflectedStringAttrAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) 222 238 { … … 267 283 } 268 284 269 static v8::Handle<v8::Value> reflected URLAttrAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info)270 { 271 INC_STATS("DOM.TestObj.reflected URLAttr._get");285 static v8::Handle<v8::Value> reflectedCustomURLAttrAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) 286 { 287 INC_STATS("DOM.TestObj.reflectedCustomURLAttr._get"); 272 288 TestObj* imp = V8TestObj::toNative(info.Holder()); 273 289 return v8String(imp->getURLAttribute(WebCore::HTMLNames::customContentURLAttrAttr)); 274 290 } 275 291 276 static void reflected URLAttrAttrSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info)277 { 278 INC_STATS("DOM.TestObj.reflected URLAttr._set");292 static void reflectedCustomURLAttrAttrSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info) 293 { 294 INC_STATS("DOM.TestObj.reflectedCustomURLAttr._set"); 279 295 TestObj* imp = V8TestObj::toNative(info.Holder()); 280 296 V8Parameter<WithNullCheck> v = value; 281 297 imp->setAttribute(WebCore::HTMLNames::customContentURLAttrAttr, v); 298 return; 299 } 300 301 static v8::Handle<v8::Value> reflectedCustomNonEmptyURLAttrAttrGetter(v8::Local<v8::String> name, const v8::AccessorInfo& info) 302 { 303 INC_STATS("DOM.TestObj.reflectedCustomNonEmptyURLAttr._get"); 304 TestObj* imp = V8TestObj::toNative(info.Holder()); 305 return v8String(imp->getNonEmptyURLAttribute(WebCore::HTMLNames::customContentNonEmptyURLAttrAttr)); 306 } 307 308 static void reflectedCustomNonEmptyURLAttrAttrSetter(v8::Local<v8::String> name, v8::Local<v8::Value> value, const v8::AccessorInfo& info) 309 { 310 INC_STATS("DOM.TestObj.reflectedCustomNonEmptyURLAttr._set"); 311 TestObj* imp = V8TestObj::toNative(info.Holder()); 312 V8Parameter<WithNullCheck> v = value; 313 imp->setAttribute(WebCore::HTMLNames::customContentNonEmptyURLAttrAttr, v); 282 314 return; 283 315 } … … 913 945 // Attribute 'reflectedBooleanAttr' (Type: 'attribute' ExtAttr: 'Reflect') 914 946 {"reflectedBooleanAttr", TestObjInternal::reflectedBooleanAttrAttrGetter, TestObjInternal::reflectedBooleanAttrAttrSetter, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */}, 915 // Attribute 'reflectedURLAttr' (Type: 'attribute' ExtAttr: ' ReflectURL')947 // Attribute 'reflectedURLAttr' (Type: 'attribute' ExtAttr: 'URL Reflect') 916 948 {"reflectedURLAttr", TestObjInternal::reflectedURLAttrAttrGetter, TestObjInternal::reflectedURLAttrAttrSetter, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */}, 949 // Attribute 'reflectedNonEmptyURLAttr' (Type: 'attribute' ExtAttr: 'URL NonEmpty Reflect') 950 {"reflectedNonEmptyURLAttr", TestObjInternal::reflectedNonEmptyURLAttrAttrGetter, TestObjInternal::reflectedNonEmptyURLAttrAttrSetter, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */}, 917 951 // Attribute 'reflectedStringAttr' (Type: 'attribute' ExtAttr: 'Reflect') 918 952 {"reflectedStringAttr", TestObjInternal::reflectedStringAttrAttrGetter, TestObjInternal::reflectedStringAttrAttrSetter, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */}, … … 921 955 // Attribute 'reflectedCustomBooleanAttr' (Type: 'attribute' ExtAttr: 'Reflect') 922 956 {"reflectedCustomBooleanAttr", TestObjInternal::reflectedCustomBooleanAttrAttrGetter, TestObjInternal::reflectedCustomBooleanAttrAttrSetter, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */}, 923 // Attribute 'reflectedURLAttr' (Type: 'attribute' ExtAttr: 'ReflectURL') 924 {"reflectedURLAttr", TestObjInternal::reflectedURLAttrAttrGetter, TestObjInternal::reflectedURLAttrAttrSetter, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */}, 957 // Attribute 'reflectedCustomURLAttr' (Type: 'attribute' ExtAttr: 'URL Reflect') 958 {"reflectedCustomURLAttr", TestObjInternal::reflectedCustomURLAttrAttrGetter, TestObjInternal::reflectedCustomURLAttrAttrSetter, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */}, 959 // Attribute 'reflectedCustomNonEmptyURLAttr' (Type: 'attribute' ExtAttr: 'URL NonEmpty Reflect') 960 {"reflectedCustomNonEmptyURLAttr", TestObjInternal::reflectedCustomNonEmptyURLAttrAttrGetter, TestObjInternal::reflectedCustomNonEmptyURLAttrAttrSetter, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */}, 925 961 // Attribute 'attrWithGetterException' (Type: 'attribute' ExtAttr: '') 926 962 {"attrWithGetterException", TestObjInternal::attrWithGetterExceptionAttrGetter, TestObjInternal::attrWithGetterExceptionAttrSetter, 0 /* no data */, static_cast<v8::AccessControl>(v8::DEFAULT), static_cast<v8::PropertyAttribute>(v8::None), 0 /* on instance */}, -
trunk/WebCore/dom/Element.cpp
r62596 r63057 1535 1535 } 1536 1536 1537 KURL Element::getNonEmptyURLAttribute(const QualifiedName& name) const 1538 { 1539 #if !ASSERT_DISABLED 1540 if (m_attributeMap) { 1541 if (Attribute* attribute = m_attributeMap->getAttributeItem(name)) 1542 ASSERT(isURLAttribute(attribute)); 1543 } 1544 #endif 1545 String value = deprecatedParseURL(getAttribute(name)); 1546 if (value.isEmpty()) 1547 return KURL(); 1548 return document()->completeURL(value); 1549 } 1550 1537 1551 int Element::getIntegralAttribute(const QualifiedName& attributeName) const 1538 1552 { -
trunk/WebCore/dom/Element.h
r62596 r63057 222 222 223 223 virtual bool isURLAttribute(Attribute*) const; 224 224 225 KURL getURLAttribute(const QualifiedName&) const; 226 KURL getNonEmptyURLAttribute(const QualifiedName&) const; 227 225 228 virtual const QualifiedName& imageSourceAttributeName() const; 226 229 virtual String target() const { return String(); } -
trunk/WebCore/html/HTMLAnchorElement.idl
r61413 r63057 25 25 attribute [Reflect] DOMString charset; 26 26 attribute [Reflect] DOMString coords; 27 attribute [Reflect URL] DOMString href;27 attribute [Reflect,URL] DOMString href; 28 28 attribute [Reflect] DOMString hreflang; 29 29 attribute [Reflect] DOMString name; -
trunk/WebCore/html/HTMLAreaElement.idl
r61413 r63057 25 25 attribute [Reflect] DOMString alt; 26 26 attribute [Reflect] DOMString coords; 27 attribute [Reflect URL] DOMString href;27 attribute [Reflect,URL] DOMString href; 28 28 attribute [Reflect] boolean noHref; 29 29 attribute [Reflect] DOMString shape; -
trunk/WebCore/html/HTMLFrameElement.idl
r62466 r63057 30 30 attribute [Reflect] boolean noResize; 31 31 attribute [Reflect] DOMString scrolling; 32 attribute [Reflect URL] DOMString src;32 attribute [Reflect,URL] DOMString src; 33 33 34 34 // Introduced in DOM Level 2: -
trunk/WebCore/html/HTMLImageElement.idl
r61413 r63057 31 31 attribute [Reflect] long hspace; 32 32 attribute [Reflect] boolean isMap; 33 attribute [Reflect URL=longdesc] DOMString longDesc;34 attribute [Reflect URL] DOMString src;33 attribute [Reflect,URL] DOMString longDesc; 34 attribute [Reflect,URL] DOMString src; 35 35 attribute [Reflect] DOMString useMap; 36 36 attribute [Reflect] long vspace; … … 39 39 // Extensions 40 40 readonly attribute boolean complete; 41 attribute [Reflect URL] DOMString lowsrc;41 attribute [Reflect,URL] DOMString lowsrc; 42 42 readonly attribute long naturalHeight; 43 43 readonly attribute long naturalWidth; -
trunk/WebCore/html/HTMLInputElement.idl
r61413 r63057 52 52 attribute unsigned long size; // Changed string -> long as part of DOM level 2 53 53 #endif 54 attribute [Reflect URL] DOMString src;54 attribute [Reflect,URL] DOMString src; 55 55 attribute [Reflect] DOMString step; 56 56 attribute [ConvertNullToNullString, JSCCustomGetter] DOMString type; // readonly dropped as part of DOM level 2 -
trunk/WebCore/html/HTMLLinkElement.idl
r61413 r63057 24 24 attribute [Reflect] boolean disabled; 25 25 attribute [Reflect] DOMString charset; 26 attribute [Reflect URL] DOMString href;26 attribute [Reflect,URL] DOMString href; 27 27 attribute [Reflect] DOMString hreflang; 28 28 attribute [Reflect] DOMString media; -
trunk/WebCore/html/HTMLMediaElement.idl
r61413 r63057 31 31 32 32 // network state 33 attribute [Reflect URL] DOMString src;33 attribute [Reflect,URL] DOMString src; 34 34 readonly attribute DOMString currentSrc; 35 35 -
trunk/WebCore/html/HTMLObjectElement.idl
r61413 r63057 33 33 attribute [Reflect] DOMString codeBase; 34 34 attribute [Reflect] DOMString codeType; 35 attribute [Reflect URL] DOMString data;35 attribute [Reflect,URL] DOMString data; 36 36 attribute [Reflect] boolean declare; 37 37 attribute [Reflect] DOMString height; -
trunk/WebCore/html/HTMLScriptElement.idl
r61518 r63057 27 27 attribute [Reflect] boolean async; 28 28 attribute [Reflect] boolean defer; 29 attribute [Reflect URL] DOMString src;29 attribute [Reflect,URL] DOMString src; 30 30 attribute [Reflect] DOMString type; 31 31 }; -
trunk/WebCore/html/HTMLVideoElement.idl
r61413 r63057 33 33 readonly attribute unsigned long videoWidth; 34 34 readonly attribute unsigned long videoHeight; 35 attribute [Reflect URL] DOMString poster;35 attribute [Reflect,URL] DOMString poster; 36 36 37 37 readonly attribute boolean webkitSupportsFullscreen;
Note: See TracChangeset
for help on using the changeset viewer.