Revision: 5665
Author:   [email protected]
Date:     Wed Feb 12 18:09:06 2014 UTC
Log:      Backport to es53 branch: r5661, r5664

5661 Add leniency in taming for better Google Visualization API support.
5664 Fix repair-framework not fully respecting acceptableProblems.

The merge command was
svn merge -c 5661,5664 ^/trunk
and there were no conflicts.

Skipping review since this is a straight merge of everything
since the previous merge.
http://code.google.com/p/google-caja/source/detail?r=5665

Modified:
 /branches/es53
 /branches/es53/src/com/google/caja/apitaming/cajaTamingGoogleLoader.js
 /branches/es53/src/com/google/caja/ses/repair-framework.js
 /branches/es53/tests/com/google/caja/ses/test-repair-framework.js
 /branches/es53/tests/com/google/caja/util/LocalServer.java

=======================================
--- /branches/es53/src/com/google/caja/apitaming/cajaTamingGoogleLoader.js Tue Feb 4 17:26:19 2014 UTC +++ /branches/es53/src/com/google/caja/apitaming/cajaTamingGoogleLoader.js Wed Feb 12 18:09:06 2014 UTC
@@ -325,6 +325,14 @@

     function defCtor(path, obj, policy) {
       caja.console.log(path + ' defCtor');
+
+ // Be lenient: don't fail on getting an object instead of a function. This + // is needed for the modular Visualization API which sometimes has stub + // objects instead of actual ctor functions when the ctor was in a module
+      // not loaded.
+      if (typeof obj === 'object') {
+        return;
+      }

       adviseFunction(obj, policy);

=======================================
--- /branches/es53/src/com/google/caja/ses/repair-framework.js Tue Feb 4 17:26:19 2014 UTC +++ /branches/es53/src/com/google/caja/ses/repair-framework.js Wed Feb 12 18:09:06 2014 UTC
@@ -244,6 +244,12 @@
      */
     var acceptableProblems = {};

+    /**
+     * Whether acceptableProblems has been used and therefore should not be
+     * modified.
+     */
+    var acceptableProblemsLocked = false;
+
     /**
* As we start to repair, this will track the worst *post-repair* severity
      * seen so far.
@@ -308,6 +314,7 @@

     var defaultDisposition = { permit: false, doNotRepair: false };
     function disposition(problem) {
+      acceptableProblemsLocked = true;
       return Object.prototype.hasOwnProperty.call(acceptableProblems,
problem.id) ? acceptableProblems[problem.id] : defaultDisposition;
     }
@@ -335,7 +342,8 @@
           repairsPerformed.lastIndexOf(problem.repair) !== -1;

         // Update yetToRepair and plannedSeverity
- if (repairPerformed || !problem.repair) { // repair attempted/absent
+        if (repairPerformed || !problem.repair ||
+            disposition(problem).doNotRepair) {  // repair attempted/absent

           if (report.postSeverity.level > severities.SAFE.level
               && disposition(problem).permit) {
@@ -452,7 +460,9 @@
     };

     this.setAcceptableProblems = function(value) {
-      // TODO(kpreid): Check some condition? Do only once?
+      if (acceptableProblemsLocked) {
+        throw new Error('Too late to setAcceptableProblems.');
+      }
       acceptableProblems = value;
     };

@@ -469,9 +479,8 @@
     this.getCurrentSeverity = function() {
       var severity = plannedSeverity;
       yetToRepair.forEach(function(problem) {
- // TODO(kpreid): Fix interaction of this with acceptableProblems config
-
-        if (problem.preSeverity.level > severity.level) {
+        if (problem.preSeverity.level > severity.level &&
+            !disposition(problem).permit) {
           severity = problem.preSeverity;
         }
       });
@@ -504,6 +513,11 @@
     // TODO(kpreid): Replace uses of this with higher level ops
     this.updateMaxSeverity = function updateMaxSeverity(severity) {
       if (severity.level > plannedSeverity.level) {
+ // This is a useful breakpoint for answering the question "why is the
+        // severity as high as it is".
+        // if (severity.level > maxAcceptableSeverity.level) {
+        //   console.info('Increasing planned severity.');
+        // }
         plannedSeverity = severity;
       }
     };
=======================================
--- /branches/es53/tests/com/google/caja/ses/test-repair-framework.js Tue Feb 4 17:26:19 2014 UTC +++ /branches/es53/tests/com/google/caja/ses/test-repair-framework.js Wed Feb 12 18:09:06 2014 UTC
@@ -141,6 +141,55 @@
     jsunitPass();
   });

+  jsunitRegister('testAcceptableProblems', function() {
+    var repairer = new ses._Repairer();
+
+    repairer.setAcceptableProblems({
+      'DNR': { doNotRepair: true },
+      'PERMIT': { permit: true },
+      'PERMIT_DNR': { permit: true, doNotRepair: true },
+    });
+    var repaired_pd = false;
+    var repaired_d = false;
+    repairer.registerProblem({
+      id: 'PERMIT',
+      test: function() { return true; },
+      repair: undefined,
+      preSeverity: severities.UNSAFE_SPEC_VIOLATION,
+      canRepair: false,
+    });
+    repairer.registerProblem({
+      id: 'DNR',
+      test: function() { return !repaired_d; },
+      repair: function() { repaired_d = true; },
+      preSeverity: severities.SAFE_SPEC_VIOLATION,
+      canRepair: true,
+    });
+    repairer.registerProblem({
+      id: 'PERMIT_DNR',
+      test: function() { return !repaired_pd; },
+      repair: function() { repaired_pd = true; },
+      preSeverity: severities.UNSAFE_SPEC_VIOLATION,
+      canRepair: true,
+    });
+    repairer.runTests('test without repair');
+    assertEquals('cur sev 1', severities.SAFE_SPEC_VIOLATION,
+        repairer.getCurrentSeverity());
+    assertEquals('plan sev 1', severities.SAFE_SPEC_VIOLATION,
+        repairer.getPlannedSeverity());
+    repairer.testAndRepair();
+    assertFalse('not repaired DNR', repaired_d);
+    assertFalse('not repaired permit&DNR', repaired_pd);
+ // We expect SAFE_SPEC_VIOLATION because problem 'DNR' is doNotRepair but
+    // it is not permitted, so its severity should show up.
+    assertEquals('cur sev 2', severities.SAFE_SPEC_VIOLATION,
+        repairer.getCurrentSeverity());
+    assertEquals('plan sev 2', severities.SAFE_SPEC_VIOLATION,
+        repairer.getPlannedSeverity());
+
+    jsunitPass();
+  });
+
   jsunitRegister('testRepairOutcomes', function() {
     var repairer = new ses._Repairer();

=======================================
--- /branches/es53/tests/com/google/caja/util/LocalServer.java Tue Feb 4 17:26:19 2014 UTC +++ /branches/es53/tests/com/google/caja/util/LocalServer.java Wed Feb 12 18:09:06 2014 UTC
@@ -14,6 +14,8 @@

 package com.google.caja.util;

+import javax.servlet.http.HttpServletResponse;
+
 import org.mortbay.jetty.Server;
 import org.mortbay.jetty.handler.ContextHandler;
 import org.mortbay.jetty.handler.ResourceHandler;
@@ -22,6 +24,7 @@
 import org.mortbay.jetty.handler.HandlerList;
 import org.mortbay.jetty.servlet.Context;
 import org.mortbay.jetty.servlet.ServletHolder;
+import org.mortbay.resource.Resource;

 import com.google.caja.SomethingWidgyHappenedError;
 import com.google.caja.service.CajolingService;
@@ -71,7 +74,18 @@
     cajaStatic.setResourceBase("./ant-war/");

     // static file serving for tests
-    final ResourceHandler resource_handler = new ResourceHandler();
+    final ResourceHandler resource_handler = new ResourceHandler() {
+      @Override
+      protected void doResponseHeaders(HttpServletResponse response,
+          Resource resource, String mimeType) {
+        super.doResponseHeaders(response, resource, mimeType);
+
+ // If not disabled, IE and Chrome will refuse to execute script text
+        // which happens to occur in the URL (which applies to our
+        // generic-host-page for one).
+        response.setHeader("X-XSS-Protection", "0");
+      }
+    };
     resource_handler.setResourceBase(".");

     // caja (=playground for now) server under /caja directory

--

--- 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