From 27aa7bc4fa6f168654a8c858f0773e611f679b39 Mon Sep 17 00:00:00 2001 From: Domenic Denicola Date: Wed, 20 Apr 2016 09:56:22 -0400 Subject: [PATCH] Formalize custom element reactions This executes a large portion of the plan laid out in https://github.com/w3c/webcomponents/issues/186, by introducing a new [CEReactions] IDL extended attribute which can be used to indicate that new steps should be inserted related to custom element reactions. It replaces the previous handwaving of "every operation and attribute" with an explicit annotation on every relevant operation, attribute, setter, and deleter. There remains work to do to annotate other specifications across the web platform with this attribute (notably DOM), as well as deal with editing operations. But all such updates will depend on the definition of [CEReactions] added here. --- source | 918 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 471 insertions(+), 447 deletions(-) diff --git a/source b/source index f0877c00644..c443b93805c 100644 --- a/source +++ b/source @@ -4074,7 +4074,9 @@ a.setAttribute('href', 'http://example.com/'); // change the content attribute d

When adding new reflecting IDL attributes corresponding to content attributes of the form "x-vendor-feature", the IDL attribute should be named "vendorFeature" - (i.e. the "x" is dropped from the IDL attribute's name).

+ (i.e. the "x" is dropped from the IDL attribute's name). Such IDL + attributes must have the [CEReactions] extended attribute + specified, if they are not readonly.

@@ -7594,9 +7596,9 @@ http://software.hixie.ch/utilities/js/live-dom-viewer/?%3C%21DOCTYPE%20html%3E..
interface HTMLOptionsCollection : HTMLCollection {
   // inherits item(), namedItem()
   attribute unsigned long length; // shadows inherited length
-  setter void (unsigned long index, HTMLOptionElement? option);
-  void add((HTMLOptionElement or HTMLOptGroupElement) element, optional (HTMLElement or long)? before = null);
-  void remove(long index);
+  [CEReactions] setter void (unsigned long index, HTMLOptionElement? option);
+  [CEReactions] void add((HTMLOptionElement or HTMLOptGroupElement) element, optional (HTMLElement or long)? before = null);
+  [CEReactions] void remove(long index);
   attribute long selectedIndex;
 };
@@ -7795,8 +7797,8 @@ http://software.hixie.ch/utilities/js/live-dom-viewer/?%3C%21DOCTYPE%20html%3E..
[OverrideBuiltins]
 interface DOMStringMap {
   getter DOMString (DOMString name);
-  setter void (DOMString name, DOMString value);
-  deleter void (DOMString name);
+  [CEReactions] setter void (DOMString name, DOMString value);
+  [CEReactions] deleter void (DOMString name);
 };

The supported property names on a DOMStringMap object at any instant @@ -8527,9 +8529,9 @@ partial /*sealed*/ interface Document { // DOM tree accessors getter object (DOMString name); - attribute DOMString title; - attribute DOMString dir; - attribute HTMLElement? body; + [CEReactions] attribute DOMString title; + [CEReactions] attribute DOMString dir; + [CEReactions] attribute HTMLElement? body; readonly attribute HTMLHeadElement? head; [SameObject] readonly attribute HTMLCollection images; [SameObject] readonly attribute HTMLCollection embeds; @@ -8541,18 +8543,18 @@ partial /*sealed*/ interface Document { readonly attribute HTMLOrSVGScriptElement? currentScript; // classic scripts in a document only // dynamic markup insertion - Document open(optional DOMString type = "text/html", optional DOMString replace = ""); + [CEReactions] Document open(optional DOMString type = "text/html", optional DOMString replace = ""); WindowProxy open(DOMString url, DOMString name, DOMString features, optional boolean replace = false); - void close(); - void write(DOMString... text); - void writeln(DOMString... text); + [CEReactions] void close(); + [CEReactions] void write(DOMString... text); + [CEReactions] void writeln(DOMString... text); // user interaction readonly attribute WindowProxy? defaultView; readonly attribute Element? activeElement; boolean hasFocus(); - attribute DOMString designMode; - boolean execCommand(DOMString commandId, optional boolean showUI = false, optional DOMString value = ""); + [CEReactions] attribute DOMString designMode; + [CEReactions] boolean execCommand(DOMString commandId, optional boolean showUI = false, optional DOMString value = ""); boolean queryCommandEnabled(DOMString commandId); boolean queryCommandIndeterm(DOMString commandId); boolean queryCommandState(DOMString commandId); @@ -9218,7 +9220,7 @@ partial /*sealed*/ interface Document {

Loading XML documents

partial interface XMLDocument {
-  boolean load(DOMString url);
+  [CEReactions] boolean load(DOMString url);
 };
@@ -9498,24 +9500,24 @@ partial /*sealed*/ interface Document {
[Constructor]
 interface HTMLElement : Element {
   // metadata attributes
-  attribute DOMString title;
-  attribute DOMString lang;
-  attribute boolean translate;
-  attribute DOMString dir;
+  [CEReactions] attribute DOMString title;
+  [CEReactions] attribute DOMString lang;
+  [CEReactions] attribute boolean translate;
+  [CEReactions] attribute DOMString dir;
   [SameObject] readonly attribute DOMStringMap dataset;
 
   // user interaction
-  attribute boolean hidden;
+  [CEReactions] attribute boolean hidden;
   void click();
-  attribute long tabIndex;
+  [CEReactions] attribute long tabIndex;
   void focus();
   void blur();
-  attribute DOMString accessKey;
+  [CEReactions] attribute DOMString accessKey;
   readonly attribute DOMString accessKeyLabel;
-  attribute boolean draggable;
-  [SameObject, PutForwards=value] readonly attribute DOMTokenList dropzone;
-  attribute HTMLMenuElement? contextMenu;
-  attribute boolean spellcheck;
+  [CEReactions] attribute boolean draggable;
+  [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList dropzone;
+  [CEReactions] attribute HTMLMenuElement? contextMenu;
+  [CEReactions] attribute boolean spellcheck;
   void forceSpellCheck();
 };
 HTMLElement implements GlobalEventHandlers;
@@ -11955,7 +11957,7 @@ gave me some of the songs they wrote. I love sharing my music.</p>
    
DOM interface:
interface HTMLTitleElement : HTMLElement {
-  attribute DOMString text;
+  [CEReactions] attribute DOMString text;
 };
@@ -12046,8 +12048,8 @@ gave me some of the songs they wrote. I love sharing my music.</p>
DOM interface:
interface HTMLBaseElement : HTMLElement {
-  attribute DOMString href;
-  attribute DOMString target;
+  [CEReactions] attribute DOMString href;
+  [CEReactions] attribute DOMString target;
 };
@@ -12214,14 +12216,14 @@ gave me some of the songs they wrote. I love sharing my music.</p>
DOM interface:
interface HTMLLinkElement : HTMLElement {
-  attribute DOMString href;
-  attribute DOMString? crossOrigin;
-  attribute DOMString rel;
-  [SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
-  attribute DOMString media;
-  attribute DOMString hreflang;
-  attribute DOMString type;
-  [SameObject, PutForwards=value] readonly attribute DOMTokenList sizes;
+  [CEReactions] attribute DOMString href;
+  [CEReactions] attribute DOMString? crossOrigin;
+  [CEReactions] attribute DOMString rel;
+  [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
+  [CEReactions] attribute DOMString media;
+  [CEReactions] attribute DOMString hreflang;
+  [CEReactions] attribute DOMString type;
+  [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList sizes;
 };
 HTMLLinkElement implements LinkStyle;
@@ -12634,9 +12636,9 @@ gave me some of the songs they wrote. I love sharing my music.</p>
DOM interface:
interface HTMLMetaElement : HTMLElement {
-  attribute DOMString name;
-  attribute DOMString httpEquiv;
-  attribute DOMString content;
+  [CEReactions] attribute DOMString name;
+  [CEReactions] attribute DOMString httpEquiv;
+  [CEReactions] attribute DOMString content;
 };
@@ -13745,10 +13747,10 @@ people expect to have work and what is necessary.
DOM interface:
interface HTMLStyleElement : HTMLElement {
-  attribute DOMString media;
-  attribute DOMString nonce;
-  attribute DOMString type;
-  attribute boolean scoped;
+  [CEReactions] attribute DOMString media;
+  [CEReactions] attribute DOMString nonce;
+  [CEReactions] attribute DOMString type;
+  [CEReactions] attribute boolean scoped;
 };
 HTMLStyleElement implements LinkStyle;
@@ -16849,7 +16851,7 @@ a friend lost to the
DOM interface:
interface HTMLQuoteElement : HTMLElement {
-  attribute DOMString cite;
+  [CEReactions] attribute DOMString cite;
 };

The HTMLQuoteElement interface is also used by the q element.

@@ -17036,9 +17038,9 @@ be cowed by the possibility.</blockquote>
DOM interface:
interface HTMLOListElement : HTMLElement {
-  attribute boolean reversed;
-  attribute long start;
-  attribute DOMString type;
+  [CEReactions] attribute boolean reversed;
+  [CEReactions] attribute long start;
+  [CEReactions] attribute DOMString type;
 };
@@ -17254,7 +17256,7 @@ I first lived there):</p>
DOM interface:
interface HTMLLIElement : HTMLElement {
-  attribute long value;
+  [CEReactions] attribute long value;
 };
@@ -17951,15 +17953,15 @@ included with Exhibit B.
DOM interface:
interface HTMLAnchorElement : HTMLElement {
-  attribute DOMString target;
-  attribute DOMString download;
-  [SameObject, PutForwards=value] readonly attribute DOMTokenList ping;
-  attribute DOMString rel;
-  [SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
-  attribute DOMString hreflang;
-  attribute DOMString type;
-
-  attribute DOMString text;
+  [CEReactions] attribute DOMString target;
+  [CEReactions] attribute DOMString download;
+  [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList ping;
+  [CEReactions] attribute DOMString rel;
+  [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
+  [CEReactions] attribute DOMString hreflang;
+  [CEReactions] attribute DOMString type;
+
+  [CEReactions] attribute DOMString text;
 };
 HTMLAnchorElement implements HTMLHyperlinkElementUtils;
@@ -19458,7 +19460,7 @@ this specification: the <abbr>WHATWG</abbr> and the
DOM interface:
interface HTMLDataElement : HTMLElement {
-  attribute DOMString value;
+  [CEReactions] attribute DOMString value;
 };
@@ -19532,7 +19534,7 @@ this specification: the <abbr>WHATWG</abbr> and the
DOM interface:
interface HTMLTimeElement : HTMLElement {
-  attribute DOMString dateTime;
+  [CEReactions] attribute DOMString dateTime;
 };
@@ -21044,17 +21046,17 @@ document.body.appendChild(wbr);
[NoInterfaceObject]
 interface HTMLHyperlinkElementUtils {
-  stringifier attribute USVString href;
+  [CEReactions] stringifier attribute USVString href;
   readonly attribute USVString origin;
-           attribute USVString protocol;
-           attribute USVString username;
-           attribute USVString password;
-           attribute USVString host;
-           attribute USVString hostname;
-           attribute USVString port;
-           attribute USVString pathname;
-           attribute USVString search;
-           attribute USVString hash;
+  [CEReactions] attribute USVString protocol;
+  [CEReactions] attribute USVString username;
+  [CEReactions] attribute USVString password;
+  [CEReactions] attribute USVString host;
+  [CEReactions] attribute USVString hostname;
+  [CEReactions] attribute USVString port;
+  [CEReactions] attribute USVString pathname;
+  [CEReactions] attribute USVString search;
+  [CEReactions] attribute USVString hash;
 };
@@ -23314,8 +23316,8 @@ interface HTMLHyperlinkElementUtils { HTMLModElement interface:

interface HTMLModElement : HTMLElement {
-  attribute DOMString cite;
-  attribute DOMString dateTime;
+  [CEReactions] attribute DOMString cite;
+  [CEReactions] attribute DOMString dateTime;
 };
@@ -24143,9 +24145,9 @@ was an English <a href="/wiki/Music_hall">music hall</a> singer, ...
DOM interface:
partial interface HTMLSourceElement {
-           attribute DOMString srcset;
-           attribute DOMString sizes;
-           attribute DOMString media;
+  [CEReactions] attribute DOMString srcset;
+  [CEReactions] attribute DOMString sizes;
+  [CEReactions] attribute DOMString media;
 };
@@ -24240,15 +24242,15 @@ was an English <a href="/wiki/Music_hall">music hall</a> singer, ...
[NamedConstructor=Image(optional unsigned long width, optional unsigned long height)]
 interface HTMLImageElement : HTMLElement {
-           attribute DOMString alt;
-           attribute DOMString src;
-           attribute DOMString srcset;
-           attribute DOMString sizes;
-           attribute DOMString? crossOrigin;
-           attribute DOMString useMap;
-           attribute boolean isMap;
-           attribute unsigned long width;
-           attribute unsigned long height;
+  [CEReactions] attribute DOMString alt;
+  [CEReactions] attribute DOMString src;
+  [CEReactions] attribute DOMString srcset;
+  [CEReactions] attribute DOMString sizes;
+  [CEReactions] attribute DOMString? crossOrigin;
+  [CEReactions] attribute DOMString useMap;
+  [CEReactions] attribute boolean isMap;
+  [CEReactions] attribute unsigned long width;
+  [CEReactions] attribute unsigned long height;
   readonly attribute unsigned long naturalWidth;
   readonly attribute unsigned long naturalHeight;
   readonly attribute boolean complete;
@@ -27140,13 +27142,13 @@ href="?audio">audio</a> test instead.)</p>
DOM interface:
interface HTMLIFrameElement : HTMLElement {
-  attribute DOMString src;
-  attribute DOMString srcdoc;
-  attribute DOMString name;
-  [SameObject, PutForwards=value] readonly attribute DOMTokenList sandbox;
-  attribute boolean allowFullscreen;
-  attribute DOMString width;
-  attribute DOMString height;
+  [CEReactions] attribute DOMString src;
+  [CEReactions] attribute DOMString srcdoc;
+  [CEReactions] attribute DOMString name;
+  [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList sandbox;
+  [CEReactions] attribute boolean allowFullscreen;
+  [CEReactions] attribute DOMString width;
+  [CEReactions] attribute DOMString height;
   readonly attribute Document? contentDocument;
   readonly attribute WindowProxy? contentWindow;
   Document? getSVGDocument();
@@ -27752,10 +27754,10 @@ href="?audio">audio</a> test instead.)</p>
DOM interface:
interface HTMLEmbedElement : HTMLElement {
-  attribute DOMString src;
-  attribute DOMString type;
-  attribute DOMString width;
-  attribute DOMString height;
+  [CEReactions] attribute DOMString src;
+  [CEReactions] attribute DOMString type;
+  [CEReactions] attribute DOMString width;
+  [CEReactions] attribute DOMString height;
   Document? getSVGDocument();
   legacycaller any (any... arguments);
 };
@@ -28139,14 +28141,14 @@ attribute, set the browsing context name of the element's nes
DOM interface:
interface HTMLObjectElement : HTMLElement {
-  attribute DOMString data;
-  attribute DOMString type;
-  attribute boolean typeMustMatch;
-  attribute DOMString name;
-  attribute DOMString useMap;
+  [CEReactions] attribute DOMString data;
+  [CEReactions] attribute DOMString type;
+  [CEReactions] attribute boolean typeMustMatch;
+  [CEReactions] attribute DOMString name;
+  [CEReactions] attribute DOMString useMap;
   readonly attribute HTMLFormElement? form;
-  attribute DOMString width;
-  attribute DOMString height;
+  [CEReactions] attribute DOMString width;
+  [CEReactions] attribute DOMString height;
   readonly attribute Document? contentDocument;
   readonly attribute WindowProxy? contentWindow;
   Document? getSVGDocument();
@@ -28929,8 +28931,8 @@ attribute, set the browsing context name of the element's nes
    
DOM interface:
interface HTMLParamElement : HTMLElement {
-  attribute DOMString name;
-  attribute DOMString value;
+  [CEReactions] attribute DOMString name;
+  [CEReactions] attribute DOMString value;
 };
@@ -29032,11 +29034,11 @@ attribute, set the browsing context name of the element's nes
DOM interface:
interface HTMLVideoElement : HTMLMediaElement {
-  attribute unsigned long width;
-  attribute unsigned long height;
+  [CEReactions] attribute unsigned long width;
+  [CEReactions] attribute unsigned long height;
   readonly attribute unsigned long videoWidth;
   readonly attribute unsigned long videoHeight;
-  attribute DOMString poster;
+  [CEReactions] attribute DOMString poster;
 };
@@ -29541,8 +29543,8 @@ interface HTMLAudioElement : HTMLMediaElement {};
DOM interface:
interface HTMLSourceElement : HTMLElement {
-  attribute DOMString src;
-  attribute DOMString type;
+  [CEReactions] attribute DOMString src;
+  [CEReactions] attribute DOMString type;
 };
@@ -29720,11 +29722,11 @@ interface HTMLAudioElement : HTMLMediaElement {};
DOM interface:
interface HTMLTrackElement : HTMLElement {
-  attribute DOMString kind;
-  attribute DOMString src;
-  attribute DOMString srclang;
-  attribute DOMString label;
-  attribute boolean default;
+  [CEReactions] attribute DOMString kind;
+  [CEReactions] attribute DOMString src;
+  [CEReactions] attribute DOMString srclang;
+  [CEReactions] attribute DOMString label;
+  [CEReactions] attribute boolean default;
 
   const unsigned short NONE = 0;
   const unsigned short LOADING = 1;
@@ -29969,16 +29971,16 @@ interface HTMLMediaElement : HTMLElement {
   readonly attribute MediaError? error;
 
   // network state
-  attribute DOMString src;
+  [CEReactions] attribute DOMString src;
   attribute MediaProvider? srcObject;
   readonly attribute DOMString currentSrc;
-  attribute DOMString? crossOrigin;
+  [CEReactions] attribute DOMString? crossOrigin;
   const unsigned short NETWORK_EMPTY = 0;
   const unsigned short NETWORK_IDLE = 1;
   const unsigned short NETWORK_LOADING = 2;
   const unsigned short NETWORK_NO_SOURCE = 3;
   readonly attribute unsigned short networkState;
-  attribute DOMString preload;
+  [CEReactions] attribute DOMString preload;
   readonly attribute TimeRanges buffered;
@@ -30005,20 +30007,20 @@ interface HTMLMediaElement : HTMLElement {
   readonly attribute TimeRanges played;
   readonly attribute TimeRanges seekable;
   readonly attribute boolean ended;
-  attribute boolean autoplay;
-  attribute boolean loop;
+  [CEReactions] attribute boolean autoplay;
+  [CEReactions] attribute boolean loop;
   Promise<void> play();
   void pause();
 
   // media controller
-  attribute DOMString mediaGroup;
-  attribute MediaController? controller;
+  [CEReactions] attribute DOMString mediaGroup;
+  [CEReactions] attribute MediaController? controller;
 
   // controls
-  attribute boolean controls;
+  [CEReactions] attribute boolean controls;
   attribute double volume;
   attribute boolean muted;
-  attribute boolean defaultMuted;
+  [CEReactions] attribute boolean defaultMuted;
 
   // tracks
   [SameObject] readonly attribute AudioTrackList audioTracks;
@@ -37406,7 +37408,7 @@ dictionary TrackEventInit : EventInit {
    
DOM interface:
interface HTMLMapElement : HTMLElement {
-  attribute DOMString name;
+  [CEReactions] attribute DOMString name;
   [SameObject] readonly attribute HTMLCollection areas;
 };
@@ -37509,14 +37511,14 @@ dictionary TrackEventInit : EventInit {
DOM interface:
interface HTMLAreaElement : HTMLElement {
-  attribute DOMString alt;
-  attribute DOMString coords;
-  attribute DOMString shape;
-  attribute DOMString target;
-  attribute DOMString download;
-  [SameObject, PutForwards=value] readonly attribute DOMTokenList ping;
-  attribute DOMString rel;
-  [SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
+  [CEReactions] attribute DOMString alt;
+  [CEReactions] attribute DOMString coords;
+  [CEReactions] attribute DOMString shape;
+  [CEReactions] attribute DOMString target;
+  [CEReactions] attribute DOMString download;
+  [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList ping;
+  [CEReactions] attribute DOMString rel;
+  [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList relList;
 };
 HTMLAreaElement implements HTMLHyperlinkElementUtils;
@@ -38214,20 +38216,24 @@ dictionary TrackEventInit : EventInit {
DOM interface:
interface HTMLTableElement : HTMLElement {
-  attribute HTMLTableCaptionElement? caption;
-  HTMLTableCaptionElement createCaption();
-  void deleteCaption();
-  attribute HTMLTableSectionElement? tHead;
-  HTMLTableSectionElement createTHead();
-  void deleteTHead();
-  attribute HTMLTableSectionElement? tFoot;
-  HTMLTableSectionElement createTFoot();
-  void deleteTFoot();
+  [CEReactions] attribute HTMLTableCaptionElement? caption;
+  [CEReactions] HTMLTableCaptionElement createCaption();
+  [CEReactions] void deleteCaption();
+
+  [CEReactions] attribute HTMLTableSectionElement? tHead;
+  [CEReactions] HTMLTableSectionElement createTHead();
+  [CEReactions] void deleteTHead();
+
+  [CEReactions] attribute HTMLTableSectionElement? tFoot;
+  [CEReactions] HTMLTableSectionElement createTFoot();
+  [CEReactions] void deleteTFoot();
+
   [SameObject] readonly attribute HTMLCollection tBodies;
-  HTMLTableSectionElement createTBody();
+  [CEReactions] HTMLTableSectionElement createTBody();
+
   [SameObject] readonly attribute HTMLCollection rows;
-  HTMLTableRowElement insertRow(optional long index = -1);
-  void deleteRow(long index);
+  [CEReactions] HTMLTableRowElement insertRow(optional long index = -1);
+  [CEReactions] void deleteRow(long index);
 };
@@ -38975,7 +38981,7 @@ the cell that corresponds to the values of the two dice.
DOM interface:
interface HTMLTableColElement : HTMLElement {
-  attribute unsigned long span;
+  [CEReactions] attribute unsigned long span;
 };
@@ -39062,8 +39068,8 @@ the cell that corresponds to the values of the two dice.
interface HTMLTableSectionElement : HTMLElement {
   [SameObject] readonly attribute HTMLCollection rows;
-  HTMLElement insertRow(optional long index = -1);
-  void deleteRow(long index);
+  [CEReactions] HTMLElement insertRow(optional long index = -1);
+  [CEReactions] void deleteRow(long index);
 };

The HTMLTableSectionElement interface is also used for thead and tfoot elements.

@@ -39297,8 +39303,8 @@ the cell that corresponds to the values of the two dice. readonly attribute long rowIndex; readonly attribute long sectionRowIndex; [SameObject] readonly attribute HTMLCollection cells; - HTMLElement insertCell(optional long index = -1); - void deleteCell(long index); + [CEReactions] HTMLElement insertCell(optional long index = -1); + [CEReactions] void deleteCell(long index); };
@@ -39543,8 +39549,8 @@ the cell that corresponds to the values of the two dice.
DOM interface:
interface HTMLTableHeaderCellElement : HTMLTableCellElement {
-  attribute DOMString scope;
-  attribute DOMString abbr;
+  [CEReactions] attribute DOMString scope;
+  [CEReactions] attribute DOMString abbr;
 };
@@ -39716,9 +39722,9 @@ the cell that corresponds to the values of the two dice. HTMLTableCellElement interface:

interface HTMLTableCellElement : HTMLElement {
-  attribute unsigned long colSpan;
-  attribute unsigned long rowSpan;
-  [SameObject, PutForwards=value] readonly attribute DOMTokenList headers;
+  [CEReactions] attribute unsigned long colSpan;
+  [CEReactions] attribute unsigned long rowSpan;
+  [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList headers;
   readonly attribute long cellIndex;
 };
@@ -41697,15 +41703,15 @@ the cell that corresponds to the values of the two dice.
[OverrideBuiltins, LegacyUnenumerableNamedProperties]
 interface HTMLFormElement : HTMLElement {
-  attribute DOMString acceptCharset;
-  attribute DOMString action;
-  attribute DOMString autocomplete;
-  attribute DOMString enctype;
-  attribute DOMString encoding;
-  attribute DOMString method;
-  attribute DOMString name;
-  attribute boolean noValidate;
-  attribute DOMString target;
+  [CEReactions] attribute DOMString acceptCharset;
+  [CEReactions] attribute DOMString action;
+  [CEReactions] attribute DOMString autocomplete;
+  [CEReactions] attribute DOMString enctype;
+  [CEReactions] attribute DOMString encoding;
+  [CEReactions] attribute DOMString method;
+  [CEReactions] attribute DOMString name;
+  [CEReactions] attribute boolean noValidate;
+  [CEReactions] attribute DOMString target;
 
   [SameObject] readonly attribute HTMLFormControlsCollection elements;
   readonly attribute unsigned long length;
@@ -41713,7 +41719,7 @@ interface HTMLFormElement : HTMLElement {
   getter (RadioNodeList or Element) (DOMString name);
 
   void submit();
-  void reset();
+  [CEReactions] void reset();
   boolean checkValidity();
   boolean reportValidity();
 
@@ -42124,7 +42130,7 @@ interface HTMLFormElement : HTMLElement {
    
interface HTMLLabelElement : HTMLElement {
   readonly attribute HTMLFormElement? form;
-  attribute DOMString htmlFor;
+  [CEReactions] attribute DOMString htmlFor;
   readonly attribute HTMLElement? control;
 };
@@ -42305,46 +42311,46 @@ interface HTMLFormElement : HTMLElement {
DOM interface:
interface HTMLInputElement : HTMLElement {
-  attribute DOMString accept;
-  attribute DOMString alt;
-  attribute DOMString autocomplete;
-  attribute boolean autofocus;
-  attribute boolean defaultChecked;
+  [CEReactions] attribute DOMString accept;
+  [CEReactions] attribute DOMString alt;
+  [CEReactions] attribute DOMString autocomplete;
+  [CEReactions] attribute boolean autofocus;
+  [CEReactions] attribute boolean defaultChecked;
   attribute boolean checked;
-  attribute DOMString dirName;
-  attribute boolean disabled;
+  [CEReactions] attribute DOMString dirName;
+  [CEReactions] attribute boolean disabled;
   readonly attribute HTMLFormElement? form;
   readonly attribute FileList? files;
-  attribute DOMString formAction;
-  attribute DOMString formEnctype;
-  attribute DOMString formMethod;
-  attribute boolean formNoValidate;
-  attribute DOMString formTarget;
-  attribute unsigned long height;
+  [CEReactions] attribute DOMString formAction;
+  [CEReactions] attribute DOMString formEnctype;
+  [CEReactions] attribute DOMString formMethod;
+  [CEReactions] attribute boolean formNoValidate;
+  [CEReactions] attribute DOMString formTarget;
+  [CEReactions] attribute unsigned long height;
   attribute boolean indeterminate;
-  attribute DOMString inputMode;
+  [CEReactions] attribute DOMString inputMode;
   readonly attribute HTMLElement? list;
-  attribute DOMString max;
-  attribute long maxLength;
-  attribute DOMString min;
-  attribute long minLength;
-  attribute boolean multiple;
-  attribute DOMString name;
-  attribute DOMString pattern;
-  attribute DOMString placeholder;
-  attribute boolean readOnly;
-  attribute boolean required;
-  attribute unsigned long size;
-  attribute DOMString src;
-  attribute DOMString step;
-  attribute DOMString type;
-  attribute DOMString defaultValue;
-  [TreatNullAs=EmptyString] attribute DOMString value;
+  [CEReactions] attribute DOMString max;
+  [CEReactions] attribute long maxLength;
+  [CEReactions] attribute DOMString min;
+  [CEReactions] attribute long minLength;
+  [CEReactions] attribute boolean multiple;
+  [CEReactions] attribute DOMString name;
+  [CEReactions] attribute DOMString pattern;
+  [CEReactions] attribute DOMString placeholder;
+  [CEReactions] attribute boolean readOnly;
+  [CEReactions] attribute boolean required;
+  [CEReactions] attribute unsigned long size;
+  [CEReactions] attribute DOMString src;
+  [CEReactions] attribute DOMString step;
+  [CEReactions] attribute DOMString type;
+  [CEReactions] attribute DOMString defaultValue;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString value;
   attribute object? valueAsDate;
   attribute unrestricted double valueAsNumber;
   attribute double valueLow;
   attribute double valueHigh;
-  attribute unsigned long width;
+  [CEReactions] attribute unsigned long width;
 
   void stepUp(optional long n = 1);
   void stepDown(optional long n = 1);
@@ -48842,18 +48848,18 @@ You cannot submit this form when the field is incorrect.
DOM interface:
interface HTMLButtonElement : HTMLElement {
-  attribute boolean autofocus;
-  attribute boolean disabled;
+  [CEReactions] attribute boolean autofocus;
+  [CEReactions] attribute boolean disabled;
   readonly attribute HTMLFormElement? form;
-  attribute DOMString formAction;
-  attribute DOMString formEnctype;
-  attribute DOMString formMethod;
-  attribute boolean formNoValidate;
-  attribute DOMString formTarget;
-  attribute DOMString name;
-  attribute DOMString type;
-  attribute DOMString value;
-  attribute HTMLMenuElement? menu;
+  [CEReactions] attribute DOMString formAction;
+  [CEReactions] attribute DOMString formEnctype;
+  [CEReactions] attribute DOMString formMethod;
+  [CEReactions] attribute boolean formNoValidate;
+  [CEReactions] attribute DOMString formTarget;
+  [CEReactions] attribute DOMString name;
+  [CEReactions] attribute DOMString type;
+  [CEReactions] attribute DOMString value;
+  [CEReactions] attribute HTMLMenuElement? menu;
 
   readonly attribute boolean willValidate;
   readonly attribute ValidityState validity;
@@ -49087,25 +49093,25 @@ You cannot submit this form when the field is incorrect.
DOM interface:
interface HTMLSelectElement : HTMLElement {
-  attribute DOMString autocomplete;
-  attribute boolean autofocus;
-  attribute boolean disabled;
+  [CEReactions] attribute DOMString autocomplete;
+  [CEReactions] attribute boolean autofocus;
+  [CEReactions] attribute boolean disabled;
   readonly attribute HTMLFormElement? form;
-  attribute boolean multiple;
-  attribute DOMString name;
-  attribute boolean required;
-  attribute unsigned long size;
+  [CEReactions] attribute boolean multiple;
+  [CEReactions] attribute DOMString name;
+  [CEReactions] attribute boolean required;
+  [CEReactions] attribute unsigned long size;
 
   readonly attribute DOMString type;
 
   [SameObject] readonly attribute HTMLOptionsCollection options;
-  attribute unsigned long length;
+  [CEReactions] attribute unsigned long length;
   getter Element? item(unsigned long index);
   HTMLOptionElement? namedItem(DOMString name);
-  void add((HTMLOptionElement or HTMLOptGroupElement) element, optional (HTMLElement or long)? before = null);
-  void remove(); // ChildNode overload
-  void remove(long index);
-  setter void (unsigned long index, HTMLOptionElement? option);
+  [CEReactions] void add((HTMLOptionElement or HTMLOptGroupElement) element, optional (HTMLElement or long)? before = null);
+  [CEReactions] void remove(); // ChildNode overload
+  [CEReactions] void remove(long index);
+  [CEReactions] setter void (unsigned long index, HTMLOptionElement? option);
 
   [SameObject] readonly attribute HTMLCollection selectedOptions;
   attribute long selectedIndex;
@@ -49723,8 +49729,8 @@ You cannot submit this form when the field is incorrect.
DOM interface:
interface HTMLOptGroupElement : HTMLElement {
-  attribute boolean disabled;
-  attribute DOMString label;
+  [CEReactions] attribute boolean disabled;
+  [CEReactions] attribute DOMString label;
 };
@@ -49821,14 +49827,14 @@ You cannot submit this form when the field is incorrect.
[NamedConstructor=Option(optional DOMString text = "", optional DOMString value, optional boolean defaultSelected = false, optional boolean selected = false)]
 interface HTMLOptionElement : HTMLElement {
-  attribute boolean disabled;
+  [CEReactions] attribute boolean disabled;
   readonly attribute HTMLFormElement? form;
-  attribute DOMString label;
-  attribute boolean defaultSelected;
+  [CEReactions] attribute DOMString label;
+  [CEReactions] attribute boolean defaultSelected;
   attribute boolean selected;
-  attribute DOMString value;
+  [CEReactions] attribute DOMString value;
 
-  attribute DOMString text;
+  [CEReactions] attribute DOMString text;
   readonly attribute long index;
 };
@@ -50077,25 +50083,25 @@ interface HTMLOptionElement : HTMLElement {
DOM interface:
interface HTMLTextAreaElement : HTMLElement {
-  attribute DOMString autocomplete;
-  attribute boolean autofocus;
-  attribute unsigned long cols;
-  attribute DOMString dirName;
-  attribute boolean disabled;
+  [CEReactions] attribute DOMString autocomplete;
+  [CEReactions] attribute boolean autofocus;
+  [CEReactions] attribute unsigned long cols;
+  [CEReactions] attribute DOMString dirName;
+  [CEReactions] attribute boolean disabled;
   readonly attribute HTMLFormElement? form;
-  attribute DOMString inputMode;
-  attribute long maxLength;
-  attribute long minLength;
-  attribute DOMString name;
-  attribute DOMString placeholder;
-  attribute boolean readOnly;
-  attribute boolean required;
-  attribute unsigned long rows;
-  attribute DOMString wrap;
+  [CEReactions] attribute DOMString inputMode;
+  [CEReactions] attribute long maxLength;
+  [CEReactions] attribute long minLength;
+  [CEReactions] attribute DOMString name;
+  [CEReactions] attribute DOMString placeholder;
+  [CEReactions] attribute boolean readOnly;
+  [CEReactions] attribute boolean required;
+  [CEReactions] attribute unsigned long rows;
+  [CEReactions] attribute DOMString wrap;
 
   readonly attribute DOMString type;
-  attribute DOMString defaultValue;
-  [TreatNullAs=EmptyString] attribute DOMString value;
+  [CEReactions] attribute DOMString defaultValue;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString value;
   readonly attribute unsigned long textLength;
 
   readonly attribute boolean willValidate;
@@ -50553,12 +50559,12 @@ Daddy"></textarea>
DOM interface:
interface HTMLKeygenElement : HTMLElement {
-  attribute boolean autofocus;
-  attribute DOMString challenge;
-  attribute boolean disabled;
+  [CEReactions] attribute boolean autofocus;
+  [CEReactions] attribute DOMString challenge;
+  [CEReactions] attribute boolean disabled;
   readonly attribute HTMLFormElement? form;
-  attribute DOMString keytype;
-  attribute DOMString name;
+  [CEReactions] attribute DOMString keytype;
+  [CEReactions] attribute DOMString name;
 
   readonly attribute DOMString type;
 
@@ -50850,13 +50856,13 @@ Daddy"></textarea>
DOM interface:
interface HTMLOutputElement : HTMLElement {
-  [SameObject, PutForwards=value] readonly attribute DOMTokenList htmlFor;
+  [CEReactions, SameObject, PutForwards=value] readonly attribute DOMTokenList htmlFor;
   readonly attribute HTMLFormElement? form;
-  attribute DOMString name;
+  [CEReactions] attribute DOMString name;
 
   readonly attribute DOMString type;
-  attribute DOMString defaultValue;
-  attribute DOMString value;
+  [CEReactions] attribute DOMString defaultValue;
+  [CEReactions] attribute DOMString value;
 
   readonly attribute boolean willValidate;
   readonly attribute ValidityState validity;
@@ -51041,8 +51047,8 @@ Daddy"></textarea>
DOM interface:
interface HTMLProgressElement : HTMLElement {
-  attribute double value;
-  attribute double max;
+  [CEReactions] attribute double value;
+  [CEReactions] attribute double max;
   readonly attribute double position;
   [SameObject] readonly attribute NodeList labels;
 };
@@ -51210,12 +51216,12 @@ Daddy"></textarea>
DOM interface:
interface HTMLMeterElement : HTMLElement {
-  attribute double value;
-  attribute double min;
-  attribute double max;
-  attribute double low;
-  attribute double high;
-  attribute double optimum;
+  [CEReactions] attribute double value;
+  [CEReactions] attribute double min;
+  [CEReactions] attribute double max;
+  [CEReactions] attribute double low;
+  [CEReactions] attribute double high;
+  [CEReactions] attribute double optimum;
   [SameObject] readonly attribute NodeList labels;
 };
@@ -51588,9 +51594,9 @@ out of 233 257 824 bytes available</meter></p>
DOM interface:
interface HTMLFieldSetElement : HTMLElement {
-  attribute boolean disabled;
+  [CEReactions] attribute boolean disabled;
   readonly attribute HTMLFormElement? form;
-  attribute DOMString name;
+  [CEReactions] attribute DOMString name;
 
   readonly attribute DOMString type;
 
@@ -56392,7 +56398,7 @@ fur
    
DOM interface:
interface HTMLDetailsElement : HTMLElement {
-  attribute boolean open;
+  [CEReactions] attribute boolean open;
 };
@@ -56565,8 +56571,8 @@ fur
DOM interface:
interface HTMLMenuElement : HTMLElement {
-  attribute DOMString type;
-  attribute DOMString label;
+  [CEReactions] attribute DOMString type;
+  [CEReactions] attribute DOMString label;
 };
@@ -56811,13 +56817,13 @@ fur
DOM interface:
interface HTMLMenuItemElement : HTMLElement {
-  attribute DOMString type;
-  attribute DOMString label;
-  attribute DOMString icon;
-  attribute boolean disabled;
-  attribute boolean checked;
-  attribute DOMString radiogroup;
-  attribute boolean default;
+  [CEReactions] attribute DOMString type;
+  [CEReactions] attribute DOMString label;
+  [CEReactions] attribute DOMString icon;
+  [CEReactions] attribute boolean disabled;
+  [CEReactions] attribute boolean checked;
+  [CEReactions] attribute DOMString radiogroup;
+  [CEReactions] attribute boolean default;
 };
@@ -57522,11 +57528,11 @@ dictionary RelatedEventInit : EventInit {
DOM interface:
interface HTMLDialogElement : HTMLElement {
-  attribute boolean open;
+  [CEReactions] attribute boolean open;
   attribute DOMString returnValue;
-  void show(optional (MouseEvent or Element) anchor);
-  void showModal(optional (MouseEvent or Element) anchor);
-  void close(optional DOMString returnValue);
+  [CEReactions] void show(optional (MouseEvent or Element) anchor);
+  [CEReactions] void showModal(optional (MouseEvent or Element) anchor);
+  [CEReactions] void close(optional DOMString returnValue);
 };
@@ -58160,14 +58166,14 @@ dictionary RelatedEventInit : EventInit {
DOM interface:
interface HTMLScriptElement : HTMLElement {
-  attribute DOMString src;
-  attribute DOMString type;
-  attribute DOMString charset;
-  attribute boolean async;
-  attribute boolean defer;
-  attribute DOMString? crossOrigin;
-  attribute DOMString text;
-  attribute DOMString nonce;
+  [CEReactions] attribute DOMString src;
+  [CEReactions] attribute DOMString type;
+  [CEReactions] attribute DOMString charset;
+  [CEReactions] attribute boolean async;
+  [CEReactions] attribute boolean defer;
+  [CEReactions] attribute DOMString? crossOrigin;
+  [CEReactions] attribute DOMString text;
+  [CEReactions] attribute DOMString nonce;
 };
@@ -59957,8 +59963,8 @@ not-slash = %x0000-002E / %x0030-10FFFF
typedef (CanvasRenderingContext2D or WebGLRenderingContext) RenderingContext;
 
 interface HTMLCanvasElement : HTMLElement {
-  attribute unsigned long width;
-  attribute unsigned long height;
+  [CEReactions] attribute unsigned long width;
+  [CEReactions] attribute unsigned long height;
 
   RenderingContext? getContext(DOMString contextId, any... arguments);
   boolean probablySupportsContext(DOMString contextId, any... arguments);
@@ -67724,28 +67730,46 @@ fetch(articleURL)
 
   
-

The following will be formalised more and better integrated with Web IDL; see - w3c/webcomponents#186 for more - information on the plan here.

+

To ensure custom element reactions are + triggered appropriately, we introduce the [CEReactions] IDL extended attribute. It + indicates that the relevant algorithm is to be supplemented with additional steps in order to + appropriately track and invoke custom element + reactions.

-

Any time a Web IDL operation is invoked, or a setter generated by a Web IDL attribute is - invoked, the following steps must be additionally run:

+

The [CEReactions] extended attribute must take no + arguments, and must not appear on anything other than an operation, attribute, setter, or deleter. + Additionally, it must not appear on readonly attributes, unless the readonly attribute is also + annotated with [PutForwards].

-
    -
  • Before executing the algorithm's steps: push a new element - queue onto the custom element reactions stack.

  • +

    Operations, attributes, setters, or deleters annotated with the [CEReactions] extended attribute must run the following steps + surrounding the main algorithm specified for the operation, setter, deleter, or for the + attribute's setter:

    -
  • After executing the algorithm's steps: pop the element queue - from the custom element reactions stack and invoke custom element - reactions in that queue.

  • -
+
+
Before executing the algorithm's steps
+
Push a new element queue onto the custom element reactions + stack.
+ +
After executing the algorithm's steps
+
Pop the element queue from the custom element reactions stack, and + invoke custom element reactions in that queue.
+
-

As described, these actions wrap every user agent-implemented method or property - setter. The intended effect is that any custom - element reactions enqueued as a result of running these methods or setters are invoked - prior to returning control back to script. If a method or setter is known to never modify the DOM - in such a way as to cause custom element - reactions, the user agent could choose not to wrap it as a performance optimization.

+
+

The intent behind this extended attribute is somewhat subtle. One way of accomplishing its + goals would be to say that every operation, attribute, setter, and deleter on the platform should + have these steps inserted, and to allow implementers to optimize away unnecessary cases (where no + DOM mutation is possible that could cause custom + element reactions to occur).

+ +

However, in practice this imprecision could lead to non-interoperable implementations of custom element reactions, as some implementations + might forget to invoke these steps in some cases. Instead, we settled on the approach of + explicitly annotating all relevant IDL constructs, as a way of ensuring interoperable behavior + and helping implementations easily pinpoint all cases where these steps are necessary.

+
@@ -74710,7 +74734,7 @@ addShortcutKeyLabel(document.getElementById('c'));
[NoInterfaceObject]
 interface ElementContentEditable {
-  attribute DOMString contentEditable;
+  [CEReactions] attribute DOMString contentEditable;
   readonly attribute boolean isContentEditable;
 };
@@ -112275,17 +112299,17 @@ if (s = prompt('What is your name?')) { interface.

interface HTMLAppletElement : HTMLElement {
-  attribute DOMString align;
-  attribute DOMString alt;
-  attribute DOMString archive;
-  attribute DOMString code;
-  attribute DOMString codeBase;
-  attribute DOMString height;
-  attribute unsigned long hspace;
-  attribute DOMString name;
-  attribute DOMString _object; // the underscore is not part of the identifier 
-  attribute unsigned long vspace;
-  attribute DOMString width;
+  [CEReactions] attribute DOMString align;
+  [CEReactions] attribute DOMString alt;
+  [CEReactions] attribute DOMString archive;
+  [CEReactions] attribute DOMString code;
+  [CEReactions] attribute DOMString codeBase;
+  [CEReactions] attribute DOMString height;
+  [CEReactions] attribute unsigned long hspace;
+  [CEReactions] attribute DOMString name;
+  [CEReactions] attribute DOMString _object; // the underscore is not part of the identifier 
+  [CEReactions] attribute unsigned long vspace;
+  [CEReactions] attribute DOMString width;
 };

The align,

interface HTMLMarqueeElement : HTMLElement {
-  attribute DOMString behavior;
-  attribute DOMString bgColor;
-  attribute DOMString direction;
-  attribute DOMString height;
-  attribute unsigned long hspace;
-  attribute long loop;
-  attribute unsigned long scrollAmount;
-  attribute unsigned long scrollDelay;
-  attribute boolean trueSpeed;
-  attribute unsigned long vspace;
-  attribute DOMString width;
+  [CEReactions] attribute DOMString behavior;
+  [CEReactions] attribute DOMString bgColor;
+  [CEReactions] attribute DOMString direction;
+  [CEReactions] attribute DOMString height;
+  [CEReactions] attribute unsigned long hspace;
+  [CEReactions] attribute long loop;
+  [CEReactions] attribute unsigned long scrollAmount;
+  [CEReactions] attribute unsigned long scrollDelay;
+  [CEReactions] attribute boolean trueSpeed;
+  [CEReactions] attribute unsigned long vspace;
+  [CEReactions] attribute DOMString width;
 
   attribute EventHandler onbounce;
   attribute EventHandler onfinish;
@@ -112532,8 +112556,8 @@ if (s = prompt('What is your name?')) {
   interface.

interface HTMLFrameSetElement : HTMLElement {
-  attribute DOMString cols;
-  attribute DOMString rows;
+  [CEReactions] attribute DOMString cols;
+  [CEReactions] attribute DOMString rows;
 };
 HTMLFrameSetElement implements WindowEventHandlers;
@@ -112643,17 +112667,17 @@ if (s = prompt('What is your name?')) {

The frame element must implement the HTMLFrameElement interface.

interface HTMLFrameElement : HTMLElement {
-  attribute DOMString name;
-  attribute DOMString scrolling;
-  attribute DOMString src;
-  attribute DOMString frameBorder;
-  attribute DOMString longDesc;
-  attribute boolean noResize;
+  [CEReactions] attribute DOMString name;
+  [CEReactions] attribute DOMString scrolling;
+  [CEReactions] attribute DOMString src;
+  [CEReactions] attribute DOMString frameBorder;
+  [CEReactions] attribute DOMString longDesc;
+  [CEReactions] attribute boolean noResize;
   readonly attribute Document? contentDocument;
   readonly attribute WindowProxy? contentWindow;
 
-  [TreatNullAs=EmptyString] attribute DOMString marginHeight;
-  [TreatNullAs=EmptyString] attribute DOMString marginWidth;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString marginHeight;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString marginWidth;
 };

The name, scrolling, and src IDL attributes of the frame element must @@ -112703,11 +112727,11 @@ if (s = prompt('What is your name?')) {


partial interface HTMLAnchorElement {
-  attribute DOMString coords;
-  attribute DOMString charset;
-  attribute DOMString name;
-  attribute DOMString rev;
-  attribute DOMString shape;
+  [CEReactions] attribute DOMString coords;
+  [CEReactions] attribute DOMString charset;
+  [CEReactions] attribute DOMString name;
+  [CEReactions] attribute DOMString rev;
+  [CEReactions] attribute DOMString shape;
 };

The coords, charset, name, rev, and shape IDL attributes of the @@ -112717,7 +112741,7 @@ if (s = prompt('What is your name?')) {


partial interface HTMLAreaElement {
-  attribute boolean noHref;
+  [CEReactions] attribute boolean noHref;
 };

The noHref IDL attribute of the @@ -112743,12 +112767,12 @@ if (s = prompt('What is your name?')) {


partial interface HTMLBodyElement {
-  [TreatNullAs=EmptyString] attribute DOMString text;
-  [TreatNullAs=EmptyString] attribute DOMString link;
-  [TreatNullAs=EmptyString] attribute DOMString vLink;
-  [TreatNullAs=EmptyString] attribute DOMString aLink;
-  [TreatNullAs=EmptyString] attribute DOMString bgColor;
-                   attribute DOMString background;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString text;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString link;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString vLink;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString aLink;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString bgColor;
+  [CEReactions] attribute DOMString background;
 };

The text IDL attribute of the body @@ -112780,7 +112804,7 @@ if (s = prompt('What is your name?')) {


partial interface HTMLBRElement {
-  attribute DOMString clear;
+  [CEReactions] attribute DOMString clear;
 };

The clear IDL attribute of the br @@ -112789,7 +112813,7 @@ if (s = prompt('What is your name?')) {


partial interface HTMLTableCaptionElement {
-  attribute DOMString align;
+  [CEReactions] attribute DOMString align;
 };

The align IDL attribute of the @@ -112798,11 +112822,11 @@ if (s = prompt('What is your name?')) {


partial interface HTMLTableColElement {
-  attribute DOMString align;
-  attribute DOMString ch;
-  attribute DOMString chOff;
-  attribute DOMString vAlign;
-  attribute DOMString width;
+  [CEReactions] attribute DOMString align;
+  [CEReactions] attribute DOMString ch;
+  [CEReactions] attribute DOMString chOff;
+  [CEReactions] attribute DOMString vAlign;
+  [CEReactions] attribute DOMString width;
 };

The align and width IDL attributes of the col element must @@ -112829,7 +112853,7 @@ if (s = prompt('What is your name?')) { interface.

interface HTMLDirectoryElement : HTMLElement {
-  attribute boolean compact;
+  [CEReactions] attribute boolean compact;
 };

The compact IDL attribute of the @@ -112838,7 +112862,7 @@ if (s = prompt('What is your name?')) {


partial interface HTMLDivElement {
-  attribute DOMString align;
+  [CEReactions] attribute DOMString align;
 };

The align IDL attribute of the div @@ -112847,7 +112871,7 @@ if (s = prompt('What is your name?')) {


partial interface HTMLDListElement {
-  attribute boolean compact;
+  [CEReactions] attribute boolean compact;
 };

The compact IDL attribute of the dl @@ -112856,8 +112880,8 @@ if (s = prompt('What is your name?')) {


partial interface HTMLEmbedElement {
-  attribute DOMString align;
-  attribute DOMString name;
+  [CEReactions] attribute DOMString align;
+  [CEReactions] attribute DOMString name;
 };

The name and align IDL attributes of the embed element @@ -112868,9 +112892,9 @@ if (s = prompt('What is your name?')) {

The font element must implement the HTMLFontElement interface.

interface HTMLFontElement : HTMLElement {
-  [TreatNullAs=EmptyString] attribute DOMString color;
-                   attribute DOMString face;
-                   attribute DOMString size; 
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString color;
+  [CEReactions] attribute DOMString face;
+  [CEReactions] attribute DOMString size; 
 };

The color, face, and size IDL attributes of the font element must @@ -112879,7 +112903,7 @@ if (s = prompt('What is your name?')) {


partial interface HTMLHeadingElement {
-  attribute DOMString align;
+  [CEReactions] attribute DOMString align;
 };

The align IDL attribute of the @@ -112897,11 +112921,11 @@ if (s = prompt('What is your name?')) {


partial interface HTMLHRElement {
-  attribute DOMString align;
-  attribute DOMString color;
-  attribute boolean noShade;
-  attribute DOMString size;
-  attribute DOMString width;
+  [CEReactions] attribute DOMString align;
+  [CEReactions] attribute DOMString color;
+  [CEReactions] attribute boolean noShade;
+  [CEReactions] attribute DOMString size;
+  [CEReactions] attribute DOMString width;
 };

The align, color, size, @@ -112915,7 +112939,7 @@ if (s = prompt('What is your name?')) {


partial interface HTMLHtmlElement {
-  attribute DOMString version;
+  [CEReactions] attribute DOMString version;
 };

The version IDL attribute of the @@ -112924,13 +112948,13 @@ if (s = prompt('What is your name?')) {


partial interface HTMLIFrameElement {
-  attribute DOMString align;
-  attribute DOMString scrolling;
-  attribute DOMString frameBorder;
-  attribute DOMString longDesc;
+  [CEReactions] attribute DOMString align;
+  [CEReactions] attribute DOMString scrolling;
+  [CEReactions] attribute DOMString frameBorder;
+  [CEReactions] attribute DOMString longDesc;
 
-  [TreatNullAs=EmptyString] attribute DOMString marginHeight;
-  [TreatNullAs=EmptyString] attribute DOMString marginWidth;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString marginHeight;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString marginWidth;
 };

The align and scrolling IDL attributes of the @@ -112957,14 +112981,14 @@ if (s = prompt('What is your name?')) {


partial interface HTMLImageElement {
-  attribute DOMString name;
-  attribute DOMString lowsrc;
-  attribute DOMString align;
-  attribute unsigned long hspace;
-  attribute unsigned long vspace;
-  attribute DOMString longDesc;
-
-  [TreatNullAs=EmptyString] attribute DOMString border;
+  [CEReactions] attribute DOMString name;
+  [CEReactions] attribute DOMString lowsrc;
+  [CEReactions] attribute DOMString align;
+  [CEReactions] attribute unsigned long hspace;
+  [CEReactions] attribute unsigned long vspace;
+  [CEReactions] attribute DOMString longDesc;
+
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString border;
 };

The name, align, border, hspace, and vspace IDL attributes of the img element @@ -112983,8 +113007,8 @@ if (s = prompt('What is your name?')) {


partial interface HTMLInputElement {
-  attribute DOMString align;
-  attribute DOMString useMap;
+  [CEReactions] attribute DOMString align;
+  [CEReactions] attribute DOMString useMap;
 };

The align IDL attribute of the @@ -112997,7 +113021,7 @@ if (s = prompt('What is your name?')) {


partial interface HTMLLegendElement {
-  attribute DOMString align;
+  [CEReactions] attribute DOMString align;
 };

The align IDL attribute of the @@ -113006,7 +113030,7 @@ if (s = prompt('What is your name?')) {


partial interface HTMLLIElement {
-  attribute DOMString type;
+  [CEReactions] attribute DOMString type;
 };

The type IDL attribute of the li @@ -113015,9 +113039,9 @@ if (s = prompt('What is your name?')) {


partial interface HTMLLinkElement {
-  attribute DOMString charset;
-  attribute DOMString rev;
-  attribute DOMString target;
+  [CEReactions] attribute DOMString charset;
+  [CEReactions] attribute DOMString rev;
+  [CEReactions] attribute DOMString target;
 };

The charset, rev, and target IDL attributes of the link element @@ -113031,7 +113055,7 @@ if (s = prompt('What is your name?')) {


partial interface HTMLMenuElement {
-  attribute boolean compact;
+  [CEReactions] attribute boolean compact;
 };

The compact IDL attribute of the @@ -113040,7 +113064,7 @@ if (s = prompt('What is your name?')) {


partial interface HTMLMetaElement {
-  attribute DOMString scheme;
+  [CEReactions] attribute DOMString scheme;
 };

User agents may treat the scheme content attribute on the @@ -113081,17 +113105,17 @@ if (s = prompt('What is your name?')) {


partial interface HTMLObjectElement {
-  attribute DOMString align;
-  attribute DOMString archive;
-  attribute DOMString code;
-  attribute boolean declare;
-  attribute unsigned long hspace;
-  attribute DOMString standby;
-  attribute unsigned long vspace;
-  attribute DOMString codeBase;
-  attribute DOMString codeType;
-
-  [TreatNullAs=EmptyString] attribute DOMString border;
+  [CEReactions] attribute DOMString align;
+  [CEReactions] attribute DOMString archive;
+  [CEReactions] attribute DOMString code;
+  [CEReactions] attribute boolean declare;
+  [CEReactions] attribute unsigned long hspace;
+  [CEReactions] attribute DOMString standby;
+  [CEReactions] attribute unsigned long vspace;
+  [CEReactions] attribute DOMString codeBase;
+  [CEReactions] attribute DOMString codeType;
+
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString border;
 };

The align, archive, border, code, declare, hspace, standby, and vspace IDL attributes of the object @@ -113109,7 +113133,7 @@ if (s = prompt('What is your name?')) {


partial interface HTMLOListElement {
-  attribute boolean compact;
+  [CEReactions] attribute boolean compact;
 };

The compact IDL attribute of the ol @@ -113118,7 +113142,7 @@ if (s = prompt('What is your name?')) {


partial interface HTMLParagraphElement {
-  attribute DOMString align;
+  [CEReactions] attribute DOMString align;
 };

The align IDL attribute of the p @@ -113127,8 +113151,8 @@ if (s = prompt('What is your name?')) {


partial interface HTMLParamElement {
-  attribute DOMString type;
-  attribute DOMString valueType;
+  [CEReactions] attribute DOMString type;
+  [CEReactions] attribute DOMString valueType;
 };

The type IDL attribute of the param @@ -113147,7 +113171,7 @@ if (s = prompt('What is your name?')) {


partial interface HTMLPreElement {
-  attribute long width;
+  [CEReactions] attribute long width;
 };

The width IDL attribute of the pre @@ -113156,8 +113180,8 @@ if (s = prompt('What is your name?')) {


partial interface HTMLScriptElement {
-  attribute DOMString event;
-  attribute DOMString htmlFor;
+  [CEReactions] attribute DOMString event;
+  [CEReactions] attribute DOMString htmlFor;
 };

The event IDL attribute of the @@ -113171,16 +113195,16 @@ if (s = prompt('What is your name?')) {


partial interface HTMLTableElement {
-  attribute DOMString align;
-  attribute DOMString border;
-  attribute DOMString frame;
-  attribute DOMString rules;
-  attribute DOMString summary;
-  attribute DOMString width;
-
-  [TreatNullAs=EmptyString] attribute DOMString bgColor;
-  [TreatNullAs=EmptyString] attribute DOMString cellPadding;
-  [TreatNullAs=EmptyString] attribute DOMString cellSpacing;
+  [CEReactions] attribute DOMString align;
+  [CEReactions] attribute DOMString border;
+  [CEReactions] attribute DOMString frame;
+  [CEReactions] attribute DOMString rules;
+  [CEReactions] attribute DOMString summary;
+  [CEReactions] attribute DOMString width;
+
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString bgColor;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString cellPadding;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString cellSpacing;
 };

The align, border, frame, summary, rules, and width, IDL attributes of the table element @@ -113201,10 +113225,10 @@ if (s = prompt('What is your name?')) {


partial interface HTMLTableSectionElement {
-  attribute DOMString align;
-  attribute DOMString ch;
-  attribute DOMString chOff;
-  attribute DOMString vAlign;
+  [CEReactions] attribute DOMString align;
+  [CEReactions] attribute DOMString ch;
+  [CEReactions] attribute DOMString chOff;
+  [CEReactions] attribute DOMString vAlign;
 };

The align IDL attribute of the @@ -113226,17 +113250,17 @@ if (s = prompt('What is your name?')) {


partial interface HTMLTableCellElement {
-  attribute DOMString align;
-  attribute DOMString axis;
-  attribute DOMString height;
-  attribute DOMString width;
+  [CEReactions] attribute DOMString align;
+  [CEReactions] attribute DOMString axis;
+  [CEReactions] attribute DOMString height;
+  [CEReactions] attribute DOMString width;
 
-  attribute DOMString ch;
-  attribute DOMString chOff;
-  attribute boolean noWrap;
-  attribute DOMString vAlign;
+  [CEReactions] attribute DOMString ch;
+  [CEReactions] attribute DOMString chOff;
+  [CEReactions] attribute boolean noWrap;
+  [CEReactions] attribute DOMString vAlign;
 
-  [TreatNullAs=EmptyString] attribute DOMString bgColor;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString bgColor;
 };

The align, axis, height, and width IDL attributes of the td and @@ -113275,12 +113299,12 @@ if (s = prompt('What is your name?')) {


partial interface HTMLTableRowElement {
-  attribute DOMString align;
-  attribute DOMString ch;
-  attribute DOMString chOff;
-  attribute DOMString vAlign;
+  [CEReactions] attribute DOMString align;
+  [CEReactions] attribute DOMString ch;
+  [CEReactions] attribute DOMString chOff;
+  [CEReactions] attribute DOMString vAlign;
 
-  [TreatNullAs=EmptyString] attribute DOMString bgColor;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString bgColor;
 };

The align IDL attribute of the tr @@ -113305,8 +113329,8 @@ if (s = prompt('What is your name?')) {


partial interface HTMLUListElement {
-  attribute boolean compact;
-  attribute DOMString type;
+  [CEReactions] attribute boolean compact;
+  [CEReactions] attribute DOMString type;
 };

The compact and type IDL attributes of the ul element must @@ -113321,11 +113345,11 @@ if (s = prompt('What is your name?')) {


partial interface Document {
-  [TreatNullAs=EmptyString] attribute DOMString fgColor;
-  [TreatNullAs=EmptyString] attribute DOMString linkColor;
-  [TreatNullAs=EmptyString] attribute DOMString vlinkColor;
-  [TreatNullAs=EmptyString] attribute DOMString alinkColor;
-  [TreatNullAs=EmptyString] attribute DOMString bgColor;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString fgColor;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString linkColor;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString vlinkColor;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString alinkColor;
+  [CEReactions, TreatNullAs=EmptyString] attribute DOMString bgColor;
 
   [SameObject] readonly attribute HTMLCollection anchors;
   [SameObject] readonly attribute HTMLCollection applets;