使用GWT为Google Chrome生成浏览器敏感代码

时间:2012-06-26 19:01:27

标签: gwt google-chrome google-chrome-extension

我正在为Google Chrome扩展程序编写链接器。在gwt.xml文件中,我需要添加一行说明用户代理属性。对于firefox,模式如下:

<set-property name="user.agent" value="gecko1_8"/>

但是,我无法为Google Chrome特定代码找到相应的名称。

2 个答案:

答案 0 :(得分:3)

这是list of supported useragents。令人困惑的是,Chrome的那个是“Safari”。 (这可能是由于这两种浏览器都是基于webkit的,但我可能是错的。)

<set-property name="user.agent" value="safari"/>

答案 1 :(得分:3)

GWT对Chrome和Safari的处理方式相同,因此只有“safari”代理值可以覆盖两者。所以你不能只使用用户代理配置来做到这一点。

然而,GWT的延迟绑定机制确实有一种方法可以通过创建“属性提供程序”来将代码定制为仅在运行时被嗅探的属性。这基本上就是你在.gwt.xml中执行此操作的方法:

  <define-property name="is.really.chrome" values="false,true"/>

  <property-provider name="is.really.chrome"><![CDATA[
      var ua = navigator.userAgent.toLowerCase();
      if (ua.indexOf("applewebkit") != -1) {
        if (ua.indexOf("chrome") != -1) {
          return true;
        } 
      } 
      return false;
  ]]></property-provider>

  <replace-with
      class="some.implementation.of.interface">
    <when-type-is class="some.interface.used.with.GWT.create"/>

    <when-property-is name="user.agent" value="safari"/>
    <when-property-is name="is.really.chrome" value="true"/>
  </replace-with>

上面的部分内容是定义一个新属性“is.really.chrome”,其值将由加载应用程序时<property-provider>块中的Javascript代码确定(此代码内联进入GWT启动序列。)

第二部分<replace-with>显示了如何定义对此新属性的值敏感的替换规则。这个(以及任何其他类似的规则)将导致GWT编译器创建代码的附加排列,这与冒险版本大致相同,但使用chrome自定义。

这篇文章是我在这个主题上发现的最好的文章之一:http://css.dzone.com/news/understanding-gwt-compiler