<!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>[210209] releases/WebKitGTK/webkit-2.14</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/210209">210209</a></dd>
<dt>Author</dt> <dd>carlosgc@webkit.org</dd>
<dt>Date</dt> <dd>2016-12-30 02:06:49 -0800 (Fri, 30 Dec 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>Merge <a href="http://trac.webkit.org/projects/webkit/changeset/210207">r210207</a> - [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="#releasesWebKitGTKwebkit214SourceWebCoreChangeLog">releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit214SourceWebCoreplatformgtkUserAgentGtkcpp">releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/gtk/UserAgentGtk.cpp</a></li>
<li><a href="#releasesWebKitGTKwebkit214ToolsChangeLog">releases/WebKitGTK/webkit-2.14/Tools/ChangeLog</a></li>
<li><a href="#releasesWebKitGTKwebkit214ToolsTestWebKitAPITestsWebCoregtkUserAgentQuirkscpp">releases/WebKitGTK/webkit-2.14/Tools/TestWebKitAPI/Tests/WebCore/gtk/UserAgentQuirks.cpp</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="releasesWebKitGTKwebkit214SourceWebCoreChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog (210208 => 210209)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog        2016-12-30 09:39:26 UTC (rev 210208)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/ChangeLog        2016-12-30 10:06:49 UTC (rev 210209)
</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-09-30  Said Abou-Hallawa  &lt;sabouhallawa@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         Unreviewed, fix 32-bit build.
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214SourceWebCoreplatformgtkUserAgentGtkcpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/gtk/UserAgentGtk.cpp (210208 => 210209)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/gtk/UserAgentGtk.cpp        2016-12-30 09:39:26 UTC (rev 210208)
+++ releases/WebKitGTK/webkit-2.14/Source/WebCore/platform/gtk/UserAgentGtk.cpp        2016-12-30 10:06:49 UTC (rev 210209)
</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">@@ -47,7 +47,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">@@ -116,6 +118,8 @@
</span><span class="cx"> 
</span><span class="cx">     if (quirks.contains(UserAgentQuirks::NeedsMacintoshPlatform))
</span><span class="cx">         uaString.appendLiteral(&quot;Macintosh&quot;);
</span><ins>+    else if (quirks.contains(UserAgentQuirks::NeedsLinuxDesktopPlatform))
+        uaString.appendLiteral(&quot;X11&quot;);
</ins><span class="cx">     else
</span><span class="cx">         uaString.append(platformForUAString());
</span><span class="cx"> 
</span><span class="lines">@@ -123,22 +127,31 @@
</span><span class="cx"> 
</span><span class="cx">     if (quirks.contains(UserAgentQuirks::NeedsMacintoshPlatform))
</span><span class="cx">         uaString.appendLiteral(&quot;Intel Mac OS X 10_12&quot;);
</span><ins>+    else if (quirks.contains(UserAgentQuirks::NeedsLinuxDesktopPlatform))
+        uaString.appendLiteral(&quot;Linux x86_64&quot;);
</ins><span class="cx">     else
</span><span class="cx">         uaString.append(platformVersionForUAString());
</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;; rv:50.0) &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><del>-    // We set a meaningful value only for the first two digits here.
</del><span class="cx">     if (quirks.contains(UserAgentQuirks::NeedsChromeBrowser))
</span><del>-        uaString.append(&quot;Chrome/54.0.2704.106 &quot;);
</del><ins>+        uaString.appendLiteral(&quot;Chrome/56.0.2891.4 &quot;);
+    else if (quirks.contains(UserAgentQuirks::NeedsFirefoxBrowser))
+        uaString.appendLiteral(&quot;Gecko/20100101 Firefox/50.0&quot;);
</ins><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 class="lines">@@ -169,6 +182,27 @@
</span><span class="cx">     return standardUserAgentStatic() + ' ' + applicationName + '/' + finalApplicationVersion;
</span><span class="cx"> }
</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 we can't handle.
</span><span class="cx"> static bool urlRequiresChromeBrowser(const URL&amp; url)
</span><span class="cx"> {
</span><span class="lines">@@ -189,15 +223,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 our standard user agent.
</span><span class="cx">     if (baseDomain == &quot;yahoo.com&quot;)
</span><span class="cx">         return true;
</span><span class="lines">@@ -213,14 +247,26 @@
</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"> String standardUserAgentForURL(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"> 
</span><span class="cx">     // The null string means we don't need a specific UA for the given URL.
</span><span class="cx">     return quirks.isEmpty() ? String() : buildUserAgentString(quirks);
</span></span></pre></div>
<a id="releasesWebKitGTKwebkit214ToolsChangeLog"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Tools/ChangeLog (210208 => 210209)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Tools/ChangeLog        2016-12-30 09:39:26 UTC (rev 210208)
+++ releases/WebKitGTK/webkit-2.14/Tools/ChangeLog        2016-12-30 10:06:49 UTC (rev 210209)
</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="releasesWebKitGTKwebkit214ToolsTestWebKitAPITestsWebCoregtkUserAgentQuirkscpp"></a>
<div class="modfile"><h4>Modified: releases/WebKitGTK/webkit-2.14/Tools/TestWebKitAPI/Tests/WebCore/gtk/UserAgentQuirks.cpp (210208 => 210209)</h4>
<pre class="diff"><span>
<span class="info">--- releases/WebKitGTK/webkit-2.14/Tools/TestWebKitAPI/Tests/WebCore/gtk/UserAgentQuirks.cpp        2016-12-30 09:39:26 UTC (rev 210208)
+++ releases/WebKitGTK/webkit-2.14/Tools/TestWebKitAPI/Tests/WebCore/gtk/UserAgentQuirks.cpp        2016-12-30 10:06:49 UTC (rev 210209)
</span><span class="lines">@@ -44,19 +44,28 @@
</span><span class="cx">     EXPECT_TRUE(uaString.contains(&quot;Mac OS X&quot;));
</span><span class="cx">     EXPECT_FALSE(uaString.contains(&quot;Linux&quot;));
</span><span class="cx">     EXPECT_FALSE(uaString.contains(&quot;Chrome&quot;));
</span><ins>+    EXPECT_FALSE(uaString.contains(&quot;Firefox&quot;));
</ins><span class="cx"> 
</span><del>-    // google domains require Chrome in the UA
</del><ins>+    // google domains require Firefox in the UA
</ins><span class="cx">     uaString = standardUserAgentForURL(URL(ParsedURLString, &quot;http://www.google.es/&quot;));
</span><del>-    EXPECT_TRUE(uaString.contains(&quot;Macintosh&quot;));
-    EXPECT_TRUE(uaString.contains(&quot;Mac OS X&quot;));
-    EXPECT_FALSE(uaString.contains(&quot;Linux&quot;));
</del><span class="cx">     EXPECT_FALSE(uaString.contains(&quot;Chrome&quot;));
</span><ins>+    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;));
+    EXPECT_FALSE(uaString.contains(&quot;Macintosh&quot;));
+    EXPECT_FALSE(uaString.contains(&quot;Mac OS X&quot;));
+    EXPECT_FALSE(uaString.contains(&quot;Windows&quot;));
</ins><span class="cx"> 
</span><span class="cx">     uaString = standardUserAgentForURL(URL(ParsedURLString, &quot;http://maps.google.com/&quot;));
</span><del>-    EXPECT_TRUE(uaString.contains(&quot;Macintosh&quot;));
-    EXPECT_TRUE(uaString.contains(&quot;Mac OS X&quot;));
-    EXPECT_FALSE(uaString.contains(&quot;Linux&quot;));
</del><span class="cx">     EXPECT_FALSE(uaString.contains(&quot;Chrome&quot;));
</span><ins>+    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;));
+    EXPECT_FALSE(uaString.contains(&quot;Macintosh&quot;));
+    EXPECT_FALSE(uaString.contains(&quot;Mac OS X&quot;));
+    EXPECT_FALSE(uaString.contains(&quot;Windows&quot;));
</ins><span class="cx"> 
</span><span class="cx">     // Slack requires Chrome in the UA
</span><span class="cx">     uaString = standardUserAgentForURL(URL(ParsedURLString, &quot;http://www.slack.com/&quot;));
</span><span class="lines">@@ -64,6 +73,7 @@
</span><span class="cx">     EXPECT_FALSE(uaString.contains(&quot;Mac OS X&quot;));
</span><span class="cx">     EXPECT_TRUE(uaString.contains(&quot;Linux&quot;));
</span><span class="cx">     EXPECT_TRUE(uaString.contains(&quot;Chrome&quot;));
</span><ins>+    EXPECT_FALSE(uaString.contains(&quot;Firefox&quot;));
</ins><span class="cx"> }
</span><span class="cx"> 
</span><span class="cx"> } // namespace TestWebKitAPI
</span></span></pre>
</div>
</div>

</body>
</html>