Установить пользовательский агент для IE9 (GWT)

#java #gwt

#java #gwt

Вопрос:

Я пытаюсь изменить пользовательский агент на safari при посещении страницы с помощью IE9.

Я написал это для gwt.xml файл:

 <set-property name='user.agent' value='safari'>
   <when-property-is name="user.agent" value="ie9" />
</set-property>
  

Однако IE9 теперь вообще не находит никакого пользовательского агента (даже не возвращается к своему собственному).
Что я делаю не так?

РЕДАКТИРОВАТЬ: я должен использовать GWT 2.0.4

ПРАВКА 2: Прочитайте комментарии к ответу, чтобы увидеть, как я это исправил.

Ответ №1:

Я не делал этого раньше, но я предполагаю, что вам придется реализовать свой собственный UserAgentPropertyGenerator (потому что это класс, который динамически оценивает свойство user agent!), а затем привязать его, как в com.google.gwt.user.UserAgent.gwt.xml:

 <property-provider 
   name="user.agent"
   generator="com.google.gwt.user.rebind.UserAgentPropertyGenerator"/>
  

Для более старых версий GWT (< 2.3.0) это настраивается непосредственно в com.google.gwt.user.UserAgent.gwt.xml как:

   <property-provider name="user.agent"><![CDATA[
      var ua = navigator.userAgent.toLowerCase();
      var makeVersion = function(result) {
        return (parseInt(result[1]) * 1000)   parseInt(result[2]);
      };

      if (ua.indexOf("opera") != -1) {
        return "opera";
      } else if (ua.indexOf("webkit") != -1) {
        return "safari";
      } else if (ua.indexOf("msie") != -1) {
        if (document.documentMode >= 8) {
          return "ie8";
        } else {
          var result = /msie ([0-9] ).([0-9] )/.exec(ua);
          if (result amp;amp; result.length == 3) {
            var v = makeVersion(result);
            if (v >= 6000) {
              return "ie6";
            }
          }
        }
      } else if (ua.indexOf("gecko") != -1) {
        var result = /rv:([0-9] ).([0-9] )/.exec(ua);
        if (result amp;amp; result.length == 3) {
          if (makeVersion(result) >= 1008)
            return "gecko1_8";
          }
        return "gecko";
      }
      return "unknown";
  ]]></property-provider>
  

Комментарии:

1. Похоже, это невозможно в GWT 2.0.4, не так ли?

2. @Rob: Да, это новое в GWT 2.3.0. Я обновил свой ответ, чтобы также охватить более старые версии GWT.

3. Спасибо! Однако я получаю ошибку при запуске этого в любой версии IE: Ошибка при выполнении поставщика JavaScript для свойства ‘user.agent’ com.google.gwt.core.client.JavaScriptException: (TypeError): ‘odoc’ не определен

4. На самом деле проблема заключалась в том, как я проверял IE9 (odoc.body.style.opacity != undefined), из-за чего более низкие значения IEs выдавали ошибки. Я изменил его на if (document.documentMode >= 9) вернуть ‘safari’, и это сработало!

Ответ №2:

Я не уверен на 100%, что понимаю ваш вопрос. Однако я считаю, что вы не можете действительно изменить пользовательский агент. Что вы, вероятно, хотите сделать, так это обрабатывать запросы из браузера ie9 так, как если бы они поступали из браузеров safari. В этом случае, я думаю, вы можете использовать отложенную привязку с помощью замены: пример на этой веб-странице для вас выглядел бы примерно так:

 <module>

  <!--  ... other configuration omitted ... -->

  <!-- Fall through to this rule is the browser isn't IE or Mozilla -->
  <replace-with class="com.google.gwt.user.client.ui.impl.PopupImpl">
    <when-type-is class="com.google.gwt.user.client.ui.impl.PopupImpl"/>
  </replace-with>

  <!-- Handling safari and ie9 in the same way -->
  <replace-with class="com.google.gwt.user.client.ui.impl.PopupImplSafari">
    <when-type-is class="com.google.gwt.user.client.ui.impl.PopupImpl" />
    <any>
      <when-property-is name="user.agent" value="safari"/>
      <when-property-is name="user.agent" value="ie9" />
    </any>
  </replace-with>

</module>
  

Комментарии:

1. Использование <set-property name=’user.agent’ value=’safari’> работает. Это термин <когда ..>, который не работает. Основываясь на данном коде, я не могу понять, как написать что-либо лучше, чем я уже сделал.