Changeset 67211 in webkit


Ignore:
Timestamp:
Sep 10, 2010 10:14:44 AM (14 years ago)
Author:
kov@webkit.org
Message:

2010-09-10 Gustavo Noronha Silva <Gustavo Noronha Silva>

Reviewed by Martin Robinson.

[GTK] Google sites do not like WebKitGTK+
https://bugs.webkit.org/show_bug.cgi?id=39617

Special-case Google domains, and spoof User-Agent when talking to
them, to stop being treated as a second-class citizen.

  • WebCoreSupport/FrameLoaderClientGtk.cpp: (WebKit::initializeDomainsList): (WebKit::isGoogleDomain): (WebKit::FrameLoaderClient::userAgent): If enable-site-specific-quirks is enabled, send the standard WebKit User-Agent string, disregarding the custom one set by the browser for Google domains.
  • webkit/webkitprivate.h:
  • webkit/webkitwebsettings.cpp: (webkitPlatform): Fix style, and simplify. (webkitOSVersion): Ditto. (webkitUserAgent): Add the Version/x.y string Safari has been using since Safari 2.2.
Location:
trunk/WebKit/gtk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/WebKit/gtk/ChangeLog

    r67206 r67211  
     12010-09-10  Gustavo Noronha Silva  <gns@gnome.org>
     2
     3        Reviewed by Martin Robinson.
     4
     5        [GTK] Google sites do not like WebKitGTK+
     6        https://bugs.webkit.org/show_bug.cgi?id=39617
     7
     8        Special-case Google domains, and spoof User-Agent when talking to
     9        them, to stop being treated as a second-class citizen.
     10
     11        * WebCoreSupport/FrameLoaderClientGtk.cpp:
     12        (WebKit::initializeDomainsList):
     13        (WebKit::isGoogleDomain):
     14        (WebKit::FrameLoaderClient::userAgent): If enable-site-specific-quirks
     15        is enabled, send the standard WebKit User-Agent string, disregarding the
     16        custom one set by the browser for Google domains.
     17        * webkit/webkitprivate.h:
     18        * webkit/webkitwebsettings.cpp:
     19        (webkitPlatform): Fix style, and simplify.
     20        (webkitOSVersion): Ditto.
     21        (webkitUserAgent): Add the Version/x.y string Safari has been
     22        using since Safari 2.2.
     23
    1242010-09-10  Xan Lopez  <xlopez@igalia.com>
    225
  • trunk/WebKit/gtk/WebCoreSupport/FrameLoaderClientGtk.cpp

    r66794 r67211  
    5050#include "MouseEvent.h"
    5151#include "NotImplemented.h"
     52#include "Page.h"
    5253#include "PlatformString.h"
    5354#include "PluginDatabase.h"
     
    9495}
    9596
    96 String FrameLoaderClient::userAgent(const KURL&)
     97static void initializeDomainsList(HashSet<String>& googleDomains)
     98{
     99    // Google search domains.
     100    googleDomains.add("biz");
     101    googleDomains.add("com");
     102    googleDomains.add("net");
     103    googleDomains.add("org");
     104    googleDomains.add("ae");
     105    googleDomains.add("ag");
     106    googleDomains.add("am");
     107    googleDomains.add("at");
     108    googleDomains.add("az");
     109    googleDomains.add("be");
     110    googleDomains.add("bi");
     111    googleDomains.add("ca");
     112    googleDomains.add("cc");
     113    googleDomains.add("cd");
     114    googleDomains.add("cg");
     115    googleDomains.add("ch");
     116    googleDomains.add("cl");
     117    googleDomains.add("com.br");
     118    googleDomains.add("co.uk");
     119    googleDomains.add("co.jp");
     120    googleDomains.add("de");
     121    googleDomains.add("dj");
     122    googleDomains.add("dk");
     123    googleDomains.add("es");
     124    googleDomains.add("fi");
     125    googleDomains.add("fm");
     126    googleDomains.add("fr");
     127    googleDomains.add("gg");
     128    googleDomains.add("gl");
     129    googleDomains.add("gm");
     130    googleDomains.add("gs");
     131    googleDomains.add("hn");
     132    googleDomains.add("hu");
     133    googleDomains.add("ie");
     134    googleDomains.add("it");
     135    googleDomains.add("je");
     136    googleDomains.add("kz");
     137    googleDomains.add("li");
     138    googleDomains.add("lt");
     139    googleDomains.add("lu");
     140    googleDomains.add("lv");
     141    googleDomains.add("ma");
     142    googleDomains.add("ms");
     143    googleDomains.add("mu");
     144    googleDomains.add("mw");
     145    googleDomains.add("nl");
     146    googleDomains.add("no");
     147    googleDomains.add("nu");
     148    googleDomains.add("pl");
     149    googleDomains.add("pn");
     150    googleDomains.add("pt");
     151    googleDomains.add("ru");
     152    googleDomains.add("rw");
     153    googleDomains.add("sh");
     154    googleDomains.add("sk");
     155    googleDomains.add("sm");
     156    googleDomains.add("st");
     157    googleDomains.add("td");
     158    googleDomains.add("tk");
     159    googleDomains.add("tp");
     160    googleDomains.add("tv");
     161    googleDomains.add("us");
     162    googleDomains.add("uz");
     163    googleDomains.add("ws");
     164}
     165
     166static bool isGoogleDomain(String host)
     167{
     168    DEFINE_STATIC_LOCAL(HashSet<String>, googleDomains, ());
     169    DEFINE_STATIC_LOCAL(Vector<String>, otherGoogleDomains, ());
     170
     171    if (googleDomains.isEmpty()) {
     172        otherGoogleDomains.append("gmail.com");
     173        otherGoogleDomains.append("youtube.com");
     174        otherGoogleDomains.append("gstatic.com");
     175        otherGoogleDomains.append("ytimg.com");
     176
     177        initializeDomainsList(googleDomains);
     178    }
     179
     180    // First check if this is one of the various google.com international domains.
     181    int position = host.find(".google.");
     182    if (position > 0 && googleDomains.contains(host.substring(position + sizeof(".google."))))
     183        return true;
     184
     185    // Then we check the possibility of it being one of the other, .com-only google domains.
     186    for (unsigned int i = 0; i < otherGoogleDomains.size(); i++) {
     187        if (host.endsWith(otherGoogleDomains.at(i)))
     188            return true;
     189    }
     190
     191    return false;
     192}
     193
     194String FrameLoaderClient::userAgent(const KURL& url)
    97195{
    98196    WebKitWebSettings* settings = webkit_web_view_get_settings(getViewFromFrame(m_frame));
     197
     198    gboolean useQuirks;
     199    g_object_get(settings, "enable-site-specific-quirks", &useQuirks, NULL);
     200
     201    // For Google domains, drop the browser's custom User Agent string, and use the standard
     202    // WebKit/Safari one, so they don't give us a broken experience.
     203    if (useQuirks && isGoogleDomain(url.host()))
     204        return webkitUserAgent();
     205
    99206    return String::fromUTF8(webkit_web_settings_get_user_agent(settings));
    100207}
  • trunk/WebKit/gtk/webkit/webkitprivate.h

    r66887 r67211  
    6060#include "Node.h"
    6161#include "Page.h"
     62#include "PlatformString.h"
    6263#include "ResourceHandle.h"
    6364#include "ResourceRequest.h"
     
    207208    };
    208209
     210    WTF::String
     211    webkitUserAgent();
     212
    209213    void
    210214    webkit_web_frame_core_frame_gone(WebKitWebFrame*);
  • trunk/WebKit/gtk/webkit/webkitwebsettings.cpp

    r64629 r67211  
    164164// This is a liberal interpretation of http://www.mozilla.org/build/revised-user-agent-strings.html
    165165// See also http://developer.apple.com/internet/safari/faq.html#anchor2
    166 static String webkit_get_user_agent()
    167 {
    168     gchar* platform;
    169     gchar* osVersion;
    170 
     166static String webkitPlatform()
     167{
    171168#if PLATFORM(X11)
    172     platform = g_strdup("X11");
     169    DEFINE_STATIC_LOCAL(const String, uaPlatform, (String("X11")));
    173170#elif OS(WINDOWS)
    174     platform = g_strdup("Windows");
     171    DEFINE_STATIC_LOCAL(const String, uaPlatform, (String("Windows")));
    175172#elif PLATFORM(MAC)
    176     platform = g_strdup("Macintosh");
     173    DEFINE_STATIC_LOCAL(const String, uaPlatform, (String("Macintosh")));
    177174#elif defined(GDK_WINDOWING_DIRECTFB)
    178     platform = g_strdup("DirectFB");
     175    DEFINE_STATIC_LOCAL(const String, uaPlatform, (String("DirectFB")));
    179176#else
    180     platform = g_strdup("Unknown");
     177    DEFINE_STATIC_LOCAL(const String, uaPlatform, (String("Unknown")));
    181178#endif
    182179
     180    return uaPlatform;
     181}
     182
     183static String webkitOSVersion()
     184{
    183185   // FIXME: platform/version detection can be shared.
    184186#if OS(DARWIN)
    185187
    186188#if CPU(X86)
    187     osVersion = g_strdup("Intel Mac OS X");
     189    DEFINE_STATIC_LOCAL(const String, uaOSVersion, (String("Intel Mac OS X")));
    188190#else
    189     osVersion = g_strdup("PPC Mac OS X");
     191    DEFINE_STATIC_LOCAL(const String, uaOSVersion, (String("PPC Mac OS X")));
    190192#endif
    191193
    192194#elif OS(UNIX)
     195    DEFINE_STATIC_LOCAL(String, uaOSVersion, (String()));
     196
     197    if (!uaOSVersion.isEmpty())
     198        return uaOSVersion;
     199
    193200    struct utsname name;
    194201    if (uname(&name) != -1)
    195         osVersion = g_strdup_printf("%s %s", name.sysname, name.machine);
     202        uaOSVersion = String::format("%s %s", name.sysname, name.machine);
    196203    else
    197         osVersion = g_strdup("Unknown");
    198 
     204        uaOSVersion = String("Unknown");
    199205#elif OS(WINDOWS)
    200     // FIXME: Compute the Windows version
    201     osVersion = g_strdup("Windows");
    202 
     206    DEFINE_STATIC_LOCAL(const String, uaOSVersion, (String("Windows")));
    203207#else
    204     osVersion = g_strdup("Unknown");
     208    DEFINE_STATIC_LOCAL(const String, uaOSVersion, (String("Unknown")));
    205209#endif
    206210
     211    return uaOSVersion;
     212}
     213
     214String webkitUserAgent()
     215{
    207216    // We mention Safari since many broken sites check for it (OmniWeb does this too)
    208217    // We re-use the WebKit version, though it doesn't seem to matter much in practice
    209218
    210219    DEFINE_STATIC_LOCAL(const String, uaVersion, (String::format("%d.%d+", WEBKIT_USER_AGENT_MAJOR_VERSION, WEBKIT_USER_AGENT_MINOR_VERSION)));
    211     DEFINE_STATIC_LOCAL(const String, staticUA, (String::format("Mozilla/5.0 (%s; U; %s; %s) AppleWebKit/%s (KHTML, like Gecko) Safari/%s",
    212                                                                 platform, osVersion, defaultLanguage().utf8().data(), uaVersion.utf8().data(), uaVersion.utf8().data())));
    213 
    214     g_free(osVersion);
    215     g_free(platform);
     220    DEFINE_STATIC_LOCAL(const String, staticUA, (String::format("Mozilla/5.0 (%s; U; %s; %s) AppleWebKit/%s (KHTML, like Gecko) Version/5.0 Safari/%s",
     221                                                                webkitPlatform().utf8().data(), webkitOSVersion().utf8().data(), defaultLanguage().utf8().data(), uaVersion.utf8().data(), uaVersion.utf8().data())));
    216222
    217223    return staticUA;
     
    608614                                                        _("User Agent"),
    609615                                                        _("The User-Agent string used by WebKitGtk"),
    610                                                         webkit_get_user_agent().utf8().data(),
     616                                                        webkitUserAgent().utf8().data(),
    611617                                                        flags));
    612618
     
    10351041        g_free(priv->user_agent);
    10361042        if (!g_value_get_string(value) || !strlen(g_value_get_string(value)))
    1037             priv->user_agent = g_strdup(webkit_get_user_agent().utf8().data());
     1043            priv->user_agent = g_strdup(webkitUserAgent().utf8().data());
    10381044        else
    10391045            priv->user_agent = g_strdup(g_value_get_string(value));
Note: See TracChangeset for help on using the changeset viewer.