Commit 2b9514d7 authored by kov@webkit.org's avatar kov@webkit.org

2010-09-10 Gustavo Noronha Silva <gns@gnome.org>

        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.

git-svn-id: http://svn.webkit.org/repository/webkit/trunk@67211 268f45cc-cd09-0410-ab3c-d52691b4dbfc
parent 948cf1a2
2010-09-10 Gustavo Noronha Silva <gns@gnome.org>
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.
2010-09-10 Xan Lopez <xlopez@igalia.com>
Reviewed by Martin Robinson.
......
......@@ -49,6 +49,7 @@
#include "MIMETypeRegistry.h"
#include "MouseEvent.h"
#include "NotImplemented.h"
#include "Page.h"
#include "PlatformString.h"
#include "PluginDatabase.h"
#include "RenderPart.h"
......@@ -93,9 +94,115 @@ FrameLoaderClient::~FrameLoaderClient()
g_object_unref(m_policyDecision);
}
String FrameLoaderClient::userAgent(const KURL&)
static void initializeDomainsList(HashSet<String>& googleDomains)
{
// Google search domains.
googleDomains.add("biz");
googleDomains.add("com");
googleDomains.add("net");
googleDomains.add("org");
googleDomains.add("ae");
googleDomains.add("ag");
googleDomains.add("am");
googleDomains.add("at");
googleDomains.add("az");
googleDomains.add("be");
googleDomains.add("bi");
googleDomains.add("ca");
googleDomains.add("cc");
googleDomains.add("cd");
googleDomains.add("cg");
googleDomains.add("ch");
googleDomains.add("cl");
googleDomains.add("com.br");
googleDomains.add("co.uk");
googleDomains.add("co.jp");
googleDomains.add("de");
googleDomains.add("dj");
googleDomains.add("dk");
googleDomains.add("es");
googleDomains.add("fi");
googleDomains.add("fm");
googleDomains.add("fr");
googleDomains.add("gg");
googleDomains.add("gl");
googleDomains.add("gm");
googleDomains.add("gs");
googleDomains.add("hn");
googleDomains.add("hu");
googleDomains.add("ie");
googleDomains.add("it");
googleDomains.add("je");
googleDomains.add("kz");
googleDomains.add("li");
googleDomains.add("lt");
googleDomains.add("lu");
googleDomains.add("lv");
googleDomains.add("ma");
googleDomains.add("ms");
googleDomains.add("mu");
googleDomains.add("mw");
googleDomains.add("nl");
googleDomains.add("no");
googleDomains.add("nu");
googleDomains.add("pl");
googleDomains.add("pn");
googleDomains.add("pt");
googleDomains.add("ru");
googleDomains.add("rw");
googleDomains.add("sh");
googleDomains.add("sk");
googleDomains.add("sm");
googleDomains.add("st");
googleDomains.add("td");
googleDomains.add("tk");
googleDomains.add("tp");
googleDomains.add("tv");
googleDomains.add("us");
googleDomains.add("uz");
googleDomains.add("ws");
}
static bool isGoogleDomain(String host)
{
DEFINE_STATIC_LOCAL(HashSet<String>, googleDomains, ());
DEFINE_STATIC_LOCAL(Vector<String>, otherGoogleDomains, ());
if (googleDomains.isEmpty()) {
otherGoogleDomains.append("gmail.com");
otherGoogleDomains.append("youtube.com");
otherGoogleDomains.append("gstatic.com");
otherGoogleDomains.append("ytimg.com");
initializeDomainsList(googleDomains);
}
// First check if this is one of the various google.com international domains.
int position = host.find(".google.");
if (position > 0 && googleDomains.contains(host.substring(position + sizeof(".google."))))
return true;
// Then we check the possibility of it being one of the other, .com-only google domains.
for (unsigned int i = 0; i < otherGoogleDomains.size(); i++) {
if (host.endsWith(otherGoogleDomains.at(i)))
return true;
}
return false;
}
String FrameLoaderClient::userAgent(const KURL& url)
{
WebKitWebSettings* settings = webkit_web_view_get_settings(getViewFromFrame(m_frame));
gboolean useQuirks;
g_object_get(settings, "enable-site-specific-quirks", &useQuirks, NULL);
// For Google domains, drop the browser's custom User Agent string, and use the standard
// WebKit/Safari one, so they don't give us a broken experience.
if (useQuirks && isGoogleDomain(url.host()))
return webkitUserAgent();
return String::fromUTF8(webkit_web_settings_get_user_agent(settings));
}
......
......@@ -59,6 +59,7 @@
#include "FullscreenVideoController.h"
#include "Node.h"
#include "Page.h"
#include "PlatformString.h"
#include "ResourceHandle.h"
#include "ResourceRequest.h"
#include "ResourceResponse.h"
......@@ -206,6 +207,9 @@ extern "C" {
gboolean disposed;
};
WTF::String
webkitUserAgent();
void
webkit_web_frame_core_frame_gone(WebKitWebFrame*);
......
......@@ -163,56 +163,62 @@ enum {
// Create a default user agent string
// This is a liberal interpretation of http://www.mozilla.org/build/revised-user-agent-strings.html
// See also http://developer.apple.com/internet/safari/faq.html#anchor2
static String webkit_get_user_agent()
static String webkitPlatform()
{
gchar* platform;
gchar* osVersion;
#if PLATFORM(X11)
platform = g_strdup("X11");
DEFINE_STATIC_LOCAL(const String, uaPlatform, (String("X11")));
#elif OS(WINDOWS)
platform = g_strdup("Windows");
DEFINE_STATIC_LOCAL(const String, uaPlatform, (String("Windows")));
#elif PLATFORM(MAC)
platform = g_strdup("Macintosh");
DEFINE_STATIC_LOCAL(const String, uaPlatform, (String("Macintosh")));
#elif defined(GDK_WINDOWING_DIRECTFB)
platform = g_strdup("DirectFB");
DEFINE_STATIC_LOCAL(const String, uaPlatform, (String("DirectFB")));
#else
platform = g_strdup("Unknown");
DEFINE_STATIC_LOCAL(const String, uaPlatform, (String("Unknown")));
#endif
return uaPlatform;
}
static String webkitOSVersion()
{
// FIXME: platform/version detection can be shared.
#if OS(DARWIN)
#if CPU(X86)
osVersion = g_strdup("Intel Mac OS X");
DEFINE_STATIC_LOCAL(const String, uaOSVersion, (String("Intel Mac OS X")));
#else
osVersion = g_strdup("PPC Mac OS X");
DEFINE_STATIC_LOCAL(const String, uaOSVersion, (String("PPC Mac OS X")));
#endif
#elif OS(UNIX)
DEFINE_STATIC_LOCAL(String, uaOSVersion, (String()));
if (!uaOSVersion.isEmpty())
return uaOSVersion;
struct utsname name;
if (uname(&name) != -1)
osVersion = g_strdup_printf("%s %s", name.sysname, name.machine);
uaOSVersion = String::format("%s %s", name.sysname, name.machine);
else
osVersion = g_strdup("Unknown");
uaOSVersion = String("Unknown");
#elif OS(WINDOWS)
// FIXME: Compute the Windows version
osVersion = g_strdup("Windows");
DEFINE_STATIC_LOCAL(const String, uaOSVersion, (String("Windows")));
#else
osVersion = g_strdup("Unknown");
DEFINE_STATIC_LOCAL(const String, uaOSVersion, (String("Unknown")));
#endif
return uaOSVersion;
}
String webkitUserAgent()
{
// We mention Safari since many broken sites check for it (OmniWeb does this too)
// We re-use the WebKit version, though it doesn't seem to matter much in practice
DEFINE_STATIC_LOCAL(const String, uaVersion, (String::format("%d.%d+", WEBKIT_USER_AGENT_MAJOR_VERSION, WEBKIT_USER_AGENT_MINOR_VERSION)));
DEFINE_STATIC_LOCAL(const String, staticUA, (String::format("Mozilla/5.0 (%s; U; %s; %s) AppleWebKit/%s (KHTML, like Gecko) Safari/%s",
platform, osVersion, defaultLanguage().utf8().data(), uaVersion.utf8().data(), uaVersion.utf8().data())));
g_free(osVersion);
g_free(platform);
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",
webkitPlatform().utf8().data(), webkitOSVersion().utf8().data(), defaultLanguage().utf8().data(), uaVersion.utf8().data(), uaVersion.utf8().data())));
return staticUA;
}
......@@ -607,7 +613,7 @@ static void webkit_web_settings_class_init(WebKitWebSettingsClass* klass)
g_param_spec_string("user-agent",
_("User Agent"),
_("The User-Agent string used by WebKitGtk"),
webkit_get_user_agent().utf8().data(),
webkitUserAgent().utf8().data(),
flags));
/**
......@@ -1034,7 +1040,7 @@ static void webkit_web_settings_set_property(GObject* object, guint prop_id, con
case PROP_USER_AGENT:
g_free(priv->user_agent);
if (!g_value_get_string(value) || !strlen(g_value_get_string(value)))
priv->user_agent = g_strdup(webkit_get_user_agent().utf8().data());
priv->user_agent = g_strdup(webkitUserAgent().utf8().data());
else
priv->user_agent = g_strdup(g_value_get_string(value));
break;
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment