diff options
author | Tor Norbye <tnorbye@google.com> | 2013-01-14 11:52:33 -0800 |
---|---|---|
committer | Tor Norbye <tnorbye@google.com> | 2013-01-14 12:55:24 -0800 |
commit | 7c3a590edd14902d0cca68a435c020ca86331a6c (patch) | |
tree | 2526c81563de27a6bf220da65b8769a4748554b4 /sdk_common/src/com/android/ide/common/resources/ResourceResolver.java | |
parent | a737845cdcf443843a3bc112a66f0d560b1e007a (diff) | |
download | sdk-7c3a590edd14902d0cca68a435c020ca86331a6c.zip sdk-7c3a590edd14902d0cca68a435c020ca86331a6c.tar.gz sdk-7c3a590edd14902d0cca68a435c020ca86331a6c.tar.bz2 |
39612: Question Mark causes Eclipse Graphical Layout Editor to Freak Out
Handle string values starting with ? and @ even if they do not correspond
to actual theme or resource URLs.
Also fix the code which handles processing strings read from XML files;
apply unescaping rules (for unicode, newlines and tabs, removing quotes,
etc).
Also make the style warning include the full resource URI (it was only
logging the stripped URI).
Change-Id: I9b9a87ac4841faeacd1d94a43fa091702e60f4d8
Diffstat (limited to 'sdk_common/src/com/android/ide/common/resources/ResourceResolver.java')
-rw-r--r-- | sdk_common/src/com/android/ide/common/resources/ResourceResolver.java | 43 |
1 files changed, 35 insertions, 8 deletions
diff --git a/sdk_common/src/com/android/ide/common/resources/ResourceResolver.java b/sdk_common/src/com/android/ide/common/resources/ResourceResolver.java index 756ea53..219c93f 100644 --- a/sdk_common/src/com/android/ide/common/resources/ResourceResolver.java +++ b/sdk_common/src/com/android/ide/common/resources/ResourceResolver.java @@ -189,7 +189,8 @@ public class ResourceResolver extends RenderResources { if (reference == null) { return null; } - if (reference.startsWith(PREFIX_THEME_REF)) { + if (reference.startsWith(PREFIX_THEME_REF) + && reference.length() > PREFIX_THEME_REF.length()) { // no theme? no need to go further! if (mTheme == null) { return null; @@ -198,6 +199,7 @@ public class ResourceResolver extends RenderResources { boolean frameworkOnly = false; // eliminate the prefix from the string + String originalReference = reference; if (reference.startsWith(ANDROID_THEME_PREFIX)) { frameworkOnly = true; reference = reference.substring(ANDROID_THEME_PREFIX.length()); @@ -207,7 +209,7 @@ public class ResourceResolver extends RenderResources { // at this point, value can contain type/name (drawable/foo for instance). // split it to make sure. - String[] segments = reference.split("\\/"); + String[] segments = reference.split("/"); // we look for the referenced item name. String referenceName = null; @@ -224,6 +226,18 @@ public class ResourceResolver extends RenderResources { } else { // it's just an item name. referenceName = segments[0]; + + // Make sure it looks like a resource name; if not, it could just be a string + // which starts with a ? + if (!Character.isJavaIdentifierStart(referenceName.charAt(0))) { + return null; + } + for (int i = 1, n = referenceName.length(); i < n; i++) { + char c = referenceName.charAt(i); + if (!Character.isJavaIdentifierPart(c) && c != '.') { + return null; + } + } } // now we look for android: in the referenceName in order to support format @@ -241,7 +255,7 @@ public class ResourceResolver extends RenderResources { mLogger.warning(LayoutLog.TAG_RESOURCES_RESOLVE_THEME_ATTR, String.format("Couldn't find theme resource %1$s for the current theme", reference), - new ResourceValue(ResourceType.ATTR, referenceName, frameworkOnly)); + new ResourceValue(ResourceType.ATTR, originalReference, frameworkOnly)); } return item; @@ -262,16 +276,17 @@ public class ResourceResolver extends RenderResources { } // at this point, value contains type/[android:]name (drawable/foo for instance) - String[] segments = reference.split("\\/"); - if (segments.length <= 1) { + String[] segments = reference.split("/"); + if (segments.length != 2) { return null; } // now we look for android: in the resource name in order to support format // such as: @drawable/android:name - if (segments[1].startsWith(PREFIX_ANDROID)) { + String referenceName = segments[1]; + if (referenceName.startsWith(PREFIX_ANDROID)) { frameworkOnly = true; - segments[1] = segments[1].substring(PREFIX_ANDROID.length()); + referenceName = referenceName.substring(PREFIX_ANDROID.length()); } ResourceType type = ResourceType.getEnum(segments[0]); @@ -281,7 +296,19 @@ public class ResourceResolver extends RenderResources { return null; } - return findResValue(type, segments[1], + // Make sure it looks like a resource name; if not, it could just be a string + // which starts with a ? + if (!Character.isJavaIdentifierStart(referenceName.charAt(0))) { + return null; + } + for (int i = 1, n = referenceName.length(); i < n; i++) { + char c = referenceName.charAt(i); + if (!Character.isJavaIdentifierPart(c) && c != '.') { + return null; + } + } + + return findResValue(type, referenceName, forceFrameworkOnly ? true :frameworkOnly); } |