Changeset 125972 in webkit
- Timestamp:
- Aug 19, 2012 2:24:01 AM (12 years ago)
- Location:
- trunk/Source/WebKit2
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebKit2/ChangeLog
r125969 r125972 1 2012-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 1 40 2012-08-18 Mikhail Pozdnyakov <mikhail.pozdnyakov@intel.com> 2 41 -
trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.cpp
r124763 r125972 33 33 #include "WebKitWebContextPrivate.h" 34 34 #include <WebCore/FileSystem.h> 35 #include <WebCore/Language.h> 35 36 #include <wtf/HashMap.h> 36 37 #include <wtf/OwnPtr.h> … … 519 520 } 520 521 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 */ 532 void 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 521 547 WebKitDownload* webkitWebContextGetOrCreateDownload(WKDownloadRef wkDownload) 522 548 { -
trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebContext.h
r124741 r125972 147 147 const gchar *languages); 148 148 149 WEBKIT_API void 150 webkit_web_context_set_preferred_languages (WebKitWebContext *context, 151 GList *languages); 152 149 153 G_END_DECLS 150 154 -
trunk/Source/WebKit2/UIProcess/API/gtk/docs/webkit2gtk-sections.txt
r125910 r125972 38 38 webkit_web_context_get_spell_checking_languages 39 39 webkit_web_context_set_spell_checking_languages 40 webkit_web_context_set_preferred_languages 40 41 41 42 <SUBSECTION URI Scheme> -
trunk/Source/WebKit2/UIProcess/API/gtk/tests/TestWebKitWebContext.cpp
r124763 r125972 21 21 22 22 #include "LoadTrackingTest.h" 23 #include "WebKitTestServer.h" 23 24 #include <gtk/gtk.h> 24 25 #include <webkit2/webkit2.h> … … 27 28 #include <wtf/gobject/GRefPtr.h> 28 29 #include <wtf/text/StringHash.h> 30 31 static WebKitTestServer* kServer; 29 32 30 33 static void testWebContextDefault(Test* test, gconstpointer) … … 166 169 } 167 170 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;197 171 GRefPtr<WebKitURISchemeRequest> m_uriSchemeRequest; 198 172 HashMap<String, URISchemeHandler> m_handlersMap; … … 267 241 } 268 242 243 static 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 268 static 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 269 281 void beforeAll() 270 282 { 283 kServer = new WebKitTestServer(); 284 kServer->run(serverCallback); 285 271 286 Test::add("WebKitWebContext", "default-context", testWebContextDefault); 272 287 PluginsTest::add("WebKitWebContext", "get-plugins", testWebContextGetPlugins); 273 288 URISchemeTest::add("WebKitWebContext", "uri-scheme", testWebContextURIScheme); 274 289 Test::add("WebKitWebContext", "spell-checker", testWebContextSpellChecker); 290 WebViewTest::add("WebKitWebContext", "languages", testWebContextLanguages); 275 291 } 276 292 277 293 void afterAll() 278 294 { 279 } 295 delete kServer; 296 } -
trunk/Source/WebKit2/UIProcess/API/gtk/tests/WebViewTest.cpp
r121094 r125972 30 30 , m_parentWindow(0) 31 31 , m_javascriptResult(0) 32 , m_resourceDataSize(0) 32 33 { 33 34 assertObjectIsDeletedWhenTestFinishes(G_OBJECT(m_webView)); … … 198 199 } 199 200 201 static 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 214 const 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 200 228 void WebViewTest::mouseMoveTo(int x, int y, unsigned int mouseModifiers) 201 229 { -
trunk/Source/WebKit2/UIProcess/API/gtk/tests/WebViewTest.h
r121093 r125972 49 49 void showInWindowAndWaitUntilMapped(GtkWindowType = GTK_WINDOW_POPUP); 50 50 void resizeView(int width, int height); 51 const char* mainResourceData(size_t& mainResourceDataSize); 51 52 52 53 void mouseMoveTo(int x, int y, unsigned int mouseModifiers = 0); … … 70 71 WebKitJavascriptResult* m_javascriptResult; 71 72 GError** m_javascriptError; 73 GOwnPtr<char> m_resourceData; 74 size_t m_resourceDataSize; 72 75 73 76 private: -
trunk/Source/WebKit2/WebProcess/WebProcess.cpp
r125766 r125972 316 316 { 317 317 overrideUserPreferredLanguages(languages); 318 languageDidChange(); 318 319 } 319 320 -
trunk/Source/WebKit2/WebProcess/gtk/WebProcessGtk.cpp
r122571 r125972 32 32 #include "WebProcessCreationParameters.h" 33 33 #include <WebCore/FileSystem.h> 34 #include <WebCore/Language.h> 34 35 #include <WebCore/MemoryCache.h> 35 36 #include <WebCore/NotImplemented.h> … … 39 40 #include <wtf/gobject/GOwnPtr.h> 40 41 #include <wtf/gobject/GRefPtr.h> 42 #include <wtf/text/CString.h> 43 #include <wtf/text/StringBuilder.h> 41 44 42 45 #if !OS(WINDOWS) … … 114 117 } 115 118 116 void WebProcess::platformInitializeWebProcess(const WebProcessCreationParameters&, CoreIPC::ArgumentDecoder*) 119 // This function is based on Epiphany code in ephy-embed-prefs.c. 120 static CString buildAcceptLanguages(Vector<String> languages) 117 121 { 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 159 static void setSoupSessionAcceptLanguage(Vector<String> languages) 160 { 161 g_object_set(WebCore::ResourceHandle::defaultSession(), "accept-language", buildAcceptLanguages(languages).data(), NULL); 162 } 163 164 static void languageChanged(void*) 165 { 166 setSoupSessionAcceptLanguage(WebCore::userPreferredLanguages()); 167 } 168 169 void WebProcess::platformInitializeWebProcess(const WebProcessCreationParameters& parameters, CoreIPC::ArgumentDecoder*) 170 { 171 if (!parameters.languages.isEmpty()) 172 setSoupSessionAcceptLanguage(parameters.languages); 173 174 WebCore::addLanguageChangeObserver(this, languageChanged); 119 175 } 120 176 … … 125 181 soup_cache_flush(cache); 126 182 soup_cache_dump(cache); 183 184 WebCore::removeLanguageChangeObserver(this); 127 185 } 128 186
Note: See TracChangeset
for help on using the changeset viewer.