Reviewers: felix8a,

Description:
Expose baseUri and unresolved uris in external references so uri
policies
can switch on actual uris that appear in a page.

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

Affected files:
M src/com/google/caja/demos/playground/server/GWTCajolingServiceImpl.java
  M     src/com/google/caja/lexer/ExternalReference.java
  M     src/com/google/caja/parser/quasiliteral/ModuleManager.java
  M     src/com/google/caja/plugin/CssRewriter.java
  M     src/com/google/caja/plugin/stages/InlineCssImportsStage.java


Index: src/com/google/caja/lexer/ExternalReference.java
===================================================================
--- src/com/google/caja/lexer/ExternalReference.java    (revision 4683)
+++ src/com/google/caja/lexer/ExternalReference.java    (working copy)
@@ -48,21 +48,36 @@
  */
 public final class ExternalReference {
   private final URI uri;
+  private final URI base;
+  private final URI relUri;
   private final FilePosition pos;

+  public ExternalReference(URI uri, FilePosition pos) {
+    this(uri, uri, uri, pos);
+  }
+
   /**
    * @param uri the location of the external resource.
+ * @param originalUri location of the resource as it appears in the source * @param pos the location, within an already parsed input, of the reference
    *     to uri.
    */
-  public ExternalReference(URI uri, FilePosition pos) {
+ public ExternalReference(URI uri, URI base, URI relUri, FilePosition pos) {
     this.uri = uri;
+    this.base = base;
+    this.relUri = relUri;
     this.pos = pos;
   }

   /** The external URI. */
   public URI getUri() { return uri; }

+  /** The base URI. */
+  public URI getBase() { return base; }
+
+  /** The base URI. */
+  public URI getUnresolvedUri() { return relUri; }
+
   /** The location, within an already parsed input, of the reference. */
   public FilePosition getReferencePosition() { return pos; }

Index: src/com/google/caja/parser/quasiliteral/ModuleManager.java
===================================================================
--- src/com/google/caja/parser/quasiliteral/ModuleManager.java (revision 4683) +++ src/com/google/caja/parser/quasiliteral/ModuleManager.java (working copy)
@@ -154,7 +154,7 @@
     }

     ExternalReference er = new ExternalReference(
-        absoluteUri, src.getFilePosition());
+        absoluteUri, baseUri, relUri, src.getFilePosition());

     CharProducer cp;
     try {
Index: src/com/google/caja/plugin/stages/InlineCssImportsStage.java
===================================================================
--- src/com/google/caja/plugin/stages/InlineCssImportsStage.java (revision 4683) +++ src/com/google/caja/plugin/stages/InlineCssImportsStage.java (working copy)
@@ -140,13 +140,16 @@
     // Compute the URI to import
     ExternalReference importUrl = null;
     URI absUri = null;
+    URI relUri = null;
     try {
+      relUri = new URI(uriNode.getValue());
       absUri = UriUtil.resolve(baseUri, uriNode.getValue());
     } catch (URISyntaxException ex) {
       // handled below.
     }
     if (absUri != null) {
-      importUrl = new ExternalReference(absUri, uriNode.getFilePosition());
+      importUrl = new ExternalReference(
+          absUri, baseUri, relUri, uriNode.getFilePosition());
     }
     if (importUrl == null) {
       mq.addMessage(
Index: src/com/google/caja/plugin/CssRewriter.java
===================================================================
--- src/com/google/caja/plugin/CssRewriter.java (revision 4683)
+++ src/com/google/caja/plugin/CssRewriter.java (working copy)
@@ -637,9 +637,10 @@
             String uriStr = content.getValue();
             try {
               URI baseUri = content.getFilePosition().source().getUri();
-              URI uri = baseUri.resolve(new URI(uriStr));
+              URI relUri = new URI(uriStr);
+              URI uri = baseUri.resolve(relUri);
               ExternalReference ref = new ExternalReference(
-                  uri, content.getFilePosition());
+                  uri, baseUri, relUri, content.getFilePosition());
               Name propertyPart = propertyPart(node);  // TODO
               if (uriPolicy != null &&
                   uriPolicy.rewriteUri(
@@ -736,12 +737,13 @@
               String uriStr = content.getValue();
               try {
                 URI baseUri = content.getFilePosition().source().getUri();
-                URI uri = baseUri.resolve(new URI(uriStr));
+                URI relUri = new URI(uriStr);
+                URI uri = baseUri.resolve(relUri);
                 // Rewrite the URI.
                 // TODO(mikesamuel): for content: and other URI types, use
                 // mime-type of text/*.
                 ExternalReference ref = new ExternalReference(
-                    uri, content.getFilePosition());
+                    uri, baseUri, relUri, content.getFilePosition());
                 CssTree.UriLiteral replacement;
                 if (uriPolicy != null) {
                   String rewrittenUri = uriPolicy.rewriteUri(
Index: src/com/google/caja/demos/playground/server/GWTCajolingServiceImpl.java
===================================================================
--- src/com/google/caja/demos/playground/server/GWTCajolingServiceImpl.java (revision 4683) +++ src/com/google/caja/demos/playground/server/GWTCajolingServiceImpl.java (working copy)
@@ -216,14 +216,16 @@

   public String fetch(String base, String uri) {
     try {
-      URI address = new URI(uri);
-      if (!address.isAbsolute()) {
-        URI baseAddress = new URI(base);
-        address = baseAddress.resolve(address);
+      URI relUri = new URI(uri);
+      URI absUri = null;
+      URI baseAddress = null;
+      if (!relUri.isAbsolute()) {
+        baseAddress = new URI(base);
+        absUri = baseAddress.resolve(relUri);
       }
       return fetcher.fetch(
-          new ExternalReference(address, FilePosition.UNKNOWN), "*/*")
-          .getTextualContent().toString();
+          new ExternalReference(absUri, baseAddress, relUri,
+              FilePosition.UNKNOWN), "*/*").getTextualContent().toString();
     } catch (URISyntaxException ex) {
       return null;
     } catch (UnsupportedEncodingException ex) {


Reply via email to