summaryrefslogtreecommitdiff
path: root/Source/WebKit/gtk/webkit/webkitglobals.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebKit/gtk/webkit/webkitglobals.cpp')
-rw-r--r--Source/WebKit/gtk/webkit/webkitglobals.cpp352
1 files changed, 352 insertions, 0 deletions
diff --git a/Source/WebKit/gtk/webkit/webkitglobals.cpp b/Source/WebKit/gtk/webkit/webkitglobals.cpp
new file mode 100644
index 000000000..71433c893
--- /dev/null
+++ b/Source/WebKit/gtk/webkit/webkitglobals.cpp
@@ -0,0 +1,352 @@
+/*
+ * Copyright (C) 2007 Holger Hans Peter Freyther
+ * Copyright (C) 2008, 2010 Collabora Ltd.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public License
+ * along with this library; see the file COPYING.LIB. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include "config.h"
+#include "webkitglobals.h"
+
+#include "ApplicationCacheStorage.h"
+#include "Chrome.h"
+#include "FrameNetworkingContextGtk.h"
+#include "GOwnPtr.h"
+#include "GRefPtr.h"
+#include "IconDatabase.h"
+#include "Logging.h"
+#include "MemoryCache.h"
+#include "Page.h"
+#include "PageCache.h"
+#include "PageGroup.h"
+#include "TextEncodingRegistry.h"
+#include "Pasteboard.h"
+#include "PasteboardHelperGtk.h"
+#include "ResourceHandle.h"
+#include "ResourceHandleClient.h"
+#include "ResourceHandleInternal.h"
+#include "ResourceResponse.h"
+#include "webkitapplicationcache.h"
+#include "webkitglobalsprivate.h"
+#include "webkiticondatabase.h"
+#include "webkitsoupauthdialog.h"
+#include "webkitspellchecker.h"
+#include "webkitspellcheckerenchant.h"
+#include "webkitwebdatabase.h"
+#include "webkitwebplugindatabaseprivate.h"
+#include <libintl.h>
+#include <runtime/InitializeThreading.h>
+#include <stdlib.h>
+#include <wtf/MainThread.h>
+
+#if USE(CLUTTER)
+#include <clutter-gtk/clutter-gtk.h>
+#endif
+
+static WebKitCacheModel cacheModel = WEBKIT_CACHE_MODEL_DEFAULT;
+
+using namespace WebCore;
+
+/**
+ * SECTION:webkit
+ * @short_description: Global functions controlling WebKit
+ *
+ * WebKit manages many resources which are not related to specific
+ * views. These functions relate to cross-view limits, such as cache
+ * sizes, database quotas, and the HTTP session management.
+ */
+
+/**
+ * webkit_get_default_session:
+ *
+ * Retrieves the default #SoupSession used by all web views.
+ * Note that the session features are added by WebKit on demand,
+ * so if you insert your own #SoupCookieJar before any network
+ * traffic occurs, WebKit will use it instead of the default.
+ *
+ * Return value: (transfer none): the default #SoupSession
+ *
+ * Since: 1.1.1
+ */
+SoupSession* webkit_get_default_session ()
+{
+ webkitInit();
+ return ResourceHandle::defaultSession();
+}
+
+/**
+ * webkit_set_cache_model:
+ * @cache_model: a #WebKitCacheModel
+ *
+ * Specifies a usage model for WebViews, which WebKit will use to
+ * determine its caching behavior. All web views follow the cache
+ * model. This cache model determines the RAM and disk space to use
+ * for caching previously viewed content .
+ *
+ * Research indicates that users tend to browse within clusters of
+ * documents that hold resources in common, and to revisit previously
+ * visited documents. WebKit and the frameworks below it include
+ * built-in caches that take advantage of these patterns,
+ * substantially improving document load speed in browsing
+ * situations. The WebKit cache model controls the behaviors of all of
+ * these caches, including various WebCore caches.
+ *
+ * Browsers can improve document load speed substantially by
+ * specifying WEBKIT_CACHE_MODEL_WEB_BROWSER. Applications without a
+ * browsing interface can reduce memory usage substantially by
+ * specifying WEBKIT_CACHE_MODEL_DOCUMENT_VIEWER. Default value is
+ * WEBKIT_CACHE_MODEL_WEB_BROWSER.
+ *
+ * Since: 1.1.18
+ */
+void webkit_set_cache_model(WebKitCacheModel model)
+{
+ webkitInit();
+
+ if (cacheModel == model)
+ return;
+
+ // FIXME: Add disk cache handling when soup has the API
+ guint cacheTotalCapacity;
+ guint cacheMinDeadCapacity;
+ guint cacheMaxDeadCapacity;
+ gdouble deadDecodedDataDeletionInterval;
+ guint pageCacheCapacity;
+
+ // FIXME: The Mac port calculates these values based on the amount of physical memory that's
+ // installed on the system. Currently these values match the Mac port for users with more than
+ // 512 MB and less than 1024 MB of physical memory.
+ switch (model) {
+ case WEBKIT_CACHE_MODEL_DOCUMENT_VIEWER:
+ pageCacheCapacity = 0;
+ cacheTotalCapacity = 0; // FIXME: The Mac port actually sets this to larger than 0.
+ cacheMinDeadCapacity = 0;
+ cacheMaxDeadCapacity = 0;
+ deadDecodedDataDeletionInterval = 0;
+ break;
+ case WEBKIT_CACHE_MODEL_DOCUMENT_BROWSER:
+ pageCacheCapacity = 2;
+ cacheTotalCapacity = 16 * 1024 * 1024;
+ cacheMinDeadCapacity = cacheTotalCapacity / 8;
+ cacheMaxDeadCapacity = cacheTotalCapacity / 4;
+ deadDecodedDataDeletionInterval = 0;
+ break;
+ case WEBKIT_CACHE_MODEL_WEB_BROWSER:
+ // Page cache capacity (in pages). Comment from Mac port:
+ // (Research indicates that value / page drops substantially after 3 pages.)
+ pageCacheCapacity = 3;
+ cacheTotalCapacity = 32 * 1024 * 1024;
+ cacheMinDeadCapacity = cacheTotalCapacity / 4;
+ cacheMaxDeadCapacity = cacheTotalCapacity / 2;
+ deadDecodedDataDeletionInterval = 60;
+ break;
+ default:
+ g_return_if_reached();
+ }
+
+ memoryCache()->setCapacities(cacheMinDeadCapacity, cacheMaxDeadCapacity, cacheTotalCapacity);
+ memoryCache()->setDeadDecodedDataDeletionInterval(deadDecodedDataDeletionInterval);
+ pageCache()->setCapacity(pageCacheCapacity);
+ cacheModel = model;
+}
+
+/**
+ * webkit_get_cache_model:
+ *
+ * Returns the current cache model. For more information about this
+ * value check the documentation of the function
+ * webkit_set_cache_model().
+ *
+ * Return value: the current #WebKitCacheModel
+ *
+ * Since: 1.1.18
+ */
+WebKitCacheModel webkit_get_cache_model()
+{
+ webkitInit();
+ return cacheModel;
+}
+
+/**
+ * webkit_get_web_plugin_database:
+ *
+ * Returns the current #WebKitWebPluginDatabase with information about
+ * all the plugins WebKit knows about in this instance.
+ *
+ * Return value: (transfer none): the current #WebKitWebPluginDatabase
+ *
+ * Since: 1.3.8
+ */
+WebKitWebPluginDatabase* webkit_get_web_plugin_database()
+{
+ static WebKitWebPluginDatabase* database = 0;
+
+ webkitInit();
+
+ if (!database)
+ database = webkit_web_plugin_database_new();
+
+ return database;
+}
+
+
+static GtkWidget* currentToplevelCallback(WebKitSoupAuthDialog* feature, SoupMessage* message, gpointer userData)
+{
+ gpointer messageData = g_object_get_data(G_OBJECT(message), "resourceHandle");
+ if (!messageData)
+ return NULL;
+
+ ResourceHandle* handle = static_cast<ResourceHandle*>(messageData);
+ if (!handle)
+ return NULL;
+
+ ResourceHandleInternal* d = handle->getInternal();
+ if (!d)
+ return NULL;
+
+ WebKit::FrameNetworkingContextGtk* context = static_cast<WebKit::FrameNetworkingContextGtk*>(d->m_context.get());
+ if (!context)
+ return NULL;
+
+ if (!context->coreFrame())
+ return NULL;
+
+ GtkWidget* toplevel = gtk_widget_get_toplevel(GTK_WIDGET(context->coreFrame()->page()->chrome()->platformPageClient()));
+ if (gtk_widget_is_toplevel(toplevel))
+ return toplevel;
+ else
+ return NULL;
+}
+
+/**
+ * webkit_get_icon_database:
+ *
+ * Returns the #WebKitIconDatabase providing access to website icons.
+ *
+ * Return value: (transfer none): the current #WebKitIconDatabase
+ *
+ * Since: 1.3.13
+ */
+WebKitIconDatabase* webkit_get_icon_database()
+{
+ webkitInit();
+
+ static WebKitIconDatabase* database = 0;
+ if (!database)
+ database = WEBKIT_ICON_DATABASE(g_object_new(WEBKIT_TYPE_ICON_DATABASE, NULL));
+
+ return database;
+}
+
+static GRefPtr<WebKitSpellChecker> textChecker = 0;
+
+static void webkitExit()
+{
+ g_object_unref(webkit_get_default_session());
+ textChecker = 0;
+}
+
+/**
+ * webkit_get_text_checker:
+ *
+ * Returns: the #WebKitSpellChecker used by WebKit, or %NULL if spell
+ * checking is not enabled
+ *
+ * Since: 1.5.1
+ **/
+GObject* webkit_get_text_checker()
+{
+ webkitInit();
+
+#if ENABLE(SPELLCHECK)
+ if (!textChecker)
+ textChecker = adoptGRef(WEBKIT_SPELL_CHECKER(g_object_new(WEBKIT_TYPE_SPELL_CHECKER_ENCHANT, NULL)));
+#endif
+
+ return G_OBJECT(textChecker.get());
+}
+
+/**
+ * webkit_set_text_checker:
+ * @checker: a #WebKitSpellChecker or %NULL
+ *
+ * Sets @checker as the spell checker to be used by WebKit. The API
+ * accepts GObject since in the future we might accept objects
+ * implementing multiple interfaces (for example, spell checking and
+ * grammar checking).
+ *
+ * Since: 1.5.1
+ **/
+void webkit_set_text_checker(GObject* checker)
+{
+ g_return_if_fail(!checker || WEBKIT_IS_SPELL_CHECKER(checker));
+
+ webkitInit();
+
+ // We need to do this because we need the cast, and casting NULL
+ // is not kosher.
+ textChecker = checker ? WEBKIT_SPELL_CHECKER(checker) : 0;
+}
+
+void webkitInit()
+{
+ static bool isInitialized = false;
+ if (isInitialized)
+ return;
+ isInitialized = true;
+
+ bindtextdomain(GETTEXT_PACKAGE, PACKAGE_LOCALE_DIR);
+ bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
+
+ JSC::initializeThreading();
+ WTF::initializeMainThread();
+
+ WebCore::initializeLoggingChannelsIfNecessary();
+
+ // We make sure the text codecs have been initialized, because
+ // that may only be done by the main thread.
+ atomicCanonicalTextEncodingName("UTF-8");
+
+ GOwnPtr<gchar> databaseDirectory(g_build_filename(g_get_user_data_dir(), "webkit", "databases", NULL));
+ webkit_set_web_database_directory_path(databaseDirectory.get());
+
+ GOwnPtr<gchar> cacheDirectory(g_build_filename(g_get_user_cache_dir(), "webkitgtk", "applications", NULL));
+ WebCore::cacheStorage().setCacheDirectory(cacheDirectory.get());
+
+ PageGroup::setShouldTrackVisitedLinks(true);
+
+ GOwnPtr<gchar> iconDatabasePath(g_build_filename(g_get_user_data_dir(), "webkit", "icondatabase", NULL));
+ webkit_icon_database_set_path(webkit_get_icon_database(), iconDatabasePath.get());
+
+ SoupSession* session = webkit_get_default_session();
+
+ SoupSessionFeature* authDialog = static_cast<SoupSessionFeature*>(g_object_new(WEBKIT_TYPE_SOUP_AUTH_DIALOG, NULL));
+ g_signal_connect(authDialog, "current-toplevel", G_CALLBACK(currentToplevelCallback), NULL);
+ soup_session_add_feature(session, authDialog);
+ g_object_unref(authDialog);
+
+ SoupSessionFeature* sniffer = static_cast<SoupSessionFeature*>(g_object_new(SOUP_TYPE_CONTENT_SNIFFER, NULL));
+ soup_session_add_feature(session, sniffer);
+ g_object_unref(sniffer);
+
+ soup_session_add_feature_by_type(session, SOUP_TYPE_CONTENT_DECODER);
+
+#if USE(CLUTTER)
+ gtk_clutter_init(0, 0);
+#endif
+
+ atexit(webkitExit);
+}