1/* 2 * Copyright (C) 2007 Holger Hans Peter Freyther 3 * Copyright (C) 2008 Collabora Ltd. 4 * 5 * This library is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU Library General Public 7 * License as published by the Free Software Foundation; either 8 * version 2 of the License, or (at your option) any later version. 9 * 10 * This library is distributed in the hope that it will be useful, 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * Library General Public License for more details. 14 * 15 * You should have received a copy of the GNU Library General Public License 16 * along with this library; see the file COPYING.LIB. If not, write to 17 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 18 * Boston, MA 02110-1301, USA. 19 */ 20 21#include "config.h" 22 23#include "webkitsoupauthdialog.h" 24#include "webkitprivate.h" 25#include "ApplicationCacheStorage.h" 26#include "Chrome.h" 27#include "ChromeClientGtk.h" 28#include "Frame.h" 29#include "FrameLoader.h" 30#include "FrameLoaderClientGtk.h" 31#include "HitTestResult.h" 32#include "IconDatabase.h" 33#include <libintl.h> 34#include "Logging.h" 35#include "PageCache.h" 36#include "PageGroup.h" 37#include "Pasteboard.h" 38#include "PasteboardHelperGtk.h" 39#include "ResourceHandle.h" 40#include "ResourceHandleClient.h" 41#include "ResourceHandleInternal.h" 42#include "ResourceResponse.h" 43#include <runtime/InitializeThreading.h> 44#include "SecurityOrigin.h" 45#include <stdlib.h> 46#include "TextEncodingRegistry.h" 47#include "webkitnetworkresponse.h" 48 49#if ENABLE(DATABASE) 50#include "DatabaseTracker.h" 51#endif 52 53using namespace WebCore; 54 55namespace WebKit { 56 57WebKitWebView* getViewFromFrame(WebKitWebFrame* frame) 58{ 59 WebKitWebFramePrivate* priv = frame->priv; 60 return priv->webView; 61} 62 63WebCore::Frame* core(WebKitWebFrame* frame) 64{ 65 if (!frame) 66 return 0; 67 68 WebKitWebFramePrivate* priv = frame->priv; 69 return priv ? priv->coreFrame : 0; 70} 71 72WebKitWebFrame* kit(WebCore::Frame* coreFrame) 73{ 74 if (!coreFrame) 75 return 0; 76 77 ASSERT(coreFrame->loader()); 78 WebKit::FrameLoaderClient* client = static_cast<WebKit::FrameLoaderClient*>(coreFrame->loader()->client()); 79 return client ? client->webFrame() : 0; 80} 81 82WebCore::Page* core(WebKitWebView* webView) 83{ 84 if (!webView) 85 return 0; 86 87 WebKitWebViewPrivate* priv = webView->priv; 88 return priv ? priv->corePage : 0; 89} 90 91WebKitWebView* kit(WebCore::Page* corePage) 92{ 93 if (!corePage) 94 return 0; 95 96 ASSERT(corePage->chrome()); 97 WebKit::ChromeClient* client = static_cast<WebKit::ChromeClient*>(corePage->chrome()->client()); 98 return client ? client->webView() : 0; 99} 100 101WebKitWebNavigationReason kit(WebCore::NavigationType type) 102{ 103 return (WebKitWebNavigationReason)type; 104} 105 106WebCore::NavigationType core(WebKitWebNavigationReason type) 107{ 108 return static_cast<WebCore::NavigationType>(type); 109} 110 111WebCore::ResourceRequest core(WebKitNetworkRequest* request) 112{ 113 SoupMessage* soupMessage = webkit_network_request_get_message(request); 114 if (soupMessage) 115 return ResourceRequest(soupMessage); 116 117 KURL url = KURL(KURL(), String::fromUTF8(webkit_network_request_get_uri(request))); 118 return ResourceRequest(url); 119} 120 121WebCore::ResourceResponse core(WebKitNetworkResponse* response) 122{ 123 SoupMessage* soupMessage = webkit_network_response_get_message(response); 124 if (soupMessage) 125 return ResourceResponse(soupMessage); 126 127 return ResourceResponse(); 128} 129 130WebCore::EditingBehavior core(WebKitEditingBehavior type) 131{ 132 return (WebCore::EditingBehavior)type; 133} 134 135WebKitHitTestResult* kit(const WebCore::HitTestResult& result) 136{ 137 guint context = WEBKIT_HIT_TEST_RESULT_CONTEXT_DOCUMENT; 138 GOwnPtr<char> linkURI(0); 139 GOwnPtr<char> imageURI(0); 140 GOwnPtr<char> mediaURI(0); 141 142 if (!result.absoluteLinkURL().isEmpty()) { 143 context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_LINK; 144 linkURI.set(g_strdup(result.absoluteLinkURL().string().utf8().data())); 145 } 146 147 if (!result.absoluteImageURL().isEmpty()) { 148 context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_IMAGE; 149 imageURI.set(g_strdup(result.absoluteImageURL().string().utf8().data())); 150 } 151 152 if (!result.absoluteMediaURL().isEmpty()) { 153 context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_MEDIA; 154 mediaURI.set(g_strdup(result.absoluteMediaURL().string().utf8().data())); 155 } 156 157 if (result.isSelected()) 158 context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_SELECTION; 159 160 if (result.isContentEditable()) 161 context |= WEBKIT_HIT_TEST_RESULT_CONTEXT_EDITABLE; 162 163 return WEBKIT_HIT_TEST_RESULT(g_object_new(WEBKIT_TYPE_HIT_TEST_RESULT, 164 "link-uri", linkURI.get(), 165 "image-uri", imageURI.get(), 166 "media-uri", mediaURI.get(), 167 "context", context, 168 NULL)); 169} 170 171PasteboardHelperGtk* pasteboardHelperInstance() 172{ 173 static PasteboardHelperGtk* helper = new PasteboardHelperGtk(); 174 return helper; 175} 176 177} /** end namespace WebKit */ 178 179namespace WTF { 180 181template <> void freeOwnedGPtr<SoupMessage>(SoupMessage* soupMessage) 182{ 183 if (soupMessage) 184 g_object_unref(soupMessage); 185} 186 187template <> void freeOwnedGPtr<WebKitNetworkRequest>(WebKitNetworkRequest* request) 188{ 189 if (request) 190 g_object_unref(request); 191} 192 193template <> void freeOwnedGPtr<WebKitNetworkResponse>(WebKitNetworkResponse* response) 194{ 195 if (response) 196 g_object_unref(response); 197} 198 199template <> void freeOwnedGPtr<WebKitWebResource>(WebKitWebResource* resource) 200{ 201 if (resource) 202 g_object_unref(resource); 203} 204 205} 206 207static GtkWidget* currentToplevelCallback(WebKitSoupAuthDialog* feature, SoupMessage* message, gpointer userData) 208{ 209 gpointer messageData = g_object_get_data(G_OBJECT(message), "resourceHandle"); 210 if (!messageData) 211 return NULL; 212 213 ResourceHandle* handle = static_cast<ResourceHandle*>(messageData); 214 if (!handle) 215 return NULL; 216 217 ResourceHandleInternal* d = handle->getInternal(); 218 if (!d) 219 return NULL; 220 221 WebCore::Frame* frame = d->m_frame; 222 if (!frame) 223 return NULL; 224 225 GtkWidget* toplevel = gtk_widget_get_toplevel(GTK_WIDGET(frame->page()->chrome()->platformPageClient())); 226#if GTK_CHECK_VERSION(2, 18, 0) 227 if (gtk_widget_is_toplevel(toplevel)) 228#else 229 if (GTK_WIDGET_TOPLEVEL(toplevel)) 230#endif 231 return toplevel; 232 else 233 return NULL; 234} 235 236static void closeIconDatabaseOnExit() 237{ 238 iconDatabase()->close(); 239} 240 241void webkit_init() 242{ 243 static bool isInitialized = false; 244 if (isInitialized) 245 return; 246 isInitialized = true; 247 248 bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR); 249 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); 250 251 JSC::initializeThreading(); 252 WebCore::InitializeLoggingChannelsIfNecessary(); 253 254 // We make sure the text codecs have been initialized, because 255 // that may only be done by the main thread. 256 atomicCanonicalTextEncodingName("UTF-8"); 257 258 // Page cache capacity (in pages). Comment from Mac port: 259 // (Research indicates that value / page drops substantially after 3 pages.) 260 // FIXME: Expose this with an API and/or calculate based on available resources 261 webkit_set_cache_model(WEBKIT_CACHE_MODEL_WEB_BROWSER); 262 263#if ENABLE(DATABASE) 264 gchar* databaseDirectory = g_build_filename(g_get_user_data_dir(), "webkit", "databases", NULL); 265 webkit_set_web_database_directory_path(databaseDirectory); 266 267 // FIXME: It should be possible for client applications to override the default appcache location 268 WebCore::cacheStorage().setCacheDirectory(databaseDirectory); 269 g_free(databaseDirectory); 270#endif 271 272 PageGroup::setShouldTrackVisitedLinks(true); 273 274 Pasteboard::generalPasteboard()->setHelper(WebKit::pasteboardHelperInstance()); 275 276 iconDatabase()->setEnabled(true); 277 278 GOwnPtr<gchar> iconDatabasePath(g_build_filename(g_get_user_data_dir(), "webkit", "icondatabase", NULL)); 279 iconDatabase()->open(iconDatabasePath.get()); 280 281 atexit(closeIconDatabaseOnExit); 282 283 SoupSession* session = webkit_get_default_session(); 284 285 SoupSessionFeature* authDialog = static_cast<SoupSessionFeature*>(g_object_new(WEBKIT_TYPE_SOUP_AUTH_DIALOG, NULL)); 286 g_signal_connect(authDialog, "current-toplevel", G_CALLBACK(currentToplevelCallback), NULL); 287 soup_session_add_feature(session, authDialog); 288 g_object_unref(authDialog); 289 290 SoupSessionFeature* sniffer = static_cast<SoupSessionFeature*>(g_object_new(SOUP_TYPE_CONTENT_SNIFFER, NULL)); 291 soup_session_add_feature(session, sniffer); 292 g_object_unref(sniffer); 293 294 soup_session_add_feature_by_type(session, SOUP_TYPE_CONTENT_DECODER); 295} 296 297void webkit_white_list_access_from_origin(const gchar* sourceOrigin, const gchar* destinationProtocol, const gchar* destinationHost, bool allowDestinationSubdomains) 298{ 299 SecurityOrigin::whiteListAccessFromOrigin(*SecurityOrigin::createFromString(sourceOrigin), destinationProtocol, destinationHost, allowDestinationSubdomains); 300} 301 302void webkit_reset_origin_access_white_lists() 303{ 304 SecurityOrigin::resetOriginAccessWhiteLists(); 305} 306