Changeset 125972 in webkit


Ignore:
Timestamp:
Aug 19, 2012 2:24:01 AM (12 years ago)
Author:
Carlos Garcia Campos
Message:

[GTK] Add API to set preferred languages to WebKit2 GTK+
https://bugs.webkit.org/show_bug.cgi?id=90878

Reviewed by Martin Robinson.

  • UIProcess/API/gtk/WebKitWebContext.cpp:

(webkit_web_context_set_preferred_languages): Public API to set a
list of preferred languages sorted from most desirable to least
desirable.

  • UIProcess/API/gtk/WebKitWebContext.h:
  • UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Add new symbol.
  • UIProcess/API/gtk/tests/TestWebKitWebContext.cpp:

(testWebContextLanguages):
(serverCallback):
(beforeAll):
(afterAll):

  • UIProcess/API/gtk/tests/WebViewTest.cpp:

(resourceGetDataCallback):
(WebViewTest::mainResourceData): Moved from TestWebKitWebContext
to make it available to all WebViewTests.

  • UIProcess/API/gtk/tests/WebViewTest.h:
  • WebProcess/WebProcess.cpp:

(WebKit::WebProcess::userPreferredLanguagesChanged): Notify our
observer that the languages have been overriden.

  • WebProcess/gtk/WebProcessGtk.cpp:

(WebKit::buildAcceptLanguages): Helper function to build the
accept languages as specified in RFC 2616.
(WebKit::setSoupSessionAcceptLanguage): Set the accept-language
property of the default SoupSession.
(WebKit::languageChanged): Update the preferred languages in
SoupSession.
(WebKit::WebProcess::platformInitializeWebProcess): Add an
observer to be notified when the list of preferred languages is
updated.
(WebKit::WebProcess::platformTerminate): Remove the observer added
in platformInitializeWebProcess().

