Fix locale provider when using devmode with -superDevMode
Some property providers expect that __gwt_getMetaProperty
is in scope when they run.
Change-Id: I89094ea319454f14e8efa162489f0a50de882340
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/recompile_lib.js b/dev/codeserver/java/com/google/gwt/dev/codeserver/recompile_lib.js
index c74d699..d97482f 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/recompile_lib.js
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/recompile_lib.js
@@ -280,3 +280,56 @@
//Export Recompiler to namespace
$namespace.lib.Recompiler = Recompiler;
+
+function MetaTagParser(moduleName) {
+ this.__parsed = false;
+ this.__metaProperties = null;
+ this.__moduleName = moduleName;
+}
+
+MetaTagParser.prototype.__getMetaTags = function() {
+ return $doc.getElementsByTagName('meta');
+};
+
+MetaTagParser.prototype.__parse = function() {
+ var metaProps = {};
+ var metas = this.__getMetaTags();
+
+ for (var i = 0, n = metas.length; i < n; ++i) {
+ var meta = metas[i];
+ var name = meta.getAttribute('name');
+ var content = meta.getAttribute('content');
+
+ if (name) {
+ name = name.replace(this.__moduleName + '::', '');
+ if (name.indexOf('::') >= 0) {
+ // It's for a different module
+ continue;
+ }
+ }
+ if (name == 'gwt:property' && content) {
+ var value;
+ var eq = content.indexOf('=');
+ if (eq >= 0) {
+ name = content.substring(0, eq);
+ value = content.substring(eq+1);
+ } else {
+ name = content;
+ value = '';
+ }
+ metaProps[name] = value;
+ }
+ }
+ return metaProps;
+};
+
+MetaTagParser.prototype.get = function() {
+ if (!this.__parsed) {
+ this.__metaProperties = this.__parse();
+ this.__parsed = true;
+ }
+ return this.__metaProperties;
+};
+
+//Export MetaTagParser to namespace
+$namespace.lib.MetaTagParser = MetaTagParser;
diff --git a/dev/codeserver/java/com/google/gwt/dev/codeserver/recompile_template.js b/dev/codeserver/java/com/google/gwt/dev/codeserver/recompile_template.js
index 48ce22b..a3988cd 100644
--- a/dev/codeserver/java/com/google/gwt/dev/codeserver/recompile_template.js
+++ b/dev/codeserver/java/com/google/gwt/dev/codeserver/recompile_template.js
@@ -18,10 +18,18 @@
var $doc = $wnd.document;
var $namespace = {};
var moduleName = __MODULE_NAME__;
-
+
var executeMain = function(){
- __PROPERTY_PROVIDERS__
__LIB_JS__
+
+ var metaTagParser = new $namespace.lib.MetaTagParser(moduleName);
+
+ //Property providers need a certain environment to run
+ var __gwt_getMetaProperty = function(name) {
+ return metaTagParser.get()[name];
+ };
+
+ __PROPERTY_PROVIDERS__
__MAIN__
};
diff --git a/dev/codeserver/javatests/com/google/gwt/dev/codeserver/client/CodeServerGwtTest.java b/dev/codeserver/javatests/com/google/gwt/dev/codeserver/client/CodeServerGwtTest.java
index 6ebea95..9976999 100644
--- a/dev/codeserver/javatests/com/google/gwt/dev/codeserver/client/CodeServerGwtTest.java
+++ b/dev/codeserver/javatests/com/google/gwt/dev/codeserver/client/CodeServerGwtTest.java
@@ -111,6 +111,47 @@
assertTrue(callbackCalled, 'callback for successful recompile was not executed');
}-*/;
+ public native void testMetaTagParser() /*-{
+ var assertStringEquals = @CodeServerGwtTest::assertEquals(Ljava/lang/String;Ljava/lang/String;);
+ var assertTrue = @CodeServerGwtTest::assertTrue(Ljava/lang/String;Z);
+ var MetaTagParser = $wnd.namespace.lib.MetaTagParser;
+ var parser = new MetaTagParser('testModule');
+
+ parser.__getMetaTags = function() {
+ // provide mocks
+ var returnValues = [
+ 'testModule::gwt:property',
+ 'bar',
+ 'testModule::gwt:property',
+ 'test1=test2',
+ 'ignored1',
+ 'ignored2',
+ 'otherModule::gwt:property',
+ 'bar1=foo1'
+ ];
+ var index = 0;
+
+ var readEntry = function() {
+ return returnValues[index++];
+ };
+
+ return [
+ {getAttribute: readEntry},
+ {getAttribute: readEntry},
+ {getAttribute: readEntry},
+ {getAttribute: readEntry}
+ ];
+ };
+
+ var props = parser.get();
+ var len = Object.keys(props).length;
+ assertTrue('Wrong number of entries: ' + len, len == 2);
+
+ assertTrue('bar is missing', 'bar' in props);
+ assertTrue('test1 is missing', 'test1' in props);
+ assertStringEquals('test2', props.test1);
+ }-*/;
+
private void ensureJsInjected() {
if(injected) {
return;