gutting the obsolete key/value interface
authorJames Craig <jcraig@apple.com>
Wed, 06 Nov 2013 17:24:10 -0800
changeset 144 7cb7fd02fe10
parent 143 96fb200fd78c
child 145 172c675f7a80
gutting the obsolete key/value interface
src/css/screen.css
src/indie-ui-context.html
src/js/respec-transformers.js
--- a/src/css/screen.css	Wed Nov 06 12:31:52 2013 -0800
+++ b/src/css/screen.css	Wed Nov 06 17:24:10 2013 -0800
@@ -26,6 +26,10 @@
 	border:solid 1px #c00;
 }
 
+[hidden] {
+	display: none;
+}
+
 .todo, .todo:before {
 	color:#c00 !important;
 	border-color:#c00 !important;
--- a/src/indie-ui-context.html	Wed Nov 06 12:31:52 2013 -0800
+++ b/src/indie-ui-context.html	Wed Nov 06 17:24:10 2013 -0800
@@ -99,385 +99,16 @@
 		<section id="intro" class="introductory informative">
 			<h2>Introduction</h2>
 			<p>The primary goal of IndieUI User Context is to provide authorized web applications access to information about a user's relevant settings and preferences, to provide the best possible user experience to all users. Some complex web applications can provide a much better experience if given access to information such as a user's preferred color, font, screen, and even *restricted* assistive technology settings such as a preference to render captions, or whether a screen reader is on. General web pages developed using best practices may never need access to restricted user settings, but complex web applications can utilize this information to enhance the performance and user interface.</p>
-			<p>There are obviously major privacy implications to providing any user-specific information to a third-party such as a web site, so a critical part of this specification defines how user agents and web browsers must prevent unauthorized access to user information, including methods to prevent access from parties interested in abusive uses such as user "fingerprinting" by marketers. The IndieUI Working Group members believe we've solved this problem by preventing web sites from being able to detect any difference between a user preference that is _Off_, and a user preference that _On_ but is not shared with the requesting site.</p>
+			<p>There are obviously major privacy implications to providing any user-specific information to a third-party such as a web site, so a critical part of this specification defines how user agents and web browsers must prevent unauthorized access to user information, including methods to prevent access from parties interested in abusive uses such as user "fingerprinting" by marketers. The IndieUI Working Group members believe we've solved this problem by preventing web sites from being able to detect any difference between a user preference that is <em>Off</em>, and a user preference that is <em>On</em> but is not shared with the requesting site.</p>
 			<p>The specification below adds several new "Media Features" to detect user settings, using existing syntax defined in the CSS3 Media Queries specification, and provides an access control extension to the MediaQueryList interface defined in the CSSOM View Model. Because this approach relies so heavily on features that overlap with work maintained by the CSS Working Group and Web Applications Working Group, it is likely that portions or all of this specification may move under the purview these other groups. At a minimum, the IndieUI Working Group requests guidance and a collaborative working relationship with CSS and WebApps.</p>
 			<p class="todo">
-				Move these to the refs section and link them here: <br>
+				Todo: Move these to the refs section and link them here: <br>
 				http://www.w3.org/TR/css3-mediaqueries/<br>
 				http://www.w3.org/TR/cssom-view/#the-mediaquerylist-interface
 			</p>
 		</section>
 		<!-- :::::::::::::::::::: END INTRO :::::::::::::::::::: -->
 		
-
-		<!-- :::::::::::::::::::: window.settings :::::::::::::::::::: -->
-		<section id="UserSettings">
-			<h3>Interface UserSettings</h3>
-			<p>The <code>settings</code> attribute of the Window interface MUST return an instance of the UserSettings interface. The same object must be returned each time.</p>
-
-			<dl title="interface UserSettings" class="idl">
-
-				<dt>DOMstring? valueForKey(<!-- params defined in dl below -->)</dt>
-				<dd>
-					<p class="ednote">Description TBD (esp re: privacy and fingerprinting, and prompt access for certain parameters on a per-domain basis, similar to location sharing)</p>
-					<p class="ednote">May need an additional "silent fail" parameter when keys are nice-to-have but not important enough to prompt if the user or platform specifies "prompt for access" to a particular key.</p>
-					<p class="note">An undefined or empty value for the <var>taxonomy</var> parameter indicates the <var>key</var> matches a preference defined in <a href="#UserSettingsKeys">User Settings Keys</a> section of this document. Standard vendor prefixes (<code>ie</code>, <code>moz</code>, <code>o</code>, <code>webkit</code>) are reserved for the <var>taxonomy</var> parameter, and any additional implementation or external taxonomy identifiers will be defined in a supplemental, informative document.</p>
-					<pre class="example" data-transform="syntaxJavaScript">
-						// example of a preference defined within the IndieUI User Context specification.
-						window.settings.valueForKey('fontSize'); // e.g. '16px'
-						window.settings.valueForKey('subtitle'); // e.g. returns true if the user wants to see subtitles or captions by default
-						
-						// example of an vendor-proposed preference, intended for standardization.
-						window.settings.valueForKey('foo', 'webkit');
-						
-					</pre>
-					<dl class="parameters">
-						
-						<dt>DOMString key</dt>
-						<dd>Identifying key for the preference value to be returned.</dd>
-						
-						<dt>optional DOMString? taxonomy</dt>
-						<dd>A unique string identifier for external taxonomy in which the key is defined, such as a vendor-prefix ('webkit') for vendor-proposed or implementation-specific keys, or another external taxonomy.</dd>
-					</dl>
-				</dd>
-
-			</dl>
-			
-			<section id="UserSettingsKeys">
-				<h4>User Settings Keys</h4>
-				<p class="ednote">The different settings key groupings are intended to allow individual privacy restrictions for each group. We're still working on the best way to spec those privacy restrictions.</p>
-
-				<section id="GeneralSettings">
-					<h5>General Settings</h5>
-					<p class="ednote">Current thinking is that General Settings will not be restricted (by default) from the requesting page. Values of these settings are expected to change often, and would therefore be of little value for any purpose but the intended use.</p>
-					
-					<dl title="dictionary GeneralSettings" class="idl">
-
-						<dt class="key" id="pointOfRegard-GeneralSettings">DOMElement? pointOfRegard = null</dt>
-						<dd>Returns a DOM element that indicates the users current point-of-regard.
-							<p class="ednote">I am still hoping we'll come up with a better name than point-of-regard.</p>
-							<div class="note">Indicates the user's focused point of attention, which make be the element under the mouse, in keyboard focus, or indicated by assistive technology such as eye tracking software or screen reader focus. Point-of-regard is similar to the concept of document.activeElement, and in the simple case of full keyboard access, it will likely stay in sync with document.activeElement.</div>
-							<p class="ednote">This one may indicate too much about AT to remain in the general settings.</p>
-						</dd>
-						
-						<dt class="key" id="fullKeyboardAccess-GeneralSettings">boolean? fullKeyboardAccess = null</dt>
-						<dd>Returns a boolean indicating whether the user's keyboard settings allow focusing all interactive elements (buttons, links, etc) by default. Note: The default non-null value will be <code>true</code> in most browsers.</dd>
-
-						<dt class="key" id="invertColors-GeneralSettings">boolean? invertColors = null</dt>
-						<dd>Returns a boolean indicating whether the display colors are currently inverted by the operating system or user agent. Web authors SHOULD NOT re-invert foreground and background colors based on this setting, but MAY choose to double-invert some content, such as photographs.</dd>
-					
-					</dl>
-					
-				</section>
-
-				<section id="TypeSettings">
-					<h5>Type Settings</h5>
-					<p class="ednote">Type settings will not be restricted (by default) from the requesting page, primarily because a site can figure out all of this information using some creative CSS and JavaScript. These keys are therefore primarily intended as convenience accessors so that web authors can more easily provide adaptive interfaces that work well for all users.</p>
-					
-					<dl title="dictionary TypeSettings" class="idl">
-					
-						<dt class="key" id="fontSize-TypeSettings">DOMString? fontSize = null</dt>
-						<dd>Returns a string representing the user's current default font size of root element, prior to applying page styles. User Agents MUST return the value in a CSS pixel unit formatted string, e.g. '14px'</dd>
-						
-						<dt class="key" id="fontSizeMinimum-TypeSettings">DOMString? fontSizeMinimum = null</dt>
-						<dd>Returns a string representing the user's minimum font size limit. User Agents MUST return the value in a CSS pixel unit formatted string, e.g. '9px'</dd>
-					
-						<dt class="key" id="letterSpacing-TypeSettings">DOMString? letterSpacing = null</dt>
-						<dd>Unit TBD; this should probably also be a calculated CSS pixel value equivalent to default or user value for CSS 'letter-spacing' property.</dd>
-
-						<dt class="key" id="lineHeight-TypeSettings">double? lineHeight = null</dt>
-						<dd>Returns a number as a unitless multiplier; equivalent to unitless 'Number' value for CSS 'line-height' property. e.g. 1.2, not '1.2em' or '12px' </dd>
-						
-						<dt class="key" id="wordSpacing-TypeSettings">DOMString? wordSpacing = null</dt>
-						<dd>Unit TBD; this should probably also be a calculated CSS pixel value equivalent to default or user value for CSS 'word-spacing' property.</dd>
-
-					</dl>
-					
-				</section>
-
-				<section id="DisplaySettings">
-					<h5>Display Settings</h5>
-					<p class="ednote">TBD: Settings in this section will be subject to domain-specific privacy policy limiting initial access and prompting the user. TBD whether these keys may be accessed only on a user triggered event, as opposed to onload for example.</p>
-					
-					<dl title="dictionary DisplaySettings" class="idl">
-
-						<dt class="key" id="displayContrast-DisplaySettings">double? displayContrast = null</dt>
-						<dd>Returns a number value between -1.0 and 1.0, representing the software contrast setting of the user's operating system. A value of 0.0 represents no contrast modification to the display (normal), and 1.0 represents the highest possible contrast modification. A negative number (uncommon) represents a lower-than-average contrast. User Agents SHOULD NOT use a positive value to represent hardware display settings, as this value is reserved for assistive contrast modes. User Agents MAY use a negative value to represent lower-than-average contrast in a hardware display.</dd>
-					
-						<dt class="key" id="displayGrayscale-DisplaySettings">boolean? displayGrayscale = null</dt>
-						<dd>Returns a boolean value representing whether the user's video display is currently set to only display in grayscale (true) or displays full color (false).</dd>
-
-						<dt class="key" id="displayLightOnDark-DisplaySettings">boolean? displayLightOnDark = null</dt>
-						<dd>Returns a boolean representing a user's preference for lightly colored foreground text on a darkly colored background.
-							<p class="ednote">I am concerned that this one will be confused with the general 'invertColors' setting.</p>
-						</dd>						
-					
-					</dl>
-					
-				</section>
-				
-				<section id="MediaAlternativeSettings">
-					<h5>Media Alternative Settings (Subtitles, etc.)</h5>
-					<p class="ednote">TBD: Settings in this section will be subject to domain-specific privacy policy limiting initial access and prompting the user. TBD whether these keys may be accessed only on a user triggered event, as opposed to onload for example.</p>
-					
-					<dl title="dictionary MediaAlternativeSettings" class="idl">
-						
-						<dt class="key" id="subtitle-MediaAlternativeSettings">boolean? subtitle = null</dt>
-						<dd>Returns a boolean value indicating whether subtitles or captions are displayed (true) or not displayed (false) in native video players. Web authors using a native video player SHOULD allow subtitles to be displayed natively. Web authors using a custom caption display SHOULD display captions based on this setting.</dd>
-						
-						<dt class="key" id="subtitleLanguages-MediaAlternativeSettings">DOMString? subtitleLanguages = null</dt>
-						<dd>Returns a string of languages in order of preference. Users Agents MUST format the string as a space-separated list of ISO-639 language codes, that may be optionally hyphenated to include ISO-3166 country codes. For example, a native Mexican Spanish speaker living in the United States may have a language preference of "es-mx es en-us en" indicating a preference order for Mexican Spanish, any Spanish, US English, and finally any English dialect.</dd>
-						
-						<dt class="key" id="subtitleType-MediaAlternativeSettings">DOMString? subtitleType = null</dt>
-						<dd>Returns a string of type of subtitles or captions in order of preference: Users Agents MUST format the string as a space-separated list of the following tokens: <code>sdh</code>, <code>cc</code>, or <code>standard</code>.
-							<p class="ednote">This key is necessary to indicate a preference for subtitles for the deaf and hard of hearing (SDH) over standard spoken-language-only subtitles, but the preference for closed-captions (CC) versus SDH may not be necessary. SDH appears to be generally preferred over CC when available, and a preference for SDH could indicate an implicit preference for CC over standard when CC is available but SDH is not.</p>
-						</dd>
-						
-						<dt class="key" id="transcript-MediaAlternativeSettings">boolean? transcript = null</dt>
-						<dd>Returns a boolean indicating a user's preference to be presented with a transcript if available. Web authors MAY provide concatenated subtitles in static form, if no other transcript exists.
-							<p class="ednote">There is some concern within the working group regarding this preference because no known operating system or user agent currently includes a way for a user to set this preference. The IndieUI working group is actively seeking comment on the perceived necessity or feasibility of this preference. It may be that this is already covered by <a href="http://www.w3.org/TR/UNDERSTANDING-WCAG20/media-equiv-av-only-alt.html">WCAG 2.0 SC 1.2.1</a> which indicates sites should offer transcripts when available.</p>
-						</dd>
-						
-						<dt class="key" id="signLanguage-MediaAlternativeSettings">boolean? signLanguage = null</dt>
-						<dd>Returns a boolean indicates a user's preference to be presented with a video of sign language if available.
-							<p class="ednote">Do we need a language order preference for type of sign? ASL, etc? Worried this feature will be at-risk due to lack of available signed alternatives.</p>
-						</dd>
-						
-						<dt class="key" id="audioDescription-MediaAlternativeSettings">boolean? audioDescription = null</dt>
-						<dd>Returns a boolean indicates a user's preference to be presented with an alternate or supplemental audio track describing the information presented visually.</dd>
-						
-					</dl>
-				</section>
-				
-				
-				<section id="ScreenReaderSettings">
-					<h5>Screen Reader Settings</h5>
-					<p class="ednote">TBD: Settings in this section will be subject to domain-specific privacy policy limiting initial access and prompting the user. TBD whether these keys may be accessed only on a user triggered event, as opposed to onload for example.</p>
-				
-					<dl title="dictionary ScreenReaderSettings" class="idl">
-						
-						<dt class="key" id="screenReaderActive-ScreenReaderSettings">boolean? screenReaderActive = null</dt>
-						<dd>Returns a boolean indicating whether or not a screen reader is currently active or in use. The user agent MUST return <code>true</code> if a screen reader is running, or <code>false</code> otherwise. User agents MAY return a null value if the user has chosen to disallow sharing screen reader information with the requesting domain.</dd>
-						
-						<dt class="key" id="screenReaderName-ScreenReaderSettings">DOMString? screenReaderName = null</dt>
-						<dd>Returns a string representing the application name of the screen reader in use. The user agent MUST return either an empty string or a string representing the name of the screen reader in detail, e.g. <code>"Apple VoiceOver"</code>. User agents MAY return a null value if the user has chosen to disallow sharing screen reader information with the requesting domain.</dd>
-						
-						<dt class="key" id="screenReaderVersion-ScreenReaderSettings">DOMString? screenReaderVersion = null</dt>
-						<dd>Returns a string representing the application version of the screen reader in use. The user agent MUST return either an empty string or a string representing the version of the screen reader in detail, e.g. "<code>4.0 (220.2)</code>". User agents MAY return a null value if the user has chosen to disallow sharing screen reader information with the requesting domain.</dd>
-						
-					</dl>
-				</section>
-				
-			</section>
-		</section>
-		<!-- :::::::::::::::::::: window.settings :::::::::::::::::::: -->
-
-
-		
-		<!-- :::::::::::::::::::: window.accessibility :::::::::::::::::::: -->
-		<!-- Commented b/c this section is mostly overcome by other features or specs. Leaving comments as some of these may be pulled back in but reformatted.
-		<section id="identification">
-			<h2>Assistive Technology Identification and Notification</h2>
-			<p class="ednote">Most of this section is out-of-date. Please don't put too much effort into change requests yet.</p>
-			<p>In certain cases, it is beneficial for web authors to be aware of the assistive technology in use. This section defines a collection of attributes that can be used to determine, from script, the kind of assistive technology in use, in order to be aware of considerations for a particular assistive technology, including the need to support the <a href="#RequestEvents">UI Change Request Events</a> or <a href="#AXevents">Accessibility Events</a> defined in previous sections. Web authors <strong class="rfc2119">should</strong> always limit client detection to detecting known versions. Web authors <strong class="rfc2119">should</strong> always assume future versions and unknown versions to be fully compliant.</p>
-			<p>The <code>accessibility</code> attribute of the Navigator interface <strong class="rfc2119">must</strong> return an instance of the Accessibility interface, which represents the identity and state of the assistive technology, and allows web pages to optionally notify assistive technology of certain interface events that cannot be indicated through declarative markup such as WAI-ARIA roles, states, and properties.</p>
-			
-			<div class="idlwrapper">
-				<pre><code>interface Accessibility {
-  readonly attribute InterfaceObject accessibility; <em class="ednote">// Editorial Note: Is it necessary to define this attribute in the IDL?</em>
-  <span class="comment">// objects implementing the Accessibility interface also implement the ScreenReader and AccessibilityNotifications interfaces</span>
-};
-Accessibility implements AccessibilityNotifications;
-Accessibility implements ScreenReader;
-Accessibility implements Magnifier;
-Accessibility implements Speech;
-
-[Supplemental, NoInterfaceObject]
-interface AccessibilityNotifications {
-	
-	const unsigned short    screenChanged   = 1;
-	const unsigned short    elementChanged  = 2;
-	
-  void postNotification(required String notification, optional HTMLElement element);
-};</code></pre>
-			</div>
-			<h4>Methods for <strong>Interface <em>Accessibility</em></strong></h4>
-			<div class="method-list">
-				<dl>
-					<dt><code>window.accessibility.postNotification()</code></dt>
-					<dd>
-						<p>Returns void. Allows the web author to send a required or supplemental notification, usually to inform the assistive technology to update its cache of the accessibility tree. For example, web authors might call this method after an animation has completed, allowing a screen reader to update its cursor location, if the focused element was moved.</p>
-						<p class="note">Note: screenChanged should be fired for full screen DOM-based refreshes. elementChanged is sufficient for significant branch node changes.</p>
-					</dd>
-				</dl>
-			</div>
-			
-			<h3><strong>Interface <em>ScreenReader</em></strong></h3>
-			<p>The <code>screenreader</code> attribute of the Accessibility interface <strong class="rfc2119">must</strong> return an instance of the ScreenReader interface:</p>
-			<div class="idlwrapper">
-				<pre><code>interface ScreenReader {
-  readonly attribute InterfaceObject screenreader; <em class="ednote">// Editorial Note: Is it necessary to define this attribute in the IDL?</em>
-  <span class="comment">// objects implementing the ScreenReader interface also implement the interfaces given below</span>
-};
-ScreenReader implements ScreenReaderID;
-ScreenReader implements ScreenReaderStatus;
-
-[Supplemental, NoInterfaceObject]
-interface ScreenReaderID {
-  readonly attribute DOMString name;
-  readonly attribute DOMString version;
-};
-
-[Supplemental, NoInterfaceObject]
-interface ScreenReaderStatus {
-  readonly attribute boolean active;
-};</code></pre>
-			</div>
-			<h4>Properties for <strong>Interface <em>ScreenReader</em></strong></h4>
-			<div class="property-list">
-				<dl>
-					<dt><code>window.accessibility.screenreader.active</code></dt>
-					<dd>Returns a boolean indicating whether or not a screen reader is in use. The user agent <strong class="rfc2119">must</strong> return <code>true</code> if a screen reader is running, or <code>false</code> otherwise. User agents <strong class="rfc2119">may</strong> return <code>false</code> if the user has chosen to disallow sharing this information with the requesting domain.</dd>
-					<dt class="ednote">window.accessibility.screenreader.activeElement</dt>
-					<dd class="ednote">@@</dd>
-					<dt><code>window.accessibility.screenreader.name</code></dt>
-					<dd>Returns the application name of the screen reader in use. The user agent <strong class="rfc2119">must</strong> return either an empty string or a string representing the name of the screen reader in detail, e.g. "<code>Apple VoiceOver</code>". User agents <strong class="rfc2119">may</strong> return an empty string if the user has chosen to disallow sharing this information with the requesting domain.</dd>
-					<dt><code>window.accessibility.screenreader.version</code></dt>
-					<dd>Returns the application version of the screen reader in use. The user agent <strong class="rfc2119">must</strong> return either an empty string or a string representing the version of the screen reader in detail, e.g. "<code>4.0 (220.2)</code>". User agents <strong class="rfc2119">may</strong> return an empty string if the user has chosen to disallow sharing this information with the requesting domain.</dd>
-				</dl>
-			</div>
-			
-			<p class="note" title="Informative">Note: The authors recommend that user agents adopt a domain-level security policy for the ScreenReader interface that is similar to the security policy for location data or cookies. A user should be able to explicitly disallow sharing of this information altogether, or on a per-domain basis.</p>
-			
-			<h3><strong>Interface <em>Magnifier</em></strong></h3>
-			<p>The <code>magnifier</code> attribute of the Accessibility interface <strong class="rfc2119">must</strong> return an instance of the Magnifier interface:</p>
-			<div class="idlwrapper">
-				<pre><code>interface Magnifier {
-  readonly attribute InterfaceObject magnifier; <em class="ednote">// Editorial Note: Is it necessary to define this attribute in the IDL?</em>
-  <span class="comment">// objects implementing the Magnifier interface also implement the interfaces given below</span>
-};
-Magnifier implements MagnifierID;
-Magnifier implements MagnifierStatus;
-Magnifier implements MagnifierNotifications;
-
-[Supplemental, NoInterfaceObject]
-interface MagnifierID {
-  readonly attribute DOMString name;
-  readonly attribute DOMString version;
-};
-
-[Supplemental, NoInterfaceObject]
-interface MagnifierStatus {
-  readonly attribute boolean active;
-  readonly attribute float   zoom;
-};
-
-[Supplemental, NoInterfaceObject]
-interface MagnifierNotifications {
-  <em class="ednote">// Editorial Note: I'm not partial to the method name focusPosition. Any other suggestions?</em>
-  void focusPosition(
-         in DOMElement element,
-         in optional array cursorRect,
-         in optional array selectionPolygon
-       );
-};</code></pre>
-			</div>
-			<h4>Properties for <strong>Interface <em>Magnifier</em></strong></h4>
-			<div class="property-list">
-				<dl>
-					<dt><code>window.accessibility.magnifier.active</code></dt>
-					<dd>Returns a boolean indicating whether or not a screen magnifier is in use. The user agent <strong class="rfc2119">must</strong> return <code>true</code> if a screen magnifier is enabled (even if the current zoom level is 1.0), or <code>false</code> if a magnifier is not enabled. User agents <strong class="rfc2119">may</strong> return <code>false</code> if the user has chosen to disallow sharing this information with the requesting domain.</dd>
-					<dt><code>window.accessibility.magnifier.name</code></dt>
-					<dd>Returns the application name of the screen magnifier in use. The user agent <strong class="rfc2119">must</strong> return either an empty string or a string representing the name of the screen magnifier in detail, e.g. "<code>Apple Universal Access Zoom</code>". User agents <strong class="rfc2119">may</strong> return an empty string if the user has chosen to disallow sharing this information with the requesting domain.</dd>
-					<dt><code>window.accessibility.magnifier.version</code></dt>
-					<dd>Returns the application version of the screen magnifier in use. The user agent <strong class="rfc2119">must</strong> return either an empty string or a string representing the version of the screen magnifier in detail, e.g. "<code>4.0 (220.2)</code>". User agents <strong class="rfc2119">may</strong> return an empty string if the user has chosen to disallow sharing this information with the requesting domain.</dd>
-					<dt><code>window.accessibility.magnifier.zoom</code></dt>
-					<dd>Returns a floating point number indicating the current magnification level of the screen magnifier. The user agent <strong class="rfc2119">must</strong> return <code>1.0</code> or the current magnification level. User agents <strong class="rfc2119">may</strong> return <code>1.0</code> if the user has chosen to disallow sharing this information with the requesting domain.</dd>
-				</dl>
-			</div>
-			<h4>Methods for <strong>Interface <em>Magnifier</em></strong></h4>
-			<div class="method-list">
-				<dl>
-					<dt><code>window.accessibility.magnifier.focusPosition ( element, cursorRect, selectionPolygon )</code></dt>
-					<dd><p>Returns void. Allows the web author to send an explicit notification informing the screen magnifier to update its cache of the cursor location. Web authors <strong class="rfc2119">should</strong> call this method when updating the display or cursor position of custom views.</p>
-						<h5>Parameters for Magnifier.focusPosition</h5>
-						<div class="parameter-list">
-							<dl>
-								<dt>1. <code>DOMElement <strong>element</strong></code></dt>
-								<dd>Required reference to the element (e.g. <code>canvas</code>) that has focus.</dd>
-								<dt>2. <code>optional array <strong>cursorRect</strong></code></dt>
-								<dd>Optional array representing the rectangular cursor location relative to the <code>[0,0]</code> position of focused element. <code>[ x<sup>1</sup>, y<sup>1</sup>, x<sup>2</sup>, y<sup>2</sup> ]</code></dd>
-								<dt>3. <code>optional array <strong>selectionPolygon</strong></code></dt>
-								<dd>Optional array representing the selection polygon relative to the <code>[0,0]</code> position of focused element. <code>[ x<sup>1</sup>, y<sup>1</sup>, x<sup>2</sup>, y<sup>2</sup>, ... x<sup><i>n</i></sup>, y<sup><i>n</i></sup> ]</code></dd>
-							</dl>
-							<p class="ednote">Editorial Note: It may be better if the optional params are shape objects with a coords array and a type string like 'rect' or 'poly'. That would allow the author to decide if they wanted to provide the extra polygon coords, or just use a simple shape.</p>
-						</div>
-					</dd>
-				</dl>
-				<p class="note">Note: The <code>focusPosition()</code> method would be necessary for screen magnifiers to work with canvas-based web apps like <a href="https://bespin.mozillalabs.com/">Bespin</a> or the <a href="http://280north.com/">280 North</a> projects. This method is not necessary for text views managed by the user agent, including <code>contentEditable</code> views.</p>
-			</div>
-			
-			<h3><strong>Interface <em>Speech</em></strong></h3>
-			<p>The <code>speech</code> attribute of the Accessibility interface <strong class="rfc2119">must</strong> return an instance of the Speech interface:</p>
-			<div class="idlwrapper">
-				<pre><code>interface Speech {
-  <span class="comment">// TBD, placeholder for speech-controlled user agents or assistive technology</span>
-  <span class="comment">// may need speech.synthesis and speech.recognition; each could have name/version/engine, etc. </span>
-  <span class="comment">// potential method: speech.synthesis.speak() to trigger TTS from web app</span>
-  <span class="comment">// potential method: speech.recognition.updateDictionary() to capture correct pronunciation of uncommon or app-specific words</span>
-};</code></pre>
-			</div>
-			-->
-		</section>
-		<!-- :::::::::::::::::::: END window.accessibility :::::::::::::::::::: -->
-		
-		
-		<!-- :::::::::::::::::::: Accessibility Event Interfaces :::::::::::::::::::: -->
-		<!--
-		<section id="AccessibilityEvents">
-			<h2>Accessibility Events</h2>
-			
-			
-			<section id="AccessibilityEvent">
-				<h3>Interface AccessibilityEvent</h3>
-				<p class="ednote">It's possible this will not need an AccessibilityEvent interface, as this is more-or-less equivalent to UIEvent at the moment.</p>
-				<p>The following events are usually initiated by assistive technologies or system , as opposed to mainstream user agents. These events are standard notification events and inherit from UIEvent, not UIRequestEvent.</p>
-				
-				<p class="ednote">Probably need a normative author requirement here stating authors MUST NOT update the visible view based on these events, unless the focused element is entirely out of view. Include example of where this is harmful.</p>
-				<p class="ednote">We might also need an AT equivalent of <code>document.activeElement</code>.</p>
-				
-				<dl title="[Constructor(DOMString typeArg, optional UIEventInit dictUIEventInit)] interface AccessibilityEvent : UIEvent" class="idl">
-				</dl>
-
-				<section id="AccessibilityEventTypes">
-					<h4>AccessibilityEvent Types</h4>
-					<p>The different types of AccessibilityEvents that can occur are:</p>
-					<dl>
-						<dt id="atfocus">Assistive Technology Focus <code class="event">atfocus</code></dt>
-						<dd>
-							<p>Initiated when the assistive technology cursor or point-of-regard moves to a particular DOM node.</p>
-							<ul>
-								<li>Bubbles: Yes</li>
-								<li>Cancelable: No</li>
-							</ul>
-						</dd>
-						<dt id="atblur">Assistive Technology Blur <code class="event">atblur</code></dt>
-						<dd>
-							<p>Initiated when the assistive technology cursor or point-of-regard leaves a particular DOM node.</p>
-							<ul>
-								<li>Bubbles: Yes</li>
-								<li>Cancelable: No</li>
-							</ul>
-						</dd>
-					</dl>
-				</section>
-			</section>
-		</section>
-		-->
-		<!-- :::::::::::::::::::: END Accessibility Event Interfaces :::::::::::::::::::: -->
-		
-		
-		
 		
 		<!--
 		ReSpec example: Use @data-transform to reuse a content transformer, and @data-oninclude to transform external content prior to inclusion.
@@ -485,8 +116,8 @@
 		<pre data-transform='xmp'>This markup is <b>escaped</b> like an <code>xmp</code>.</pre>
 		-->
 		<section id="keyslist" class="appendix">
-			<h2>Settings List (alphabetical)</h2>
-			<div data-transform="listKeys"><!-- dynamically generates key list --></div>
+			<h2>Media Features List (alphabetical)</h2>
+			<div data-transform="listMediaFeatures"><!-- dynamically generates media feature list --></div>
 		</section>
 		<section id="terms" class="appendix" data-include="./include/terms.html"></section>
 		<section id="acknowledgements" class="appendix" data-include="./include/ack.html"></section>
--- a/src/js/respec-transformers.js	Wed Nov 06 12:31:52 2013 -0800
+++ b/src/js/respec-transformers.js	Wed Nov 06 17:24:10 2013 -0800
@@ -35,24 +35,25 @@
 }
 
 
