Revision: 5483
Author: [email protected]
Date: Thu Jul 11 15:50:37 2013
Log: Several features and fixes mostly in Domado.
https://codereview.appspot.com/11180043
Bugs:
* Don't warn if event.view is missing or undefined (ssue 1713).
* Explain navigator.cajaVersion in more detail (issue 1735).
Features:
* <input>.autofocus has a no-op setter (issue 1797).
* Add <optgroup>.disabled and <optgroup>.label (issue 1802).
* Add <form>.encoding as alias for <form>.enctype (issue 1794).
* Add window.frames and window.frames.length (issue 1264).
Other:
* Add a generic host page available from brserve (issue 1684).
* Rename 'Domita' to 'Domado' where applicable (issue 1400).
* Remove 'domitaTrace' mechanism in Domado.
* getUrlParam() understands + escapes.
* In repairES5, added a bug link for PUSH_IGNORES_FROZEN in Chrome
(issue 1756).
[email protected]
http://code.google.com/p/google-caja/source/detail?r=5483
Added:
/trunk/tests/com/google/caja/plugin/generic-host-page.html
Modified:
/trunk/src/com/google/caja/demos/photon/container/photon.js
/trunk/src/com/google/caja/demos/trycaja/js/trycaja.js
/trunk/src/com/google/caja/es53.js
/trunk/src/com/google/caja/plugin/CssRewriter.java
/trunk/src/com/google/caja/plugin/LinkStyleWhitelist.java
/trunk/src/com/google/caja/plugin/domado.js
/trunk/src/com/google/caja/plugin/es53-frame-group.js
/trunk/src/com/google/caja/plugin/templates/SafeCssMaker.java
/trunk/src/com/google/caja/ses/repairES5.js
/trunk/tests/com/google/caja/plugin/browser-test-case.js
/trunk/tests/com/google/caja/plugin/css-stylesheet-tests.js
/trunk/tests/com/google/caja/plugin/es53-test-domado-dom-guest.html
/trunk/tests/com/google/caja/plugin/es53-test-domado-forms-guest.html
/trunk/tests/com/google/caja/plugin/es53-test-domado-special-guest.html
/trunk/tests/com/google/caja/plugin/evil-twin.html
/trunk/tests/com/google/caja/plugin/test-index.html
/trunk/tests/com/google/caja/plugin/third-party-tests.json
=======================================
--- /dev/null
+++ /trunk/tests/com/google/caja/plugin/generic-host-page.html Thu Jul 11
15:50:37 2013
@@ -0,0 +1,124 @@
+<!doctype html>
+<!--
+ - Copyright (C) 2013 Google Inc.
+ -
+ - Licensed under the Apache License, Version 2.0 (the "License");
+ - you may not use this file except in compliance with the License.
+ - You may obtain a copy of the License at
+ -
+ - http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing, software
+ - distributed under the License is distributed on an "AS IS" BASIS,
+ - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ - See the License for the specific language governing permissions and
+ - limitations under the License.
+-->
+<!doctype html>
+<html><head>
+ <meta charset="utf-8">
+ <title>Caja generic host page (no test hooks)</title>
+ <!-- TODO(kpreid): Allow minified/unminified choice -->
+ <script src="/caja/caja.js"></script>
+ <script>
+ // note - duplicated from browser-test-case.js
+ function urlParamPattern(name) {
+ name = name.replace(/[\[]/,"\\[").replace(/[\]]/,"\\]");
+ return new RegExp("([\\?&]"+name+"=)([^&#]*)");
+ }
+ function getUrlParam(name, opt_default) {
+ var match = urlParamPattern(name).exec(window.location.href);
+ if (match) {
+ return decodeURIComponent(match[2].replace(/\+/g, ' '));
+ } else {
+ return opt_default ? opt_default : '';
+ }
+ }
+ </script>
+ <style>
+ html {
+ background: #CCC;
+ color: black;
+ }
+ #guest {
+ background: white;
+ color: black;
+ border: 0.1em solid black;
+ }
+
+ #form [name="content"] {
+ margin-left: 0;
+ margin-right: 0;
+ box-sizing: border-box;
+ width: 100%;
+ height: 20em;
+ }
+ #load {
+ float: right;
+ padding: 1em;
+ }
+ #guest {
+ clear: right;
+ }
+ </style>
+</head><body>
+ <div id="toolbar">
+ <span class='nonwidget'><a href='test-index.html'>other
tests</a></span>
+ </div>
+ <form id="form" action="" method="GET">
+ <label>SES maximum severity<select name="maxAcceptableSeverity">
+ <option>SAFE</option>
+ <option selected>SAFE_SPEC_VIOLATION</option>
+ <option>NO_KNOWN_EXPLOIT_SPEC_VIOLATION</option>
+ <option>UNSAFE_SPEC_VIOLATION</option>
+ <option>NOT_OCAP_SAFE</option>
+ <option>NOT_ISOLATED</option>
+ <option>NEW_SYMPTOM</option>
+ <option>NOT_SUPPORTED</option>
+ </select></label>
+ ·
+ <label><input type="checkbox" name="debug" value="true"> Config
<code>debug</code></label>
+ <br>
+ <textarea type="text" name="content"></textarea>
+ <button id="load" type="submit">Load</button>
+ <script>
+ var options = {};
+ Array.prototype.forEach.call(document.querySelectorAll(
+ '#form [name]'), function(el) {
+ if (el.tagName === 'INPUT' && el.type === 'checkbox') {
+ el.checked = JSON.parse(getUrlParam(el.name, '' + el.checked));
+ options[el.name] = el.checked;
+ } else {
+ el.value = getUrlParam(el.name, el.value);
+ options[el.name] = el.value;
+ }
+ });
+ </script>
+ </form>
+ <p>Status: <span id="status">—</span></p>
+ <div id="guest"></div>
+ <script>
+ function status(s) {
+ console.info(s);
+ document.getElementById('status').textContent = s;
+ }
+
+ status('caja.initialize()');
+ caja.initialize({
+ cajaServer: '/caja',
+ debug: options.debug,
+ maxAcceptableSeverity: options.maxAcceptableSeverity
+ });
+ status('caja.load()');
+ caja.load(
+ document.getElementById('guest'),
+ caja.policy.net.ALL,
+ function(frame) {
+ status('frame.content().run()');
+ frame.content('http://caja-host-url.invalid/', options.content)
+ .run(function() {
+ status('Complete');
+ });
+ });
+ </script>
+</body></html>
=======================================
--- /trunk/src/com/google/caja/demos/photon/container/photon.js Fri May 6
13:38:34 2011
+++ /trunk/src/com/google/caja/demos/photon/container/photon.js Thu Jul 11
15:50:37 2013
@@ -18,7 +18,7 @@
* transfer of objects between mutually suspicious components.
*
* @param instantiateInTameElement a tamed function that takes
- * a Domita tamed element, an HTML module URL and an optional
+ * a Domado tamed element, an HTML module URL and an optional
* map of outer variables and instantiates the module within
* the provided element.
* @param log a tamed function that logs messages to the console.
=======================================
--- /trunk/src/com/google/caja/demos/trycaja/js/trycaja.js Tue Jun 5
15:50:03 2012
+++ /trunk/src/com/google/caja/demos/trycaja/js/trycaja.js Thu Jul 11
15:50:37 2013
@@ -5,7 +5,7 @@
// Page variables
var pages = mypages;
- function showDomita(report) {
+ function showDomado(report) {
if (!cajaDisplayed) {
cajaDisplayed = true;
document.getElementById('cajaDisplayContainer').style.display =
@@ -375,7 +375,7 @@
}
default: {
if (line.trim() == 'display') {
- showDomita(report);
+ showDomado(report);
return true;
}
=======================================
--- /trunk/src/com/google/caja/es53.js Mon May 20 13:12:41 2013
+++ /trunk/src/com/google/caja/es53.js Thu Jul 11 15:50:37 2013
@@ -1214,7 +1214,7 @@
* ES3, except that, when {@code opt_useKeyLifetime} is falsy or
* absent, the keys here may be primitive types as well.
*
- * <p> To support Domita, the keys might be host objects.
+ * <p> To support taming membranes, the keys might be host objects.
*/
function newTable(opt_useKeyLifetime, opt_expectedSize) {
magicCount++;
=======================================
--- /trunk/src/com/google/caja/plugin/CssRewriter.java Wed Feb 13 14:19:54
2013
+++ /trunk/src/com/google/caja/plugin/CssRewriter.java Thu Jul 11 15:50:37
2013
@@ -677,7 +677,7 @@
((CssTree.IdentLiteral) child).getValue());
if (!ALLOWED_PSEUDO_CLASSES.contains(pseudoName)) {
// Allow the visited pseudo selector but not with any
styles
- // that can be fetched via getComputedStyle in DOMita's
+ // that can be fetched via getComputedStyle in Domado's
// COMPUTED_STYLE_WHITELIST.
if (!(LINK_PSEUDO_CLASSES.contains(pseudoName)
&& strippedPropertiesBannedInLinkClasses(
=======================================
--- /trunk/src/com/google/caja/plugin/LinkStyleWhitelist.java Fri Mar 30
14:33:29 2012
+++ /trunk/src/com/google/caja/plugin/LinkStyleWhitelist.java Thu Jul 11
15:50:37 2013
@@ -34,7 +34,7 @@
Set<Name> propNames = Sets.newHashSet(
Name.css("background-color"), Name.css("color"),
Name.css("cursor"));
// Rules limited to link and visited styles cannot allow properties
that
- // can be tested by DOMita's getComputedStyle since it would allow
history
+ // can be tested by Domado's getComputedStyle since it would allow
history
// mining.
// Do not inline the below. The removeAll relies on the input being a
set
// of names, but since removeAll takes a Collection<?> it would fail
=======================================
--- /trunk/src/com/google/caja/plugin/domado.js Wed Jul 10 16:40:25 2013
+++ /trunk/src/com/google/caja/plugin/domado.js Thu Jul 11 15:50:37 2013
@@ -1415,10 +1415,10 @@
function assert(cond) {
if (!cond) {
if (typeof console !== 'undefined') {
- console.error('domita assertion failed');
+ console.error('Domado: assertion failed');
console.trace();
}
- throw new Error("Domita assertion failed");
+ throw new Error('Domado: assertion failed');
}
}
@@ -2656,6 +2656,34 @@
}
var NP_noArgEditVoidMethod = NP_NoArgEditMethod(noop);
var NP_noArgEditMethodReturningNode =
NP_NoArgEditMethod(defaultTameNode);
+ /**
+ * Reflect a boolean attribute, in the HTML5 sense. Respects schema
for
+ * writes, forwards for reads.
+ *
+ *
http://www.whatwg.org/specs/web-apps/current-work/multipage/common-dom-interfaces.html#reflecting-content-attributes-in-idl-attributes
+ */
+ var NP_reflectBoolean = Props.markPropMaker(function(env) {
+ var prop = env.prop;
+ return {
+ enumerable: true,
+ get: env.amplifying(function(privates) {
+ return privates.policy.attributesVisible &&
+ Boolean(privates.feral[prop]);
+ }),
+ set: innocuous(function(value) {
+ // "On setting, the content attribute must be removed if the
IDL
+ // attribute is set to false, and must be set to the empty
string if
+ // the IDL attribute is set to true."
+ if (value) {
+ // TODO(kpreid): markup whitelist rejects '' for boolean
attrs but
+ // should accept it
+ this.setAttribute(prop, prop /* should be '' */);
+ } else {
+ this.removeAttribute(prop);
+ }
+ })
+ };
+ });
/**
* Property spec for properties which reflect attributes whose
values are
@@ -5235,6 +5263,8 @@
return tameHTMLCollection(f, defaultTameNode);
}),
enctype: PT.filterAttr(defaultToEmptyStr, String),
+ encoding: Props.actAs('enctype',
+ PT.filterAttr(defaultToEmptyStr, String)),
method: PT.filterAttr(defaultToEmptyStr, String),
target: PT.filterAttr(defaultToEmptyStr, String),
submit: Props.ampMethod(function(privates) {
@@ -5384,8 +5414,8 @@
defineElement({
domClass: 'CajaFormField',
properties: function() { return {
- autofocus: PT.ro,
- disabled: PT.rw,
+ autofocus: NP_reflectBoolean,
+ disabled: NP_reflectBoolean,
form: PT.related,
maxLength: PT.rw,
name: PT.rw,
@@ -5517,11 +5547,19 @@
}; }
});
+ defineElement({
+ domClass: 'HTMLOptGroupElement',
+ properties: function() { return {
+ disabled: NP_reflectBoolean,
+ label: NP_writePolicyOnly
+ }; }
+ });
+
defineElement({
domClass: 'HTMLOptionElement',
properties: function() { return {
defaultSelected: PT.filterProp(Boolean, Boolean),
- disabled: PT.filterProp(Boolean, Boolean),
+ disabled: NP_reflectBoolean,
form: PT.related,
index: PT.filterProp(Number),
label: PT.filterProp(String, String),
@@ -5615,7 +5653,7 @@
var styleForFeatureTests = makeDOMAccessible(
document.createElement('style'));
return {
- disabled: PT.filterProp(identity, Boolean),
+ disabled: NP_reflectBoolean,
media: NP_writePolicyOnly,
scoped: Props.cond('scoped' in styleForFeatureTests,
PT.filterProp(identity, Boolean)),
@@ -5799,8 +5837,8 @@
function tameEventView(view) {
if (view === window) {
return tameWindow;
- } else if (view === null) {
- return null;
+ } else if (view === null || view === undefined) {
+ return view;
} else {
if (typeof console !== 'undefined') {
console.warn('Domado: Discarding unrecognized feral view
value:',
@@ -5812,13 +5850,14 @@
function untameEventView(view) {
if (view === tameWindow) {
return window;
- } else if (view === null) {
- return null;
+ } else if (view === null || view === undefined) {
+ return view;
} else {
if (typeof console !== 'undefined') {
console.warn('Domado: Discarding unrecognized guest view
value:',
view);
}
+ return null;
}
}
@@ -6691,16 +6730,6 @@
bridal.getAttribute(containerNode, 'class')
+ ' ' + idClass + ' vdoc-container___');
}
-
- // bitmask of trace points
- // 0x0001 plugin_dispatchEvent
- domicile.domitaTrace = 0;
- domicile.getDomitaTrace = cajaVM.constFunc(
- function() { return domicile.domitaTrace; }
- );
- domicile.setDomitaTrace = cajaVM.constFunc(
- function(x) { domicile.domitaTrace = x; }
- );
var TameWindowConf = new Confidence('TameWindow');
@@ -6728,9 +6757,14 @@
taming.permitUntaming(this);
// Attach reflexive properties
-
['top', 'self', 'opener', 'parent', 'window'].forEach(function(prop) {
+ [
+ 'top', 'self', 'opener', 'parent', 'window', 'frames'
+ ].forEach(function(prop) {
this[prop] = this;
}, this);
+
+ // window.frames.length (must be a data prop for ES5/3)
+ this.length = 0;
}
inertCtor(TameWindow, Object, 'Window');
Props.define(TameWindow.prototype, TameWindowConf, {
@@ -6818,7 +6852,9 @@
platform: String(navigator.platform),
// userAgent should equal the string sent in the User-Agent HTTP
header.
userAgent: String(navigator.userAgent),
- // Custom attribute indicating Caja is active.
+ // Custom attribute indicating Caja is active. The version number
has
+ // ended up completely meaningless, but there is code in the wild
that
+ // tests for this attribute, so we'll just leave it, for now.
cajaVersion: '1.0'
});
@@ -7158,13 +7194,6 @@
function dispatch(isUserAction, pluginId, handler, args) {
var domicile =
windowToDomicile.get(rulebreaker.getImports(pluginId));
- if (domicile.domitaTrace & 0x1 && typeof console != 'undefined') {
- var sig = ('' + handler).match(/^function\b[^\)]*\)/);
- console.log(
- 'Dispatch pluginId=' + pluginId +
- ', handler=' + (sig ? sig[0] : handler) +
- ', args=' + args);
- }
switch (typeof handler) {
case 'number':
handler = domicile.handlers[+handler];
=======================================
--- /trunk/src/com/google/caja/plugin/es53-frame-group.js Tue Jun 18
13:18:13 2013
+++ /trunk/src/com/google/caja/plugin/es53-frame-group.js Thu Jul 11
15:50:37 2013
@@ -251,12 +251,12 @@
})
});
- // The Domita implementation is obtained from the taming window,
- // since we wish to protect Domita and its dependencies from the
+ // The Domado implementation is obtained from the taming window,
+ // since we wish to protect Domado and its dependencies from the
// ability of guest code to modify the shared primordials.
// TODO(kpreid): This is probably wrong: we're replacing the feral
- // record imports with the tame constructed object 'window'.
+ // record imports with the tame constructed object 'window' (issue
1399).
var targetAttributePresets = undefined;
if (config.targetAttributePresets) {
=======================================
--- /trunk/src/com/google/caja/plugin/templates/SafeCssMaker.java Thu May
12 13:11:27 2011
+++ /trunk/src/com/google/caja/plugin/templates/SafeCssMaker.java Thu Jul
11 15:50:37 2013
@@ -37,7 +37,7 @@
/**
* Attaches CSS to either the static HTML or the uncajoled JS as
appropriate.
* <p>
- * Depends on <code>emitCss___</code> as defined in DOMita.
+ * Depends on <code>emitCss___</code> as defined in Domado.
*
* @author [email protected]
*/
=======================================
--- /trunk/src/com/google/caja/ses/repairES5.js Mon Jun 17 13:22:24 2013
+++ /trunk/src/com/google/caja/ses/repairES5.js Thu Jul 11 15:50:37 2013
@@ -3781,7 +3781,7 @@
repair: repair_PUSH_IGNORES_SEALED,
preSeverity: severities.UNSAFE_SPEC_VIOLATION,
canRepair: true,
- urls: [],
+ urls: ['https://code.google.com/p/v8/issues/detail?id=2711'],
sections: ['15.2.3.9'],
tests: [] // TODO(erights): Add to test262
},
=======================================
--- /trunk/tests/com/google/caja/plugin/browser-test-case.js Fri Jun 21
14:57:00 2013
+++ /trunk/tests/com/google/caja/plugin/browser-test-case.js Thu Jul 11
15:50:37 2013
@@ -137,8 +137,11 @@
}
function getUrlParam(name, opt_default) {
var match = urlParamPattern(name).exec(window.location.href);
- return match ? decodeURIComponent(match[2]) :
- opt_default ? opt_default : '';
+ if (match) {
+ return decodeURIComponent(match[2].replace(/\+/g, ' '));
+ } else {
+ return opt_default ? opt_default : '';
+ }
}
/**
=======================================
--- /trunk/tests/com/google/caja/plugin/css-stylesheet-tests.js Mon Jul 1
09:53:11 2013
+++ /trunk/tests/com/google/caja/plugin/css-stylesheet-tests.js Thu Jul 11
15:50:37 2013
@@ -264,7 +264,7 @@
"messages": []
},
- // Properties that are on DOMita's HISTORY_INSENSITIVE_STYLE_WHITELIST
+ // Properties that are on Domado's HISTORY_INSENSITIVE_STYLE_WHITELIST
// should not be allowed in any rule that correlates with the :visited
// pseudo selector.
// TODO: How is this a whitelist then?
=======================================
--- /trunk/tests/com/google/caja/plugin/es53-test-domado-dom-guest.html Wed
Jul 10 16:24:53 2013
+++ /trunk/tests/com/google/caja/plugin/es53-test-domado-dom-guest.html Thu
Jul 11 15:50:37 2013
@@ -379,6 +379,21 @@
});
</script>
+<script>
+ jsunitRegister('testWindowReflexive', function() {
+ [
+ 'top', 'self', 'opener', 'parent', 'window', 'frames'
+ ].forEach(function(prop) {
+ assertTrue(prop, window[prop] === window);
+ });
+
+ // window.frames (which === window) is expected to act as an
array-like.
+ assertEquals(0, window.frames.length);
+
+ pass();
+ });
+</script>
+
<div id="testAttrsDeclaredInMarkup" class="testcontainer"
><form title="test title"></form>
<b>Test attributes in markup</b>
=======================================
--- /trunk/tests/com/google/caja/plugin/es53-test-domado-forms-guest.html
Thu May 23 10:22:00 2013
+++ /trunk/tests/com/google/caja/plugin/es53-test-domado-forms-guest.html
Thu Jul 11 15:50:37 2013
@@ -254,3 +254,42 @@
pass('testFancyInputs');
});
</script>
+
+<form class="testcontainer" id="testAutofocus">testAutofocus
+ <input type="text" id="testAutofocus-field" autofocus>
+</form>
+<script>
+ jsunitRegister('testAutofocus', function() {
+ var el = document.getElementById('testAutofocus-field');
+ assertEquals(false, el.autofocus);
+ el.autofocus = true;
+ assertEquals(null, directAccess.getAttribute(el, 'autofocus'));
+ assertEquals(false, el.autofocus);
+ pass();
+ });
+</script>
+
+<form class="testcontainer" id="testOptgroup">
+ <optgroup id="testOptgroup-field" disabled label="testOptgroup">
+</form>
+<script>
+ jsunitRegister('testOptgroup', function() {
+ var el = document.getElementById('testOptgroup-field');
+
+ assertEquals('testOptgroup', el.label);
+ el.label = 'testOptgroup is nifty';
+ assertEquals('testOptgroup is nifty', el.getAttribute('label'));
+
+ // disabled
+ // extensive tests to exercise reflect-boolean-attribute code, not
because
+ // we're worried about disabled in particular
+ assertEquals(true, el.disabled);
+ el.disabled = false;
+ assertEquals(null, directAccess.getAttribute(el, 'disabled'));
+ assertEquals(false, el.disabled);
+ el.disabled = true;
+ assertEquals('string', typeof
directAccess.getAttribute(el, 'disabled'));
+ assertEquals(true, el.disabled);
+ pass();
+ });
+</script>
=======================================
--- /trunk/tests/com/google/caja/plugin/es53-test-domado-special-guest.html
Fri Apr 19 10:46:56 2013
+++ /trunk/tests/com/google/caja/plugin/es53-test-domado-special-guest.html
Thu Jul 11 15:50:37 2013
@@ -128,7 +128,7 @@
// The 'p1' element, since it is contained within an A element, should
have
// computed COLOR value inherited from the top-level container element
of
- // this DOMita instance (since COLOR is an allowed history-sensitive
+ // this Domado instance (since COLOR is an allowed history-sensitive
// property), and a computed PADDING-LEFT value exactly as explicitly
set
// (since the CSS rewriter does not allow PADDING-LEFT to be assigned
in a
// history sensitive manner).
@@ -377,7 +377,7 @@
<script type="text/javascript">
jsunitRegister('testBoundingClientRect',
function testBoundingClientRect() {
- // Grab two elements defined in domita_test.html
+ // Grab two elements defined in the initial state html
var absPos = document.getElementById('absolutely-positioned');
var relPos = document.getElementById('relatively-positioned');
=======================================
--- /trunk/tests/com/google/caja/plugin/evil-twin.html Fri Jun 25 11:21:10
2010
+++ /trunk/tests/com/google/caja/plugin/evil-twin.html Thu Jul 11 15:50:37
2013
@@ -2,7 +2,7 @@
For host-tools-test.js
This gadget attempts to mess with copies of itself that fail to have
distinct
- id namespaces through Domita. If it is properly isolated, then touchCount
+ id namespaces through Domado. If it is properly isolated, then touchCount
will become and remain 1; if not, it will be 0 or higher than 1
depending on
which element it actually looks up.
-->
=======================================
--- /trunk/tests/com/google/caja/plugin/test-index.html Mon Jun 17 12:21:19
2013
+++ /trunk/tests/com/google/caja/plugin/test-index.html Thu Jul 11 15:50:37
2013
@@ -66,6 +66,8 @@
<li><a href="apidiff/analyzer.html">Browser API report/diff</a></li>
<li><a
href="browser-test-case.html?test-case=repl.html&es5=true">
REPL inside the sandbox</a></li>
+ <li><a href="generic-host-page.html">
+ Generic host page</a></li>
</ul>
<script src="catalog-parser.js"></script>
<script src="test-index.js"></script>
=======================================
--- /trunk/tests/com/google/caja/plugin/third-party-tests.json Wed Jul 10
16:24:53 2013
+++ /trunk/tests/com/google/caja/plugin/third-party-tests.json Thu Jul 11
15:50:37 2013
@@ -70,7 +70,7 @@
},
{
"guest": "attributes",
- "expected-pass": 415,
+ "expected-pass": 428,
"comment": [
"Current failure categories:",
"Seeing absolute instead of relative URLs (visible
rewriting).",
@@ -140,7 +140,7 @@
},
{
"guest": "serialize",
- "expected-pass": 26,
+ "expected-pass": 28,
"comment": [
"Current failure categories:",
"Missing form fields."
--
---
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.