/* * BrowseCap.java * * Copyright (C) 2009-17 by RStudio, Inc. * * Unless you have received this program directly from RStudio pursuant * to the terms of a commercial license agreement with RStudio, then * this program is licensed to you under the terms of version 3 of the * GNU Affero General Public License. This program is distributed WITHOUT * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT, * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details. * */ package org.rstudio.core.client; import org.rstudio.core.client.theme.ThemeFonts; import org.rstudio.core.client.widget.FontDetector; import org.rstudio.studio.client.application.Desktop; import com.google.gwt.core.client.GWT; import com.google.gwt.dom.client.Document; public class BrowseCap { public static double getFontSkew() { if (hasMetaKey()) return -1; else if (FIXED_UBUNTU_MONO) { if (isFirefox()) return 1; else return 0.4; } else if (!Desktop.isDesktop() && isWindows()) return 0.4; else return 0; } public static final BrowseCap INSTANCE = GWT.create(BrowseCap.class); public boolean suppressBraceHighlighting() { return false; } public boolean aceVerticalScrollBarIssue() { return false; } public boolean suppressBrowserForwardBack() { return false; } public boolean hasWindowFind() { return !isInternetExplorer(); } public boolean canCopyToClipboard() { return Desktop.isDesktop() || !isSafari(); } public boolean isInternetExplorer() { return isUserAgent("trident"); } public boolean isInternetExplorer10() { return false; } public static boolean hasMetaKey() { return isMacintosh(); } public static boolean isMacintosh() { return OPERATING_SYSTEM.equals("macintosh"); } public static boolean isMacintoshDesktop() { return Desktop.isDesktop() && isMacintosh(); } public static boolean isCocoaDesktop() { return Desktop.isDesktop() && Desktop.getFrame().isCocoa(); } public static boolean isWindows() { return OPERATING_SYSTEM.equals("windows"); } public static boolean isWindowsDesktop() { return Desktop.isDesktop() && isWindows(); } public static boolean isLinux() { return OPERATING_SYSTEM.equals("linux"); } public static boolean isLinuxDesktop() { return Desktop.isDesktop() && isLinux(); } public static boolean hasUbuntuFonts() { return FIXED_UBUNTU_MONO; } public static boolean isChrome() { return isUserAgent("chrome"); } public static boolean isSafari() { return isUserAgent("safari") && !isChrome(); } public static boolean isChromeLinux() { return isChrome() && isLinux(); } public static boolean isFirefox() { return isUserAgent("firefox"); } public static boolean isChromeFrame() { return isUserAgent("chromeframe"); } public static double devicePixelRatio() { if (Desktop.isDesktop()) return Desktop.getFrame().devicePixelRatio(); else return getDevicePixelRatio(); } public static String getPlatformName() { if (BrowseCap.isMacintosh()) return "Mac"; else if (BrowseCap.isLinux()) return "Linux"; else if (BrowseCap.isWindows()) return "Windows"; else return "Unknown"; } public static String getBrowserName() { if (BrowseCap.isChrome()) return "Chrome"; else if (BrowseCap.isFirefox()) return "Firefox"; else if (BrowseCap.isSafari()) return "Safari"; else if (BrowseCap.INSTANCE.isInternetExplorer()) return "IE"; else return "Unknown"; } private static native final double getDevicePixelRatio() /*-{ try { if ('devicePixelRatio' in $wnd) return $wnd.devicePixelRatio; else return 1.0; } catch(ex) { return 1.0; } }-*/; private static native final boolean isUserAgent(String uaTest) /*-{ var ua = navigator.userAgent.toLowerCase(); if (ua.indexOf(uaTest) != -1) return true; else return false; }-*/; private static native final String getOperatingSystem() /*-{ var ua = navigator.userAgent.toLowerCase(); if (ua.indexOf("linux") != -1) { return "linux"; } else if (ua.indexOf("macintosh") != -1) { return "macintosh"; } return "windows"; }-*/; private static final String OPERATING_SYSTEM = getOperatingSystem(); private static final boolean getFixedUbuntuMono() { if (isLinux()) { // get fixed width font String fixedWidthFont = ThemeFonts.getFixedWidthFont(); // in desktop mode we'll get an exact match whereas in web mode // we'll get a list of fonts so we need to do an additional probe if (Desktop.isDesktop()) return StringUtil.notNull(fixedWidthFont).equals("\"Ubuntu Mono\""); else return FontDetector.isFontSupported("Ubuntu Mono"); } else { return false; } } private static final boolean FIXED_UBUNTU_MONO = getFixedUbuntuMono(); static { Document.get().getBody().addClassName(OPERATING_SYSTEM); if (isWindowsDesktop() && Desktop.getFrame().getDisplayDpi() >= 192) { Document.get().getBody().addClassName("windows-highdpi"); } if (FIXED_UBUNTU_MONO) { Document.get().getBody().addClassName("ubuntu_mono"); if (isFirefox()) Document.get().getBody().addClassName("ubuntu_mono_firefox"); } } }