[html5] r8036 - [giow] (3) navigator.plugins and company Fixing https://www.w3.org/Bugs/Public/s [...]

whatwg at whatwg.org whatwg at whatwg.org
Mon Jul 8 18:19:49 PDT 2013


Author: ianh
Date: 2013-07-08 18:19:46 -0700 (Mon, 08 Jul 2013)
New Revision: 8036

Modified:
   complete.html
   index
   source
Log:
[giow] (3) navigator.plugins and company
Fixing https://www.w3.org/Bugs/Public/show_bug.cgi?id=22553
Affected topics: DOM APIs, HTML

Modified: complete.html
===================================================================
--- complete.html	2013-07-03 23:00:32 UTC (rev 8035)
+++ complete.html	2013-07-09 01:19:46 UTC (rev 8036)
@@ -256,7 +256,7 @@
 
   <header class=head id=head><p><a href=http://www.whatwg.org/ class=logo><img width=101 src=/images/logo alt=WHATWG height=101></a></p>
    <hgroup><h1 class=allcaps>HTML</h1>
-    <h2 class="no-num no-toc">Living Standard — Last Updated 3 July 2013</h2>
+    <h2 class="no-num no-toc">Living Standard — Last Updated 9 July 2013</h2>
    </hgroup><dl><dt><strong>Web developer edition:</strong></dt>
     <dd><strong><a href=http://developers.whatwg.org/>http://developers.whatwg.org/</a></strong></dd>
     <dt>Multiple-page version:</dt>
@@ -1004,7 +1004,8 @@
         <ol>
          <li><a href=#security-and-privacy><span class=secno>7.5.1.3.1 </span>Security and privacy</a></li>
          <li><a href=#sample-handler-impl><span class=secno>7.5.1.3.2 </span>Sample user interface</a></ol></li>
-       <li><a href=#manually-releasing-the-storage-mutex><span class=secno>7.5.1.4 </span>Manually releasing the storage mutex</a></ol></li>
+       <li><a href=#manually-releasing-the-storage-mutex><span class=secno>7.5.1.4 </span>Manually releasing the storage mutex</a></li>
+       <li><a href=#plugins-0><span class=secno>7.5.1.5 </span>Plugins</a></ol></li>
      <li><a href=#the-external-interface><span class=secno>7.5.2 </span>The <code>External</code> interface</a></ol></li>
    <li><a href=#images><span class=secno>7.6 </span>Images</a></ol></li>
  <li><a href=#editing><span class=secno>8 </span>User interaction</a>
@@ -3039,6 +3040,13 @@
   privileges as the user agent itself, vulnerabilities in the third-party software become as
   dangerous as those in the user agent.</p>
 
+  <p>Since different users having differents sets of <a href=#plugin title=plugin>plugins</a> provides a
+  fingerprinting vector that increases the chances of users being uniquely identified, user agents
+  are encouraged to support the exact same set of <a href=#plugin title=plugin>plugins</a> for each
+  user.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
   </div>
 
 
@@ -73936,7 +73944,8 @@
 <a href=#navigator>Navigator</a> implements <a href=#navigatorlanguage>NavigatorLanguage</a>;
 <a href=#navigator>Navigator</a> implements <a href=#navigatoronline>NavigatorOnLine</a>;
 <a href=#navigator>Navigator</a> implements <a href=#navigatorcontentutils>NavigatorContentUtils</a>;
-<a href=#navigator>Navigator</a> implements <a href=#navigatorstorageutils>NavigatorStorageUtils</a>;</pre>
+<a href=#navigator>Navigator</a> implements <a href=#navigatorstorageutils>NavigatorStorageUtils</a>;
+<a href=#navigator>Navigator</a> implements <a href=#navigatorplugins>NavigatorPlugins</a>;</pre>
 
 <!-- v2:
   cookieEnabled geolocator javaEnabled mozIsLocallyAvailable preference
@@ -74646,6 +74655,381 @@
   </div>
 
 
