Revision: 5612
Author:   [email protected]
Date:     Tue Oct  8 22:01:03 2013 UTC
Log:      Remove Domado 'rulebreaker', no longer needed without ES5/3.
https://codereview.appspot.com/14569043

* Remove opt_rulebreaker parameter to Domado().
* Remove all occurrences of makeDOMAccessible and
  makeFunctionAccessible.

[email protected]

http://code.google.com/p/google-caja/source/detail?r=5612

Modified:
 /trunk/src/com/google/caja/plugin/bridal.js
 /trunk/src/com/google/caja/plugin/domado.js
 /trunk/src/com/google/caja/plugin/html-emitter.js
 /trunk/src/com/google/caja/plugin/ses-frame-group.js
 /trunk/tests/com/google/caja/plugin/browser-test-case.js
 /trunk/tests/com/google/caja/plugin/html-emitter-test.html
 /trunk/tests/com/google/caja/plugin/test-domado-special.js

=======================================
--- /trunk/src/com/google/caja/plugin/bridal.js Wed Oct  2 19:45:52 2013 UTC
+++ /trunk/src/com/google/caja/plugin/bridal.js Tue Oct  8 22:01:03 2013 UTC
@@ -31,25 +31,17 @@
 /**
  * Construct the bridal object for a specific document.
  *
- * @param {function} makeDOMAccessible A function which will be called on the - * document and every object retrieved from it, recursively, and its results - * used instead of those objects. This hook is available in case bridal is
- *     running in an environment such that unmodified DOM objects cannot be
- *     touched. makeDOMAccessible may either modify its argument (should be
- *     idempotent) or return a different object.
* @param {Node} targetDocNode The document to manipulate, or some node owned
  *     by it.
  */