Location:
trunk/Source/WebKit2
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r125969 r125972  
     12012-08-18  Carlos Garcia Campos  <cgarcia@igalia.com>
     2
     3        [GTK] Add API to set preferred languages to WebKit2 GTK+
     4        https://bugs.webkit.org/show_bug.cgi?id=90878
     5
     6        Reviewed by Martin Robinson.
     7
     8        * UIProcess/API/gtk/WebKitWebContext.cpp:
     9        (webkit_web_context_set_preferred_languages): Public API to set a
     10        list of preferred languages sorted from most desirable to least
     11        desirable.
     12        * UIProcess/API/gtk/WebKitWebContext.h:
     13        * UIProcess/API/gtk/docs/webkit2gtk-sections.txt: Add new symbol.
     14        * UIProcess/API/gtk/tests/TestWebKitWebContext.cpp:
     15        (testWebContextLanguages):
     16        (serverCallback):
     17        (beforeAll):
     18        (afterAll):
     19        * UIProcess/API/gtk/tests/WebViewTest.cpp:
     20        (resourceGetDataCallback):
     21        (WebViewTest::mainResourceData): Moved from TestWebKitWebContext
     22        to make it available to all WebViewTests.
     23        * UIProcess/API/gtk/tests/WebViewTest.h:
     24        * WebProcess/WebProcess.cpp:
     25        (WebKit::WebProcess::userPreferredLanguagesChanged): Notify our
     26        observer that the languages have been overriden.
     27        * WebProcess/gtk/WebProcessGtk.cpp:
     28        (WebKit::buildAcceptLanguages): Helper function to build the
     29        accept languages as specified in RFC 2616.
     30        (WebKit::setSoupSessionAcceptLanguage): Set the accept-language
     31        property of the default SoupSession.
     32        (WebKit::languageChanged): Update the preferred languages in
     33        SoupSession.
     34        (WebKit::WebProcess::platformInitializeWebProcess): Add an
     35        observer to be notified when the list of preferred languages is
     36        updated.
     37        (WebKit::WebProcess::platformTerminate): Remove the observer added
     38        in platformInitializeWebProcess().
     39
    1402012-08-18  Mikhail Pozdnyakov  <mikhail.pozdnyakov@intel.com>
    241
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp

    r124763 r125972  
    3333#include "WebKitWebContextPrivate.h"
    3434#include <WebCore/FileSystem.h>
     35#include <WebCore/Language.h>
    3536#include <wtf/HashMap.h>
    3637#include <wtf/OwnPtr.h>
     
    519520}
    520521
     522/**
     523 * webkit_web_context_set_preferred_languages:
     524 * @context: a #WebKitWebContext
     525 * @languages: (element-type utf8): a #GList of language identifiers
     526 *
     527 * Set the list of preferred languages, sorted from most desirable
     528 * to least desirable. The list will be used to build the "Accept-Language"
     529 * header that will be included in the network requests started by
     530 * the #WebKitWebContext.
     531 */
     532void webkit_web_context_set_preferred_languages(WebKitWebContext* context, GList* languageList)
     533{
     534    g_return_if_fail(WEBKIT_IS_WEB_CONTEXT(context));
     535
     536    if (!languageList)
     537        return;
     538
     539    Vector<String> languages;
     540    for (GList* iter = languageList; iter; iter = g_list_next(iter))
     541        languages.append(String::fromUTF8(static_cast<char*>(iter->data)).lower().replace("_", "-"));
     542
     543    WebCore::overrideUserPreferredLanguages(languages);
     544    WebCore::languageDidChange();
     545}
     546
    521547WebKitDownload* webkitWebContextGetOrCreateDownload(WKDownloadRef wkDownload)
    522548{
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.h

    r124741 r125972  
    147147                                                     const gchar                   *languages);
    148148
     149WEBKIT_API void
     150webkit_web_context_set_preferred_languages          (WebKitWebContext              *context,
     151                                                     GList                         *languages);
     152
    149153G_END_DECLS
    150154
  • trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt

    r125910 r125972  
    3838webkit_web_context_get_spell_checking_languages
    3939webkit_web_context_set_spell_checking_languages
     40webkit_web_context_set_preferred_languages
    4041
    4142<SUBSECTION URI Scheme>
  • trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebContext.cpp

    r124763 r125972  
    2121
    2222#include "LoadTrackingTest.h"
     23#include "WebKitTestServer.h"
    2324#include <gtk/gtk.h>
    2425#include <webkit2/webkit2.h>
     
    2728#include <wtf/gobject/GRefPtr.h>
    2829#include <wtf/text/StringHash.h>
     30
     31static WebKitTestServer* kServer;
    2932
    3033static void testWebContextDefault(Test* test, gconstpointer)
     
    166169    }
    167170
    168     static void resourceGetDataCallback(GObject* object, GAsyncResult* result, gpointer userData)
    169     {
    170         size_t dataSize;
    171         GOwnPtr<GError> error;
    172         unsigned char* data = webkit_web_resource_get_data_finish(WEBKIT_WEB_RESOURCE(object), result, &dataSize, &error.outPtr());
    173         g_assert(data);
    174 
    175         URISchemeTest* test = static_cast<URISchemeTest*>(userData);
    176         test->m_resourceData.set(reinterpret_cast<char*>(data));
    177         test->m_resourceDataSize = dataSize;
    178         g_main_loop_quit(test->m_mainLoop);
    179     }
    180 
    181     const char* mainResourceData(size_t& mainResourceDataSize)
    182     {
    183         m_resourceDataSize = 0;
    184         m_resourceData.clear();
    185         WebKitWebResource* resource = webkit_web_view_get_main_resource(m_webView);
    186         g_assert(resource);
    187 
    188         webkit_web_resource_get_data(resource, 0, resourceGetDataCallback, this);
    189         g_main_loop_run(m_mainLoop);
    190 
    191         mainResourceDataSize = m_resourceDataSize;
    192         return m_resourceData.get();
    193     }
    194 
    195     GOwnPtr<char> m_resourceData;
    196     size_t m_resourceDataSize;
    197171    GRefPtr<WebKitURISchemeRequest> m_uriSchemeRequest;
    198172    HashMap<String, URISchemeHandler> m_handlersMap;
     
    267241}
    268242
     243static void testWebContextLanguages(WebViewTest* test, gconstpointer)
     244{
     245    static const char* expectedDefaultLanguage = "en";
     246    test->loadURI(kServer->getURIForPath("/").data());
     247    test->waitUntilLoadFinished();
     248    size_t mainResourceDataSize = 0;
     249    const char* mainResourceData = test->mainResourceData(mainResourceDataSize);
     250    g_assert_cmpuint(mainResourceDataSize, ==, strlen(expectedDefaultLanguage));
     251    g_assert(!strncmp(mainResourceData, expectedDefaultLanguage, mainResourceDataSize));
     252
     253    GList* languages = g_list_prepend(0, const_cast<gpointer>(static_cast<const void*>("dE")));
     254    languages = g_list_prepend(languages, const_cast<gpointer>(static_cast<const void*>("ES_es")));
     255    languages = g_list_prepend(languages, const_cast<gpointer>(static_cast<const void*>("en")));
     256    webkit_web_context_set_preferred_languages(webkit_web_context_get_default(), languages);
     257    g_list_free(languages);
     258
     259    static const char* expectedLanguages = "en, es-es;q=0.90, de;q=0.80";
     260    test->loadURI(kServer->getURIForPath("/").data());
     261    test->waitUntilLoadFinished();
     262    mainResourceDataSize = 0;
     263    mainResourceData = test->mainResourceData(mainResourceDataSize);
     264    g_assert_cmpuint(mainResourceDataSize, ==, strlen(expectedLanguages));
     265    g_assert(!strncmp(mainResourceData, expectedLanguages, mainResourceDataSize));
     266}
     267
     268static void serverCallback(SoupServer* server, SoupMessage* message, const char* path, GHashTable*, SoupClientContext*, gpointer)
     269{
     270    if (message->method != SOUP_METHOD_GET) {
     271        soup_message_set_status(message, SOUP_STATUS_NOT_IMPLEMENTED);
     272        return;
     273    }
     274
     275    soup_message_set_status(message, SOUP_STATUS_OK);
     276    const char* acceptLanguage = soup_message_headers_get_one(message->request_headers, "Accept-Language");
     277    soup_message_body_append(message->response_body, SOUP_MEMORY_COPY, acceptLanguage, strlen(acceptLanguage));
     278    soup_message_body_complete(message->response_body);
     279}
     280
    269281void beforeAll()
    270282{
     283    kServer = new WebKitTestServer();
     284    kServer->run(serverCallback);
     285
    271286    Test::add("WebKitWebContext", "default-context", testWebContextDefault);
    272287    PluginsTest::add("WebKitWebContext", "get-plugins", testWebContextGetPlugins);
    273288    URISchemeTest::add("WebKitWebContext", "uri-scheme", testWebContextURIScheme);
    274289    Test::add("WebKitWebContext", "spell-checker", testWebContextSpellChecker);
     290    WebViewTest::add("WebKitWebContext", "languages", testWebContextLanguages);
    275291}
    276292
    277293void afterAll()
    278294{
    279 }
     295    delete kServer;
     296}
  • trunk/Source/WebKit2/UIProcess/API/gtk/tests/WebViewTest.cpp

    r121094 r125972  
    3030    , m_parentWindow(0)
    3131    , m_javascriptResult(0)
     32    , m_resourceDataSize(0)
    3233{
    3334    assertObjectIsDeletedWhenTestFinishes(G_OBJECT(m_webView));
     
    198199}
    199200
     201static void resourceGetDataCallback(GObject* object, GAsyncResult* result, gpointer userData)
     202{
     203    size_t dataSize;
     204    GOwnPtr<GError> error;
     205    unsigned char* data = webkit_web_resource_get_data_finish(WEBKIT_WEB_RESOURCE(object), result, &dataSize, &error.outPtr());
     206    g_assert(data);
     207
     208    WebViewTest* test = static_cast<WebViewTest*>(userData);
     209    test->m_resourceData.set(reinterpret_cast<char*>(data));
     210    test->m_resourceDataSize = dataSize;
     211    g_main_loop_quit(test->m_mainLoop);
     212}
     213
     214const char* WebViewTest::mainResourceData(size_t& mainResourceDataSize)
     215{
     216    m_resourceDataSize = 0;
     217    m_resourceData.clear();
     218    WebKitWebResource* resource = webkit_web_view_get_main_resource(m_webView);
     219    g_assert(resource);
     220
     221    webkit_web_resource_get_data(resource, 0, resourceGetDataCallback, this);
     222    g_main_loop_run(m_mainLoop);
     223
     224    mainResourceDataSize = m_resourceDataSize;
     225    return m_resourceData.get();
     226}
     227
    200228void WebViewTest::mouseMoveTo(int x, int y, unsigned int mouseModifiers)
    201229{
  • trunk/Source/WebKit2/UIProcess/API/gtk/tests/WebViewTest.h

    r121093 r125972  
    4949    void showInWindowAndWaitUntilMapped(GtkWindowType = GTK_WINDOW_POPUP);
    5050    void resizeView(int width, int height);
     51    const char* mainResourceData(size_t& mainResourceDataSize);
    5152
    5253    void mouseMoveTo(int x, int y, unsigned int mouseModifiers = 0);
     
    7071    WebKitJavascriptResult* m_javascriptResult;
    7172    GError** m_javascriptError;
     73    GOwnPtr<char> m_resourceData;
     74    size_t m_resourceDataSize;
    7275
    7376private:
  • trunk/Source/WebKit2/WebProcess/WebProcess.cpp

    r125766 r125972  
    316316{
    317317    overrideUserPreferredLanguages(languages);
     318    languageDidChange();
    318319}
    319320
  • trunk/Source/WebKit2/WebProcess/gtk/WebProcessGtk.cpp

    r122571 r125972  
    3232#include "WebProcessCreationParameters.h"
    3333#include <WebCore/FileSystem.h>
     34#include <WebCore/Language.h>
    3435#include <WebCore/MemoryCache.h>
    3536#include <WebCore/NotImplemented.h>
     
    3940#include <wtf/gobject/GOwnPtr.h>
    4041#include <wtf/gobject/GRefPtr.h>
     42#include <wtf/text/CString.h>
     43#include <wtf/text/StringBuilder.h>
    4144
    4245#if !OS(WINDOWS)
     
    114117}
    115118
    116 void WebProcess::platformInitializeWebProcess(const WebProcessCreationParameters&, CoreIPC::ArgumentDecoder*)
     119// This function is based on Epiphany code in ephy-embed-prefs.c.
     120static CString buildAcceptLanguages(Vector<String> languages)
    117121{
    118     notImplemented();
     122    // Ignore "C" locale.
     123    size_t position = languages.find("c");
     124    if (position != notFound)
     125        languages.remove(position);
     126
     127    // Fallback to "en" if the list is empty.
     128    if (languages.isEmpty())
     129        return "en";
     130
     131    // Calculate deltas for the quality values.
     132    int delta;
     133    if (languages.size() < 10)
     134        delta = 10;
     135    else if (languages.size() < 20)
     136        delta = 5;
     137    else
     138        delta = 1;
     139
     140    // Set quality values for each language.
     141    StringBuilder builder;
     142    for (size_t i = 0; i < languages.size(); ++i) {
     143        if (i)
     144            builder.append(", ");
     145
     146        builder.append(languages[i]);
     147
     148        int quality = 100 - i * delta;
     149        if (quality > 0 && quality < 100) {
     150            char buffer[8];
     151            g_ascii_formatd(buffer, 8, "%.2f", quality / 100.0);
     152            builder.append(String::format(";q=%s", buffer));
     153        }
     154    }
     155
     156    return builder.toString().utf8();
     157}
     158
     159static void setSoupSessionAcceptLanguage(Vector<String> languages)
     160{
     161    g_object_set(WebCore::ResourceHandle::defaultSession(), "accept-language", buildAcceptLanguages(languages).data(), NULL);
     162}
     163
     164static void languageChanged(void*)
     165{
     166    setSoupSessionAcceptLanguage(WebCore::userPreferredLanguages());
     167}
     168
     169void WebProcess::platformInitializeWebProcess(const WebProcessCreationParameters& parameters, CoreIPC::ArgumentDecoder*)
     170{
     171    if (!parameters.languages.isEmpty())
     172        setSoupSessionAcceptLanguage(parameters.languages);
     173
     174    WebCore::addLanguageChangeObserver(this, languageChanged);
    119175}
    120176
     
    125181    soup_cache_flush(cache);
    126182    soup_cache_dump(cache);
     183
     184    WebCore::removeLanguageChangeObserver(this);
    127185}
    128186
Note: See TracChangeset for help on using the changeset viewer.