+
+  <h5 id=plugins-0><span class=secno>7.5.1.5 </span>Plugins</h5>
+
+  <pre class=idl>[NoInterfaceObject]
+interface <dfn id=navigatorplugins>NavigatorPlugins</dfn> {
+  readonly attribute <a href=#pluginarray>PluginArray</a> <a href=#dom-navigator-plugins title=dom-navigator-plugins>plugins</a>;
+  readonly attribute <a href=#mimetypearray>MimeTypeArray</a> <a href=#dom-navigator-mimetypes title=dom-navigator-mimeTypes>mimeTypes</a>;
+};
+
+interface <dfn id=pluginarray>PluginArray</dfn> {
+  void <a href=#dom-pluginarray-refresh title=dom-PluginArray-refresh>refresh</a>(optional boolean reload = false);
+  readonly attribute unsigned long <a href=#dom-pluginarray-length title=dom-PluginArray-length>length</a>;
+  getter <a href=#dom-plugin title=dom-Plugin>Plugin</a>? <a href=#dom-pluginarray-item title=dom-PluginArray-item>item</a>(unsigned long index);
+  getter <a href=#dom-plugin title=dom-Plugin>Plugin</a>? <a href=#dom-pluginarray-nameditem title=dom-PluginArray-namedItem>namedItem</a>(DOMString name);
+};
+
+interface <dfn id=mimetypearray>MimeTypeArray</dfn> {
+  readonly attribute unsigned long <a href=#dom-mimetypearray-length title=dom-MimeTypeArray-length>length</a>;
+  getter <a href=#mimetype>MimeType</a>? <a href=#dom-mimetypearray-item title=dom-MimeTypeArray-item>item</a>(unsigned long index);
+  getter <a href=#mimetype>MimeType</a>? <a href=#dom-mimetypearray-nameditem title=dom-MimeTypeArray-namedItem>namedItem</a>(DOMString name);
+};
+
+interface <dfn id=dom-plugin title=dom-Plugin>Plugin</dfn> {
+  readonly attribute DOMString <a href=#dom-plugin-name title=dom-Plugin-name>name</a>;
+  readonly attribute DOMString <a href=#dom-plugin-description title=dom-Plugin-description>description</a>;
+  readonly attribute DOMString <a href=#dom-plugin-filename title=dom-Plugin-filename>filename</a>;
+  readonly attribute unsigned long <a href=#dom-plugin-length title=dom-Plugin-length>length</a>;
+  getter <a href=#mimetype>MimeType</a>? <a href=#dom-plugin-item title=dom-Plugin-item>item</a>(unsigned long index);
+  getter <a href=#mimetype>MimeType</a>? <a href=#dom-plugin-nameditem title=dom-Plugin-namedItem>namedItem</a>(DOMString name);
+};
+
+interface <dfn id=mimetype>MimeType</dfn> {
+  readonly attribute DOMString <a href=#dom-mimetype-type title=dom-MimeType-type>type</a>;
+  readonly attribute DOMString <a href=#dom-mimetype-description title=dom-MimeType-description>description</a>;
+  readonly attribute DOMString <a href=#dom-mimetype-suffixes title=dom-MimeType-suffixes>suffixes</a>; // comma-separated
+  readonly attribute <a href=#dom-plugin title=dom-Plugin>Plugin</a> <a href=#dom-mimetype-enabledplugin title=dom-MimeType-enabledPlugin>enabledPlugin</a>;
+};</pre>
+
+  <dl class=domintro><dt><var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-plugins>plugins</code> . <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>refresh</a></code>( [ <var title="">refresh</var> ] )</dt>
+   <dd>
+    <p>Updates the lists of supported plugins and MIME types for this page, and reloads the page if the lists have changed.</p>
+    <!-- that's not quite what all browsers have always done -->
+   </dd>
+
+   <dt><var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-plugins>plugins</code> . <code title=dom-PluginArray-length><a href=#dom-pluginarray-length>length</a></code></dt>
+   <dd>
+    <p>Returns the number of plugins, represented by <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> objects, that the user agent reports.</p>
+   </dd>
+
+   <dt><var title="">plugin</var> = <var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-plugins>plugins</code> . <code title=dom-PluginArray-item><a href=#dom-pluginarray-item>item</a></code>(<var title="">index</var>)</dt>
+   <dt><var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-plugins>plugins</code>[<var title="">index</var>]</dt>
+   <dd>
+    <p>Returns the specified <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object.</p>
+   </dd>
+
+   <dt><var title="">plugin</var> = <var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-plugins>plugins</code> . <code title=dom-PluginArray-item><a href=#dom-pluginarray-item>item</a></code>(<var title="">name</var>)</dt>
+   <dt><var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-plugins>plugins</code>[<var title="">name</var>]</dt>
+   <dd>
+    <p>Returns the <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object for the plugin with the given name.</p>
+   </dd>
+
+   <dt><var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-mimeTypes>mimeTypes</code> . <code title=dom-MimeTypeArray-length><a href=#dom-mimetypearray-length>length</a></code></dt>
+   <dd>
+    <p>Returns the number of MIME types, represented by <code><a href=#mimetype>MimeType</a></code> objects, supported by the plugins that the user agent reports.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> = <var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-mimeTypes>mimeTypes</code> . <code title=dom-MimeTypeArray-item><a href=#dom-mimetypearray-item>item</a></code>(<var title="">index</var>)</dt>
+   <dt><var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-mimeTypes>mimeTypes</code>[<var title="">index</var>]</dt>
+   <dd>
+    <p>Returns the specified <code><a href=#mimetype>MimeType</a></code> object.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> = <var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-mimeTypes>mimeTypes</code> . <code title=dom-MimeTypeArray-item><a href=#dom-mimetypearray-item>item</a></code>(<var title="">name</var>)</dt>
+   <dt><var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-mimeTypes>mimeTypes</code>[<var title="">name</var>]</dt>
+   <dd>
+    <p>Returns the <code><a href=#mimetype>MimeType</a></code> object for the given MIME type.</p>
+   </dd>
+
+   <dt><var title="">plugin</var> . <code title=dom-Plugin-name><a href=#dom-plugin-name>name</a></code>
+   <dd>
+    <p>Returns the plugin's name.</p>
+   </dd>
+
+   <dt><var title="">plugin</var> . <code title=dom-Plugin-description><a href=#dom-plugin-description>description</a></code>
+   <dd>
+    <p>Returns the plugin's description.</p>
+   </dd>
+
+   <dt><var title="">plugin</var> . <code title=dom-Plugin-filename><a href=#dom-plugin-filename>filename</a></code>
+   <dd>
+    <p>Returns the plugin library's filename, if applicable on the current platform.</p>
+   </dd>
+
+   <dt><var title="">plugin</var> . <code title=dom-Plugin-length><a href=#dom-plugin-length>length</a></code></dt>
+   <dd>
+    <p>Returns the number of MIME types, represented by <code><a href=#mimetype>MimeType</a></code> objects, supported by the plugin.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> = <var title="">plugin</var> . <code title=dom-Plugin-item><a href=#dom-plugin-item>item</a></code>(<var title="">index</var>)</dt>
+   <dt><var title="">plugin</var>[<var title="">index</var>]</dt>
+   <dd>
+    <p>Returns the specified <code><a href=#mimetype>MimeType</a></code> object.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> = <var title="">plugin</var> . <code title=dom-Plugin-item><a href=#dom-plugin-item>item</a></code>(<var title="">name</var>)</dt>
+   <dt><var title="">plugin</var>[<var title="">name</var>]</dt>
+   <dd>
+    <p>Returns the <code><a href=#mimetype>MimeType</a></code> object for the given MIME type.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> . <code title=dom-MimeType-type><a href=#dom-mimetype-type>type</a></code>
+   <dd>
+    <p>Returns the MIME type.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> . <code title=dom-MimeType-description><a href=#dom-mimetype-description>description</a></code>
+   <dd>
+    <p>Returns the MIME type's description.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> . <code title=dom-MimeType-suffixes><a href=#dom-mimetype-suffixes>suffixes</a></code>
+   <dd>
+    <p>Returns the MIME type's typical file extensions, in a comma-separated list.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> . <code title=dom-MimeType-enabledPlugin><a href=#dom-mimetype-enabledplugin>enabledPlugin</a></code>
+   <dd>
+    <p>Returns the <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object that implements this MIME type.</p>
+   </dd>
+
+  </dl><div class=impl>
+
+  <p>The <dfn id=dom-navigator-plugins title=dom-navigator-plugins><code>navigator.plugins</code></dfn> attribute must
+  return a <code><a href=#pluginarray>PluginArray</a></code> object. The same object must be returned each time.</p>
+
+  <p>The <dfn id=dom-navigator-mimetypes title=dom-navigator-mimeTypes><code>navigator.mimeTypes</code></dfn> attribute must
+  return a <code>MimeTypenArray</code> object. The same object must be returned each time.</p>
+
+  <hr><p>A <code><a href=#pluginarray>PluginArray</a></code> object represents none, some, or all of the <a href=#plugin title=plugin>plugins</a> supported by the user agent, each of which is represented by a <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object. Each of these <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code>
+  objects may be <dfn id=hidden-plugin title="hidden plugin">hidden plugins</dfn>. A <a href=#hidden-plugin>hidden plugin</a> can't
+  be enumerated, but can still be inspected by using its name.</p>
+
+  <p class=note>The fewer <a href=#plugin title=plugin>plugins</a> are represented by the
+  <code><a href=#pluginarray>PluginArray</a></code> object, and of those, the more that are <a href=#hidden-plugin title="hidden
+  plugin">hidden</a>, the more the user's privacy will be protected. Each exposed plugin
+  increases the number of bits that can be derived for fingerprinting. Hiding a plugin helps, but
+  unless it is an extremely rare plugin, it is likely that a site attempting to derive the list of
+  plugins can still determine whether the plugin is supported or not by probing for it by name (the
+  names of popular plugins are widely known). Therefore not exposing a plugin at all is preferred.
+  Unfortunately, many legacy sites use this feature to determine, for example, which plugin to use
+  to play video. Not exposing any plugins at all might therefore not be entirely plausible.</p>
+
+  <p>The <code><a href=#pluginarray>PluginArray</a></code> objects created by a user agent must not be <a href=#live>live</a>. The
+  set of plugins represented by the objects must not change once an object is created, except when
+  it is updated by the <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>refresh()</a></code> method.</p>
+
+  <p>Each <a href=#plugin>plugin</a> represented by a <code><a href=#pluginarray>PluginArray</a></code> can support a number of
+  <a href=#mime-type title="MIME type">MIME types</a>. For each such <a href=#plugin>plugin</a>, the user agent must
+  pick one or more of these <a href=#mime-type title="MIME type">MIME types</a> to be those that are
+  <dfn id=explicitly-supported>explicitly supported</dfn>.</p>
+
+  <p class=note>The <a href=#explicitly-supported>explicitly supported</a> <a href=#mime-type title="MIME type">MIME types</a> of
+  a <a href=#plugin>plugin</a> are those that are exposed through the <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> and <code><a href=#mimetypearray>MimeTypeArray</a></code> interfaces. As with <a href=#plugin title=plugin>plugins</a> themselves, any variation between users regarding what is exposed
+  allows sites to fingerprint users. User agents are therefore encouraged to expose the same <a href=#mime-type title="MIME type">MIME types</a> for all users of a <a href=#plugin>plugin</a>, regardless of the
+  actual types supported... at least, within the constraints imposed by compatibility with legacy
+  content.</p>
+
+  <p>The <a href=#supported-property-indices>supported property indices</a> of a <code><a href=#pluginarray>PluginArray</a></code> object are the
+  numbers from zero to the number of non-<a href=#hidden-plugin title="hidden plugin">hidden</a> <a href=#plugin title=plugin>plugins</a> represented by the object, if any.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>The <dfn id=dom-pluginarray-length title=dom-PluginArray-length><code>length</code></dfn> attribute must return the
+  number of non-<a href=#hidden-plugin title="hidden plugin">hidden</a> <a href=#plugin title=plugin>plugins</a>
+  represented by the object.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>The <dfn id=dom-pluginarray-item title=dom-PluginArray-item><code>item()</code></dfn> method of a
+  <code><a href=#pluginarray>PluginArray</a></code> object must return null if the argument is not one of the object's
+  <a href=#supported-property-indices>supported property indices</a>, and otherwise must return the result of running the
+  following steps, using the method's argument as <var title="">index</var>:</p>
+
+  <ol><li><p>Let <var title="">list</var> be the <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> objects
+   representing the non-<a href=#hidden-plugin title="hidden plugin">hidden</a> <a href=#plugin title=plugin>plugins</a> represented by the <code><a href=#pluginarray>PluginArray</a></code> object.</li>
+
+   <li><p>Sort <var title="">list</var> alphabetically by the <code title=dom-Plugin-name><a href=#dom-plugin-name>name</a></code> of each <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code>.</li>
+
+   <li><p>Return the <var title="">index</var>th entry in <var title="">list</var>.</li>
+
+  </ol><p class=note>It is important <a href=#fingerprinting-vector class=no-backref title="fingerprinting vector">for
+  privacy</a> that the order of plugins not leak additional information, e.g. the order in which
+  plugins were installed.</p>
+
+  <p>The <a href=#supported-property-names>supported property names</a> of a <code><a href=#pluginarray>PluginArray</a></code> object are the values
+  of the <code title=dom-Plugin-name><a href=#dom-plugin-name>name</a></code> attributes of all the <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> objects represented by the <code><a href=#pluginarray>PluginArray</a></code> object. The
+  properties exposed in this way must not be enumerable.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>The <dfn id=dom-pluginarray-nameditem title=dom-PluginArray-namedItem><code>namedItem()</code></dfn> method of a
+  <code><a href=#pluginarray>PluginArray</a></code> object must return null if the argument is not one of the object's
+  <a href=#supported-property-names>supported property names</a>, and otherwise must return the <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object, of those represented by the <code><a href=#pluginarray>PluginArray</a></code>
+  object, that has a <code title=dom-Plugin-name><a href=#dom-plugin-name>name</a></code> equal to the method's argument.</p>
+
+  <p>The <dfn id=dom-pluginarray-refresh title=dom-PluginArray-refresh><code>refresh()</code></dfn> method of the
+  <code><a href=#pluginarray>PluginArray</a></code> object of a <code><a href=#navigator>Navigator</a></code> object, when invoked, must check to
+  see if any <a href=#plugin title=plugin>plugins</a> have been installed or reconfigured since the user
+  agent created the <code><a href=#pluginarray>PluginArray</a></code> object. If so, and the method's argument is true, then
+  the user agent must act as if the <code title=dom-location-reload><a href=#dom-location-reload>location.reload()</a></code>
+  method was called instead. Otherwise, the user agent must update the <code><a href=#pluginarray>PluginArray</a></code>
+  object and <code><a href=#mimetypearray>MimeTypeArray</a></code> object created for attributes of that <code><a href=#navigator>Navigator</a></code>
+  object, and the <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> and <code><a href=#mimetype>MimeType</a></code> objects created
+  for those <code><a href=#pluginarray>PluginArray</a></code> and <code><a href=#mimetypearray>MimeTypeArray</a></code> objects, using the same <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> objects for cases where the <code title=dom-Plugin-name><a href=#dom-plugin-name>name</a></code> is the same, and the same <code><a href=#mimetype>MimeType</a></code> objects for
+  cases where the <code title=dom-MimeType-type><a href=#dom-mimetype-type>type</a></code> is the same, and creating new objects
+  for cases where there were no matching objects immediately prior to the <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>refresh()</a></code> call. Old <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code>
+  and <code><a href=#mimetype>MimeType</a></code> objects must continue to return the same values that they had prior to
+  the update, though naturally now the data is stale and may appear inconsistent (for example, an
+  old <code><a href=#mimetype>MimeType</a></code> entry might list as its <code title=dom-MimeType-enabledPlugin><a href=#dom-mimetype-enabledplugin>enabledPlugin</a></code> a <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code>
+  object that no longer lists that <code><a href=#mimetype>MimeType</a></code> as a supported <code><a href=#mimetype>MimeType</a></code>).</p>
+
+  <hr><p>A <code><a href=#mimetypearray>MimeTypeArray</a></code> object represents the <a href=#mime-type title="MIME type">MIME types</a>
+  <a href=#explicitly-supported>explicitly supported</a> by <a href=#plugin title=plugin>plugins</a> supported by the user
+  agent, each of which is represented by a <code><a href=#mimetype>MimeType</a></code> object.</p>
+
+  <p>The <code><a href=#mimetypearray>MimeTypeArray</a></code> objects created by a user agent must not be <a href=#live>live</a>.
+  The set of MIME types represented by the objects must not change once an object is created, except
+  when it is updated by the <code><a href=#pluginarray>PluginArray</a></code> object's <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>refresh()</a></code> method.</p>
+
+  <p>The <a href=#supported-property-indices>supported property indices</a> of a <code><a href=#mimetypearray>MimeTypeArray</a></code> object are the
+  numbers from zero to the number of <a href=#mime-type title="MIME type">MIME types</a> <a href=#explicitly-supported>explicitly
+  supported</a> by non-<a href=#hidden-plugin title="hidden plugin">hidden</a> <a href=#plugin title=plugin>plugins</a> represented by the corresponding <code><a href=#pluginarray>PluginArray</a></code> object, if
+  any.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>The <dfn id=dom-mimetypearray-length title=dom-MimeTypeArray-length><code>length</code></dfn> attribute must return the
+  number of <a href=#mime-type title="MIME type">MIME types</a> <a href=#explicitly-supported>explicitly supported</a> by non-<a href=#hidden-plugin title="hidden plugin">hidden</a> <a href=#plugin title=plugin>plugins</a> represented by the
+  corresponding <code><a href=#pluginarray>PluginArray</a></code> object, if any.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>The <dfn id=dom-mimetypearray-item title=dom-MimeTypeArray-item><code>item()</code></dfn> method of a
+  <code><a href=#mimetypearray>MimeTypeArray</a></code> object must return null if the argument is not one of the object's
+  <a href=#supported-property-indices>supported property indices</a>, and otherwise must return the result of running the
+  following steps, using the method's argument as <var title="">index</var>:</p>
+
+  <ol><li><p>Let <var title="">list</var> be the <code><a href=#mimetype>MimeType</a></code> objects representing the <a href=#mime-type title="MIME type">MIME types</a> <a href=#explicitly-supported>explicitly supported</a> by non-<a href=#hidden-plugin title="hidden
+   plugin">hidden</a> <a href=#plugin title=plugin>plugins</a> represented by the corresponding
+   <code><a href=#pluginarray>PluginArray</a></code> object, if any.</li>
+
+   <li><p>Sort <var title="">list</var> alphabetically by the <code title=dom-MimeType-type><a href=#dom-mimetype-type>type</a></code> of each <code><a href=#mimetype>MimeType</a></code>.</li>
+
+   <li><p>Return the <var title="">index</var>th entry in <var title="">list</var>.</li>
+
+  </ol><p class=note>It is important <a href=#fingerprinting-vector class=no-backref title="fingerprinting vector">for
+  privacy</a> that the order of MIME types not leak additional information, e.g. the order in
+  which plugins were installed.</p>
+
+  <p>The <a href=#supported-property-names>supported property names</a> of a <code><a href=#mimetypearray>MimeTypeArray</a></code> object are the values
+  of the <code title=dom-MimeType-type><a href=#dom-mimetype-type>type</a></code> attributes of all the <code><a href=#mimetype>MimeType</a></code>
+  objects represented by the <code><a href=#mimetypearray>MimeTypeArray</a></code> object. The properties exposed in this way
+  must not be enumerable.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>The <dfn id=dom-mimetypearray-nameditem title=dom-MimeTypeArray-namedItem><code>namedItem()</code></dfn> method of a
+  <code><a href=#mimetypearray>MimeTypeArray</a></code> object must return null if the argument is not one of the object's
+  <a href=#supported-property-names>supported property names</a>, and otherwise must return the <code><a href=#mimetype>MimeType</a></code> object
+  that has a <code title=dom-MimeType-type><a href=#dom-mimetype-type>type</a></code> equal to the method's argument.</p>
+
+  <hr><p>A <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object represents a <a href=#plugin>plugin</a>. It has
+  several attributes to provide details about the plugin, and can be enumerated to obtain the list
+  of <a href=#mime-type title="MIME type">MIME types</a> that it <a href=#explicitly-supported title="explicitly supported">explicitly
+  supports</a>.</p>
+
+  <p>The <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> objects created by a user agent must not be
+  <a href=#live>live</a>. The set of MIME types represented by the objects, and the values of the
+  objects' attributes, must not change once an object is created, except when updated by the
+  <code><a href=#pluginarray>PluginArray</a></code> object's <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>refresh()</a></code>
+  method.</p>
+
+  <p>The <dfn id=reported-mime-types>reported MIME types</dfn> for a <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object are the
+  <a href=#mime-type title="MIME type">MIME types</a> <a href=#explicitly-supported>explicitly supported</a> by the corresponding
+  <a href=#plugin>plugin</a> when this object was last created or updated by <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>PluginArray.refresh()</a></code>, whichever happened most
+  recently.</p>
+
+  <p>The <a href=#supported-property-indices>supported property indices</a> of a <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object
+  are the numbers from zero to the number of <a href=#reported-mime-types>reported MIME types</a>.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>The <dfn id=dom-plugin-length title=dom-Plugin-length><code>length</code></dfn> attribute must return the number
+  of <a href=#reported-mime-types>reported MIME types</a>.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>The <dfn id=dom-plugin-item title=dom-Plugin-item><code>item()</code></dfn> method of a <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object must return null if the argument is not one of the
+  object's <a href=#supported-property-indices>supported property indices</a>, and otherwise must return the result of running
+  the following steps, using the method's argument as <var title="">index</var>:</p>
+
+  <ol><li><p>Let <var title="">list</var> be the <code><a href=#mimetype>MimeType</a></code> objects representing the
+   <a href=#reported-mime-types>reported MIME types</a>.</li>
+
+   <li><p>Sort <var title="">list</var> alphabetically by the <code title=dom-MimeType-type><a href=#dom-mimetype-type>type</a></code> of each <code><a href=#mimetype>MimeType</a></code>.</li>
+
+   <li><p>Return the <var title="">index</var>th entry in <var title="">list</var>.</li>
+
+  </ol><p class=note>It is important <a href=#fingerprinting-vector class=no-backref title="fingerprinting vector">for
+  privacy</a> that the order of MIME types not leak additional information, e.g. the order in
+  which plugins were installed.</p>
+
+  <p>The <a href=#supported-property-names>supported property names</a> of a <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object
+  are the values of the <code title=dom-MimeType-type><a href=#dom-mimetype-type>type</a></code> attributes of the
+  <code><a href=#mimetype>MimeType</a></code> objects representing the <a href=#reported-mime-types>reported MIME types</a>. The properties
+  exposed in this way must not be enumerable.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>The <dfn id=dom-plugin-nameditem title=dom-Plugin-namedItem><code>namedItem()</code></dfn> method of a <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object must return null if the argument is not one of the
+  object's <a href=#supported-property-names>supported property names</a>, and otherwise must return the
+  <code><a href=#mimetype>MimeType</a></code> object that has a <code title=dom-MimeType-type><a href=#dom-mimetype-type>type</a></code> equal to the
+  method's argument.</p>
+
+  <p>The <dfn id=dom-plugin-name title=dom-Plugin-name><code>name</code></dfn> attribute must return the
+  <a href=#plugin>plugin</a>'s name.</p>
+
+  <p>The <dfn id=dom-plugin-description title=dom-Plugin-description><code>description</code></dfn> and <dfn id=dom-plugin-filename title=dom-Plugin-filename><code>filename</code></dfn> attributes must return user-agent-defined
+  (or, in all likelihood, <a href=#plugin>plugin</a>-defined) strings. In each case, the same string must
+  be returned each time, except that the strings returned may change when the <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>PluginArray.refresh()</a></code> method updates the object.</p>
+
+  <p class=warning>If the values returned by the <code title=dom-Plugin-description><a href=#dom-plugin-description>description</a></code> or <code title=dom-Plugin-filename><a href=#dom-plugin-filename>filename</a></code> attributes vary between versions of a
+  <a href=#plugin>plugin</a>, they can be used both as a fingerprinting vector and, even more importantly,
+  as a trivial way to determine what security vulnerabilities a <a href=#plugin>plugin</a> (and thus a
+  browser) may have. It is thus highly recommended that the <code title=dom-Plugin-description><a href=#dom-plugin-description>description</a></code> attribute just return the same value as the
+  <code title=dom-Plugin-name><a href=#dom-plugin-name>name</a></code> attribute, and that the <code title=dom-Plugin-filename><a href=#dom-plugin-filename>filename</a></code> attribute return the empty string.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <hr><p>A <code><a href=#mimetype>MimeType</a></code> object represents a <a href=#mime-type>MIME type</a> that is, or was,
+  <a href=#explicitly-supported>explicitly supported</a> by a <a href=#plugin>plugin</a>.</p>
+
+  <p>The <code><a href=#mimetype>MimeType</a></code> objects created by a user agent must not be <a href=#live>live</a>. The
+  values of the objects' attributes must not change once an object is created, except when updated
+  by the <code><a href=#pluginarray>PluginArray</a></code> object's <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>refresh()</a></code>
+  method.</p>
+
+  <p>The <dfn id=dom-mimetype-type title=dom-MimeType-type><code>type</code></dfn> attribute must return the
+  <a href=#valid-mime-type-with-no-parameters>valid MIME type with no parameters</a> describing the <a href=#mime-type>MIME type</a>.</p>
+
+  <p>The <dfn id=dom-mimetype-description title=dom-MimeType-description><code>description</code></dfn> and <dfn id=dom-mimetype-suffixes title=dom-MimeType-suffixes><code>suffixes</code></dfn> attributes must return
+  user-agent-defined (or, in all likelihood, <a href=#plugin>plugin</a>-defined) strings. In each case, the
+  same string must be returned each time, except that the strings returned may change when the <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>PluginArray.refresh()</a></code> method updates the object.</p>
+
+  <p class=warning>If the values returned by the <code title=dom-MimeType-description><a href=#dom-mimetype-description>description</a></code> or <code title=dom-MimeType-suffixes><a href=#dom-mimetype-suffixes>suffxies</a></code> attributes vary between versions of a
+  <a href=#plugin>plugin</a>, they can be used both as a fingerprinting vector and, even more importantly,
+  as a trivial way to determine what security vulnerabilities a <a href=#plugin>plugin</a> (and thus a
+  browser) may have. It is thus highly recommended that the <code title=dom-MimeType-description><a href=#dom-mimetype-description>description</a></code> attribute just return the same value as the
+  <code title=dom-MimeType-type><a href=#dom-mimetype-type>type</a></code> attribute, and that the <code title=dom-MimeType-suffixes><a href=#dom-mimetype-suffixes>suffixes</a></code> attribute return the empty string.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p class=note>Commas in the <code title=dom-MimeType-suffixes><a href=#dom-mimetype-suffixes>suffixes</a></code> attribute are
+  interpreted as separating subsequent filename extensions, as in "<code title="">htm,html</code>".</p>
+
+  <p>The <dfn id=dom-mimetype-enabledplugin title=dom-MimeType-enabledPlugin><code>enabledPlugin</code></dfn> attribute must
+  return the <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object that represents the <a href=#plugin>plugin</a>
+  that <a href=#explicitly-supported>explicitly supported</a> the <a href=#mime-type>MIME type</a> that this <code><a href=#mimetype>MimeType</a></code>
+  object represents when this object was last created or updated by <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>PluginArray.refresh()</a></code>, whichever happened most
+  recently.</p>
+
+  </div>
+
+
+
   <h4 id=the-external-interface><span class=secno>7.5.2 </span>The <code><a href=#external>External</a></code> interface</h4>
 
   <div class=impl>
@@ -102722,15 +103106,20 @@
    <li><code><a href=#messagechannel>MessageChannel</a></code>
    <li><code><a href=#messageevent>MessageEvent</a></code>
    <li><code><a href=#messageport>MessagePort</a></code>
+   <li><code><a href=#mimetype>MimeType</a></code>
+   <li><code><a href=#mimetypearray>MimeTypeArray</a></code>
    <li><code>MouseEvent</code>, <a href=#MouseEvent-partial>partial</a>
    <li><code><a href=#navigator>Navigator</a></code>
    <li><code><a href=#navigatorcontentutils>NavigatorContentUtils</a></code>
    <li><code><a href=#navigatorid>NavigatorID</a></code>
    <li><code><a href=#navigatorlanguage>NavigatorLanguage</a></code>
    <li><code><a href=#navigatoronline>NavigatorOnLine</a></code>
+   <li><code><a href=#navigatorplugins>NavigatorPlugins</a></code>
    <li><code><a href=#navigatorstorageutils>NavigatorStorageUtils</a></code>
    <li><code><a href=#pagetransitionevent>PageTransitionEvent</a></code>
    <li><code><a href=#path>Path</a></code>
+   <li><code><a href=#dom-plugin>Plugin</a></code>
+   <li><code><a href=#pluginarray>PluginArray</a></code>
    <li><code><a href=#popstateevent>PopStateEvent</a></code>
    <li><code><a href=#portcollection>PortCollection</a></code>
    <li><code><a href=#propertynodelist>PropertyNodeList</a></code>
@@ -103350,6 +103739,7 @@
   Chris Evans,
   Chris Morris,
   Chris Pearce,
+  Chris Peterson,
   Chris Weber,
   Christian Biesinger,
   Christian Johansen,

Modified: index
===================================================================
--- index	2013-07-03 23:00:32 UTC (rev 8035)
+++ index	2013-07-09 01:19:46 UTC (rev 8036)
@@ -256,7 +256,7 @@
 
   <header class=head id=head><p><a href=http://www.whatwg.org/ class=logo><img width=101 src=/images/logo alt=WHATWG height=101></a></p>
    <hgroup><h1 class=allcaps>HTML</h1>
-    <h2 class="no-num no-toc">Living Standard — Last Updated 3 July 2013</h2>
+    <h2 class="no-num no-toc">Living Standard — Last Updated 9 July 2013</h2>
    </hgroup><dl><dt><strong>Web developer edition:</strong></dt>
     <dd><strong><a href=http://developers.whatwg.org/>http://developers.whatwg.org/</a></strong></dd>
     <dt>Multiple-page version:</dt>
@@ -1004,7 +1004,8 @@
         <ol>
          <li><a href=#security-and-privacy><span class=secno>7.5.1.3.1 </span>Security and privacy</a></li>
          <li><a href=#sample-handler-impl><span class=secno>7.5.1.3.2 </span>Sample user interface</a></ol></li>
-       <li><a href=#manually-releasing-the-storage-mutex><span class=secno>7.5.1.4 </span>Manually releasing the storage mutex</a></ol></li>
+       <li><a href=#manually-releasing-the-storage-mutex><span class=secno>7.5.1.4 </span>Manually releasing the storage mutex</a></li>
+       <li><a href=#plugins-0><span class=secno>7.5.1.5 </span>Plugins</a></ol></li>
      <li><a href=#the-external-interface><span class=secno>7.5.2 </span>The <code>External</code> interface</a></ol></li>
    <li><a href=#images><span class=secno>7.6 </span>Images</a></ol></li>
  <li><a href=#editing><span class=secno>8 </span>User interaction</a>
@@ -3039,6 +3040,13 @@
   privileges as the user agent itself, vulnerabilities in the third-party software become as
   dangerous as those in the user agent.</p>
 
+  <p>Since different users having differents sets of <a href=#plugin title=plugin>plugins</a> provides a
+  fingerprinting vector that increases the chances of users being uniquely identified, user agents
+  are encouraged to support the exact same set of <a href=#plugin title=plugin>plugins</a> for each
+  user.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
   </div>
 
 
@@ -73936,7 +73944,8 @@
 <a href=#navigator>Navigator</a> implements <a href=#navigatorlanguage>NavigatorLanguage</a>;
 <a href=#navigator>Navigator</a> implements <a href=#navigatoronline>NavigatorOnLine</a>;
 <a href=#navigator>Navigator</a> implements <a href=#navigatorcontentutils>NavigatorContentUtils</a>;
-<a href=#navigator>Navigator</a> implements <a href=#navigatorstorageutils>NavigatorStorageUtils</a>;</pre>
+<a href=#navigator>Navigator</a> implements <a href=#navigatorstorageutils>NavigatorStorageUtils</a>;
+<a href=#navigator>Navigator</a> implements <a href=#navigatorplugins>NavigatorPlugins</a>;</pre>
 
 <!-- v2:
   cookieEnabled geolocator javaEnabled mozIsLocallyAvailable preference
@@ -74646,6 +74655,381 @@
   </div>
 
 
+
+  <h5 id=plugins-0><span class=secno>7.5.1.5 </span>Plugins</h5>
+
+  <pre class=idl>[NoInterfaceObject]
+interface <dfn id=navigatorplugins>NavigatorPlugins</dfn> {
+  readonly attribute <a href=#pluginarray>PluginArray</a> <a href=#dom-navigator-plugins title=dom-navigator-plugins>plugins</a>;
+  readonly attribute <a href=#mimetypearray>MimeTypeArray</a> <a href=#dom-navigator-mimetypes title=dom-navigator-mimeTypes>mimeTypes</a>;
+};
+
+interface <dfn id=pluginarray>PluginArray</dfn> {
+  void <a href=#dom-pluginarray-refresh title=dom-PluginArray-refresh>refresh</a>(optional boolean reload = false);
+  readonly attribute unsigned long <a href=#dom-pluginarray-length title=dom-PluginArray-length>length</a>;
+  getter <a href=#dom-plugin title=dom-Plugin>Plugin</a>? <a href=#dom-pluginarray-item title=dom-PluginArray-item>item</a>(unsigned long index);
+  getter <a href=#dom-plugin title=dom-Plugin>Plugin</a>? <a href=#dom-pluginarray-nameditem title=dom-PluginArray-namedItem>namedItem</a>(DOMString name);
+};
+
+interface <dfn id=mimetypearray>MimeTypeArray</dfn> {
+  readonly attribute unsigned long <a href=#dom-mimetypearray-length title=dom-MimeTypeArray-length>length</a>;
+  getter <a href=#mimetype>MimeType</a>? <a href=#dom-mimetypearray-item title=dom-MimeTypeArray-item>item</a>(unsigned long index);
+  getter <a href=#mimetype>MimeType</a>? <a href=#dom-mimetypearray-nameditem title=dom-MimeTypeArray-namedItem>namedItem</a>(DOMString name);
+};
+
+interface <dfn id=dom-plugin title=dom-Plugin>Plugin</dfn> {
+  readonly attribute DOMString <a href=#dom-plugin-name title=dom-Plugin-name>name</a>;
+  readonly attribute DOMString <a href=#dom-plugin-description title=dom-Plugin-description>description</a>;
+  readonly attribute DOMString <a href=#dom-plugin-filename title=dom-Plugin-filename>filename</a>;
+  readonly attribute unsigned long <a href=#dom-plugin-length title=dom-Plugin-length>length</a>;
+  getter <a href=#mimetype>MimeType</a>? <a href=#dom-plugin-item title=dom-Plugin-item>item</a>(unsigned long index);
+  getter <a href=#mimetype>MimeType</a>? <a href=#dom-plugin-nameditem title=dom-Plugin-namedItem>namedItem</a>(DOMString name);
+};
+
+interface <dfn id=mimetype>MimeType</dfn> {
+  readonly attribute DOMString <a href=#dom-mimetype-type title=dom-MimeType-type>type</a>;
+  readonly attribute DOMString <a href=#dom-mimetype-description title=dom-MimeType-description>description</a>;
+  readonly attribute DOMString <a href=#dom-mimetype-suffixes title=dom-MimeType-suffixes>suffixes</a>; // comma-separated
+  readonly attribute <a href=#dom-plugin title=dom-Plugin>Plugin</a> <a href=#dom-mimetype-enabledplugin title=dom-MimeType-enabledPlugin>enabledPlugin</a>;
+};</pre>
+
+  <dl class=domintro><dt><var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-plugins>plugins</code> . <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>refresh</a></code>( [ <var title="">refresh</var> ] )</dt>
+   <dd>
+    <p>Updates the lists of supported plugins and MIME types for this page, and reloads the page if the lists have changed.</p>
+    <!-- that's not quite what all browsers have always done -->
+   </dd>
+
+   <dt><var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-plugins>plugins</code> . <code title=dom-PluginArray-length><a href=#dom-pluginarray-length>length</a></code></dt>
+   <dd>
+    <p>Returns the number of plugins, represented by <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> objects, that the user agent reports.</p>
+   </dd>
+
+   <dt><var title="">plugin</var> = <var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-plugins>plugins</code> . <code title=dom-PluginArray-item><a href=#dom-pluginarray-item>item</a></code>(<var title="">index</var>)</dt>
+   <dt><var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-plugins>plugins</code>[<var title="">index</var>]</dt>
+   <dd>
+    <p>Returns the specified <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object.</p>
+   </dd>
+
+   <dt><var title="">plugin</var> = <var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-plugins>plugins</code> . <code title=dom-PluginArray-item><a href=#dom-pluginarray-item>item</a></code>(<var title="">name</var>)</dt>
+   <dt><var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-plugins>plugins</code>[<var title="">name</var>]</dt>
+   <dd>
+    <p>Returns the <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object for the plugin with the given name.</p>
+   </dd>
+
+   <dt><var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-mimeTypes>mimeTypes</code> . <code title=dom-MimeTypeArray-length><a href=#dom-mimetypearray-length>length</a></code></dt>
+   <dd>
+    <p>Returns the number of MIME types, represented by <code><a href=#mimetype>MimeType</a></code> objects, supported by the plugins that the user agent reports.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> = <var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-mimeTypes>mimeTypes</code> . <code title=dom-MimeTypeArray-item><a href=#dom-mimetypearray-item>item</a></code>(<var title="">index</var>)</dt>
+   <dt><var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-mimeTypes>mimeTypes</code>[<var title="">index</var>]</dt>
+   <dd>
+    <p>Returns the specified <code><a href=#mimetype>MimeType</a></code> object.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> = <var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-mimeTypes>mimeTypes</code> . <code title=dom-MimeTypeArray-item><a href=#dom-mimetypearray-item>item</a></code>(<var title="">name</var>)</dt>
+   <dt><var title="">window</var> . <code title=dom-navigator><a href=#dom-navigator>navigator</a></code> . <code title=dom-mimeTypes>mimeTypes</code>[<var title="">name</var>]</dt>
+   <dd>
+    <p>Returns the <code><a href=#mimetype>MimeType</a></code> object for the given MIME type.</p>
+   </dd>
+
+   <dt><var title="">plugin</var> . <code title=dom-Plugin-name><a href=#dom-plugin-name>name</a></code>
+   <dd>
+    <p>Returns the plugin's name.</p>
+   </dd>
+
+   <dt><var title="">plugin</var> . <code title=dom-Plugin-description><a href=#dom-plugin-description>description</a></code>
+   <dd>
+    <p>Returns the plugin's description.</p>
+   </dd>
+
+   <dt><var title="">plugin</var> . <code title=dom-Plugin-filename><a href=#dom-plugin-filename>filename</a></code>
+   <dd>
+    <p>Returns the plugin library's filename, if applicable on the current platform.</p>
+   </dd>
+
+   <dt><var title="">plugin</var> . <code title=dom-Plugin-length><a href=#dom-plugin-length>length</a></code></dt>
+   <dd>
+    <p>Returns the number of MIME types, represented by <code><a href=#mimetype>MimeType</a></code> objects, supported by the plugin.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> = <var title="">plugin</var> . <code title=dom-Plugin-item><a href=#dom-plugin-item>item</a></code>(<var title="">index</var>)</dt>
+   <dt><var title="">plugin</var>[<var title="">index</var>]</dt>
+   <dd>
+    <p>Returns the specified <code><a href=#mimetype>MimeType</a></code> object.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> = <var title="">plugin</var> . <code title=dom-Plugin-item><a href=#dom-plugin-item>item</a></code>(<var title="">name</var>)</dt>
+   <dt><var title="">plugin</var>[<var title="">name</var>]</dt>
+   <dd>
+    <p>Returns the <code><a href=#mimetype>MimeType</a></code> object for the given MIME type.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> . <code title=dom-MimeType-type><a href=#dom-mimetype-type>type</a></code>
+   <dd>
+    <p>Returns the MIME type.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> . <code title=dom-MimeType-description><a href=#dom-mimetype-description>description</a></code>
+   <dd>
+    <p>Returns the MIME type's description.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> . <code title=dom-MimeType-suffixes><a href=#dom-mimetype-suffixes>suffixes</a></code>
+   <dd>
+    <p>Returns the MIME type's typical file extensions, in a comma-separated list.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> . <code title=dom-MimeType-enabledPlugin><a href=#dom-mimetype-enabledplugin>enabledPlugin</a></code>
+   <dd>
+    <p>Returns the <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object that implements this MIME type.</p>
+   </dd>
+
+  </dl><div class=impl>
+
+  <p>The <dfn id=dom-navigator-plugins title=dom-navigator-plugins><code>navigator.plugins</code></dfn> attribute must
+  return a <code><a href=#pluginarray>PluginArray</a></code> object. The same object must be returned each time.</p>
+
+  <p>The <dfn id=dom-navigator-mimetypes title=dom-navigator-mimeTypes><code>navigator.mimeTypes</code></dfn> attribute must
+  return a <code>MimeTypenArray</code> object. The same object must be returned each time.</p>
+
+  <hr><p>A <code><a href=#pluginarray>PluginArray</a></code> object represents none, some, or all of the <a href=#plugin title=plugin>plugins</a> supported by the user agent, each of which is represented by a <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object. Each of these <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code>
+  objects may be <dfn id=hidden-plugin title="hidden plugin">hidden plugins</dfn>. A <a href=#hidden-plugin>hidden plugin</a> can't
+  be enumerated, but can still be inspected by using its name.</p>
+
+  <p class=note>The fewer <a href=#plugin title=plugin>plugins</a> are represented by the
+  <code><a href=#pluginarray>PluginArray</a></code> object, and of those, the more that are <a href=#hidden-plugin title="hidden
+  plugin">hidden</a>, the more the user's privacy will be protected. Each exposed plugin
+  increases the number of bits that can be derived for fingerprinting. Hiding a plugin helps, but
+  unless it is an extremely rare plugin, it is likely that a site attempting to derive the list of
+  plugins can still determine whether the plugin is supported or not by probing for it by name (the
+  names of popular plugins are widely known). Therefore not exposing a plugin at all is preferred.
+  Unfortunately, many legacy sites use this feature to determine, for example, which plugin to use
+  to play video. Not exposing any plugins at all might therefore not be entirely plausible.</p>
+
+  <p>The <code><a href=#pluginarray>PluginArray</a></code> objects created by a user agent must not be <a href=#live>live</a>. The
+  set of plugins represented by the objects must not change once an object is created, except when
+  it is updated by the <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>refresh()</a></code> method.</p>
+
+  <p>Each <a href=#plugin>plugin</a> represented by a <code><a href=#pluginarray>PluginArray</a></code> can support a number of
+  <a href=#mime-type title="MIME type">MIME types</a>. For each such <a href=#plugin>plugin</a>, the user agent must
+  pick one or more of these <a href=#mime-type title="MIME type">MIME types</a> to be those that are
+  <dfn id=explicitly-supported>explicitly supported</dfn>.</p>
+
+  <p class=note>The <a href=#explicitly-supported>explicitly supported</a> <a href=#mime-type title="MIME type">MIME types</a> of
+  a <a href=#plugin>plugin</a> are those that are exposed through the <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> and <code><a href=#mimetypearray>MimeTypeArray</a></code> interfaces. As with <a href=#plugin title=plugin>plugins</a> themselves, any variation between users regarding what is exposed
+  allows sites to fingerprint users. User agents are therefore encouraged to expose the same <a href=#mime-type title="MIME type">MIME types</a> for all users of a <a href=#plugin>plugin</a>, regardless of the
+  actual types supported... at least, within the constraints imposed by compatibility with legacy
+  content.</p>
+
+  <p>The <a href=#supported-property-indices>supported property indices</a> of a <code><a href=#pluginarray>PluginArray</a></code> object are the
+  numbers from zero to the number of non-<a href=#hidden-plugin title="hidden plugin">hidden</a> <a href=#plugin title=plugin>plugins</a> represented by the object, if any.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>The <dfn id=dom-pluginarray-length title=dom-PluginArray-length><code>length</code></dfn> attribute must return the
+  number of non-<a href=#hidden-plugin title="hidden plugin">hidden</a> <a href=#plugin title=plugin>plugins</a>
+  represented by the object.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>The <dfn id=dom-pluginarray-item title=dom-PluginArray-item><code>item()</code></dfn> method of a
+  <code><a href=#pluginarray>PluginArray</a></code> object must return null if the argument is not one of the object's
+  <a href=#supported-property-indices>supported property indices</a>, and otherwise must return the result of running the
+  following steps, using the method's argument as <var title="">index</var>:</p>
+
+  <ol><li><p>Let <var title="">list</var> be the <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> objects
+   representing the non-<a href=#hidden-plugin title="hidden plugin">hidden</a> <a href=#plugin title=plugin>plugins</a> represented by the <code><a href=#pluginarray>PluginArray</a></code> object.</li>
+
+   <li><p>Sort <var title="">list</var> alphabetically by the <code title=dom-Plugin-name><a href=#dom-plugin-name>name</a></code> of each <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code>.</li>
+
+   <li><p>Return the <var title="">index</var>th entry in <var title="">list</var>.</li>
+
+  </ol><p class=note>It is important <a href=#fingerprinting-vector class=no-backref title="fingerprinting vector">for
+  privacy</a> that the order of plugins not leak additional information, e.g. the order in which
+  plugins were installed.</p>
+
+  <p>The <a href=#supported-property-names>supported property names</a> of a <code><a href=#pluginarray>PluginArray</a></code> object are the values
+  of the <code title=dom-Plugin-name><a href=#dom-plugin-name>name</a></code> attributes of all the <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> objects represented by the <code><a href=#pluginarray>PluginArray</a></code> object. The
+  properties exposed in this way must not be enumerable.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>The <dfn id=dom-pluginarray-nameditem title=dom-PluginArray-namedItem><code>namedItem()</code></dfn> method of a
+  <code><a href=#pluginarray>PluginArray</a></code> object must return null if the argument is not one of the object's
+  <a href=#supported-property-names>supported property names</a>, and otherwise must return the <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object, of those represented by the <code><a href=#pluginarray>PluginArray</a></code>
+  object, that has a <code title=dom-Plugin-name><a href=#dom-plugin-name>name</a></code> equal to the method's argument.</p>
+
+  <p>The <dfn id=dom-pluginarray-refresh title=dom-PluginArray-refresh><code>refresh()</code></dfn> method of the
+  <code><a href=#pluginarray>PluginArray</a></code> object of a <code><a href=#navigator>Navigator</a></code> object, when invoked, must check to
+  see if any <a href=#plugin title=plugin>plugins</a> have been installed or reconfigured since the user
+  agent created the <code><a href=#pluginarray>PluginArray</a></code> object. If so, and the method's argument is true, then
+  the user agent must act as if the <code title=dom-location-reload><a href=#dom-location-reload>location.reload()</a></code>
+  method was called instead. Otherwise, the user agent must update the <code><a href=#pluginarray>PluginArray</a></code>
+  object and <code><a href=#mimetypearray>MimeTypeArray</a></code> object created for attributes of that <code><a href=#navigator>Navigator</a></code>
+  object, and the <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> and <code><a href=#mimetype>MimeType</a></code> objects created
+  for those <code><a href=#pluginarray>PluginArray</a></code> and <code><a href=#mimetypearray>MimeTypeArray</a></code> objects, using the same <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> objects for cases where the <code title=dom-Plugin-name><a href=#dom-plugin-name>name</a></code> is the same, and the same <code><a href=#mimetype>MimeType</a></code> objects for
+  cases where the <code title=dom-MimeType-type><a href=#dom-mimetype-type>type</a></code> is the same, and creating new objects
+  for cases where there were no matching objects immediately prior to the <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>refresh()</a></code> call. Old <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code>
+  and <code><a href=#mimetype>MimeType</a></code> objects must continue to return the same values that they had prior to
+  the update, though naturally now the data is stale and may appear inconsistent (for example, an
+  old <code><a href=#mimetype>MimeType</a></code> entry might list as its <code title=dom-MimeType-enabledPlugin><a href=#dom-mimetype-enabledplugin>enabledPlugin</a></code> a <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code>
+  object that no longer lists that <code><a href=#mimetype>MimeType</a></code> as a supported <code><a href=#mimetype>MimeType</a></code>).</p>
+
+  <hr><p>A <code><a href=#mimetypearray>MimeTypeArray</a></code> object represents the <a href=#mime-type title="MIME type">MIME types</a>
+  <a href=#explicitly-supported>explicitly supported</a> by <a href=#plugin title=plugin>plugins</a> supported by the user
+  agent, each of which is represented by a <code><a href=#mimetype>MimeType</a></code> object.</p>
+
+  <p>The <code><a href=#mimetypearray>MimeTypeArray</a></code> objects created by a user agent must not be <a href=#live>live</a>.
+  The set of MIME types represented by the objects must not change once an object is created, except
+  when it is updated by the <code><a href=#pluginarray>PluginArray</a></code> object's <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>refresh()</a></code> method.</p>
+
+  <p>The <a href=#supported-property-indices>supported property indices</a> of a <code><a href=#mimetypearray>MimeTypeArray</a></code> object are the
+  numbers from zero to the number of <a href=#mime-type title="MIME type">MIME types</a> <a href=#explicitly-supported>explicitly
+  supported</a> by non-<a href=#hidden-plugin title="hidden plugin">hidden</a> <a href=#plugin title=plugin>plugins</a> represented by the corresponding <code><a href=#pluginarray>PluginArray</a></code> object, if
+  any.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>The <dfn id=dom-mimetypearray-length title=dom-MimeTypeArray-length><code>length</code></dfn> attribute must return the
+  number of <a href=#mime-type title="MIME type">MIME types</a> <a href=#explicitly-supported>explicitly supported</a> by non-<a href=#hidden-plugin title="hidden plugin">hidden</a> <a href=#plugin title=plugin>plugins</a> represented by the
+  corresponding <code><a href=#pluginarray>PluginArray</a></code> object, if any.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>The <dfn id=dom-mimetypearray-item title=dom-MimeTypeArray-item><code>item()</code></dfn> method of a
+  <code><a href=#mimetypearray>MimeTypeArray</a></code> object must return null if the argument is not one of the object's
+  <a href=#supported-property-indices>supported property indices</a>, and otherwise must return the result of running the
+  following steps, using the method's argument as <var title="">index</var>:</p>
+
+  <ol><li><p>Let <var title="">list</var> be the <code><a href=#mimetype>MimeType</a></code> objects representing the <a href=#mime-type title="MIME type">MIME types</a> <a href=#explicitly-supported>explicitly supported</a> by non-<a href=#hidden-plugin title="hidden
+   plugin">hidden</a> <a href=#plugin title=plugin>plugins</a> represented by the corresponding
+   <code><a href=#pluginarray>PluginArray</a></code> object, if any.</li>
+
+   <li><p>Sort <var title="">list</var> alphabetically by the <code title=dom-MimeType-type><a href=#dom-mimetype-type>type</a></code> of each <code><a href=#mimetype>MimeType</a></code>.</li>
+
+   <li><p>Return the <var title="">index</var>th entry in <var title="">list</var>.</li>
+
+  </ol><p class=note>It is important <a href=#fingerprinting-vector class=no-backref title="fingerprinting vector">for
+  privacy</a> that the order of MIME types not leak additional information, e.g. the order in
+  which plugins were installed.</p>
+
+  <p>The <a href=#supported-property-names>supported property names</a> of a <code><a href=#mimetypearray>MimeTypeArray</a></code> object are the values
+  of the <code title=dom-MimeType-type><a href=#dom-mimetype-type>type</a></code> attributes of all the <code><a href=#mimetype>MimeType</a></code>
+  objects represented by the <code><a href=#mimetypearray>MimeTypeArray</a></code> object. The properties exposed in this way
+  must not be enumerable.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>The <dfn id=dom-mimetypearray-nameditem title=dom-MimeTypeArray-namedItem><code>namedItem()</code></dfn> method of a
+  <code><a href=#mimetypearray>MimeTypeArray</a></code> object must return null if the argument is not one of the object's
+  <a href=#supported-property-names>supported property names</a>, and otherwise must return the <code><a href=#mimetype>MimeType</a></code> object
+  that has a <code title=dom-MimeType-type><a href=#dom-mimetype-type>type</a></code> equal to the method's argument.</p>
+
+  <hr><p>A <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object represents a <a href=#plugin>plugin</a>. It has
+  several attributes to provide details about the plugin, and can be enumerated to obtain the list
+  of <a href=#mime-type title="MIME type">MIME types</a> that it <a href=#explicitly-supported title="explicitly supported">explicitly
+  supports</a>.</p>
+
+  <p>The <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> objects created by a user agent must not be
+  <a href=#live>live</a>. The set of MIME types represented by the objects, and the values of the
+  objects' attributes, must not change once an object is created, except when updated by the
+  <code><a href=#pluginarray>PluginArray</a></code> object's <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>refresh()</a></code>
+  method.</p>
+
+  <p>The <dfn id=reported-mime-types>reported MIME types</dfn> for a <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object are the
+  <a href=#mime-type title="MIME type">MIME types</a> <a href=#explicitly-supported>explicitly supported</a> by the corresponding
+  <a href=#plugin>plugin</a> when this object was last created or updated by <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>PluginArray.refresh()</a></code>, whichever happened most
+  recently.</p>
+
+  <p>The <a href=#supported-property-indices>supported property indices</a> of a <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object
+  are the numbers from zero to the number of <a href=#reported-mime-types>reported MIME types</a>.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>The <dfn id=dom-plugin-length title=dom-Plugin-length><code>length</code></dfn> attribute must return the number
+  of <a href=#reported-mime-types>reported MIME types</a>.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>The <dfn id=dom-plugin-item title=dom-Plugin-item><code>item()</code></dfn> method of a <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object must return null if the argument is not one of the
+  object's <a href=#supported-property-indices>supported property indices</a>, and otherwise must return the result of running
+  the following steps, using the method's argument as <var title="">index</var>:</p>
+
+  <ol><li><p>Let <var title="">list</var> be the <code><a href=#mimetype>MimeType</a></code> objects representing the
+   <a href=#reported-mime-types>reported MIME types</a>.</li>
+
+   <li><p>Sort <var title="">list</var> alphabetically by the <code title=dom-MimeType-type><a href=#dom-mimetype-type>type</a></code> of each <code><a href=#mimetype>MimeType</a></code>.</li>
+
+   <li><p>Return the <var title="">index</var>th entry in <var title="">list</var>.</li>
+
+  </ol><p class=note>It is important <a href=#fingerprinting-vector class=no-backref title="fingerprinting vector">for
+  privacy</a> that the order of MIME types not leak additional information, e.g. the order in
+  which plugins were installed.</p>
+
+  <p>The <a href=#supported-property-names>supported property names</a> of a <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object
+  are the values of the <code title=dom-MimeType-type><a href=#dom-mimetype-type>type</a></code> attributes of the
+  <code><a href=#mimetype>MimeType</a></code> objects representing the <a href=#reported-mime-types>reported MIME types</a>. The properties
+  exposed in this way must not be enumerable.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p>The <dfn id=dom-plugin-nameditem title=dom-Plugin-namedItem><code>namedItem()</code></dfn> method of a <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object must return null if the argument is not one of the
+  object's <a href=#supported-property-names>supported property names</a>, and otherwise must return the
+  <code><a href=#mimetype>MimeType</a></code> object that has a <code title=dom-MimeType-type><a href=#dom-mimetype-type>type</a></code> equal to the
+  method's argument.</p>
+
+  <p>The <dfn id=dom-plugin-name title=dom-Plugin-name><code>name</code></dfn> attribute must return the
+  <a href=#plugin>plugin</a>'s name.</p>
+
+  <p>The <dfn id=dom-plugin-description title=dom-Plugin-description><code>description</code></dfn> and <dfn id=dom-plugin-filename title=dom-Plugin-filename><code>filename</code></dfn> attributes must return user-agent-defined
+  (or, in all likelihood, <a href=#plugin>plugin</a>-defined) strings. In each case, the same string must
+  be returned each time, except that the strings returned may change when the <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>PluginArray.refresh()</a></code> method updates the object.</p>
+
+  <p class=warning>If the values returned by the <code title=dom-Plugin-description><a href=#dom-plugin-description>description</a></code> or <code title=dom-Plugin-filename><a href=#dom-plugin-filename>filename</a></code> attributes vary between versions of a
+  <a href=#plugin>plugin</a>, they can be used both as a fingerprinting vector and, even more importantly,
+  as a trivial way to determine what security vulnerabilities a <a href=#plugin>plugin</a> (and thus a
+  browser) may have. It is thus highly recommended that the <code title=dom-Plugin-description><a href=#dom-plugin-description>description</a></code> attribute just return the same value as the
+  <code title=dom-Plugin-name><a href=#dom-plugin-name>name</a></code> attribute, and that the <code title=dom-Plugin-filename><a href=#dom-plugin-filename>filename</a></code> attribute return the empty string.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <hr><p>A <code><a href=#mimetype>MimeType</a></code> object represents a <a href=#mime-type>MIME type</a> that is, or was,
+  <a href=#explicitly-supported>explicitly supported</a> by a <a href=#plugin>plugin</a>.</p>
+
+  <p>The <code><a href=#mimetype>MimeType</a></code> objects created by a user agent must not be <a href=#live>live</a>. The
+  values of the objects' attributes must not change once an object is created, except when updated
+  by the <code><a href=#pluginarray>PluginArray</a></code> object's <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>refresh()</a></code>
+  method.</p>
+
+  <p>The <dfn id=dom-mimetype-type title=dom-MimeType-type><code>type</code></dfn> attribute must return the
+  <a href=#valid-mime-type-with-no-parameters>valid MIME type with no parameters</a> describing the <a href=#mime-type>MIME type</a>.</p>
+
+  <p>The <dfn id=dom-mimetype-description title=dom-MimeType-description><code>description</code></dfn> and <dfn id=dom-mimetype-suffixes title=dom-MimeType-suffixes><code>suffixes</code></dfn> attributes must return
+  user-agent-defined (or, in all likelihood, <a href=#plugin>plugin</a>-defined) strings. In each case, the
+  same string must be returned each time, except that the strings returned may change when the <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>PluginArray.refresh()</a></code> method updates the object.</p>
+
+  <p class=warning>If the values returned by the <code title=dom-MimeType-description><a href=#dom-mimetype-description>description</a></code> or <code title=dom-MimeType-suffixes><a href=#dom-mimetype-suffixes>suffxies</a></code> attributes vary between versions of a
+  <a href=#plugin>plugin</a>, they can be used both as a fingerprinting vector and, even more importantly,
+  as a trivial way to determine what security vulnerabilities a <a href=#plugin>plugin</a> (and thus a
+  browser) may have. It is thus highly recommended that the <code title=dom-MimeType-description><a href=#dom-mimetype-description>description</a></code> attribute just return the same value as the
+  <code title=dom-MimeType-type><a href=#dom-mimetype-type>type</a></code> attribute, and that the <code title=dom-MimeType-suffixes><a href=#dom-mimetype-suffixes>suffixes</a></code> attribute return the empty string.
+  <a href=#fingerprinting-vector class=fingerprint title="fingerprinting vector"><img src=http://images.whatwg.org/fingerprint.png width=46 alt="(This is a fingerprinting vector.)" height=64></a>
+  </p>
+
+  <p class=note>Commas in the <code title=dom-MimeType-suffixes><a href=#dom-mimetype-suffixes>suffixes</a></code> attribute are
+  interpreted as separating subsequent filename extensions, as in "<code title="">htm,html</code>".</p>
+
+  <p>The <dfn id=dom-mimetype-enabledplugin title=dom-MimeType-enabledPlugin><code>enabledPlugin</code></dfn> attribute must
+  return the <code title=dom-Plugin><a href=#dom-plugin>Plugin</a></code> object that represents the <a href=#plugin>plugin</a>
+  that <a href=#explicitly-supported>explicitly supported</a> the <a href=#mime-type>MIME type</a> that this <code><a href=#mimetype>MimeType</a></code>
+  object represents when this object was last created or updated by <code title=dom-PluginArray-refresh><a href=#dom-pluginarray-refresh>PluginArray.refresh()</a></code>, whichever happened most
+  recently.</p>
+
+  </div>
+
+
+
   <h4 id=the-external-interface><span class=secno>7.5.2 </span>The <code><a href=#external>External</a></code> interface</h4>
 
   <div class=impl>
@@ -102722,15 +103106,20 @@
    <li><code><a href=#messagechannel>MessageChannel</a></code>
    <li><code><a href=#messageevent>MessageEvent</a></code>
    <li><code><a href=#messageport>MessagePort</a></code>
+   <li><code><a href=#mimetype>MimeType</a></code>
+   <li><code><a href=#mimetypearray>MimeTypeArray</a></code>
    <li><code>MouseEvent</code>, <a href=#MouseEvent-partial>partial</a>
    <li><code><a href=#navigator>Navigator</a></code>
    <li><code><a href=#navigatorcontentutils>NavigatorContentUtils</a></code>
    <li><code><a href=#navigatorid>NavigatorID</a></code>
    <li><code><a href=#navigatorlanguage>NavigatorLanguage</a></code>
    <li><code><a href=#navigatoronline>NavigatorOnLine</a></code>
+   <li><code><a href=#navigatorplugins>NavigatorPlugins</a></code>
    <li><code><a href=#navigatorstorageutils>NavigatorStorageUtils</a></code>
    <li><code><a href=#pagetransitionevent>PageTransitionEvent</a></code>
    <li><code><a href=#path>Path</a></code>
+   <li><code><a href=#dom-plugin>Plugin</a></code>
+   <li><code><a href=#pluginarray>PluginArray</a></code>
    <li><code><a href=#popstateevent>PopStateEvent</a></code>
    <li><code><a href=#portcollection>PortCollection</a></code>
    <li><code><a href=#propertynodelist>PropertyNodeList</a></code>
@@ -103350,6 +103739,7 @@
   Chris Evans,
   Chris Morris,
   Chris Pearce,
+  Chris Peterson,
   Chris Weber,
   Christian Biesinger,
   Christian Johansen,

Modified: source
===================================================================
--- source	2013-07-03 23:00:32 UTC (rev 8035)
+++ source	2013-07-09 01:19:46 UTC (rev 8036)
@@ -1798,6 +1798,13 @@
   privileges as the user agent itself, vulnerabilities in the third-party software become as
   dangerous as those in the user agent.</p>
 
+  <p>Since different users having differents sets of <span title="plugin">plugins</span> provides a
+  fingerprinting vector that increases the chances of users being uniquely identified, user agents
+  are encouraged to support the exact same set of <span title="plugin">plugins</span> for each
+  user.
+  <!--INSERT FINGERPRINT-->
+  </p>
+
   </div>
 
 
@@ -82767,7 +82774,8 @@
 <span>Navigator</span> implements <span>NavigatorLanguage</span>;
 <span>Navigator</span> implements <span>NavigatorOnLine</span>;
 <span>Navigator</span> implements <span>NavigatorContentUtils</span>;
-<span>Navigator</span> implements <span>NavigatorStorageUtils</span>;</pre>
+<span>Navigator</span> implements <span>NavigatorStorageUtils</span>;
+<span>Navigator</span> implements <span>NavigatorPlugins</span>;</pre>
 
 <!-- v2:
   cookieEnabled geolocator javaEnabled mozIsLocallyAvailable preference
@@ -83575,6 +83583,442 @@
   </div>
 
 
+
+  <h5>Plugins</h5>
+
+  <pre class="idl">[NoInterfaceObject]
+interface <dfn>NavigatorPlugins</dfn> {
+  readonly attribute <span>PluginArray</span> <span title="dom-navigator-plugins">plugins</span>;
+  readonly attribute <span>MimeTypeArray</span> <span title="dom-navigator-mimeTypes">mimeTypes</span>;
+};
+
+interface <dfn>PluginArray</dfn> {
+  void <span title="dom-PluginArray-refresh">refresh</span>(optional boolean reload = false);
+  readonly attribute unsigned long <span title="dom-PluginArray-length">length</span>;
+  getter <span title="dom-Plugin">Plugin</span>? <span title="dom-PluginArray-item">item</span>(unsigned long index);
+  getter <span title="dom-Plugin">Plugin</span>? <span title="dom-PluginArray-namedItem">namedItem</span>(DOMString name);
+};
+
+interface <dfn>MimeTypeArray</dfn> {
+  readonly attribute unsigned long <span title="dom-MimeTypeArray-length">length</span>;
+  getter <span>MimeType</span>? <span title="dom-MimeTypeArray-item">item</span>(unsigned long index);
+  getter <span>MimeType</span>? <span title="dom-MimeTypeArray-namedItem">namedItem</span>(DOMString name);
+};
+
+interface <dfn title="dom-Plugin">Plugin</dfn> {
+  readonly attribute DOMString <span title="dom-Plugin-name">name</span>;
+  readonly attribute DOMString <span title="dom-Plugin-description">description</span>;
+  readonly attribute DOMString <span title="dom-Plugin-filename">filename</span>;
+  readonly attribute unsigned long <span title="dom-Plugin-length">length</span>;
+  getter <span>MimeType</span>? <span title="dom-Plugin-item">item</span>(unsigned long index);
+  getter <span>MimeType</span>? <span title="dom-Plugin-namedItem">namedItem</span>(DOMString name);
+};
+
+interface <dfn>MimeType</dfn> {
+  readonly attribute DOMString <span title="dom-MimeType-type">type</span>;
+  readonly attribute DOMString <span title="dom-MimeType-description">description</span>;
+  readonly attribute DOMString <span title="dom-MimeType-suffixes">suffixes</span>; // comma-separated
+  readonly attribute <span title="dom-Plugin">Plugin</span> <span title="dom-MimeType-enabledPlugin">enabledPlugin</span>;
+};</pre>
+
+  <dl class="domintro">
+
+   <dt><var title="">window</var> . <code title="dom-navigator">navigator</code> . <code title="dom-plugins">plugins</code> . <code title="dom-PluginArray-refresh">refresh</code>( [ <var title="">refresh</var> ] )</dt>
+   <dd>
+    <p>Updates the lists of supported plugins and MIME types for this page, and reloads the page if the lists have changed.</p>
+    <!-- that's not quite what all browsers have always done -->
+   </dd>
+
+   <dt><var title="">window</var> . <code title="dom-navigator">navigator</code> . <code title="dom-plugins">plugins</code> . <code title="dom-PluginArray-length">length</code></dt>
+   <dd>
+    <p>Returns the number of plugins, represented by <code title="dom-Plugin">Plugin</code> objects, that the user agent reports.</p>
+   </dd>
+
+   <dt><var title="">plugin</var> = <var title="">window</var> . <code title="dom-navigator">navigator</code> . <code title="dom-plugins">plugins</code> . <code title="dom-PluginArray-item">item</code>(<var title="">index</var>)</dt>
+   <dt><var title="">window</var> . <code title="dom-navigator">navigator</code> . <code title="dom-plugins">plugins</code>[<var title="">index</var>]</dt>
+   <dd>
+    <p>Returns the specified <code title="dom-Plugin">Plugin</code> object.</p>
+   </dd>
+
+   <dt><var title="">plugin</var> = <var title="">window</var> . <code title="dom-navigator">navigator</code> . <code title="dom-plugins">plugins</code> . <code title="dom-PluginArray-item">item</code>(<var title="">name</var>)</dt>
+   <dt><var title="">window</var> . <code title="dom-navigator">navigator</code> . <code title="dom-plugins">plugins</code>[<var title="">name</var>]</dt>
+   <dd>
+    <p>Returns the <code title="dom-Plugin">Plugin</code> object for the plugin with the given name.</p>
+   </dd>
+
+   <dt><var title="">window</var> . <code title="dom-navigator">navigator</code> . <code title="dom-mimeTypes">mimeTypes</code> . <code title="dom-MimeTypeArray-length">length</code></dt>
+   <dd>
+    <p>Returns the number of MIME types, represented by <code>MimeType</code> objects, supported by the plugins that the user agent reports.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> = <var title="">window</var> . <code title="dom-navigator">navigator</code> . <code title="dom-mimeTypes">mimeTypes</code> . <code title="dom-MimeTypeArray-item">item</code>(<var title="">index</var>)</dt>
+   <dt><var title="">window</var> . <code title="dom-navigator">navigator</code> . <code title="dom-mimeTypes">mimeTypes</code>[<var title="">index</var>]</dt>
+   <dd>
+    <p>Returns the specified <code>MimeType</code> object.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> = <var title="">window</var> . <code title="dom-navigator">navigator</code> . <code title="dom-mimeTypes">mimeTypes</code> . <code title="dom-MimeTypeArray-item">item</code>(<var title="">name</var>)</dt>
+   <dt><var title="">window</var> . <code title="dom-navigator">navigator</code> . <code title="dom-mimeTypes">mimeTypes</code>[<var title="">name</var>]</dt>
+   <dd>
+    <p>Returns the <code>MimeType</code> object for the given MIME type.</p>
+   </dd>
+
+   <dt><var title="">plugin</var> . <code title="dom-Plugin-name">name</code>
+   <dd>
+    <p>Returns the plugin's name.</p>
+   </dd>
+
+   <dt><var title="">plugin</var> . <code title="dom-Plugin-description">description</code>
+   <dd>
+    <p>Returns the plugin's description.</p>
+   </dd>
+
+   <dt><var title="">plugin</var> . <code title="dom-Plugin-filename">filename</code>
+   <dd>
+    <p>Returns the plugin library's filename, if applicable on the current platform.</p>
+   </dd>
+
+   <dt><var title="">plugin</var> . <code title="dom-Plugin-length">length</code></dt>
+   <dd>
+    <p>Returns the number of MIME types, represented by <code>MimeType</code> objects, supported by the plugin.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> = <var title="">plugin</var> . <code title="dom-Plugin-item">item</code>(<var title="">index</var>)</dt>
+   <dt><var title="">plugin</var>[<var title="">index</var>]</dt>
+   <dd>
+    <p>Returns the specified <code>MimeType</code> object.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> = <var title="">plugin</var> . <code title="dom-Plugin-item">item</code>(<var title="">name</var>)</dt>
+   <dt><var title="">plugin</var>[<var title="">name</var>]</dt>
+   <dd>
+    <p>Returns the <code>MimeType</code> object for the given MIME type.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> . <code title="dom-MimeType-type">type</code>
+   <dd>
+    <p>Returns the MIME type.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> . <code title="dom-MimeType-description">description</code>
+   <dd>
+    <p>Returns the MIME type's description.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> . <code title="dom-MimeType-suffixes">suffixes</code>
+   <dd>
+    <p>Returns the MIME type's typical file extensions, in a comma-separated list.</p>
+   </dd>
+
+   <dt><var title="">mimeType</var> . <code title="dom-MimeType-enabledPlugin">enabledPlugin</code>
+   <dd>
+    <p>Returns the <code title="dom-Plugin">Plugin</code> object that implements this MIME type.</p>
+   </dd>
+
+  </dl>
+
+  <div class="impl">
+
+  <p>The <dfn title="dom-navigator-plugins"><code>navigator.plugins</code></dfn> attribute must
+  return a <code>PluginArray</code> object. The same object must be returned each time.</p>
+
+  <p>The <dfn title="dom-navigator-mimeTypes"><code>navigator.mimeTypes</code></dfn> attribute must
+  return a <code>MimeTypenArray</code> object. The same object must be returned each time.</p>
+
+  <hr>
+
+  <p>A <code>PluginArray</code> object represents none, some, or all of the <span
+  title="plugin">plugins</span> supported by the user agent, each of which is represented by a <code
+  title="dom-Plugin">Plugin</code> object. Each of these <code title="dom-Plugin">Plugin</code>
+  objects may be <dfn title="hidden plugin">hidden plugins</dfn>. A <span>hidden plugin</span> can't
+  be enumerated, but can still be inspected by using its name.</p>
+
+  <p class="note">The fewer <span title="plugin">plugins</span> are represented by the
+  <code>PluginArray</code> object, and of those, the more that are <span title="hidden
+  plugin">hidden</span>, the more the user's privacy will be protected. Each exposed plugin
+  increases the number of bits that can be derived for fingerprinting. Hiding a plugin helps, but
+  unless it is an extremely rare plugin, it is likely that a site attempting to derive the list of
+  plugins can still determine whether the plugin is supported or not by probing for it by name (the
+  names of popular plugins are widely known). Therefore not exposing a plugin at all is preferred.
+  Unfortunately, many legacy sites use this feature to determine, for example, which plugin to use
+  to play video. Not exposing any plugins at all might therefore not be entirely plausible.</p>
+
+  <p>The <code>PluginArray</code> objects created by a user agent must not be <span>live</span>. The
+  set of plugins represented by the objects must not change once an object is created, except when
+  it is updated by the <code title="dom-PluginArray-refresh">refresh()</code> method.</p>
+
+  <p>Each <span>plugin</span> represented by a <code>PluginArray</code> can support a number of
+  <span title="MIME type">MIME types</span>. For each such <span>plugin</span>, the user agent must
+  pick one or more of these <span title="MIME type">MIME types</span> to be those that are
+  <dfn>explicitly supported</dfn>.</p>
+
+  <p class="note">The <span>explicitly supported</span> <span title="MIME type">MIME types</span> of
+  a <span>plugin</span> are those that are exposed through the <code
+  title="dom-Plugin">Plugin</code> and <code>MimeTypeArray</code> interfaces. As with <span
+  title="plugin">plugins</span> themselves, any variation between users regarding what is exposed
+  allows sites to fingerprint users. User agents are therefore encouraged to expose the same <span
+  title="MIME type">MIME types</span> for all users of a <span>plugin</span>, regardless of the
+  actual types supported... at least, within the constraints imposed by compatibility with legacy
+  content.</p>
+
+  <p>The <span>supported property indices</span> of a <code>PluginArray</code> object are the
+  numbers from zero to the number of non-<span title="hidden plugin">hidden</span> <span
+  title="plugin">plugins</span> represented by the object, if any.
+  <!--INSERT FINGERPRINT-->
+  </p>
+
+  <p>The <dfn title="dom-PluginArray-length"><code>length</code></dfn> attribute must return the
+  number of non-<span title="hidden plugin">hidden</span> <span title="plugin">plugins</span>
+  represented by the object.
+  <!--INSERT FINGERPRINT-->
+  </p>
+
+  <p>The <dfn title="dom-PluginArray-item"><code>item()</code></dfn> method of a
+  <code>PluginArray</code> object must return null if the argument is not one of the object's
+  <span>supported property indices</span>, and otherwise must return the result of running the
+  following steps, using the method's argument as <var title="">index</var>:</p>
+
+  <ol>
+
+   <li><p>Let <var title="">list</var> be the <code title="dom-Plugin">Plugin</code> objects
+   representing the non-<span title="hidden plugin">hidden</span> <span
+   title="plugin">plugins</span> represented by the <code>PluginArray</code> object.</p></li>
+
+   <li><p>Sort <var title="">list</var> alphabetically by the <code
+   title="dom-Plugin-name">name</code> of each <code title="dom-Plugin">Plugin</code>.</p></li>
+
+   <li><p>Return the <var title="">index</var>th entry in <var title="">list</var>.</p></li>
+
+  </ol>
+
+  <p class="note">It is important <span class="no-backref" title="fingerprinting vector">for
+  privacy</span> that the order of plugins not leak additional information, e.g. the order in which
+  plugins were installed.</p>
+
+  <p>The <span>supported property names</span> of a <code>PluginArray</code> object are the values
+  of the <code title="dom-Plugin-name">name</code> attributes of all the <code
+  title="dom-Plugin">Plugin</code> objects represented by the <code>PluginArray</code> object. The
+  properties exposed in this way must not be enumerable.
+  <!--INSERT FINGERPRINT-->
+  </p>
+
+  <p>The <dfn title="dom-PluginArray-namedItem"><code>namedItem()</code></dfn> method of a
+  <code>PluginArray</code> object must return null if the argument is not one of the object's
+  <span>supported property names</span>, and otherwise must return the <code
+  title="dom-Plugin">Plugin</code> object, of those represented by the <code>PluginArray</code>
+  object, that has a <code title="dom-Plugin-name">name</code> equal to the method's argument.</p>
+
+  <p>The <dfn title="dom-PluginArray-refresh"><code>refresh()</code></dfn> method of the
+  <code>PluginArray</code> object of a <code>Navigator</code> object, when invoked, must check to
+  see if any <span title="plugin">plugins</span> have been installed or reconfigured since the user
+  agent created the <code>PluginArray</code> object. If so, and the method's argument is true, then
+  the user agent must act as if the <code title="dom-location-reload">location.reload()</code>
+  method was called instead. Otherwise, the user agent must update the <code>PluginArray</code>
+  object and <code>MimeTypeArray</code> object created for attributes of that <code>Navigator</code>
+  object, and the <code title="dom-Plugin">Plugin</code> and <code>MimeType</code> objects created
+  for those <code>PluginArray</code> and <code>MimeTypeArray</code> objects, using the same <code
+  title="dom-Plugin">Plugin</code> objects for cases where the <code
+  title="dom-Plugin-name">name</code> is the same, and the same <code>MimeType</code> objects for
+  cases where the <code title="dom-MimeType-type">type</code> is the same, and creating new objects
+  for cases where there were no matching objects immediately prior to the <code
+  title="dom-PluginArray-refresh">refresh()</code> call. Old <code title="dom-Plugin">Plugin</code>
+  and <code>MimeType</code> objects must continue to return the same values that they had prior to
+  the update, though naturally now the data is stale and may appear inconsistent (for example, an
+  old <code>MimeType</code> entry might list as its <code
+  title="dom-MimeType-enabledPlugin">enabledPlugin</code> a <code title="dom-Plugin">Plugin</code>
+  object that no longer lists that <code>MimeType</code> as a supported <code>MimeType</code>).</p>
+
+  <hr>
+
+  <p>A <code>MimeTypeArray</code> object represents the <span title="MIME type">MIME types</span>
+  <span>explicitly supported</span> by <span title="plugin">plugins</span> supported by the user
+  agent, each of which is represented by a <code>MimeType</code> object.</p>
+
+  <p>The <code>MimeTypeArray</code> objects created by a user agent must not be <span>live</span>.
+  The set of MIME types represented by the objects must not change once an object is created, except
+  when it is updated by the <code>PluginArray</code> object's <code
+  title="dom-PluginArray-refresh">refresh()</code> method.</p>
+
+  <p>The <span>supported property indices</span> of a <code>MimeTypeArray</code> object are the
+  numbers from zero to the number of <span title="MIME type">MIME types</span> <span>explicitly
+  supported</span> by non-<span title="hidden plugin">hidden</span> <span
+  title="plugin">plugins</span> represented by the corresponding <code>PluginArray</code> object, if
+  any.
+  <!--INSERT FINGERPRINT-->
+  </p>
+
+  <p>The <dfn title="dom-MimeTypeArray-length"><code>length</code></dfn> attribute must return the
+  number of <span title="MIME type">MIME types</span> <span>explicitly supported</span> by non-<span
+  title="hidden plugin">hidden</span> <span title="plugin">plugins</span> represented by the
+  corresponding <code>PluginArray</code> object, if any.
+  <!--INSERT FINGERPRINT-->
+  </p>
+
+  <p>The <dfn title="dom-MimeTypeArray-item"><code>item()</code></dfn> method of a
+  <code>MimeTypeArray</code> object must return null if the argument is not one of the object's
+  <span>supported property indices</span>, and otherwise must return the result of running the
+  following steps, using the method's argument as <var title="">index</var>:</p>
+
+  <ol>
+
+   <li><p>Let <var title="">list</var> be the <code>MimeType</code> objects representing the <span
+   title="MIME type">MIME types</span> <span>explicitly supported</span> by non-<span title="hidden
+   plugin">hidden</span> <span title="plugin">plugins</span> represented by the corresponding
+   <code>PluginArray</code> object, if any.</p></li>
+
+   <li><p>Sort <var title="">list</var> alphabetically by the <code
+   title="dom-MimeType-type">type</code> of each <code>MimeType</code>.</p></li>
+
+   <li><p>Return the <var title="">index</var>th entry in <var title="">list</var>.</p></li>
+
+  </ol>
+
+  <p class="note">It is important <span class="no-backref" title="fingerprinting vector">for
+  privacy</span> that the order of MIME types not leak additional information, e.g. the order in
+  which plugins were installed.</p>
+
+  <p>The <span>supported property names</span> of a <code>MimeTypeArray</code> object are the values
+  of the <code title="dom-MimeType-type">type</code> attributes of all the <code>MimeType</code>
+  objects represented by the <code>MimeTypeArray</code> object. The properties exposed in this way
+  must not be enumerable.
+  <!--INSERT FINGERPRINT-->
+  </p>
+
+  <p>The <dfn title="dom-MimeTypeArray-namedItem"><code>namedItem()</code></dfn> method of a
+  <code>MimeTypeArray</code> object must return null if the argument is not one of the object's
+  <span>supported property names</span>, and otherwise must return the <code>MimeType</code> object
+  that has a <code title="dom-MimeType-type">type</code> equal to the method's argument.</p>
+
+  <hr>
+
+  <p>A <code title="dom-Plugin">Plugin</code> object represents a <span>plugin</span>. It has
+  several attributes to provide details about the plugin, and can be enumerated to obtain the list
+  of <span title="MIME type">MIME types</span> that it <span title="explicitly supported">explicitly
+  supports</span>.</p>
+
+  <p>The <code title="dom-Plugin">Plugin</code> objects created by a user agent must not be
+  <span>live</span>. The set of MIME types represented by the objects, and the values of the
+  objects' attributes, must not change once an object is created, except when updated by the
+  <code>PluginArray</code> object's <code title="dom-PluginArray-refresh">refresh()</code>
+  method.</p>
+
+  <p>The <dfn>reported MIME types</dfn> for a <code title="dom-Plugin">Plugin</code> object are the
+  <span title="MIME type">MIME types</span> <span>explicitly supported</span> by the corresponding
+  <span>plugin</span> when this object was last created or updated by <code
+  title="dom-PluginArray-refresh">PluginArray.refresh()</code>, whichever happened most
+  recently.</p>
+
+  <p>The <span>supported property indices</span> of a <code title="dom-Plugin">Plugin</code> object
+  are the numbers from zero to the number of <span>reported MIME types</span>.
+  <!--INSERT FINGERPRINT-->
+  </p>
+
+  <p>The <dfn title="dom-Plugin-length"><code>length</code></dfn> attribute must return the number
+  of <span>reported MIME types</span>.
+  <!--INSERT FINGERPRINT-->
+  </p>
+
+  <p>The <dfn title="dom-Plugin-item"><code>item()</code></dfn> method of a <code
+  title="dom-Plugin">Plugin</code> object must return null if the argument is not one of the
+  object's <span>supported property indices</span>, and otherwise must return the result of running
+  the following steps, using the method's argument as <var title="">index</var>:</p>
+
+  <ol>
+
+   <li><p>Let <var title="">list</var> be the <code>MimeType</code> objects representing the
+   <span>reported MIME types</span>.</p></li>
+
+   <li><p>Sort <var title="">list</var> alphabetically by the <code
+   title="dom-MimeType-type">type</code> of each <code>MimeType</code>.</p></li>
+
+   <li><p>Return the <var title="">index</var>th entry in <var title="">list</var>.</p></li>
+
+  </ol>
+
+  <p class="note">It is important <span class="no-backref" title="fingerprinting vector">for
+  privacy</span> that the order of MIME types not leak additional information, e.g. the order in
+  which plugins were installed.</p>
+
+  <p>The <span>supported property names</span> of a <code title="dom-Plugin">Plugin</code> object
+  are the values of the <code title="dom-MimeType-type">type</code> attributes of the
+  <code>MimeType</code> objects representing the <span>reported MIME types</span>. The properties
+  exposed in this way must not be enumerable.
+  <!--INSERT FINGERPRINT-->
+  </p>
+
+  <p>The <dfn title="dom-Plugin-namedItem"><code>namedItem()</code></dfn> method of a <code
+  title="dom-Plugin">Plugin</code> object must return null if the argument is not one of the
+  object's <span>supported property names</span>, and otherwise must return the
+  <code>MimeType</code> object that has a <code title="dom-MimeType-type">type</code> equal to the
+  method's argument.</p>
+
+  <p>The <dfn title="dom-Plugin-name"><code>name</code></dfn> attribute must return the
+  <span>plugin</span>'s name.</p>
+
+  <p>The <dfn title="dom-Plugin-description"><code>description</code></dfn> and <dfn
+  title="dom-Plugin-filename"><code>filename</code></dfn> attributes must return user-agent-defined
+  (or, in all likelihood, <span>plugin</span>-defined) strings. In each case, the same string must
+  be returned each time, except that the strings returned may change when the <code
+  title="dom-PluginArray-refresh">PluginArray.refresh()</code> method updates the object.</p>
+
+  <p class="warning">If the values returned by the <code
+  title="dom-Plugin-description">description</code> or <code
+  title="dom-Plugin-filename">filename</code> attributes vary between versions of a
+  <span>plugin</span>, they can be used both as a fingerprinting vector and, even more importantly,
+  as a trivial way to determine what security vulnerabilities a <span>plugin</span> (and thus a
+  browser) may have. It is thus highly recommended that the <code
+  title="dom-Plugin-description">description</code> attribute just return the same value as the
+  <code title="dom-Plugin-name">name</code> attribute, and that the <code
+  title="dom-Plugin-filename">filename</code> attribute return the empty string.
+  <!--INSERT FINGERPRINT-->
+  </p>
+
+  <hr>
+
+  <p>A <code>MimeType</code> object represents a <span>MIME type</span> that is, or was,
+  <span>explicitly supported</span> by a <span>plugin</span>.</p>
+
+  <p>The <code>MimeType</code> objects created by a user agent must not be <span>live</span>. The
+  values of the objects' attributes must not change once an object is created, except when updated
+  by the <code>PluginArray</code> object's <code title="dom-PluginArray-refresh">refresh()</code>
+  method.</p>
+
+  <p>The <dfn title="dom-MimeType-type"><code>type</code></dfn> attribute must return the
+  <span>valid MIME type with no parameters</span> describing the <span>MIME type</span>.</p>
+
+  <p>The <dfn title="dom-MimeType-description"><code>description</code></dfn> and <dfn
+  title="dom-MimeType-suffixes"><code>suffixes</code></dfn> attributes must return
+  user-agent-defined (or, in all likelihood, <span>plugin</span>-defined) strings. In each case, the
+  same string must be returned each time, except that the strings returned may change when the <code
+  title="dom-PluginArray-refresh">PluginArray.refresh()</code> method updates the object.</p>
+
+  <p class="warning">If the values returned by the <code
+  title="dom-MimeType-description">description</code> or <code
+  title="dom-MimeType-suffixes">suffxies</code> attributes vary between versions of a
+  <span>plugin</span>, they can be used both as a fingerprinting vector and, even more importantly,
+  as a trivial way to determine what security vulnerabilities a <span>plugin</span> (and thus a
+  browser) may have. It is thus highly recommended that the <code
+  title="dom-MimeType-description">description</code> attribute just return the same value as the
+  <code title="dom-MimeType-type">type</code> attribute, and that the <code
+  title="dom-MimeType-suffixes">suffixes</code> attribute return the empty string.
+  <!--INSERT FINGERPRINT-->
+  </p>
+
+  <p class="note">Commas in the <code title="dom-MimeType-suffixes">suffixes</code> attribute are
+  interpreted as separating subsequent filename extensions, as in "<code
+  title="">htm,html</code>".</p>
+
+  <p>The <dfn title="dom-MimeType-enabledPlugin"><code>enabledPlugin</code></dfn> attribute must
+  return the <code title="dom-Plugin">Plugin</code> object that represents the <span>plugin</span>
+  that <span>explicitly supported</span> the <span>MIME type</span> that this <code>MimeType</code>
+  object represents when this object was last created or updated by <code
+  title="dom-PluginArray-refresh">PluginArray.refresh()</code>, whichever happened most
+  recently.</p>
+
+  </div>
+
+
+
   <h4>The <code>External</code> interface</h4>
 
   <div class="impl">
@@ -115886,6 +116330,7 @@
   Chris Evans,
   Chris Morris,
   Chris Pearce,
+  Chris Peterson,
   Chris Weber,
   Christian Biesinger,
   Christian Johansen,




More information about the Commit-Watchers mailing list