<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[210207] trunk</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/210207">210207</a></dd>
<dt>Author</dt> <dd>mcatanzaro@igalia.com</dd>
<dt>Date</dt> <dd>2016-12-30 01:02:51 -0800 (Fri, 30 Dec 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>[GTK] Improve user agent construction
https://bugs.webkit.org/show_bug.cgi?id=142074

Reviewed by Carlos Garcia Campos.

Source/WebCore:

Using the macOS quirk rather than the Chrome quirk for Google domains was a mistake: it
broke Hangouts in a different way than the Chrome quirk, and also prevents use of the nice
Earth mode on Google Maps. Google is making it really hard to develop a sane quirk.
Eventually I settled on the combination of two quirks: (1) Firefox browser, and (2) Linux
x86_64 platform. See the bug for full discussion on why these quirks are the best way to
make Google domains work properly in WebKit. This is an extremely sad state of affairs, but
I'm confident it is the best option. Note this effectively includes a rollout of <a href="http://trac.webkit.org/projects/webkit/changeset/210168">r210168</a>.

Also, fix a bug that caused an extra space to be inserted in the middle of the user agent.

* platform/UserAgentQuirks.cpp:
(WebCore::isGoogle):
(WebCore::urlRequiresFirefoxBrowser):
(WebCore::urlRequiresMacintoshPlatform):
(WebCore::urlRequiresLinuxDesktopPlatform):
(WebCore::UserAgentQuirks::quirksForURL):
(WebCore::UserAgentQuirks::stringForQuirk):
(WebCore::UserAgentQuirks::firefoxRevisionString):
* platform/UserAgentQuirks.h:
* platform/gtk/UserAgentGtk.cpp:
(WebCore::buildUserAgentString):

Tools:

* TestWebKitAPI/Tests/WebCore/UserAgentQuirks.cpp:
(TestWebKitAPI::assertUserAgentForURLHasChromeBrowserQuirk):
(TestWebKitAPI::assertUserAgentForURLHasFirefoxBrowserQuirk):
(TestWebKitAPI::assertUserAgentForURLHasLinuxPlatformQuirk):
(TestWebKitAPI::assertUserAgentForURLHasMacPlatformQuirk):
(TestWebKitAPI::TEST):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceWebCoreChangeLog">trunk/Source/WebCore/ChangeLog</a></li>
<li><a href="#trunkSourceWebCoreplatformUserAgentQuirkscpp">trunk/Source/WebCore/platform/UserAgentQuirks.cpp</a></li>
<li><a href="#trunkSourceWebCoreplatformUserAgentQuirksh">trunk/Source/WebCore/platform/UserAgentQuirks.h</a></li>
<li><a href="#trunkSourceWebCoreplatformgtkUserAgentGtkcpp">trunk/Source/WebCore/platform/gtk/UserAgentGtk.cpp</a></li>
<li><a href="#trunkToolsChangeLog">trunk/Tools/ChangeLog</a></li>
<li><a href="#trunkToolsTestWebKitAPITestsWebCoreUserAgentQuirkscpp">trunk/Tools/TestWebKitAPI/Tests/WebCore/UserAgentQuirks.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/ChangeLog (210206 => 210207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/ChangeLog        2016-12-30 08:54:25 UTC (rev 210206)
+++ trunk/Source/WebCore/ChangeLog        2016-12-30 09:02:51 UTC (rev 210207)
</span><span class="lines">@@ -1,3 +1,32 @@
</span><ins>+2016-12-30  Michael Catanzaro  &lt;mcatanzaro@igalia.com&gt;
+
+        [GTK] Improve user agent construction
+        https://bugs.webkit.org/show_bug.cgi?id=142074
+
+        Reviewed by Carlos Garcia Campos.
+
+        Using the macOS quirk rather than the Chrome quirk for Google domains was a mistake: it
+        broke Hangouts in a different way than the Chrome quirk, and also prevents use of the nice
+        Earth mode on Google Maps. Google is making it really hard to develop a sane quirk.
+        Eventually I settled on the combination of two quirks: (1) Firefox browser, and (2) Linux
+        x86_64 platform. See the bug for full discussion on why these quirks are the best way to
+        make Google domains work properly in WebKit. This is an extremely sad state of affairs, but
+        I'm confident it is the best option. Note this effectively includes a rollout of r210168.
+
+        Also, fix a bug that caused an extra space to be inserted in the middle of the user agent.
+
+        * platform/UserAgentQuirks.cpp:
+        (WebCore::isGoogle):
+        (WebCore::urlRequiresFirefoxBrowser):
+        (WebCore::urlRequiresMacintoshPlatform):
+        (WebCore::urlRequiresLinuxDesktopPlatform):
+        (WebCore::UserAgentQuirks::quirksForURL):
+        (WebCore::UserAgentQuirks::stringForQuirk):
+        (WebCore::UserAgentQuirks::firefoxRevisionString):
+        * platform/UserAgentQuirks.h:
+        * platform/gtk/UserAgentGtk.cpp:
+        (WebCore::buildUserAgentString):
+
</ins><span class="cx"> 2016-12-30  Andreas Kling  &lt;akling@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Drop the render tree for documents in the page cache.
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformUserAgentQuirkscpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/UserAgentQuirks.cpp (210206 => 210207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/UserAgentQuirks.cpp        2016-12-30 08:54:25 UTC (rev 210206)
+++ trunk/Source/WebCore/platform/UserAgentQuirks.cpp        2016-12-30 09:02:51 UTC (rev 210207)
</span><span class="lines">@@ -34,6 +34,27 @@
</span><span class="cx"> // When editing the quirks in this file, be sure to update
</span><span class="cx"> // Tools/TestWebKitAPI/Tests/WebCore/UserAgentQuirks.cpp.
</span><span class="cx"> 
</span><ins>+static bool isGoogle(const URL&amp; url)
+{
+    String baseDomain = topPrivatelyControlledDomain(url.host());
+
+    // Our Google UA is *very* complicated to get right. Read
+    // https://webkit.org/b/142074 carefully before changing. Test that Earth
+    // view is available in Google Maps. Test Google Calendar. Test downloading
+    // the Hangouts browser plugin. Change platformVersionForUAString() to
+    // return &quot;FreeBSD amd64&quot; and test Maps and Calendar again.
+    if (baseDomain.startsWith(&quot;google.&quot;))
+        return true;
+    if (baseDomain == &quot;gstatic.com&quot;)
+        return true;
+    if (baseDomain == &quot;googleapis.com&quot;)
+        return true;
+    if (baseDomain == &quot;googleusercontent.com&quot;)
+        return true;
+
+    return false;
+}
+
</ins><span class="cx"> // Be careful with this quirk: it's an invitation for sites to use JavaScript
</span><span class="cx"> // that works in Chrome that WebKit cannot handle. Prefer other quirks instead.
</span><span class="cx"> static bool urlRequiresChromeBrowser(const URL&amp; url)
</span><span class="lines">@@ -56,15 +77,15 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static bool urlRequiresFirefoxBrowser(const URL&amp; url)
+{
+    return isGoogle(url);
+}
+
</ins><span class="cx"> static bool urlRequiresMacintoshPlatform(const URL&amp; url)
</span><span class="cx"> {
</span><span class="cx">     String baseDomain = topPrivatelyControlledDomain(url.host());
</span><span class="cx"> 
</span><del>-    // Avoid receiving terrible fallbacks version of calendar.google.com and
-    // maps.google.com on certain platforms. https://webkit.org/b/142074
-    if (baseDomain.startsWith(&quot;google.&quot;))
-        return true;
-
</del><span class="cx">     // At least finance.yahoo.com displays a mobile version with WebKitGTK+'s standard user agent.
</span><span class="cx">     if (baseDomain == &quot;yahoo.com&quot;)
</span><span class="cx">         return true;
</span><span class="lines">@@ -80,14 +101,27 @@
</span><span class="cx">     return false;
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static bool urlRequiresLinuxDesktopPlatform(const URL&amp; url)
+{
+    return isGoogle(url);
+}
+
</ins><span class="cx"> UserAgentQuirks UserAgentQuirks::quirksForURL(const URL&amp; url)
</span><span class="cx"> {
</span><span class="cx">     ASSERT(!url.isNull());
</span><ins>+
</ins><span class="cx">     UserAgentQuirks quirks;
</span><ins>+
</ins><span class="cx">     if (urlRequiresChromeBrowser(url))
</span><span class="cx">         quirks.add(UserAgentQuirks::NeedsChromeBrowser);
</span><ins>+    else if (urlRequiresFirefoxBrowser(url))
+        quirks.add(UserAgentQuirks::NeedsFirefoxBrowser);
+
</ins><span class="cx">     if (urlRequiresMacintoshPlatform(url))
</span><span class="cx">         quirks.add(UserAgentQuirks::NeedsMacintoshPlatform);
</span><ins>+    else if (urlRequiresLinuxDesktopPlatform(url))
+        quirks.add(UserAgentQuirks::NeedsLinuxDesktopPlatform);
+
</ins><span class="cx">     return quirks;
</span><span class="cx"> }
</span><span class="cx"> 
</span><span class="lines">@@ -97,8 +131,13 @@
</span><span class="cx">     case NeedsChromeBrowser:
</span><span class="cx">         // Get versions from https://chromium.googlesource.com/chromium/src.git
</span><span class="cx">         return ASCIILiteral(&quot;Chrome/56.0.2891.4&quot;);
</span><ins>+    case NeedsFirefoxBrowser:
+        // Gecko version never changes. Firefox version must be updated below.
+        return ASCIILiteral(&quot;Gecko/20100101 Firefox/50.0&quot;);
</ins><span class="cx">     case NeedsMacintoshPlatform:
</span><span class="cx">         return ASCIILiteral(&quot;Macintosh; Intel Mac OS X 10_12&quot;);
</span><ins>+    case NeedsLinuxDesktopPlatform:
+        return ASCIILiteral(&quot;X11; Linux x86_64&quot;);
</ins><span class="cx">     case NumUserAgentQuirks:
</span><span class="cx">     default:
</span><span class="cx">         ASSERT_NOT_REACHED();
</span><span class="lines">@@ -106,4 +145,9 @@
</span><span class="cx">     return ASCIILiteral(&quot;&quot;);
</span><span class="cx"> }
</span><span class="cx"> 
</span><ins>+String UserAgentQuirks::firefoxRevisionString()
+{
+    return ASCIILiteral(&quot;rv:50.0&quot;);
</ins><span class="cx"> }
</span><ins>+
+}
</ins></span></pre></div>
<a id="trunkSourceWebCoreplatformUserAgentQuirksh"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/UserAgentQuirks.h (210206 => 210207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/UserAgentQuirks.h        2016-12-30 08:54:25 UTC (rev 210206)
+++ trunk/Source/WebCore/platform/UserAgentQuirks.h        2016-12-30 09:02:51 UTC (rev 210207)
</span><span class="lines">@@ -36,7 +36,9 @@
</span><span class="cx"> public:
</span><span class="cx">     enum UserAgentQuirk {
</span><span class="cx">         NeedsChromeBrowser,
</span><ins>+        NeedsFirefoxBrowser,
</ins><span class="cx">         NeedsMacintoshPlatform,
</span><ins>+        NeedsLinuxDesktopPlatform,
</ins><span class="cx"> 
</span><span class="cx">         NumUserAgentQuirks
</span><span class="cx">     };
</span><span class="lines">@@ -66,6 +68,8 @@
</span><span class="cx"> 
</span><span class="cx">     static String stringForQuirk(UserAgentQuirk);
</span><span class="cx"> 
</span><ins>+    static String firefoxRevisionString();
+
</ins><span class="cx"> private:
</span><span class="cx">     uint32_t m_quirks;
</span><span class="cx"> };
</span></span></pre></div>
<a id="trunkSourceWebCoreplatformgtkUserAgentGtkcpp"></a>
<div class="modfile"><h4>Modified: trunk/Source/WebCore/platform/gtk/UserAgentGtk.cpp (210206 => 210207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/WebCore/platform/gtk/UserAgentGtk.cpp        2016-12-30 08:54:25 UTC (rev 210206)
+++ trunk/Source/WebCore/platform/gtk/UserAgentGtk.cpp        2016-12-30 09:02:51 UTC (rev 210207)
</span><span class="lines">@@ -1,5 +1,5 @@
</span><span class="cx"> /*
</span><del>- * Copyright (C) 2012, 2014 Igalia S.L.
</del><ins>+ * Copyright (C) 2012, 2014, 2016 Igalia S.L.
</ins><span class="cx">  *
</span><span class="cx">  * Redistribution and use in source and binary forms, with or without
</span><span class="cx">  * modification, are permitted provided that the following conditions
</span><span class="lines">@@ -82,6 +82,8 @@
</span><span class="cx"> 
</span><span class="cx">     if (quirks.contains(UserAgentQuirks::NeedsMacintoshPlatform))
</span><span class="cx">         uaString.append(UserAgentQuirks::stringForQuirk(UserAgentQuirks::NeedsMacintoshPlatform));
</span><ins>+    else if (quirks.contains(UserAgentQuirks::NeedsLinuxDesktopPlatform))
+        uaString.append(UserAgentQuirks::stringForQuirk(UserAgentQuirks::NeedsLinuxDesktopPlatform));
</ins><span class="cx">     else {
</span><span class="cx">         uaString.append(platformForUAString());
</span><span class="cx">         uaString.appendLiteral(&quot;; &quot;);
</span><span class="lines">@@ -88,20 +90,31 @@
</span><span class="cx">         uaString.append(platformVersionForUAString());
</span><span class="cx">     }
</span><span class="cx"> 
</span><del>-    uaString.appendLiteral(&quot;) AppleWebKit/&quot;);
-    uaString.append(versionForUAString());
-    uaString.appendLiteral(&quot; (KHTML, like Gecko) &quot;);
</del><ins>+    if (quirks.contains(UserAgentQuirks::NeedsFirefoxBrowser)) {
+        uaString.appendLiteral(&quot;; &quot;);
+        uaString.append(UserAgentQuirks::firefoxRevisionString());
+        uaString.appendLiteral(&quot;) &quot;);
+    } else {
+        uaString.appendLiteral(&quot;) AppleWebKit/&quot;);
+        uaString.append(versionForUAString());
+        uaString.appendLiteral(&quot; (KHTML, like Gecko) &quot;);
+    }
</ins><span class="cx"> 
</span><span class="cx">     // Note that Chrome UAs advertise *both* Chrome and Safari.
</span><span class="cx">     if (quirks.contains(UserAgentQuirks::NeedsChromeBrowser)) {
</span><span class="cx">         uaString.append(UserAgentQuirks::stringForQuirk(UserAgentQuirks::NeedsChromeBrowser));
</span><span class="cx">         uaString.appendLiteral(&quot; &quot;);
</span><ins>+    } else if (quirks.contains(UserAgentQuirks::NeedsFirefoxBrowser)) {
+        uaString.append(UserAgentQuirks::stringForQuirk(UserAgentQuirks::NeedsFirefoxBrowser));
+        uaString.appendLiteral(&quot; &quot;);
</ins><span class="cx">     }
</span><span class="cx"> 
</span><del>-    // Version/X is mandatory *before* Safari/X to be a valid Safari UA. See
-    // https://bugs.webkit.org/show_bug.cgi?id=133403 for details.
-    uaString.appendLiteral(&quot; Version/10.0 Safari/&quot;);
-    uaString.append(versionForUAString());
</del><ins>+    if (!quirks.contains(UserAgentQuirks::NeedsFirefoxBrowser)) {
+        // Version/X is mandatory *before* Safari/X to be a valid Safari UA. See
+        // https://bugs.webkit.org/show_bug.cgi?id=133403 for details.
+        uaString.appendLiteral(&quot;Version/10.0 Safari/&quot;);
+        uaString.append(versionForUAString());
+    }
</ins><span class="cx"> 
</span><span class="cx">     return uaString.toString();
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkToolsChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Tools/ChangeLog (210206 => 210207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/ChangeLog        2016-12-30 08:54:25 UTC (rev 210206)
+++ trunk/Tools/ChangeLog        2016-12-30 09:02:51 UTC (rev 210207)
</span><span class="lines">@@ -1,3 +1,17 @@
</span><ins>+2016-12-30  Michael Catanzaro  &lt;mcatanzaro@igalia.com&gt;
+
+        [GTK] Improve user agent construction
+        https://bugs.webkit.org/show_bug.cgi?id=142074
+
+        Reviewed by Carlos Garcia Campos.
+
+        * TestWebKitAPI/Tests/WebCore/UserAgentQuirks.cpp:
+        (TestWebKitAPI::assertUserAgentForURLHasChromeBrowserQuirk):
+        (TestWebKitAPI::assertUserAgentForURLHasFirefoxBrowserQuirk):
+        (TestWebKitAPI::assertUserAgentForURLHasLinuxPlatformQuirk):
+        (TestWebKitAPI::assertUserAgentForURLHasMacPlatformQuirk):
+        (TestWebKitAPI::TEST):
+
</ins><span class="cx"> 2016-12-27  Michael Catanzaro  &lt;mcatanzaro@igalia.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [GTK] Improve user agent construction
</span></span></pre></div>
<a id="trunkToolsTestWebKitAPITestsWebCoreUserAgentQuirkscpp"></a>
<div class="modfile"><h4>Modified: trunk/Tools/TestWebKitAPI/Tests/WebCore/UserAgentQuirks.cpp (210206 => 210207)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Tools/TestWebKitAPI/Tests/WebCore/UserAgentQuirks.cpp        2016-12-30 08:54:25 UTC (rev 210206)
+++ trunk/Tools/TestWebKitAPI/Tests/WebCore/UserAgentQuirks.cpp        2016-12-30 09:02:51 UTC (rev 210207)
</span><span class="lines">@@ -36,22 +36,35 @@
</span><span class="cx"> {
</span><span class="cx">     String uaString = standardUserAgentForURL(URL(ParsedURLString, url));
</span><span class="cx"> 
</span><del>-#if !OS(MAC_OS_X)
-    EXPECT_FALSE(uaString.contains(&quot;Macintosh&quot;));
-    EXPECT_FALSE(uaString.contains(&quot;Mac OS X&quot;));
-#endif
-#if OS(LINUX)
-    EXPECT_TRUE(uaString.contains(&quot;Linux&quot;));
-#endif
-#if OS(WINDOWS)
-    EXPECT_TRUE(uaString.contains(&quot;Windows&quot;));
-#endif
-
</del><span class="cx">     EXPECT_TRUE(uaString.contains(&quot;Chrome&quot;));
</span><span class="cx">     EXPECT_TRUE(uaString.contains(&quot;Safari&quot;));
</span><span class="cx">     EXPECT_FALSE(uaString.contains(&quot;Chromium&quot;));
</span><ins>+    EXPECT_FALSE(uaString.contains(&quot;Firefox&quot;));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><ins>+static void assertUserAgentForURLHasFirefoxBrowserQuirk(const char* url)
+{
+    String uaString = standardUserAgentForURL(URL(ParsedURLString, url));
+
+    EXPECT_FALSE(uaString.contains(&quot;Chrome&quot;));
+    EXPECT_FALSE(uaString.contains(&quot;Safari&quot;));
+    EXPECT_FALSE(uaString.contains(&quot;Chromium&quot;));
+    EXPECT_FALSE(uaString.contains(&quot;AppleWebKit&quot;));
+    EXPECT_TRUE(uaString.contains(&quot;Firefox&quot;));
+}
+
+static void assertUserAgentForURLHasLinuxPlatformQuirk(const char* url)
+{
+    String uaString = standardUserAgentForURL(URL(ParsedURLString, url));
+
+    EXPECT_TRUE(uaString.contains(&quot;Linux&quot;));
+    EXPECT_FALSE(uaString.contains(&quot;Macintosh&quot;));
+    EXPECT_FALSE(uaString.contains(&quot;Mac OS X&quot;));
+    EXPECT_FALSE(uaString.contains(&quot;Windows&quot;));
+    EXPECT_FALSE(uaString.contains(&quot;Chrome&quot;));
+    EXPECT_FALSE(uaString.contains(&quot;FreeBSD&quot;));
+}
+
</ins><span class="cx"> static void assertUserAgentForURLHasMacPlatformQuirk(const char* url)
</span><span class="cx"> {
</span><span class="cx">     String uaString = standardUserAgentForURL(URL(ParsedURLString, url));
</span><span class="lines">@@ -61,6 +74,7 @@
</span><span class="cx">     EXPECT_FALSE(uaString.contains(&quot;Linux&quot;));
</span><span class="cx">     EXPECT_FALSE(uaString.contains(&quot;Windows&quot;));
</span><span class="cx">     EXPECT_FALSE(uaString.contains(&quot;Chrome&quot;));
</span><ins>+    EXPECT_FALSE(uaString.contains(&quot;FreeBSD&quot;));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> TEST(UserAgentTest, Quirks)
</span><span class="lines">@@ -69,12 +83,9 @@
</span><span class="cx">     String uaString = standardUserAgentForURL(URL(ParsedURLString, &quot;http://www.webkit.org/&quot;));
</span><span class="cx">     EXPECT_TRUE(uaString.isNull());
</span><span class="cx"> 
</span><del>-#if !OS(MAC_OS_X)
</del><span class="cx">     // Google quirk should not affect sites with similar domains.
</span><span class="cx">     uaString = standardUserAgentForURL(URL(ParsedURLString, &quot;http://www.googleblog.com/&quot;));
</span><del>-    EXPECT_FALSE(uaString.contains(&quot;Macintosh&quot;));
-    EXPECT_FALSE(uaString.contains(&quot;Mac OS X&quot;));
-#endif
</del><ins>+    EXPECT_FALSE(uaString.contains(&quot;Firefox&quot;));
</ins><span class="cx"> 
</span><span class="cx">     assertUserAgentForURLHasChromeBrowserQuirk(&quot;http://typekit.com/&quot;);
</span><span class="cx">     assertUserAgentForURLHasChromeBrowserQuirk(&quot;http://typekit.net/&quot;);
</span><span class="lines">@@ -81,17 +92,21 @@
</span><span class="cx">     assertUserAgentForURLHasChromeBrowserQuirk(&quot;http://www.youtube.com/&quot;);
</span><span class="cx">     assertUserAgentForURLHasChromeBrowserQuirk(&quot;http://www.slack.com/&quot;);
</span><span class="cx"> 
</span><ins>+    assertUserAgentForURLHasFirefoxBrowserQuirk(&quot;http://www.google.com/&quot;);
+    assertUserAgentForURLHasFirefoxBrowserQuirk(&quot;http://www.google.es/&quot;);
+    assertUserAgentForURLHasFirefoxBrowserQuirk(&quot;http://calendar.google.com/&quot;);
+    assertUserAgentForURLHasFirefoxBrowserQuirk(&quot;http://plus.google.com/&quot;);
+
+    assertUserAgentForURLHasLinuxPlatformQuirk(&quot;http://www.google.com/&quot;);
+    assertUserAgentForURLHasLinuxPlatformQuirk(&quot;http://www.google.es/&quot;);
+    assertUserAgentForURLHasLinuxPlatformQuirk(&quot;http://calendar.google.com/&quot;);
+    assertUserAgentForURLHasLinuxPlatformQuirk(&quot;http://plus.google.com/&quot;);
+
</ins><span class="cx">     assertUserAgentForURLHasMacPlatformQuirk(&quot;http://www.yahoo.com/&quot;);
</span><span class="cx">     assertUserAgentForURLHasMacPlatformQuirk(&quot;http://finance.yahoo.com/&quot;);
</span><span class="cx">     assertUserAgentForURLHasMacPlatformQuirk(&quot;http://intl.taobao.com/&quot;);
</span><span class="cx">     assertUserAgentForURLHasMacPlatformQuirk(&quot;http://www.whatsapp.com/&quot;);
</span><span class="cx">     assertUserAgentForURLHasMacPlatformQuirk(&quot;http://web.whatsapp.com/&quot;);
</span><del>-
-    assertUserAgentForURLHasMacPlatformQuirk(&quot;http://www.google.com/&quot;);
-    assertUserAgentForURLHasMacPlatformQuirk(&quot;http://www.google.es/&quot;);
-    assertUserAgentForURLHasMacPlatformQuirk(&quot;http://calendar.google.com/&quot;);
-    assertUserAgentForURLHasMacPlatformQuirk(&quot;http://maps.google.com/&quot;);
-    assertUserAgentForURLHasMacPlatformQuirk(&quot;http://plus.google.com/&quot;);
</del><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace TestWebKitAPI
</span></span></pre>
</div>
</div>

</body>
</html>