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;