diff options
Diffstat (limited to 'gerrit-gwtexpui/src/main/java/com/google/gwtexpui/linker/server/UserAgentRule.java')
-rw-r--r-- | gerrit-gwtexpui/src/main/java/com/google/gwtexpui/linker/server/UserAgentRule.java | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/linker/server/UserAgentRule.java b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/linker/server/UserAgentRule.java new file mode 100644 index 0000000000..366b6c57a3 --- /dev/null +++ b/gerrit-gwtexpui/src/main/java/com/google/gwtexpui/linker/server/UserAgentRule.java @@ -0,0 +1,93 @@ +// Copyright (C) 2009 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package com.google.gwtexpui.linker.server; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; +import static java.util.regex.Pattern.compile; + +import javax.servlet.http.HttpServletRequest; + +/** + * Selects the value for the {@code user.agent} property. + * <p> + * Examines the {@code User-Agent} HTTP request header, and tries to match it to + * known {@code user.agent} values. + * <p> + * Ported from JavaScript in {@code com.google.gwt.user.UserAgent.gwt.xml}. + */ +public class UserAgentRule implements Rule { + private static final Pattern msie = compile(".*msie ([0-9]+)\\.([0-9]+).*"); + private static final Pattern gecko = compile(".*rv:([0-9]+)\\.([0-9]+).*"); + + public String getName() { + return "user.agent"; + } + + @Override + public String select(HttpServletRequest req) { + String ua = req.getHeader("User-Agent"); + if (ua == null) { + return null; + } + + ua = ua.toLowerCase(); + + if (ua.indexOf("opera") != -1) { + return "opera"; + + } else if (ua.indexOf("webkit") != -1) { + return "safari"; + + } else if (ua.indexOf("msie") != -1) { + // GWT 2.0 uses document.documentMode here, which we can't do + // on the server side. + + Matcher m = msie.matcher(ua); + if (m.matches() && m.groupCount() == 2) { + int v = makeVersion(m); + if (v >= 10000) { + return "ie10"; + } + if (v >= 9000) { + return "ie9"; + } + if (v >= 8000) { + return "ie8"; + } + if (v >= 6000) { + return "ie6"; + } + } + return null; + + } else if (ua.indexOf("gecko") != -1) { + Matcher m = gecko.matcher(ua); + if (m.matches() && m.groupCount() == 2) { + if (makeVersion(m) >= 1008) { + return "gecko1_8"; + } + } + return "gecko"; + } + + return null; + } + + private int makeVersion(Matcher result) { + return (Integer.parseInt(result.group(1)) * 1000) + + Integer.parseInt(result.group(2)); + } +} |