/* Copyright (C) 2009-2010 ProFUSION embedded systems Copyright (C) 2009-2010 Samsung Electronics Copyright (C) 2012 Intel Corporation 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 "ewk_settings.h" #include "ApplicationCacheStorage.h" #include "CairoUtilitiesEfl.h" #include "CrossOriginPreflightResultCache.h" #include "DatabaseManager.h" #include "FontCache.h" #include "FrameView.h" #include "GCController.h" #include "IconDatabase.h" #include "Image.h" #include "IntSize.h" #include "KURL.h" #include "LocalFileSystem.h" #include "MemoryCache.h" #include "PageCache.h" #include "RuntimeEnabledFeatures.h" #include "Settings.h" #include "StorageThread.h" #include "StorageTracker.h" #include "WebKitVersion.h" #include "WorkerThread.h" #include "ewk_private.h" #include #include #include #include #include #include #include #include #if OS(UNIX) #include #include #include #elif OS(WINDOWS) #include "SystemInfo.h" #endif static const char* s_offlineAppCachePath = 0; static const char* _ewk_icon_database_path = 0; static const char* s_webDatabasePath = 0; static const char* s_localStoragePath = 0; static const char* s_cssMediaType = 0; static uint64_t s_webDatabaseQuota = 1 * 1024 * 1024; // 1MB. static WTF::String _ewk_settings_webkit_platform_get() { WTF::String uaPlatform; #if PLATFORM(X11) uaPlatform = "X11"; #else uaPlatform = "Unknown"; #endif return uaPlatform; } static WTF::String _ewk_settings_webkit_os_version_get() { WTF::String uaOsVersion; #if OS(DARWIN) #if CPU(X86) || CPU(X86_64) uaOsVersion = "Intel Mac OS X"; #else uaOsVersion = "PPC Mac OS X"; #endif #elif OS(UNIX) struct utsname name; if (uname(&name) != -1) uaOsVersion = makeString(name.sysname, ' ', name.machine); else uaOsVersion = "Unknown"; #elif OS(WINDOWS) uaOsVersion = windowsVersionFroUAString(); #else uaOsVersion = "Unknown"; #endif return uaOsVersion; } uint64_t ewk_settings_web_database_default_quota_get() { return s_webDatabaseQuota; } void ewk_settings_web_database_default_quota_set(uint64_t maximumSize) { s_webDatabaseQuota = maximumSize; } void ewk_settings_local_storage_path_set(const char* path) { WebCore::StorageTracker::tracker().setDatabaseDirectoryPath(WTF::String::fromUTF8(path)); eina_stringshare_replace(&s_localStoragePath, path); } const char* ewk_settings_local_storage_path_get(void) { return s_localStoragePath; } void ewk_settings_local_storage_database_clear() { WebCore::StorageTracker::tracker().deleteAllOrigins(); } void ewk_settings_local_storage_database_origin_clear(const char* url) { EINA_SAFETY_ON_NULL_RETURN(url); const WebCore::KURL kurl(WebCore::KURL(), WTF::String::fromUTF8(url)); WebCore::StorageTracker::tracker().deleteOrigin(WebCore::SecurityOrigin::create(kurl).get()); } void ewk_settings_web_database_path_set(const char* path) { #if ENABLE(SQL_DATABASE) WebCore::DatabaseManager::manager().setDatabaseDirectoryPath(WTF::String::fromUTF8(path)); eina_stringshare_replace(&s_webDatabasePath, path); #endif } const char* ewk_settings_web_database_path_get(void) { return s_webDatabasePath; } Eina_Bool ewk_settings_icon_database_path_set(const char* directory) { WebCore::IconDatabase::delayDatabaseCleanup(); if (directory) { if (WebCore::iconDatabase().isEnabled()) { ERR("IconDatabase is already open: %s", _ewk_icon_database_path); return false; } struct stat st; if (stat(directory, &st)) { ERR("could not stat(%s): %s", directory, strerror(errno)); return false; } if (!S_ISDIR(st.st_mode)) { ERR("not a directory: %s", directory); return false; } if (access(directory, R_OK | W_OK)) { ERR("could not access directory '%s' for read and write: %s", directory, strerror(errno)); return false; } WebCore::iconDatabase().setEnabled(true); WebCore::iconDatabase().open(WTF::String::fromUTF8(directory), WebCore::IconDatabase::defaultDatabaseFilename()); eina_stringshare_replace(&_ewk_icon_database_path, directory); } else { WebCore::iconDatabase().setEnabled(false); WebCore::iconDatabase().close(); eina_stringshare_del(_ewk_icon_database_path); _ewk_icon_database_path = 0; } return true; } const char* ewk_settings_icon_database_path_get(void) { return _ewk_icon_database_path; } Eina_Bool ewk_settings_icon_database_clear(void) { if (!WebCore::iconDatabase().isEnabled()) return false; if (!WebCore::iconDatabase().isOpen()) return false; WebCore::iconDatabase().removeAllIcons(); return true; } cairo_surface_t* ewk_settings_icon_database_icon_surface_get(const char* url) { EINA_SAFETY_ON_NULL_RETURN_VAL(url, 0); WebCore::KURL kurl(WebCore::KURL(), WTF::String::fromUTF8(url)); RefPtr icon = WebCore::iconDatabase().synchronousNativeIconForPageURL(kurl.string(), WebCore::IntSize(16, 16)); if (!icon) ERR("no icon for url %s", url); return icon.get(); } Evas_Object* ewk_settings_icon_database_icon_object_get(const char* url, Evas* canvas) { EINA_SAFETY_ON_NULL_RETURN_VAL(url, 0); EINA_SAFETY_ON_NULL_RETURN_VAL(canvas, 0); WebCore::KURL kurl(WebCore::KURL(), WTF::String::fromUTF8(url)); RefPtr surface = WebCore::iconDatabase().synchronousNativeIconForPageURL(kurl.string(), WebCore::IntSize(16, 16)); if (!surface) { ERR("no icon for url %s", url); return 0; } return surface ? WebCore::evasObjectFromCairoImageSurface(canvas, surface.get()).leakRef() : 0; } void ewk_settings_object_cache_capacity_set(unsigned minDeadCapacity, unsigned maxDeadCapacity, unsigned totalCapacity) { WebCore::memoryCache()->setCapacities(minDeadCapacity, maxDeadCapacity, totalCapacity); } Eina_Bool ewk_settings_object_cache_enable_get() { return !WebCore::memoryCache()->disabled(); } void ewk_settings_object_cache_enable_set(Eina_Bool enable) { WebCore::memoryCache()->setDisabled(!enable); } Eina_Bool ewk_settings_shadow_dom_enable_get() { #if ENABLE(SHADOW_DOM) return WebCore::RuntimeEnabledFeatures::shadowDOMEnabled(); #else return false; #endif } Eina_Bool ewk_settings_shadow_dom_enable_set(Eina_Bool enable) { #if ENABLE(SHADOW_DOM) enable = !!enable; WebCore::RuntimeEnabledFeatures::setShadowDOMEnabled(enable); return true; #else UNUSED_PARAM(enable); return false; #endif } unsigned ewk_settings_page_cache_capacity_get() { return WebCore::pageCache()->capacity(); } void ewk_settings_page_cache_capacity_set(unsigned pages) { WebCore::pageCache()->setCapacity(pages); } void ewk_settings_memory_cache_clear() { // Turn the cache on and off. Disabling the object cache will remove all // resources from the cache. They may still live on if they are referenced // by some Web page though. if (!WebCore::memoryCache()->disabled()) { WebCore::memoryCache()->setDisabled(true); WebCore::memoryCache()->setDisabled(false); } int pageCapacity = WebCore::pageCache()->capacity(); // Setting size to 0, makes all pages be released. WebCore::pageCache()->setCapacity(0); WebCore::pageCache()->setCapacity(pageCapacity); // Invalidating the font cache and freeing all inactive font data. WebCore::fontCache()->invalidate(); // Empty the Cross-Origin Preflight cache WebCore::CrossOriginPreflightResultCache::shared().empty(); // Drop JIT compiled code from ExecutableAllocator. WebCore::gcController().discardAllCompiledCode(); // Garbage Collect to release the references of CachedResource from dead objects. WebCore::gcController().garbageCollectNow(); // FastMalloc has lock-free thread specific caches that can only be cleared from the thread itself. WebCore::StorageThread::releaseFastMallocFreeMemoryInAllThreads(); #if ENABLE(WORKERS) WebCore::WorkerThread::releaseFastMallocFreeMemoryInAllThreads(); #endif WTF::releaseFastMallocFreeMemory(); } void ewk_settings_repaint_throttling_set(double deferredRepaintDelay, double initialDeferredRepaintDelayDuringLoading, double maxDeferredRepaintDelayDuringLoading, double deferredRepaintDelayIncrementDuringLoading) { WebCore::FrameView::setRepaintThrottlingDeferredRepaintDelay(deferredRepaintDelay); WebCore::FrameView::setRepaintThrottlingnInitialDeferredRepaintDelayDuringLoading(initialDeferredRepaintDelayDuringLoading); WebCore::FrameView::setRepaintThrottlingMaxDeferredRepaintDelayDuringLoading(maxDeferredRepaintDelayDuringLoading); WebCore::FrameView::setRepaintThrottlingDeferredRepaintDelayIncrementDuringLoading(deferredRepaintDelayIncrementDuringLoading); } /** * @internal * * Gets the default user agent string. * * @return a pointer to an eina_stringshare containing the user agent string */ const char* ewk_settings_default_user_agent_get() { WTF::String uaVersion = String::number(WEBKIT_MAJOR_VERSION) + '.' + String::number(WEBKIT_MINOR_VERSION) + '+'; WTF::String staticUa = "Mozilla/5.0 (" + _ewk_settings_webkit_platform_get() + "; " + _ewk_settings_webkit_os_version_get() + ") AppleWebKit/" + uaVersion + " (KHTML, like Gecko) Version/5.0 Safari/" + uaVersion; return eina_stringshare_add(staticUa.utf8().data()); } /** * @internal * * Sets the given path to the directory where WebKit will write for * the HTML5 file system API. * * @param path the new file system directory path */ void ewk_settings_file_system_path_set(const char* path) { #if ENABLE(FILE_SYSTEM) WebCore::LocalFileSystem::initializeLocalFileSystem(String::fromUTF8(path)); #else UNUSED_PARAM(path); #endif } void ewk_settings_application_cache_path_set(const char* path) { WebCore::cacheStorage().setCacheDirectory(WTF::String::fromUTF8(path)); eina_stringshare_replace(&s_offlineAppCachePath, path); } const char* ewk_settings_application_cache_path_get() { return s_offlineAppCachePath; } int64_t ewk_settings_application_cache_max_quota_get() { return WebCore::cacheStorage().maximumSize(); } void ewk_settings_application_cache_max_quota_set(int64_t maximumSize) { ewk_settings_application_cache_clear(); WebCore::cacheStorage().setMaximumSize(maximumSize); } void ewk_settings_application_cache_clear() { WebCore::cacheStorage().deleteAllEntries(); } double ewk_settings_default_timer_interval_get(void) { return WebCore::Settings::defaultMinDOMTimerInterval(); } void ewk_settings_css_media_type_set(const char* type) { eina_stringshare_replace(&s_cssMediaType, type); } const char* ewk_settings_css_media_type_get() { return s_cssMediaType; }