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