Reviewers: MikeSamuel,

Description:
http://code.google.com/p/google-caja/issues/detail?id=588

domita has support for setting very simple onevent= handlers
when assigning to innerHTML.  for example, this is supposed
to work:

  <div id='a'></div>
  <script>
    var a = document.getElementById('a');
    a.innerHTML = '<input type="button" onclick="foo();">';
    function foo () { cajita.log(1); }
  </script>

however, this has been broken since valija was created,
because plugin_dispatchEvent knows how to find a cajita 'foo',
but not a valija 'foo'.

this change teaches plugin_dispatchEvent about valija 'foo'.

Please review this at http://codereview.appspot.com/115082

Affected files:
  M     src/com/google/caja/plugin/domita.js
  M     tests/com/google/caja/plugin/domita_test_untrusted.html


Index: tests/com/google/caja/plugin/domita_test_untrusted.html
===================================================================
--- tests/com/google/caja/plugin/domita_test_untrusted.html     (revision 3717)
+++ tests/com/google/caja/plugin/domita_test_untrusted.html     (working copy)
@@ -39,6 +39,10 @@
   <b>Click me</b>
 </p>

+<p class="clickme-testcontainer" id="test-innerhtml-onclick">
+  <b>do not click yet</b>
+</p>
+
 <div class="clickme-testcontainer" id="test-case-insensitive-attrs">
   <table id="is-red">
     <tr>
@@ -755,6 +759,23 @@
       });
 });

+jsunitRegister('testInnerhtmlOnclick',
+               function testInnerhtmlOnclick() {
+  var el = document.getElementById('test-innerhtml-onclick');
+  if (directAccess.isValija) {
+    el.innerHTML = '<b onclick="innerhtmlClicked();">Click me</b>';
+  } else {
+    // in cajita, innerhtmlClicked is a local module function,
+    // and there's no way for domita.js to access it.
+    el.innerHTML = "<span>Cajita can't link up onclick= functions</span>";
+    pass('test-innerhtml-onclick');
+  }
+});
+
+function innerhtmlClicked() {
+  pass('test-innerhtml-onclick');
+}
+
 jsunitRegister('testCaseInsensitiveAttrs',
                function testCaseInsensitiveAttrs() {
   var tableNode = document.getElementById('is-red');
Index: src/com/google/caja/plugin/domita.js
===================================================================
--- src/com/google/caja/plugin/domita.js        (revision 3717)
+++ src/com/google/caja/plugin/domita.js        (working copy)
@@ -4047,7 +4047,7 @@
   }
   switch (typeof handler) {
     case 'string':
-      handler = imports[handler];
+      handler = imports.$v ? imports.$v.ro(handler) : imports[handler];
       break;
     case 'function': case 'object':
       break;


Reply via email to