-// utility used by listKeys
-function allKeys() {
-	var selector = '', keyList = [], nodeList = $$('.key');
-	for (var i=0; i<nodeList.length; i++) {
-		keyList.push(nodeList[i].id);
+// utility used by listMediaFeatures
+function allMediaFeatures() {
+	var selector = '', mediaFeatureList = [], nodeList = $$('.mediafeature');
+	for (var i=0; i < nodeList.length; i++) {
+		mediaFeatureList.push(nodeList[i].id);
 	}
-	return keyList.sort();
+	return mediaFeatureList.sort();
 }
 
-/* listKeys: alphabetical list generated from user context keys. */
-function listKeys(r, content) {
-	var s = '<ul>', keyName = '', linkId = '', keyList = allKeys();
-	for (var i=0; i<keyList.length; i++){
-		keyName = keyList[i];
-		linkId = keyName.replace(/([a-z]+)-([a-z]+)/i, 'widl-$2-$1'); // regex: hardcoded ID 'fooBar-bazBop' becomes ReSpec-generated ID 'widl-bazBop-fooBar'
-		keyName = keyName.substring(0, keyName.indexOf('-'));
-		//console.log(keyList[i] + ' : ' + keyName + ' : ' + linkId);
-		s += '<li><code><a href="#' + linkId + '">' + keyName + '</a></code></li>';
+/* listMediaFeatures: alphabetical list generated from user context media features. */
+function listMediaFeatures(r, content) {
+	var s = '<ul>', mediaFeatureName = '', linkId = '', mediaFeatureList = allMediaFeatures();
+	for (var i = 0; i < mediaFeatureList.length; i++){
+		mediaFeatureName = mediaFeatureList[i];
+		// FIXME: this regex probably needs updating now that media features can contain hyphens
+		linkId = mediaFeatureName.replace(/([a-z]+)-([a-z]+)/i, 'widl-$2-$1'); // regex: hardcoded ID 'fooBar-bazBop' becomes ReSpec-generated ID 'widl-bazBop-fooBar'
+		mediaFeatureName = mediaFeatureName.substring(0, mediaFeatureName.indexOf('-'));
+		//console.log(mediaFeatureList[i] + ' : ' + mediaFeatureName + ' : ' + linkId);
+		s += '<li><code><a href="#' + linkId + '">' + mediaFeatureName + '</a></code></li>';
 	}
 	s += '</ul>';
 	return content + s;