-var bridalMaker = function (makeDOMAccessible, targetDocNode) {
-  targetDocNode = makeDOMAccessible(targetDocNode);
+var bridalMaker = function (targetDocNode) {
   var document = targetDocNode.nodeType === 9 ? targetDocNode :
-      makeDOMAccessible(targetDocNode.ownerDocument);
+      targetDocNode.ownerDocument;

-  var window = makeDOMAccessible(
-      bridalMaker.getWindow(document, makeDOMAccessible));
-  var navigator      = makeDOMAccessible(window.navigator);
-  var XMLHttpRequest = makeDOMAccessible(window.XMLHttpRequest);
-  var ActiveXObject  = makeDOMAccessible(window.ActiveXObject);
+  var window = bridalMaker.getWindow(document);
+  var navigator      = window.navigator;
+  var XMLHttpRequest = window.XMLHttpRequest;
+  var ActiveXObject  = window.ActiveXObject;

////////////////////////////////////////////////////////////////////////////
   // Private section
@@ -92,7 +84,7 @@
         "details", "figcaption", "figure", "footer", "header", "hgroup", 
"mark",
         "meter", "nav", "output", "progress", "section", "summary", "time",
         "video"];
- var documentFragment = makeDOMAccessible(document.createDocumentFragment());
+    var documentFragment = document.createDocumentFragment();
     for (var i = 0; i < html5_elements.length; i++) {
       try {
         document.createElement(html5_elements[i]);
@@ -142,7 +134,6 @@
   var endsWithUnderbars = /__$/;
   var escapeAttrib = html.escapeAttrib;
   function constructClone(node, deep) {
-    node = makeDOMAccessible(node);
     var clone;
     if (node.nodeType === 1 && featureExtendedCreateElement) {
// From http://blog.pengoworks.com/index.cfm/2007/7/16/IE6--IE7-quirks-with-cloneNode-and-form-elements
@@ -185,17 +176,16 @@
           break;
       }

-      clone = makeDOMAccessible(document.createElement(tagDesc));
+      clone = document.createElement(tagDesc);

-      var attrs = makeDOMAccessible(node.attributes);
+      var attrs = node.attributes;
       for (var i = 0, attr; (attr = attrs[i]); ++i) {
-        attr = makeDOMAccessible(attr);
         if (attr.specified && !endsWithUnderbars.test(attr.name)) {
           setAttribute(clone, attr.nodeName, attr.nodeValue);
         }
       }
     } else {
-      clone = makeDOMAccessible(node.cloneNode(false));
+      clone = node.cloneNode(false);
     }
     if (deep) {
       // TODO(mikesamuel): should we whitelist nodes here, to e.g. prevent
@@ -210,8 +200,6 @@
   }

   function fixupClone(node, clone) {
-    node = makeDOMAccessible(node);
-    clone = makeDOMAccessible(clone);
for (var child = node.firstChild, cloneChild = clone.firstChild; cloneChild;
          child = child.nextSibling, cloneChild = cloneChild.nextSibling) {
       fixupClone(child, cloneChild);
@@ -248,14 +236,13 @@
   }

function initEvent(event, methodName, type, bubbles, cancelable, args, notCustom) {
-    event = makeDOMAccessible(event);
     methodName = String(methodName);
     type = tameEventType(type, !notCustom);
     bubbles = Boolean(bubbles);
     cancelable = Boolean(cancelable);

if (methodName in event) { // Non-IE, specialized init such as initMouseEvent
-      var method = makeDOMAccessible(event[methodName]);
+      var method = event[methodName];
       if (typeof method !== 'function') {
         // we don't expect this to happen, but if it does, explain
         throw new Error('Domado internal error: event.' + methodName +
@@ -279,8 +266,6 @@
   }

   function dispatchEvent(element, event) {
-    element = makeDOMAccessible(element);
-    event = makeDOMAccessible(event);
     // TODO(mikesamuel): when we change event dispatching to happen
     // asynchronously, we should exempt custom events since those
     // need to return a useful value, and there may be code bracketing
@@ -316,7 +301,6 @@
    *         be used directly.
    */
   function addEventListener(element, type, handler, useCapture) {
-    element = makeDOMAccessible(element);
     type = String(type);
     var tameType = tameEventType(type, false, element.tagName);
     var isNowCustom = type !== tameType;
@@ -383,7 +367,6 @@
    * @return {Node} The duplicate node.
    */
   function cloneNode(node, deep) {
-    node = makeDOMAccessible(node);
     var clone;
     if (!document.all) {  // Not IE 6 or IE 7
       clone = node.cloneNode(deep);
@@ -395,9 +378,9 @@
   }

   function initCanvasElements(doc) {
-    var els = makeDOMAccessible(doc).getElementsByTagName('canvas');
+    var els = doc.getElementsByTagName('canvas');
     for (var i = 0; i < els.length; i++) {
-      initCanvasElement(makeDOMAccessible(els[i]));
+      initCanvasElement(els[i]);
     }
   }

@@ -415,9 +398,9 @@
         tag.push(' ', attribs[i], '="', escapeAttrib(attribs[i + 1]), '"');
       }
       tag.push('>');
-      return makeDOMAccessible(document.createElement(tag.join('')));
+      return document.createElement(tag.join(''));
     } else {
-      var el = makeDOMAccessible(document.createElement(tagName));
+      var el = document.createElement(tagName);
       for (var i = 0, n = attribs.length; i < n; i += 2) {
         setAttribute(el, attribs[i], attribs[i + 1]);
       }
@@ -441,9 +424,9 @@
     // Courtesy Stoyan Stefanov who documents the derivation of this at
     // http://www.phpied.com/dynamic-script-and-style-elements-in-ie/ and
     // http://yuiblog.com/blog/2007/06/07/style/
-    var styleSheet = makeDOMAccessible(document.createElement('style'));
+    var styleSheet = document.createElement('style');
     styleSheet.setAttribute('type', 'text/css');
-    var ssss = makeDOMAccessible(styleSheet.styleSheet);
+    var ssss = styleSheet.styleSheet;
     if (ssss) {   // IE
       ssss.cssText = cssText;
     } else {                // the world
@@ -464,7 +447,6 @@
    * @param {string} value the value of an attribute.
    */
   function setAttribute(element, name, value) {
-    element = makeDOMAccessible(element);
     /*
       Hazards:

@@ -497,7 +479,7 @@
     */
     switch (name) {
       case 'style':
-        makeDOMAccessible(element.style).cssText = value;
+        element.style.cssText = value;
         return value;
// Firefox will run javascript: URLs in the frame specified by target. // This can cause things to run in an unintended frame, so we make sure
@@ -527,8 +509,7 @@
     }
     if (featureExtendedCreateElement /* old IE, need workarounds */) {
       try {
-        var attr = makeDOMAccessible(
-          makeDOMAccessible(element.ownerDocument).createAttribute(name));
+        var attr = element.ownerDocument.createAttribute(name);
         attr.value = value;
         element.setAttributeNode(attr);
       } catch (e) {
@@ -549,15 +530,13 @@
    *    {@code left}, {@code right}, {@code top}, and {@code bottom}.
    */
   function getBoundingClientRect(el) {
-    el = makeDOMAccessible(el);
     if (el.nodeType === 9 /* Document */) {
-      el = makeDOMAccessible(el.documentElement);
+      el = el.documentElement;
     }
-    var doc = makeDOMAccessible(el.ownerDocument);
+    var doc = el.ownerDocument;
     // Use the native method if present.
     if (el.getBoundingClientRect) {
       var cRect = el.getBoundingClientRect();
-      makeDOMAccessible(cRect);
       if (isIE) {
// IE has an unnecessary border, which can be mucked with by styles, so
         // the amount of border is not predictable.
@@ -671,12 +650,12 @@
     // value string.  This unfortunately fails when element.style is an
     // input element instead of a style object.
     if (name === 'style') {
-      var style = makeDOMAccessible(element.style);
+      var style = element.style;
       if (typeof style.cssText === 'string') {
         return style.cssText;
       }
     }
-    var attr = makeDOMAccessible(element.getAttributeNode(name));
+    var attr = element.getAttributeNode(name);
     if (attr && attr.specified) {
       return attr.value;
     } else {
@@ -688,7 +667,7 @@
     if (element.hasAttribute) {  // Non IE
       return element.hasAttribute(name);
     } else {
-      var attr = makeDOMAccessible(element.getAttributeNode(name));
+      var attr = element.getAttributeNode(name);
       return attr !== null && attr.specified;
     }
   }
@@ -701,11 +680,10 @@
    * such as ":first-child".
    */
   function getComputedStyle(element, pseudoElement) {
- if (makeDOMAccessible(element).currentStyle && pseudoElement === void 0) {
-      return makeDOMAccessible(element.currentStyle);
+    if (element.currentStyle && pseudoElement === void 0) {
+      return element.currentStyle;
     } else if (window.getComputedStyle) {
-      return makeDOMAccessible(
-          window.getComputedStyle(element, pseudoElement));
+      return window.getComputedStyle(element, pseudoElement);
     } else {
       throw new Error(
           'Computed style not available for pseudo element '
@@ -726,11 +704,11 @@
       for (var i = 0, n = activeXClassIds.length; i < n; i++) {
         var candidate = activeXClassIds[i];
         try {
-          return makeDOMAccessible(new ActiveXObject(candidate));
+          return new ActiveXObject(candidate);
         } catch (e) {}
       }
     }
-    return makeDOMAccessible(new XMLHttpRequest);
+    return new XMLHttpRequest;
   }

   return {
@@ -759,11 +737,10 @@
 /**
  * Returns the window containing this element.
  */
-// mda = makeDOMAccessible
-bridalMaker.getWindow = function(node, mda) {
-  var doc = mda(node).nodeType === 9  // Document node
+bridalMaker.getWindow = function(node) {
+  var doc = node.nodeType === 9  // Document node
       ? node
-      : mda(node.ownerDocument);
+      : node.ownerDocument;
   // IE
   if (doc.parentWindow) { return doc.parentWindow; }
   // Everything else
@@ -773,7 +750,7 @@
   // Just in case
   var s = doc.createElement('script');
   s.innerHTML = "document.parentWindow = window;";
-  var body = mda(doc.body);
+  var body = doc.body;
   body.appendChild(s);
   body.removeChild(s);
   return doc.parentWindow;
=======================================
--- /trunk/src/com/google/caja/plugin/domado.js Tue Oct  8 16:46:28 2013 UTC
+++ /trunk/src/com/google/caja/plugin/domado.js Tue Oct  8 22:01:03 2013 UTC
@@ -831,14 +831,13 @@
   }());

   /** XMLHttpRequest or an equivalent on IE 6. */
-  function XMLHttpRequestCtor(makeDOMAccessible,
-      XMLHttpRequest, ActiveXObject, XDomainRequest) {
+ function XMLHttpRequestCtor(XMLHttpRequest, ActiveXObject, XDomainRequest) {
     if (XMLHttpRequest &&
- makeDOMAccessible(new XMLHttpRequest()).withCredentials !== undefined) {
+      new XMLHttpRequest().withCredentials !== undefined) {
       return XMLHttpRequest;
     } else if (XDomainRequest) {
       return function XDomainRequestObjectForIE() {
-        var xdr = makeDOMAccessible(new XDomainRequest());
+        var xdr = new XDomainRequest();
         xdr.onload = function () {
           if ('function' === typeof xdr.onreadystatechange) {
             xdr.status = 200;
@@ -891,7 +890,6 @@

   function TameXMLHttpRequest(
       taming,
-      rulebreaker,
       xmlHttpRequestMaker,
       naiveUriPolicy,
       getBaseURL) {
@@ -910,8 +908,7 @@
     function TameXMLHttpRequest() {
       TameXHRConf.confide(this, taming);
       amplify(this, function(privates) {
-        var xhr = privates.feral =
-            rulebreaker.makeDOMAccessible(new xmlHttpRequestMaker());
+        var xhr = privates.feral = new xmlHttpRequestMaker();
         taming.tamesTo(xhr, this);

         privates.async = undefined;
@@ -1254,59 +1251,39 @@
* objects, and a shared map allowing separate virtual documents to dispatch
    * events across them. (TODO(kpreid): Confirm this explanation is good.)
    *
- * @param {Object} opt_rulebreaker. If necessary, authorities to break the
-   *     ES5/3 taming membrane and work with the taming-frame system. If
-   *     running under SES, pass null instead.
+ * TODO(kpreid): Revisit whether this stage should exist, now that rulebreaker
+   * is gone.
+   *
    * @return A record of functions attachDocument, dispatchEvent, and
    *     dispatchToHandler.
    */
-  return cajaVM.constFunc(function Domado_(opt_rulebreaker) {
+  return cajaVM.constFunc(function Domado_() {
     // Everything in this scope but not in function attachDocument() below
// does not contain lexical references to a particular DOM instance, but
     // may have some kind of privileged access to Domado internals.

- // This is only used if opt_rulebreaker is absent (because the plugin ids - // are normally managed by es53 when it is not). TODO(kpreid): Is there a - // more sensible place to put this management, which would be used in both
-    // modes?
+    // TODO(kpreid): This ID management should probably be handled by
+    // ses-single-frame.js instead.
     var importsToId = new WeakMap(true);
     var idToImports = [];
     var nextPluginId = 0;
-
- // This parameter is supplied in the ES5/3 case and not in the ES5+SES case.
-    var rulebreaker = opt_rulebreaker ? opt_rulebreaker : cajaVM.def({
-      // These are the stub versions used when in ES5+SES.
-      makeDOMAccessible: function (o) {return o;},
-      makeFunctionAccessible: function (o) {return o;},
-      copyLengthPropertyIfUninterceptable: function (source, target) {},
-      writeToPixelArray: function (source, target, length) {
-        // See the use below for why this exists.
-        for (var i = length-1; i >= 0; i--) {
-          target[+i] = source[+i];
-        }
-      },
-
-      getId: function (imports) {
-        if (importsToId.has(imports)) {
-          return importsToId.get(imports);
-        } else {
-          var id = nextPluginId++;
-          importsToId.set(imports, id);
-          idToImports[id] = imports;
-          return id;
-        }
-      },
-      getImports: function (id) {
-        var imports = idToImports[id];
-        if (imports === undefined) {
-          throw new Error('Internal: imports#', id, ' unregistered');
-        }
-        return imports;
+    function getId(imports) {
+      if (importsToId.has(imports)) {
+        return importsToId.get(imports);
+      } else {
+        var id = nextPluginId++;
+        importsToId.set(imports, id);
+        idToImports[id] = imports;
+        return id;
       }
-    });
-
-    var makeDOMAccessible = rulebreaker.makeDOMAccessible;
-    var makeFunctionAccessible = rulebreaker.makeFunctionAccessible;
+    }
+    function getImports(id) {
+      var imports = idToImports[id];
+      if (imports === undefined) {
+        throw new Error('Internal: imports#', id, ' unregistered');
+      }
+      return imports;
+    }

     // value transforming/trivial functions
     function noop() { return undefined; }
@@ -1419,8 +1396,6 @@
function tameSetAndClear(target, set, clear, setName, clearName, passArg,
         evalStrings, environment) {
       var ids = new WeakMap();
-      makeFunctionAccessible(set);
-      makeFunctionAccessible(clear);
       function tameSet(action, delayMillis) {
// Existing browsers treat a timeout/interval of null or undefined as a
         // noop.
@@ -1482,7 +1457,6 @@
       switch (overflow && overflow.toLowerCase()) {
         case 'visible':
         case 'hidden':
-          makeDOMAccessible(element.style);
           element.style.overflow = 'auto';
           break;
       }
@@ -1529,7 +1503,6 @@
         throw new Error('Cannot resize to ' + w + ':' + typeof w + ', '
                         + h + ':' + typeof h);
       }
-      makeDOMAccessible(element.style);
       element.style.width = w + 'px';
       element.style.height = h + 'px';
     }
@@ -1573,14 +1546,11 @@
       //     +--------+
       //     clientWidth (but excludes content outside viewport)

-      var style = makeDOMAccessible(element.currentStyle);
+      var style = element.currentStyle;
       if (!style) {
-        style = makeDOMAccessible(
-            bridalMaker.getWindow(element, makeDOMAccessible)
-            .getComputedStyle(element, void 0));
+        style = bridalMaker.getWindow(element)
+            .getComputedStyle(element, void 0);
       }
-
-      makeDOMAccessible(element.style);

       // We guess the padding since it's not always expressed in px on IE
       var extraHeight = guessPixelsFromCss(style.paddingBottom)
@@ -1804,19 +1774,13 @@

       var vdocContainsForeignNodes = false;

-      outerContainerNode = makeDOMAccessible(outerContainerNode);
       var document = outerContainerNode.nodeType === 9  // Document node
           ? outerContainerNode
           : outerContainerNode.ownerDocument;
-      document = makeDOMAccessible(document);
-      var bridal = bridalMaker(makeDOMAccessible, document);
-      var elementForFeatureTests =
-          makeDOMAccessible(document.createElement('div'));
+      var bridal = bridalMaker(document);
+      var elementForFeatureTests = document.createElement('div');

- var window = bridalMaker.getWindow(outerContainerNode, makeDOMAccessible);
-      window = makeDOMAccessible(window);
-
-      makeDOMAccessible(document.location);
+      var window = bridalMaker.getWindow(outerContainerNode);

// Note that feralPseudoWindow may be an Element or a Window depending.
       var feralPseudoDocument, feralPseudoWindow;
@@ -1838,11 +1802,9 @@
         // on behalf of the guest. This way, a visual isolation break would
// require modifying untame(tameWindow).style, which is less likely to
         // be accidentally permitted.
-        var outerIsolator = makeDOMAccessible(
-            document.createElement('div'));
-        feralPseudoDocument = makeDOMAccessible(
-            document.createElement('div'));
- feralPseudoWindow = makeDOMAccessible(document.createElement('div'));
+        var outerIsolator = document.createElement('div');
+        feralPseudoDocument = document.createElement('div');
+        feralPseudoWindow = document.createElement('div');
         outerIsolator.appendChild(feralPseudoWindow);
         feralPseudoWindow.appendChild(feralPseudoDocument);
         // Class-name hooks: The host page can
@@ -1862,7 +1824,6 @@
         // needed effects.
         [outerIsolator, feralPseudoWindow, feralPseudoDocument].forEach(
             function(el) {
-          makeDOMAccessible(el.style);
           // Ensure block display and no additional borders/gaps.
           el.style.display = 'block';
           el.style.margin = '0';
@@ -1966,9 +1927,6 @@

             TameNodeConf.confide(proxiedNode, taming, node);

-            // special case for ES5/3 lack of interposition on 'length'
- rulebreaker.copyLengthPropertyIfUninterceptable(node, proxiedNode);
-
             node = proxiedNode;
           }

@@ -2876,7 +2834,6 @@
        */
       function defaultTameNode(node, foreign) {
         if (node === null || node === void 0) { return null; }
-        node = makeDOMAccessible(node);
         // TODO(mikesamuel): make sure it really is a DOM node

         if (taming.hasTameTwin(node)) {
@@ -2907,15 +2864,13 @@
         if (node === feralPseudoDocument) {
           return tameDocument;
         }
-
-        node = makeDOMAccessible(node);

         // Catch errors because node might be from a different domain.
         try {
           var doc = node.ownerDocument;
           for (var ancestor = node;
               ancestor;
-              ancestor = makeDOMAccessible(ancestor.parentNode)) {
+              ancestor = ancestor.parentNode) {
             if (isContainerNode(ancestor)) {
               // is within the virtual document
               return defaultTameNode(node);
@@ -2937,8 +2892,7 @@
       function tameEventTarget(nodeOrWindow) {
if (nodeOrWindow === feralPseudoWindow || nodeOrWindow === window) {
           return tameWindow;
-        } else if (nodeOrWindow &&
-            makeDOMAccessible(nodeOrWindow).nodeType === 1) {
+        } else if (nodeOrWindow && nodeOrWindow.nodeType === 1) {
           return tameRelatedNode(nodeOrWindow);
         } else {
           // Wasn't an element and wasn't the particular window.
@@ -2953,9 +2907,9 @@
       function isNodeToBeHidden(feralNode) {
         if (!feralNode) return false;
         for (
-            var ancestor = makeDOMAccessible(feralNode.parentNode);
+            var ancestor = feralNode.parentNode;
             ancestor !== null;
-            ancestor = makeDOMAccessible(ancestor.parentNode)) {
+            ancestor = ancestor.parentNode) {
           if (taming.hasTameTwin(ancestor)) {
             if (taming.tame(ancestor) instanceof TameForeignNode) {
               // Every foreign node is already tamed as foreign, by
@@ -3028,7 +2982,6 @@
        * foreign node filtering, and host-exception wrapping, only.
        */
       function NodeListFilter(feralNodeList) {
-        feralNodeList = makeDOMAccessible(feralNodeList);
         var expectation = [];
         var filteredCache = [];

@@ -3062,7 +3015,6 @@
               feralIndex++) {
             var node = feralNodeList[feralIndex];
             expectation.push(node);
-            makeDOMAccessible(node);
             if (!isNodeToBeHidden(node)) {
               filteredCache.push(node);
             }
@@ -3271,8 +3223,7 @@
           if (isNumericName(name)) {
             return this.visibleList.item(+name);
           } else {
-            var feral = makeDOMAccessible(this.feral.getNamedItem(
-                this.mapping.untameName(name)));
+ var feral = this.feral.getNamedItem(this.mapping.untameName(name));
             if (!isNodeToBeHidden(feral)) {
               return feral;
             } else {
@@ -3551,7 +3502,6 @@
        */
       var TokenListConf = new Confidence('TameDOMTokenList');
       function TameDOMTokenList(feral, getTransform, setTransform) {
-        feral = makeDOMAccessible(feral);
         function getItem(i) {
           return TameDOMTokenList.prototype.item.call(self, i);
         }
@@ -3607,8 +3557,8 @@
return TameDOMTokenList.call(this, feral, getTransform, setTransform);
       }
       registerArrayLikeClass(TameDOMSettableTokenList, TameDOMTokenList);
-      if (elementForFeatureTests.classList && makeDOMAccessible(
-          elementForFeatureTests.classList).value !== undefined) {
+      if (elementForFeatureTests.classList &&
+          elementForFeatureTests.classList.value !== undefined) {
         Props.define(TameDOMSettableTokenList.prototype, TokenListConf, {
           value: {
             get: TokenListConf.amplifying(function(privates) {
@@ -3632,7 +3582,6 @@
       finishArrayLikeClass(TameDOMSettableTokenList);

       function tameTokenList(feral, getTransform, setTransform) {
-        makeDOMAccessible(feral);
         if ('value' in feral) {
           return new TameDOMSettableTokenList(feral, getTransform,
               setTransform);
@@ -3645,7 +3594,7 @@
         ensureValidCallback(listener);
         function wrapper(event) {
           return plugin_dispatchEvent(
-              thisNode, event, rulebreaker.getId(tameWindow), listener,
+              thisNode, event, getId(tameWindow), listener,
               // indicate that we want an event argument only
               1);
         }
@@ -3826,14 +3775,12 @@
        * @constructor
        */
       function TameBackedNode(node, opt_policy, opt_proxyType) {
-        node = makeDOMAccessible(node);
-
         if (!node) {
throw new Error('Creating tame node with undefined native delegate');
         }

         // Determine access policy
-        var parent = makeDOMAccessible(node.parentNode);
+        var parent = node.parentNode;
         var parentPolicy;
         if (!parent || isContainerNode(parent) || isContainerNode(node)) {
           parentPolicy = null;
@@ -4127,7 +4074,6 @@
       }
       tamingClassTable.registerLazy('Attr', function() {
         function TameBackedAttributeNode(node, ownerElement) {
-          node = makeDOMAccessible(node);
if ('ownerElement' in node && node.ownerElement !== ownerElement) {
             throw new Error('Inconsistent ownerElement');
           }
@@ -4266,7 +4212,6 @@
             if (htmlSchema.element(rawNode.tagName).allowed) {
               // Not an opaque node.
               for (var c = rawNode.firstChild; c; c = c.nextSibling) {
-                c = makeDOMAccessible(c);
                 innerTextOf(c, out);
               }
             }
@@ -4277,7 +4222,6 @@
             break;
           case 11:  // Document Fragment
             for (var c = rawNode.firstChild; c; c = c.nextSibling) {
-              c = makeDOMAccessible(c);
               innerTextOf(c, out);
             }
             break;
@@ -4399,10 +4343,9 @@
// emulating how browsers treat offsetParent and the real <BODY>.
               return nodeAmplify(tameDocument.body, function(bodyPriv) {
                 var feralBody = bodyPriv.feral;
-                for (var ancestor =
-                         makeDOMAccessible(privates.feral.parentNode);
+                for (var ancestor = privates.feral.parentNode;
                      ancestor !== feralPseudoDocument;
-                     ancestor = makeDOMAccessible(ancestor.parentNode)) {
+                     ancestor = ancestor.parentNode) {
                   if (ancestor === feralBody) {
                     return defaultTameNode(feralBody);
                   }
@@ -4707,7 +4650,7 @@
       // http://dev.w3.org/html5/spec/Overview.html#the-canvas-element
       (function() {
         // TODO(felix8a): need to call bridal.initCanvasElement
- var canvasTest = makeDOMAccessible(document.createElement('canvas'));
+        var canvasTest = document.createElement('canvas');
         if (typeof canvasTest.getContext !== 'function') {
           // If the host browser does not have getContext, then it must not
// usefully support canvas, so we don't either; skip registering the
@@ -4794,8 +4737,6 @@

         tamingClassTable.registerLazy('ImageData', function() {
           function TameImageData(imageData) {
-            imageData = makeDOMAccessible(imageData);
-
             // Since we can't interpose indexing, we can't wrap the
             // CanvasPixelArray
// so we have to copy the pixel data. This is horrible, bad, and
@@ -4835,12 +4776,7 @@
               if (!privates.tamePixelArray) {

                 var bareArray = privates.feral.data;
-                // Note: On Firefox 4.0.1, at least, pixel arrays cannot
-                // have added properties (such as our w___). Therefore,
-                // for writing, we use a special routine, and we don't do
-                // makeDOMAccessible because it would have no effect. An
-                // alternative approach would be to muck with the
-                // "Uint8ClampedArray" prototype.
+                // TODO(kpreid): replace tamePixelArray with typed array

                 var length = bareArray.length;
                 var tamePixelArray = { // not frozen, user-modifiable
@@ -4855,8 +4791,9 @@
                     // TODO(kpreid): shouldn't be a public method (but is
                     // harmless).

-                    rulebreaker.writeToPixelArray(
-                      tamePixelArray, bareArray, length);
+                    for (var i = length-1; i >= 0; i--) {
+                      bareArray[+i] = tamePixelArray[+i];
+                    }
                   })
                 };
                 for (var i = length-1; i >= 0; i--) {
@@ -4874,7 +4811,7 @@
           function TameGradient(gradient) {
             TameGradientConf.confide(this, taming);
             TameGradientConf.amplify(this, function(privates) {
-              privates.feral = makeDOMAccessible(gradient);
+              privates.feral = gradient;
             });
             taming.tamesTo(gradient, this);
             Object.freeze(this);
@@ -4948,17 +4885,16 @@
                   throw new Error(prop + ' takes ' + count +
                       ' args, not ' + (arguments.length - 1));
                 }
+ // In theory this could be type check plus Array.prototype.shift
+                // -- but feeling a little paranoid, so let's construct a
+                // separate arguments array.
                 var args = new Array(count);
                 for (var i = 0; i < count; i++) {
                   args[+i] = enforceType(arguments[+i + 1], 'number',
                       prop + ' argument ' + i);
                 }
- // The copy-into-array is necessary in ES5/3 because host DOM
-                // won't take an arguments object from inside of ES53.
                 var feral = privates.feral;
- // TODO(kpreid): Needing to do this not good. A normal mDA isn't
-                // sufficient because we're using .apply for varargs
-                makeDOMAccessible(feral[prop]).apply(feral, args);
+                feral[prop].apply(feral, args);
               })
             };
           });
@@ -5031,7 +4967,6 @@

         tamingClassTable.registerLazy('TextMetrics', function() {
           function TameTextMetrics(feralMetrics) {
-            feralMetrics = makeDOMAccessible(feralMetrics);
// TextMetrics just acts as a record, so we don't need any forwarding
             // wrapper; copying the data is sufficient.
             [
@@ -5062,7 +4997,6 @@
           var TameContext2DConf = new Confidence('TameContext2D');
           function TameContext2D(feralContext, policy) {
             // policy is needed for the PropertyTaming accessors
-            feralContext = makeDOMAccessible(feralContext);
             TameContext2DConf.confide(this, taming);
             TameContext2DConf.amplify(this, function(privates) {
               privates.feral = feralContext;
@@ -5376,8 +5310,7 @@
         }),
col_lookup: Props.overridable(true, cajaVM.constFunc(function(name) {
           return nodeAmplify(this.target, function(privates) {
-            return makeDOMAccessible(
- makeDOMAccessible(privates.feral.elements).namedItem(name));
+            return privates.feral.elements.namedItem(name);
           });
         })),
         col_evaluate: Props.overridable(true, cajaVM.constFunc(
@@ -5512,7 +5445,7 @@
// to consider whether this should always allow access to said content,
         // and probably other issues.
         return nodeAmplify(tameIFrame, function(privates) {
- var frameFeralDoc = makeDOMAccessible(privates.feral.contentDocument);
+          var frameFeralDoc = privates.feral.contentDocument;
           if (!privates.contentDomicile ||
               frameFeralDoc !== privates.seenContentDocument) {
             if (!frameFeralDoc) {
@@ -5536,8 +5469,7 @@
// Creating HtmlEmitter hooks up document.write, and finish() (i.e.
             // end-of-file, i.e. an empty-string input document) triggers
             // construction of the virtualized global structure.
-            var emitter = new HtmlEmitter(makeDOMAccessible,
-                subDomicile.htmlEmitterTarget,
+            var emitter = new HtmlEmitter(subDomicile.htmlEmitterTarget,
                 naiveUriPolicy.mitigate, subDomicile);
             emitter.finish();
           }
@@ -5545,7 +5477,7 @@
         });
       }

- var featureTestImage = makeDOMAccessible(document.createElement('img'));
+      var featureTestImage = document.createElement('img');
       defineElement({
         domClass: 'HTMLImageElement',
         properties: function() { return {
@@ -5814,8 +5746,7 @@
         domClass: 'HTMLStyleElement',
         forceChildrenNotEditable: true,  // critical to style isolation
         properties: function() {
-          var styleForFeatureTests = makeDOMAccessible(
-              document.createElement('style'));
+          var styleForFeatureTests = document.createElement('style');
           return {
             disabled: NP_reflectBoolean,
             media: NP_writePolicyOnly,
@@ -5974,7 +5905,6 @@
       function fromInt(x) { return '' + (x | 0); }

       function tameEvent(event) {
-        event = makeDOMAccessible(event);
         if (!taming.hasTameTwin(event)) {
           var tamed = new (tamingClassTable.getTamingCtor('Event'))(
               event, false);
@@ -5994,8 +5924,7 @@

         var featureTestKeyEvent = {};
         try {
-          featureTestKeyEvent = makeDOMAccessible(
-              document.createEvent('KeyboardEvent'));
+          featureTestKeyEvent = document.createEvent('KeyboardEvent');
         } catch (e) {}

         function tameEventView(view) {
@@ -6350,8 +6279,7 @@
           // TODO(kpreid): Make this a memoized live list.
           var tameForms = [];
           for (var i = 0; i < document.forms.length; i++) {
-            var tameForm = tameRelatedNode(
-              makeDOMAccessible(document.forms).item(i));
+            var tameForm = tameRelatedNode(document.forms.item(i));
             // tameRelatedNode returns null if the node is not part of
             // this node's virtual document.
             if (tameForm !== null) { tameForms.push(tameForm); }
@@ -6686,8 +6614,6 @@
* http://www.w3.org/TR/DOM-Level-2-Style/css.html#CSS-CSSStyleDeclaration
          */
         function TameStyle(style, editable, tameEl) {
-          style = makeDOMAccessible(style);
-
           TameStyleConf.confide(this, taming);
           TameStyleConf.amplify(this, function(privates) {
             privates.feral = style;
@@ -6782,7 +6708,7 @@
         function isNestedInAnchor(el) {
           for (;
               el && el !== feralPseudoDocument;
-              el = makeDOMAccessible(el.parentNode)) {
+              el = el.parentNode) {
             if (el.tagName && el.tagName.toLowerCase() === 'a') {
               return true;
             }
@@ -6847,12 +6773,10 @@
         // called by cajoled code, so we do not use inertCtor().
         return cajaVM.def(TameXMLHttpRequest(
             taming,
-            rulebreaker,
             XMLHttpRequestCtor(
-                makeDOMAccessible,
-                makeFunctionAccessible(window.XMLHttpRequest),
-                makeFunctionAccessible(window.ActiveXObject),
-                makeFunctionAccessible(window.XDomainRequest)),
+                window.XMLHttpRequest,
+                window.ActiveXObject,
+                window.XDomainRequest),
             naiveUriPolicy,
             function () { return domicile.pseudoLocation.href; }));
       });
@@ -6886,7 +6810,6 @@
           }
           e = document.createElement('head');
         }
-        e = makeDOMAccessible(e);
         return e;
       });

@@ -7069,7 +6992,7 @@
// See spec at http://www.whatwg.org/specs/web-apps/current-work/multipage/browsers.html#navigator
       // We don't attempt to hide or abstract userAgent details since
       // they are discoverable via side-channels we don't control.
-      var navigator = makeDOMAccessible(window.navigator);
+      var navigator = window.navigator;
       var tameNavigator = cajaVM.def({
         appName: String(navigator.appName),
         appVersion: String(navigator.appVersion),
@@ -7276,14 +7199,14 @@
         writable: false
       });

-      pluginId = rulebreaker.getId(tameWindow);
+      pluginId = getId(tameWindow);
       windowToDomicile.set(tameWindow, domicile);

       // Install virtual UA stylesheet.
       if (!document.caja_gadgetStylesheetInstalled) (function () {
         document.caja_gadgetStylesheetInstalled = true;

-        var element = makeDOMAccessible(document.createElement("style"));
+        var element = document.createElement("style");
         element.setAttribute("type", "text/css");
         element.textContent = (
           // Visually contains the virtual document
@@ -7320,13 +7243,13 @@
      */
     function plugin_dispatchEvent(thisNode, event, pluginId, handler,
           argCount) {
-      var window = bridalMaker.getWindow(thisNode, makeDOMAccessible);
-      event = makeDOMAccessible(event || window.event);
+      var window = bridalMaker.getWindow(thisNode);
+      event = event || window.event;
       // support currentTarget on IE[678]
       if (!event.currentTarget) {
         event.currentTarget = thisNode;
       }
-      var imports = rulebreaker.getImports(pluginId);
+      var imports = getImports(pluginId);
       var domicile = windowToDomicile.get(imports);
       var node = domicile.tameNode(thisNode);
       var isUserAction = eventIsUserAction(event, window);
@@ -7368,7 +7291,7 @@
     }

     function dispatch(isUserAction, pluginId, handler, args) {
- var domicile = windowToDomicile.get(rulebreaker.getImports(pluginId));
+      var domicile = windowToDomicile.get(getImports(pluginId));
       switch (typeof handler) {
         case 'number':
           handler = domicile.handlers[+handler];
=======================================
--- /trunk/src/com/google/caja/plugin/html-emitter.js Mon Aug 26 20:59:09 2013 UTC +++ /trunk/src/com/google/caja/plugin/html-emitter.js Tue Oct 8 22:01:03 2013 UTC
@@ -35,14 +35,6 @@
 if ('I'.toLowerCase() !== 'i') { throw 'I/i problem'; }

 /**
- * @param {function} makeDOMAccessible A function which will be called on base - * and every object retrieved from it, recursively. This hook is available - * in case HtmlEmitter is running in an environment such that unmodified DOM - * objects cannot be touched. makeDOMAccessible should be idempotent. Note
- *     that the contract here is stronger than for bridalMaker, in that
- *     this makeDOMAccessible may not return a different object.
- *     Except, this contract may be impossible to satisfy on IE<=8.
- *     TODO(felix8a): check all the implications of violating the contract.
* @param base a node that is the ancestor of all statically generated HTML. * @param opt_mitigatingUrlRewriter a script url rewriting proxy which can be used
  *     to optionally load premitigated scripts instead of mitigating on the
@@ -53,13 +45,12 @@
* @param opt_guestGlobal the object in the guest frame that is the global scope
  *     for guest code.
  */
-function HtmlEmitter(makeDOMAccessible, base,
-    opt_mitigatingUrlRewriter, opt_domicile, opt_guestGlobal) {
+function HtmlEmitter(base, opt_mitigatingUrlRewriter, opt_domicile,
+      opt_guestGlobal) {
   if (!base) {
     throw new Error(
         'Host page error: Virtual document element was not provided');
   }
-  base = makeDOMAccessible(base);

   var targetDocument = base.nodeType === 9  // Document node
       ? base
@@ -69,7 +60,7 @@
   // 'insertion point', which is not this; this is the 'current node' and
   // implicitly the 'stack of open elements' via parents.
   var insertionPoint = base;
-  var bridal = bridalMaker(makeDOMAccessible, targetDocument);
+  var bridal = bridalMaker(targetDocument);

   // TODO: Take into account <base> elements.

@@ -92,9 +83,7 @@
     idMap = {};
     var descs = base.getElementsByTagName('*');
     for (var i = 0, desc; (desc = descs[i]); ++i) {
-      desc = makeDOMAccessible(desc);
       var id = desc.getAttributeNode('id');
-      id = makeDOMAccessible(id);
       // The key is decorated to avoid name conflicts and restrictions.
       if (id && id.value) { idMap[id.value + " map entry"] = desc; }
     }
@@ -140,7 +129,7 @@
       // and so just doing base.write(htmlString), which would otherwise be
       // sufficient, would insert unwanted structure around our HTML.
       // TODO(kpreid): Fix that.
-      var dummy = makeDOMAccessible(targetDocument.createElement('div'));
+      var dummy = targetDocument.createElement('div');
       dummy.innerHTML = htmlString;
       while (dummy.firstChild) {
         base.appendChild(dummy.firstChild);
@@ -230,7 +219,6 @@

     // First, store all the children.
     for (var child = limit.firstChild, next; child; child = next) {
-      child = makeDOMAccessible(child);
       next = child.nextSibling;  // removeChild kills nextSibling.
       out.push(child, limit);
       limit.removeChild(child);
@@ -239,9 +227,7 @@
     // Second, store your ancestor's next siblings and recurse.
     for (var anc = limit, greatAnc; anc && anc !== base; anc = greatAnc) {
       greatAnc = anc.parentNode;
-      greatAnc = makeDOMAccessible(greatAnc);
       for (var sibling = anc.nextSibling, next; sibling; sibling = next) {
-        sibling = makeDOMAccessible(sibling);
         next = sibling.nextSibling;
         out.push(sibling, greatAnc);
         greatAnc.removeChild(sibling);
@@ -343,8 +329,8 @@

   function hasChild(el, name) {
     if (!el) { return false; }
-    var child = makeDOMAccessible(el.firstChild);
-    for (; child; child = makeDOMAccessible(child.nextSibling)) {
+
+    for (var child = el.firstChild; child; child = child.nextSibling) {
       if (child.nodeType === 1 && virtTagName(child) === name) {
         return child;
       }
=======================================
--- /trunk/src/com/google/caja/plugin/ses-frame-group.js Tue Oct 8 16:46:28 2013 UTC +++ /trunk/src/com/google/caja/plugin/ses-frame-group.js Tue Oct 8 22:01:03 2013 UTC
@@ -63,11 +63,11 @@
   var lazyDomado;
   function getDomado() {
     // don't construct Domado until we know we need it
-    return lazyDomado || (lazyDomado = Domado(null));
+    return lazyDomado || (lazyDomado = Domado());
   }

   // TODO(kpreid): Only used for XHR; dependency on feralWin is bogus
-  var bridal = bridalMaker(identity, feralWin.document);
+  var bridal = bridalMaker(feralWin.document);

   var unsafe = false;

@@ -292,9 +292,8 @@
         cajaVM.copyToImports(imports, cajaVM.sharedImports);
       }));

-    var htmlEmitter = new tamingWin.HtmlEmitter(
-      identity, domicile.htmlEmitterTarget, uriPolicy.mitigate, domicile,
-      window);
+    var htmlEmitter = new tamingWin.HtmlEmitter(domicile.htmlEmitterTarget,
+      uriPolicy.mitigate, domicile, window);

     // Invoked by textual event handlers emitted by Domado.
// TODO(kpreid): Use a name other than ___ for this purpose; perhaps some
=======================================
--- /trunk/tests/com/google/caja/plugin/browser-test-case.js Tue Oct 8 16:46:28 2013 UTC +++ /trunk/tests/com/google/caja/plugin/browser-test-case.js Tue Oct 8 22:01:03 2013 UTC
@@ -444,7 +444,7 @@
 })();

 function fetch(url, cb) {
-  var xhr = bridalMaker(function (x){return x;}, document).makeXhr();
+  var xhr = bridalMaker(document).makeXhr();
   xhr.open('GET', url, true);
   xhr.onreadystatechange = function() {
     if (xhr.readyState === 4) {
=======================================
--- /trunk/tests/com/google/caja/plugin/html-emitter-test.html Wed May 15 21:13:15 2013 UTC +++ /trunk/tests/com/google/caja/plugin/html-emitter-test.html Tue Oct 8 22:01:03 2013 UTC
@@ -49,7 +49,7 @@
     }
     var base = document.getElementById('base0');

- var el___, emitter___ = new HtmlEmitter(function (n) {return n;}, base);
+    var el___, emitter___ = new HtmlEmitter(base);

     emitter___.attach('id_1___');
     var el___ = emitter___.byId('id_1___');
@@ -85,7 +85,7 @@

     base = document.getElementById('base1');
     el___ = undefined;
-    emitter___ = new HtmlEmitter(function (n) {return n;}, base);
+    emitter___ = new HtmlEmitter(base);

     console.log('Emitting static');
     emitter___.emitStatic('<p>Hello world<\/p>');
=======================================
--- /trunk/tests/com/google/caja/plugin/test-domado-special.js Tue Oct 8 16:46:28 2013 UTC +++ /trunk/tests/com/google/caja/plugin/test-domado-special.js Tue Oct 8 22:01:03 2013 UTC
@@ -13,7 +13,7 @@
 // limitations under the License.

 function fetch(url, callback) {
-  var xhr = bridalMaker(function (x){return x;}, document).makeXhr();
+  var xhr = bridalMaker(document).makeXhr();
   xhr.open('GET', url, true);
   xhr.onreadystatechange = function() {
     if (xhr.readyState === 4 && xhr.status === 200) {

--

--- You received this message because you are subscribed to the Google Groups "Google Caja Discuss" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to