Home | History | Annotate | Download | only in webkit
      1 /*
      2  * Copyright (C) 2008 Christian Dywan <christian (at) imendio.com>
      3  * Copyright (C) 2008 Nuanti Ltd.
      4  * Copyright (C) 2008 Collabora Ltd.
      5  * Copyright (C) 2008 Holger Hans Peter Freyther
      6  * Copyright (C) 2009 Jan Michael Alonzo
      7  * Copyright (C) 2009 Movial Creative Technologies Inc.
      8  * Copyright (C) 2009 Igalia S.L.
      9  *
     10  * This library is free software; you can redistribute it and/or
     11  * modify it under the terms of the GNU Library General Public
     12  * License as published by the Free Software Foundation; either
     13  * version 2 of the License, or (at your option) any later version.
     14  *
     15  * This library is distributed in the hope that it will be useful,
     16  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     17  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     18  * Library General Public License for more details.
     19  *
     20  * You should have received a copy of the GNU Library General Public License
     21  * along with this library; see the file COPYING.LIB.  If not, write to
     22  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     23  * Boston, MA 02110-1301, USA.
     24  */
     25 
     26 #include "config.h"
     27 #include "webkitwebsettings.h"
     28 
     29 #include "webkitenumtypes.h"
     30 #include "webkitprivate.h"
     31 #include "webkitversion.h"
     32 
     33 #include "CString.h"
     34 #include "FileSystem.h"
     35 #include "PluginDatabase.h"
     36 #include "Language.h"
     37 #include "PlatformString.h"
     38 
     39 #include <glib/gi18n-lib.h>
     40 #if OS(UNIX)
     41 #include <sys/utsname.h>
     42 #endif
     43 
     44 /**
     45  * SECTION:webkitwebsettings
     46  * @short_description: Control the behaviour of a #WebKitWebView
     47  *
     48  * #WebKitWebSettings can be applied to a #WebKitWebView to control
     49  * the to be used text encoding, color, font sizes, printing mode,
     50  * script support, loading of images and various other things.
     51  *
     52  * <informalexample><programlisting>
     53  * /<!-- -->* Create a new websettings and disable java script *<!-- -->/
     54  * WebKitWebSettings *settings = webkit_web_settings_new ();
     55  * g_object_set (G_OBJECT(settings), "enable-scripts", FALSE, NULL);
     56  *
     57  * /<!-- -->* Apply the result *<!-- -->/
     58  * webkit_web_view_set_settings (WEBKIT_WEB_VIEW(my_webview), settings);
     59  * </programlisting></informalexample>
     60  */
     61 
     62 using namespace WebCore;
     63 
     64 G_DEFINE_TYPE(WebKitWebSettings, webkit_web_settings, G_TYPE_OBJECT)
     65 
     66 struct _WebKitWebSettingsPrivate {
     67     gchar* default_encoding;
     68     gchar* cursive_font_family;
     69     gchar* default_font_family;
     70     gchar* fantasy_font_family;
     71     gchar* monospace_font_family;
     72     gchar* sans_serif_font_family;
     73     gchar* serif_font_family;
     74     guint default_font_size;
     75     guint default_monospace_font_size;
     76     guint minimum_font_size;
     77     guint minimum_logical_font_size;
     78     gboolean enforce_96_dpi;
     79     gboolean auto_load_images;
     80     gboolean auto_shrink_images;
     81     gboolean print_backgrounds;
     82     gboolean enable_scripts;
     83     gboolean enable_plugins;
     84     gboolean resizable_text_areas;
     85     gchar* user_stylesheet_uri;
     86     gfloat zoom_step;
     87     gboolean enable_developer_extras;
     88     gboolean enable_private_browsing;
     89     gboolean enable_spell_checking;
     90     gchar* spell_checking_languages;
     91     GSList* spell_checking_languages_list;
     92     gboolean enable_caret_browsing;
     93     gboolean enable_html5_database;
     94     gboolean enable_html5_local_storage;
     95     gboolean enable_xss_auditor;
     96     gchar* user_agent;
     97     gboolean javascript_can_open_windows_automatically;
     98     gboolean enable_offline_web_application_cache;
     99     WebKitEditingBehavior editing_behavior;
    100     gboolean enable_universal_access_from_file_uris;
    101     gboolean enable_dom_paste;
    102     gboolean tab_key_cycles_through_elements;
    103     gboolean enable_default_context_menu;
    104     gboolean enable_site_specific_quirks;
    105     gboolean enable_page_cache;
    106 };
    107 
    108 #define WEBKIT_WEB_SETTINGS_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_WEB_SETTINGS, WebKitWebSettingsPrivate))
    109 
    110 enum {
    111     PROP_0,
    112 
    113     PROP_DEFAULT_ENCODING,
    114     PROP_CURSIVE_FONT_FAMILY,
    115     PROP_DEFAULT_FONT_FAMILY,
    116     PROP_FANTASY_FONT_FAMILY,
    117     PROP_MONOSPACE_FONT_FAMILY,
    118     PROP_SANS_SERIF_FONT_FAMILY,
    119     PROP_SERIF_FONT_FAMILY,
    120     PROP_DEFAULT_FONT_SIZE,
    121     PROP_DEFAULT_MONOSPACE_FONT_SIZE,
    122     PROP_MINIMUM_FONT_SIZE,
    123     PROP_MINIMUM_LOGICAL_FONT_SIZE,
    124     PROP_ENFORCE_96_DPI,
    125     PROP_AUTO_LOAD_IMAGES,
    126     PROP_AUTO_SHRINK_IMAGES,
    127     PROP_PRINT_BACKGROUNDS,
    128     PROP_ENABLE_SCRIPTS,
    129     PROP_ENABLE_PLUGINS,
    130     PROP_RESIZABLE_TEXT_AREAS,
    131     PROP_USER_STYLESHEET_URI,
    132     PROP_ZOOM_STEP,
    133     PROP_ENABLE_DEVELOPER_EXTRAS,
    134     PROP_ENABLE_PRIVATE_BROWSING,
    135     PROP_ENABLE_SPELL_CHECKING,
    136     PROP_SPELL_CHECKING_LANGUAGES,
    137     PROP_ENABLE_CARET_BROWSING,
    138     PROP_ENABLE_HTML5_DATABASE,
    139     PROP_ENABLE_HTML5_LOCAL_STORAGE,
    140     PROP_ENABLE_XSS_AUDITOR,
    141     PROP_USER_AGENT,
    142     PROP_JAVASCRIPT_CAN_OPEN_WINDOWS_AUTOMATICALLY,
    143     PROP_ENABLE_OFFLINE_WEB_APPLICATION_CACHE,
    144     PROP_EDITING_BEHAVIOR,
    145     PROP_ENABLE_UNIVERSAL_ACCESS_FROM_FILE_URIS,
    146     PROP_ENABLE_DOM_PASTE,
    147     PROP_TAB_KEY_CYCLES_THROUGH_ELEMENTS,
    148     PROP_ENABLE_DEFAULT_CONTEXT_MENU,
    149     PROP_ENABLE_SITE_SPECIFIC_QUIRKS,
    150     PROP_ENABLE_PAGE_CACHE
    151 };
    152 
    153 // Create a default user agent string
    154 // This is a liberal interpretation of http://www.mozilla.org/build/revised-user-agent-strings.html
    155 // See also http://developer.apple.com/internet/safari/faq.html#anchor2
    156 static String webkit_get_user_agent()
    157 {
    158     gchar* platform;
    159     gchar* osVersion;
    160 
    161 #if PLATFORM(X11)
    162     platform = g_strdup("X11");
    163 #elif OS(WINDOWS)
    164     platform = g_strdup("Windows");
    165 #elif PLATFORM(MAC)
    166     platform = g_strdup("Macintosh");
    167 #elif defined(GDK_WINDOWING_DIRECTFB)
    168     platform = g_strdup("DirectFB");
    169 #else
    170     platform = g_strdup("Unknown");
    171 #endif
    172 
    173    // FIXME: platform/version detection can be shared.
    174 #if OS(DARWIN)
    175 
    176 #if CPU(X86)
    177     osVersion = g_strdup("Intel Mac OS X");
    178 #else
    179     osVersion = g_strdup("PPC Mac OS X");
    180 #endif
    181 
    182 #elif OS(UNIX)
    183     struct utsname name;
    184     if (uname(&name) != -1)
    185         osVersion = g_strdup_printf("%s %s", name.sysname, name.machine);
    186     else
    187         osVersion = g_strdup("Unknown");
    188 
    189 #elif OS(WINDOWS)
    190     // FIXME: Compute the Windows version
    191     osVersion = g_strdup("Windows");
    192 
    193 #else
    194     osVersion = g_strdup("Unknown");
    195 #endif
    196 
    197     // We mention Safari since many broken sites check for it (OmniWeb does this too)
    198     // We re-use the WebKit version, though it doesn't seem to matter much in practice
    199 
    200     DEFINE_STATIC_LOCAL(const String, uaVersion, (String::format("%d.%d+", WEBKIT_USER_AGENT_MAJOR_VERSION, WEBKIT_USER_AGENT_MINOR_VERSION)));
    201     DEFINE_STATIC_LOCAL(const String, staticUA, (String::format("Mozilla/5.0 (%s; U; %s; %s) AppleWebKit/%s (KHTML, like Gecko) Safari/%s",
    202                                                                 platform, osVersion, defaultLanguage().utf8().data(), uaVersion.utf8().data(), uaVersion.utf8().data())));
    203 
    204     g_free(osVersion);
    205     g_free(platform);
    206 
    207     return staticUA;
    208 }
    209 
    210 static void webkit_web_settings_finalize(GObject* object);
    211 
    212 static void webkit_web_settings_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec);
    213 
    214 static void webkit_web_settings_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec);
    215 
    216 static void webkit_web_settings_class_init(WebKitWebSettingsClass* klass)
    217 {
    218     GObjectClass* gobject_class = G_OBJECT_CLASS(klass);
    219     gobject_class->finalize = webkit_web_settings_finalize;
    220     gobject_class->set_property = webkit_web_settings_set_property;
    221     gobject_class->get_property = webkit_web_settings_get_property;
    222 
    223     webkit_init();
    224 
    225     GParamFlags flags = (GParamFlags)(WEBKIT_PARAM_READWRITE | G_PARAM_CONSTRUCT);
    226 
    227     g_object_class_install_property(gobject_class,
    228                                     PROP_DEFAULT_ENCODING,
    229                                     g_param_spec_string(
    230                                     "default-encoding",
    231                                     _("Default Encoding"),
    232                                     _("The default encoding used to display text."),
    233                                     "iso-8859-1",
    234                                     flags));
    235 
    236     g_object_class_install_property(gobject_class,
    237                                     PROP_CURSIVE_FONT_FAMILY,
    238                                     g_param_spec_string(
    239                                     "cursive-font-family",
    240                                     _("Cursive Font Family"),
    241                                     _("The default Cursive font family used to display text."),
    242                                     "serif",
    243                                     flags));
    244 
    245     g_object_class_install_property(gobject_class,
    246                                     PROP_DEFAULT_FONT_FAMILY,
    247                                     g_param_spec_string(
    248                                     "default-font-family",
    249                                     _("Default Font Family"),
    250                                     _("The default font family used to display text."),
    251                                     "sans-serif",
    252                                     flags));
    253 
    254     g_object_class_install_property(gobject_class,
    255                                     PROP_FANTASY_FONT_FAMILY,
    256                                     g_param_spec_string(
    257                                     "fantasy-font-family",
    258                                     _("Fantasy Font Family"),
    259                                     _("The default Fantasy font family used to display text."),
    260                                     "serif",
    261                                     flags));
    262 
    263     g_object_class_install_property(gobject_class,
    264                                     PROP_MONOSPACE_FONT_FAMILY,
    265                                     g_param_spec_string(
    266                                     "monospace-font-family",
    267                                     _("Monospace Font Family"),
    268                                     _("The default font family used to display monospace text."),
    269                                     "monospace",
    270                                     flags));
    271 
    272     g_object_class_install_property(gobject_class,
    273                                     PROP_SANS_SERIF_FONT_FAMILY,
    274                                     g_param_spec_string(
    275                                     "sans-serif-font-family",
    276                                     _("Sans Serif Font Family"),
    277                                     _("The default Sans Serif font family used to display text."),
    278                                     "sans-serif",
    279                                     flags));
    280 
    281     g_object_class_install_property(gobject_class,
    282                                     PROP_SERIF_FONT_FAMILY,
    283                                     g_param_spec_string(
    284                                     "serif-font-family",
    285                                     _("Serif Font Family"),
    286                                     _("The default Serif font family used to display text."),
    287                                     "serif",
    288                                     flags));
    289 
    290     g_object_class_install_property(gobject_class,
    291                                     PROP_DEFAULT_FONT_SIZE,
    292                                     g_param_spec_int(
    293                                     "default-font-size",
    294                                     _("Default Font Size"),
    295                                     _("The default font size used to display text."),
    296                                     5, G_MAXINT, 12,
    297                                     flags));
    298 
    299     g_object_class_install_property(gobject_class,
    300                                     PROP_DEFAULT_MONOSPACE_FONT_SIZE,
    301                                     g_param_spec_int(
    302                                     "default-monospace-font-size",
    303                                     _("Default Monospace Font Size"),
    304                                     _("The default font size used to display monospace text."),
    305                                     5, G_MAXINT, 10,
    306                                     flags));
    307 
    308     g_object_class_install_property(gobject_class,
    309                                     PROP_MINIMUM_FONT_SIZE,
    310                                     g_param_spec_int(
    311                                     "minimum-font-size",
    312                                     _("Minimum Font Size"),
    313                                     _("The minimum font size used to display text."),
    314                                     1, G_MAXINT, 5,
    315                                     flags));
    316 
    317     g_object_class_install_property(gobject_class,
    318                                     PROP_MINIMUM_LOGICAL_FONT_SIZE,
    319                                     g_param_spec_int(
    320                                     "minimum-logical-font-size",
    321                                     _("Minimum Logical Font Size"),
    322                                     _("The minimum logical font size used to display text."),
    323                                     1, G_MAXINT, 5,
    324                                     flags));
    325 
    326     /**
    327     * WebKitWebSettings:enforce-96-dpi:
    328     *
    329     * Enforce a resolution of 96 DPI. This is meant for compatibility
    330     * with web pages which cope badly with different screen resolutions
    331     * and for automated testing.
    332     * Web browsers and applications that typically display arbitrary
    333     * content from the web should provide a preference for this.
    334     *
    335     * Since: 1.0.3
    336     */
    337     g_object_class_install_property(gobject_class,
    338                                     PROP_ENFORCE_96_DPI,
    339                                     g_param_spec_boolean(
    340                                     "enforce-96-dpi",
    341                                     _("Enforce 96 DPI"),
    342                                     _("Enforce a resolution of 96 DPI"),
    343                                     FALSE,
    344                                     flags));
    345 
    346     g_object_class_install_property(gobject_class,
    347                                     PROP_AUTO_LOAD_IMAGES,
    348                                     g_param_spec_boolean(
    349                                     "auto-load-images",
    350                                     _("Auto Load Images"),
    351                                     _("Load images automatically."),
    352                                     TRUE,
    353                                     flags));
    354 
    355     g_object_class_install_property(gobject_class,
    356                                     PROP_AUTO_SHRINK_IMAGES,
    357                                     g_param_spec_boolean(
    358                                     "auto-shrink-images",
    359                                     _("Auto Shrink Images"),
    360                                     _("Automatically shrink standalone images to fit."),
    361                                     TRUE,
    362                                     flags));
    363 
    364     g_object_class_install_property(gobject_class,
    365                                     PROP_PRINT_BACKGROUNDS,
    366                                     g_param_spec_boolean(
    367                                     "print-backgrounds",
    368                                     _("Print Backgrounds"),
    369                                     _("Whether background images should be printed."),
    370                                     TRUE,
    371                                     flags));
    372 
    373     g_object_class_install_property(gobject_class,
    374                                     PROP_ENABLE_SCRIPTS,
    375                                     g_param_spec_boolean(
    376                                     "enable-scripts",
    377                                     _("Enable Scripts"),
    378                                     _("Enable embedded scripting languages."),
    379                                     TRUE,
    380                                     flags));
    381 
    382     g_object_class_install_property(gobject_class,
    383                                     PROP_ENABLE_PLUGINS,
    384                                     g_param_spec_boolean(
    385                                     "enable-plugins",
    386                                     _("Enable Plugins"),
    387                                     _("Enable embedded plugin objects."),
    388                                     TRUE,
    389                                     flags));
    390 
    391     g_object_class_install_property(gobject_class,
    392                                     PROP_RESIZABLE_TEXT_AREAS,
    393                                     g_param_spec_boolean(
    394                                     "resizable-text-areas",
    395                                     _("Resizable Text Areas"),
    396                                     _("Whether text areas are resizable."),
    397                                     TRUE,
    398                                     flags));
    399 
    400     g_object_class_install_property(gobject_class,
    401                                     PROP_USER_STYLESHEET_URI,
    402                                     g_param_spec_string("user-stylesheet-uri",
    403                                     _("User Stylesheet URI"),
    404                                     _("The URI of a stylesheet that is applied to every page."),
    405                                     0,
    406                                     flags));
    407 
    408     /**
    409     * WebKitWebSettings:zoom-step:
    410     *
    411     * The value by which the zoom level is changed when zooming in or out.
    412     *
    413     * Since: 1.0.1
    414     */
    415     g_object_class_install_property(gobject_class,
    416                                     PROP_ZOOM_STEP,
    417                                     g_param_spec_float(
    418                                     "zoom-step",
    419                                     _("Zoom Stepping Value"),
    420                                     _("The value by which the zoom level is changed when zooming in or out."),
    421                                     0.0f, G_MAXFLOAT, 0.1f,
    422                                     flags));
    423 
    424     /**
    425     * WebKitWebSettings:enable-developer-extras:
    426     *
    427     * Whether developer extensions should be enabled. This enables,
    428     * for now, the Web Inspector, which can be controlled using the
    429     * #WebKitWebInspector instance held by the #WebKitWebView this
    430     * setting is enabled for.
    431     *
    432     * Since: 1.0.3
    433     */
    434     g_object_class_install_property(gobject_class,
    435                                     PROP_ENABLE_DEVELOPER_EXTRAS,
    436                                     g_param_spec_boolean(
    437                                     "enable-developer-extras",
    438                                     _("Enable Developer Extras"),
    439                                     _("Enables special extensions that help developers"),
    440                                     FALSE,
    441                                     flags));
    442 
    443     /**
    444     * WebKitWebSettings:enable-private-browsing:
    445     *
    446     * Whether to enable private browsing mode. Private browsing mode prevents
    447     * WebKit from updating the global history and storing any session
    448     * information e.g., on-disk cache, as well as suppressing any messages
    449     * from being printed into the (javascript) console.
    450     *
    451     * This is currently experimental for WebKitGtk.
    452     *
    453     * Since: 1.1.2
    454     */
    455     g_object_class_install_property(gobject_class,
    456                                     PROP_ENABLE_PRIVATE_BROWSING,
    457                                     g_param_spec_boolean(
    458                                     "enable-private-browsing",
    459                                     _("Enable Private Browsing"),
    460                                     _("Enables private browsing mode"),
    461                                     FALSE,
    462                                     flags));
    463 
    464     /**
    465     * WebKitWebSettings:enable-spell-checking:
    466     *
    467     * Whether to enable spell checking while typing.
    468     *
    469     * Since: 1.1.6
    470     */
    471     g_object_class_install_property(gobject_class,
    472                                     PROP_ENABLE_SPELL_CHECKING,
    473                                     g_param_spec_boolean(
    474                                     "enable-spell-checking",
    475                                     _("Enable Spell Checking"),
    476                                     _("Enables spell checking while typing"),
    477                                     FALSE,
    478                                     flags));
    479 
    480     /**
    481     * WebKitWebSettings:spell-checking-languages:
    482     *
    483     * The languages to be used for spell checking, separated by commas.
    484     *
    485     * The locale string typically is in the form lang_COUNTRY, where lang
    486     * is an ISO-639 language code, and COUNTRY is an ISO-3166 country code.
    487     * For instance, sv_FI for Swedish as written in Finland or pt_BR
    488     * for Portuguese as written in Brazil.
    489     *
    490     * If no value is specified then the value returned by
    491     * gtk_get_default_language will be used.
    492     *
    493     * Since: 1.1.6
    494     */
    495     g_object_class_install_property(gobject_class,
    496                                     PROP_SPELL_CHECKING_LANGUAGES,
    497                                     g_param_spec_string(
    498                                     "spell-checking-languages",
    499                                     _("Languages to use for spell checking"),
    500                                     _("Comma separated list of languages to use for spell checking"),
    501                                     0,
    502                                     flags));
    503 
    504     /**
    505     * WebKitWebSettings:enable-caret-browsing:
    506     *
    507     * Whether to enable caret browsing mode.
    508     *
    509     * Since: 1.1.6
    510     */
    511     g_object_class_install_property(gobject_class,
    512                                     PROP_ENABLE_CARET_BROWSING,
    513                                     g_param_spec_boolean("enable-caret-browsing",
    514                                                          _("Enable Caret Browsing"),
    515                                                          _("Whether to enable accesibility enhanced keyboard navigation"),
    516                                                          FALSE,
    517                                                          flags));
    518     /**
    519     * WebKitWebSettings:enable-html5-database:
    520     *
    521     * Whether to enable HTML5 client-side SQL database support. Client-side
    522     * SQL database allows web pages to store structured data and be able to
    523     * use SQL to manipulate that data asynchronously.
    524     *
    525     * Since: 1.1.8
    526     */
    527     g_object_class_install_property(gobject_class,
    528                                     PROP_ENABLE_HTML5_DATABASE,
    529                                     g_param_spec_boolean("enable-html5-database",
    530                                                          _("Enable HTML5 Database"),
    531                                                          _("Whether to enable HTML5 database support"),
    532                                                          TRUE,
    533                                                          flags));
    534 
    535     /**
    536     * WebKitWebSettings:enable-html5-local-storage:
    537     *
    538     * Whether to enable HTML5 localStorage support. localStorage provides
    539     * simple synchronous storage access.
    540     *
    541     * Since: 1.1.8
    542     */
    543     g_object_class_install_property(gobject_class,
    544                                     PROP_ENABLE_HTML5_LOCAL_STORAGE,
    545                                     g_param_spec_boolean("enable-html5-local-storage",
    546                                                          _("Enable HTML5 Local Storage"),
    547                                                          _("Whether to enable HTML5 Local Storage support"),
    548                                                          TRUE,
    549                                                          flags));
    550     /**
    551     * WebKitWebSettings:enable-xss-auditor
    552     *
    553     * Whether to enable the XSS Auditor. This feature filters some kinds of
    554     * reflective XSS attacks on vulnerable web sites.
    555     *
    556     * Since: 1.1.11
    557     */
    558     g_object_class_install_property(gobject_class,
    559                                     PROP_ENABLE_XSS_AUDITOR,
    560                                     g_param_spec_boolean("enable-xss-auditor",
    561                                                          _("Enable XSS Auditor"),
    562                                                          _("Whether to enable teh XSS auditor"),
    563                                                          TRUE,
    564                                                          flags));
    565 
    566     /**
    567      * WebKitWebSettings:user-agent:
    568      *
    569      * The User-Agent string used by WebKitGtk.
    570      *
    571      * This will return a default User-Agent string if a custom string wasn't
    572      * provided by the application. Setting this property to a NULL value or
    573      * an empty string will result in the User-Agent string being reset to the
    574      * default value.
    575      *
    576      * Since: 1.1.11
    577      */
    578     g_object_class_install_property(gobject_class, PROP_USER_AGENT,
    579                                     g_param_spec_string("user-agent",
    580                                                         _("User Agent"),
    581                                                         _("The User-Agent string used by WebKitGtk"),
    582                                                         webkit_get_user_agent().utf8().data(),
    583                                                         flags));
    584 
    585     /**
    586     * WebKitWebSettings:javascript-can-open-windows-automatically
    587     *
    588     * Whether JavaScript can open popup windows automatically without user
    589     * intervention.
    590     *
    591     * Since: 1.1.11
    592     */
    593     g_object_class_install_property(gobject_class,
    594                                     PROP_JAVASCRIPT_CAN_OPEN_WINDOWS_AUTOMATICALLY,
    595                                     g_param_spec_boolean("javascript-can-open-windows-automatically",
    596                                                          _("JavaScript can open windows automatically"),
    597                                                          _("Whether JavaScript can open windows automatically"),
    598                                                          FALSE,
    599                                                          flags));
    600     /**
    601     * WebKitWebSettings:enable-offline-web-application-cache
    602     *
    603     * Whether to enable HTML5 offline web application cache support. Offline
    604     * Web Application Cache ensures web applications are available even when
    605     * the user is not connected to the network.
    606     *
    607     * Since: 1.1.13
    608     */
    609     g_object_class_install_property(gobject_class,
    610                                     PROP_ENABLE_OFFLINE_WEB_APPLICATION_CACHE,
    611                                     g_param_spec_boolean("enable-offline-web-application-cache",
    612                                                          _("Enable offline web application cache"),
    613                                                          _("Whether to enable offline web application cache"),
    614                                                          TRUE,
    615                                                          flags));
    616 
    617     COMPILE_ASSERT(static_cast<int>(WEBKIT_EDITING_BEHAVIOR_MAC) == static_cast<int>(WebCore::EditingMacBehavior), editing_behavior_type_mac_match);
    618     COMPILE_ASSERT(static_cast<int>(WEBKIT_EDITING_BEHAVIOR_WINDOWS) == static_cast<int>(WebCore::EditingWindowsBehavior), editing_behavior_type_windows_match);
    619 
    620     /**
    621     * WebKitWebSettings:editing-behavior
    622     *
    623     * This setting controls various editing behaviors that differ
    624     * between platforms and that have been combined in two groups,
    625     * 'Mac' and 'Windows'. Some examples:
    626     *
    627     *  1) Clicking below the last line of an editable area puts the
    628     * caret at the end of the last line on Mac, but in the middle of
    629     * the last line on Windows.
    630     *
    631     *  2) Pushing down the arrow key on the last line puts the caret
    632     *  at the end of the last line on Mac, but does nothing on
    633     *  Windows. A similar case exists on the top line.
    634     *
    635     * Since: 1.1.13
    636     */
    637     g_object_class_install_property(gobject_class,
    638                                     PROP_EDITING_BEHAVIOR,
    639                                     g_param_spec_enum("editing-behavior",
    640                                                       _("Editing behavior"),
    641                                                       _("The behavior mode to use in editing mode"),
    642                                                       WEBKIT_TYPE_EDITING_BEHAVIOR,
    643                                                       WEBKIT_EDITING_BEHAVIOR_MAC,
    644                                                       flags));
    645 
    646     /**
    647      * WebKitWebSettings:enable-universal-access-from-file-uris
    648      *
    649      * Whether to allow files loaded through file:// URIs universal access to
    650      * all pages.
    651      *
    652      * Since: 1.1.13
    653      */
    654     g_object_class_install_property(gobject_class,
    655                                     PROP_ENABLE_UNIVERSAL_ACCESS_FROM_FILE_URIS,
    656                                     g_param_spec_boolean("enable-universal-access-from-file-uris",
    657                                                          _("Enable universal access from file URIs"),
    658                                                          _("Whether to allow universal access from file URIs"),
    659                                                          FALSE,
    660                                                          flags));
    661 
    662     /**
    663      * WebKitWebSettings:enable-dom-paste
    664      *
    665      * Whether to enable DOM paste. If set to %TRUE, document.execCommand("Paste")
    666      * will correctly execute and paste content of the clipboard.
    667      *
    668      * Since: 1.1.16
    669      */
    670     g_object_class_install_property(gobject_class,
    671                                     PROP_ENABLE_DOM_PASTE,
    672                                     g_param_spec_boolean("enable-dom-paste",
    673                                                          _("Enable DOM paste"),
    674                                                          _("Whether to enable DOM paste"),
    675                                                          FALSE,
    676                                                          flags));
    677     /**
    678     * WebKitWebSettings:tab-key-cycles-through-elements:
    679     *
    680     * Whether the tab key cycles through elements on the page.
    681     *
    682     * If @flag is %TRUE, pressing the tab key will focus the next element in
    683     * the @web_view. If @flag is %FALSE, the @web_view will interpret tab
    684     * key presses as normal key presses. If the selected element is editable, the
    685     * tab key will cause the insertion of a tab character.
    686     *
    687     * Since: 1.1.17
    688     */
    689     g_object_class_install_property(gobject_class,
    690                                     PROP_TAB_KEY_CYCLES_THROUGH_ELEMENTS,
    691                                     g_param_spec_boolean("tab-key-cycles-through-elements",
    692                                                          _("Tab key cycles through elements"),
    693                                                          _("Whether the tab key cycles through elements on the page."),
    694                                                          TRUE,
    695                                                          flags));
    696 
    697     /**
    698      * WebKitWebSettings:enable-default-context-menu:
    699      *
    700      * Whether right-clicks should be handled automatically to create,
    701      * and display the context menu. Turning this off will make
    702      * WebKitGTK+ not emit the populate-popup signal. Notice that the
    703      * default button press event handler may still handle right
    704      * clicks for other reasons, such as in-page context menus, or
    705      * right-clicks that are handled by the page itself.
    706      *
    707      * Since: 1.1.18
    708      */
    709     g_object_class_install_property(gobject_class,
    710                                     PROP_ENABLE_DEFAULT_CONTEXT_MENU,
    711                                     g_param_spec_boolean(
    712                                     "enable-default-context-menu",
    713                                     _("Enable Default Context Menu"),
    714                                     _("Enables the handling of right-clicks for the creation of the default context menu"),
    715                                     TRUE,
    716                                     flags));
    717 
    718     /**
    719      * WebKitWebSettings::enable-site-specific-quirks
    720      *
    721      * Whether to turn on site-specific hacks.  Turning this on will
    722      * tell WebKitGTK+ to use some site-specific workarounds for
    723      * better web compatibility.  For example, older versions of
    724      * MediaWiki will incorrectly send WebKit a css file with KHTML
    725      * workarounds.  By turning on site-specific quirks, WebKit will
    726      * special-case this and other cases to make the sites work.
    727      *
    728      * Since: 1.1.18
    729      */
    730     g_object_class_install_property(gobject_class,
    731                                     PROP_ENABLE_SITE_SPECIFIC_QUIRKS,
    732                                     g_param_spec_boolean(
    733                                     "enable-site-specific-quirks",
    734                                     _("Enable Site Specific Quirks"),
    735                                     _("Enables the site-specific compatibility workarounds"),
    736                                     FALSE,
    737                                     flags));
    738 
    739     /**
    740     * WebKitWebSettings:enable-page-cache:
    741     *
    742     * Enable or disable the page cache. Disabling the page cache is
    743     * generally only useful for special circumstances like low-memory
    744     * scenarios or special purpose applications like static HTML
    745     * viewers. This setting only controls the Page Cache, this cache
    746     * is different than the disk-based or memory-based traditional
    747     * resource caches, its point is to make going back and forth
    748     * between pages much faster. For details about the different types
    749     * of caches and their purposes see:
    750     * http://webkit.org/blog/427/webkit-page-cache-i-the-basics/
    751     *
    752     * Since: 1.1.18
    753     */
    754     g_object_class_install_property(gobject_class,
    755                                     PROP_ENABLE_PAGE_CACHE,
    756                                     g_param_spec_boolean("enable-page-cache",
    757                                                          _("Enable page cache"),
    758                                                          _("Whether the page cache should be used"),
    759                                                          FALSE,
    760                                                          flags));
    761 
    762     g_type_class_add_private(klass, sizeof(WebKitWebSettingsPrivate));
    763 }
    764 
    765 static void webkit_web_settings_init(WebKitWebSettings* web_settings)
    766 {
    767     web_settings->priv = WEBKIT_WEB_SETTINGS_GET_PRIVATE(web_settings);
    768 }
    769 
    770 static void free_spell_checking_language(gpointer data, gpointer user_data)
    771 {
    772     SpellLanguage* language = static_cast<SpellLanguage*>(data);
    773     if (language->config) {
    774         if (language->speller)
    775             enchant_broker_free_dict(language->config, language->speller);
    776 
    777         enchant_broker_free(language->config);
    778     }
    779     g_slice_free(SpellLanguage, language);
    780 }
    781 
    782 static void webkit_web_settings_finalize(GObject* object)
    783 {
    784     WebKitWebSettings* web_settings = WEBKIT_WEB_SETTINGS(object);
    785     WebKitWebSettingsPrivate* priv = web_settings->priv;
    786 
    787     g_free(priv->default_encoding);
    788     g_free(priv->cursive_font_family);
    789     g_free(priv->default_font_family);
    790     g_free(priv->fantasy_font_family);
    791     g_free(priv->monospace_font_family);
    792     g_free(priv->sans_serif_font_family);
    793     g_free(priv->serif_font_family);
    794     g_free(priv->user_stylesheet_uri);
    795     g_free(priv->spell_checking_languages);
    796 
    797     g_slist_foreach(priv->spell_checking_languages_list, free_spell_checking_language, NULL);
    798     g_slist_free(priv->spell_checking_languages_list);
    799 
    800     g_free(priv->user_agent);
    801 
    802     G_OBJECT_CLASS(webkit_web_settings_parent_class)->finalize(object);
    803 }
    804 
    805 static void webkit_web_settings_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec)
    806 {
    807     WebKitWebSettings* web_settings = WEBKIT_WEB_SETTINGS(object);
    808     WebKitWebSettingsPrivate* priv = web_settings->priv;
    809     EnchantBroker* broker;
    810     SpellLanguage* lang;
    811     GSList* spellLanguages = NULL;
    812 
    813     switch(prop_id) {
    814     case PROP_DEFAULT_ENCODING:
    815         g_free(priv->default_encoding);
    816         priv->default_encoding = g_strdup(g_value_get_string(value));
    817         break;
    818     case PROP_CURSIVE_FONT_FAMILY:
    819         g_free(priv->cursive_font_family);
    820         priv->cursive_font_family = g_strdup(g_value_get_string(value));
    821         break;
    822     case PROP_DEFAULT_FONT_FAMILY:
    823         g_free(priv->default_font_family);
    824         priv->default_font_family = g_strdup(g_value_get_string(value));
    825         break;
    826     case PROP_FANTASY_FONT_FAMILY:
    827         g_free(priv->fantasy_font_family);
    828         priv->fantasy_font_family = g_strdup(g_value_get_string(value));
    829         break;
    830     case PROP_MONOSPACE_FONT_FAMILY:
    831         g_free(priv->monospace_font_family);
    832         priv->monospace_font_family = g_strdup(g_value_get_string(value));
    833         break;
    834     case PROP_SANS_SERIF_FONT_FAMILY:
    835         g_free(priv->sans_serif_font_family);
    836         priv->sans_serif_font_family = g_strdup(g_value_get_string(value));
    837         break;
    838     case PROP_SERIF_FONT_FAMILY:
    839         g_free(priv->serif_font_family);
    840         priv->serif_font_family = g_strdup(g_value_get_string(value));
    841         break;
    842     case PROP_DEFAULT_FONT_SIZE:
    843         priv->default_font_size = g_value_get_int(value);
    844         break;
    845     case PROP_DEFAULT_MONOSPACE_FONT_SIZE:
    846         priv->default_monospace_font_size = g_value_get_int(value);
    847         break;
    848     case PROP_MINIMUM_FONT_SIZE:
    849         priv->minimum_font_size = g_value_get_int(value);
    850         break;
    851     case PROP_MINIMUM_LOGICAL_FONT_SIZE:
    852         priv->minimum_logical_font_size = g_value_get_int(value);
    853         break;
    854     case PROP_ENFORCE_96_DPI:
    855         priv->enforce_96_dpi = g_value_get_boolean(value);
    856         break;
    857     case PROP_AUTO_LOAD_IMAGES:
    858         priv->auto_load_images = g_value_get_boolean(value);
    859         break;
    860     case PROP_AUTO_SHRINK_IMAGES:
    861         priv->auto_shrink_images = g_value_get_boolean(value);
    862         break;
    863     case PROP_PRINT_BACKGROUNDS:
    864         priv->print_backgrounds = g_value_get_boolean(value);
    865         break;
    866     case PROP_ENABLE_SCRIPTS:
    867         priv->enable_scripts = g_value_get_boolean(value);
    868         break;
    869     case PROP_ENABLE_PLUGINS:
    870         priv->enable_plugins = g_value_get_boolean(value);
    871         break;
    872     case PROP_RESIZABLE_TEXT_AREAS:
    873         priv->resizable_text_areas = g_value_get_boolean(value);
    874         break;
    875     case PROP_USER_STYLESHEET_URI:
    876         g_free(priv->user_stylesheet_uri);
    877         priv->user_stylesheet_uri = g_strdup(g_value_get_string(value));
    878         break;
    879     case PROP_ZOOM_STEP:
    880         priv->zoom_step = g_value_get_float(value);
    881         break;
    882     case PROP_ENABLE_DEVELOPER_EXTRAS:
    883         priv->enable_developer_extras = g_value_get_boolean(value);
    884         break;
    885     case PROP_ENABLE_PRIVATE_BROWSING:
    886         priv->enable_private_browsing = g_value_get_boolean(value);
    887         break;
    888     case PROP_ENABLE_CARET_BROWSING:
    889         priv->enable_caret_browsing = g_value_get_boolean(value);
    890         break;
    891     case PROP_ENABLE_HTML5_DATABASE:
    892         priv->enable_html5_database = g_value_get_boolean(value);
    893         break;
    894     case PROP_ENABLE_HTML5_LOCAL_STORAGE:
    895         priv->enable_html5_local_storage = g_value_get_boolean(value);
    896         break;
    897     case PROP_ENABLE_SPELL_CHECKING:
    898         priv->enable_spell_checking = g_value_get_boolean(value);
    899         break;
    900     case PROP_SPELL_CHECKING_LANGUAGES:
    901         priv->spell_checking_languages = g_strdup(g_value_get_string(value));
    902 
    903         broker = enchant_broker_init();
    904         if (priv->spell_checking_languages) {
    905             char** langs = g_strsplit(priv->spell_checking_languages, ",", -1);
    906             for (int i = 0; langs[i]; i++) {
    907                 if (enchant_broker_dict_exists(broker, langs[i])) {
    908                     lang = g_slice_new0(SpellLanguage);
    909                     lang->config = enchant_broker_init();
    910                     lang->speller = enchant_broker_request_dict(lang->config, langs[i]);
    911 
    912                     spellLanguages = g_slist_append(spellLanguages, lang);
    913                 }
    914             }
    915 
    916             g_strfreev(langs);
    917         } else {
    918             const char* language = pango_language_to_string(gtk_get_default_language());
    919 
    920             if (enchant_broker_dict_exists(broker, language)) {
    921                 lang = g_slice_new0(SpellLanguage);
    922                 lang->config = enchant_broker_init();
    923                 lang->speller = enchant_broker_request_dict(lang->config, language);
    924 
    925                 spellLanguages = g_slist_append(spellLanguages, lang);
    926             }
    927         }
    928         enchant_broker_free(broker);
    929         g_slist_foreach(priv->spell_checking_languages_list, free_spell_checking_language, NULL);
    930         g_slist_free(priv->spell_checking_languages_list);
    931         priv->spell_checking_languages_list = spellLanguages;
    932         break;
    933     case PROP_ENABLE_XSS_AUDITOR:
    934         priv->enable_xss_auditor = g_value_get_boolean(value);
    935         break;
    936     case PROP_USER_AGENT:
    937         g_free(priv->user_agent);
    938         if (!g_value_get_string(value) || !strlen(g_value_get_string(value)))
    939             priv->user_agent = g_strdup(webkit_get_user_agent().utf8().data());
    940         else
    941             priv->user_agent = g_strdup(g_value_get_string(value));
    942         break;
    943     case PROP_JAVASCRIPT_CAN_OPEN_WINDOWS_AUTOMATICALLY:
    944         priv->javascript_can_open_windows_automatically = g_value_get_boolean(value);
    945         break;
    946     case PROP_ENABLE_OFFLINE_WEB_APPLICATION_CACHE:
    947         priv->enable_offline_web_application_cache = g_value_get_boolean(value);
    948         break;
    949     case PROP_EDITING_BEHAVIOR:
    950         priv->editing_behavior = static_cast<WebKitEditingBehavior>(g_value_get_enum(value));
    951         break;
    952     case PROP_ENABLE_UNIVERSAL_ACCESS_FROM_FILE_URIS:
    953         priv->enable_universal_access_from_file_uris = g_value_get_boolean(value);
    954         break;
    955     case PROP_ENABLE_DOM_PASTE:
    956         priv->enable_dom_paste = g_value_get_boolean(value);
    957         break;
    958     case PROP_TAB_KEY_CYCLES_THROUGH_ELEMENTS:
    959         priv->tab_key_cycles_through_elements = g_value_get_boolean(value);
    960         break;
    961     case PROP_ENABLE_DEFAULT_CONTEXT_MENU:
    962         priv->enable_default_context_menu = g_value_get_boolean(value);
    963         break;
    964     case PROP_ENABLE_SITE_SPECIFIC_QUIRKS:
    965         priv->enable_site_specific_quirks = g_value_get_boolean(value);
    966         break;
    967     case PROP_ENABLE_PAGE_CACHE:
    968         priv->enable_page_cache = g_value_get_boolean(value);
    969         break;
    970     default:
    971         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
    972         break;
    973     }
    974 }
    975 
    976 static void webkit_web_settings_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec)
    977 {
    978     WebKitWebSettings* web_settings = WEBKIT_WEB_SETTINGS(object);
    979     WebKitWebSettingsPrivate* priv = web_settings->priv;
    980 
    981     switch (prop_id) {
    982     case PROP_DEFAULT_ENCODING:
    983         g_value_set_string(value, priv->default_encoding);
    984         break;
    985     case PROP_CURSIVE_FONT_FAMILY:
    986         g_value_set_string(value, priv->cursive_font_family);
    987         break;
    988     case PROP_DEFAULT_FONT_FAMILY:
    989         g_value_set_string(value, priv->default_font_family);
    990         break;
    991     case PROP_FANTASY_FONT_FAMILY:
    992         g_value_set_string(value, priv->fantasy_font_family);
    993         break;
    994     case PROP_MONOSPACE_FONT_FAMILY:
    995         g_value_set_string(value, priv->monospace_font_family);
    996         break;
    997     case PROP_SANS_SERIF_FONT_FAMILY:
    998         g_value_set_string(value, priv->sans_serif_font_family);
    999         break;
   1000     case PROP_SERIF_FONT_FAMILY:
   1001         g_value_set_string(value, priv->serif_font_family);
   1002         break;
   1003     case PROP_DEFAULT_FONT_SIZE:
   1004         g_value_set_int(value, priv->default_font_size);
   1005         break;
   1006     case PROP_DEFAULT_MONOSPACE_FONT_SIZE:
   1007         g_value_set_int(value, priv->default_monospace_font_size);
   1008         break;
   1009     case PROP_MINIMUM_FONT_SIZE:
   1010         g_value_set_int(value, priv->minimum_font_size);
   1011         break;
   1012     case PROP_MINIMUM_LOGICAL_FONT_SIZE:
   1013         g_value_set_int(value, priv->minimum_logical_font_size);
   1014         break;
   1015     case PROP_ENFORCE_96_DPI:
   1016         g_value_set_boolean(value, priv->enforce_96_dpi);
   1017         break;
   1018     case PROP_AUTO_LOAD_IMAGES:
   1019         g_value_set_boolean(value, priv->auto_load_images);
   1020         break;
   1021     case PROP_AUTO_SHRINK_IMAGES:
   1022         g_value_set_boolean(value, priv->auto_shrink_images);
   1023         break;
   1024     case PROP_PRINT_BACKGROUNDS:
   1025         g_value_set_boolean(value, priv->print_backgrounds);
   1026         break;
   1027     case PROP_ENABLE_SCRIPTS:
   1028         g_value_set_boolean(value, priv->enable_scripts);
   1029         break;
   1030     case PROP_ENABLE_PLUGINS:
   1031         g_value_set_boolean(value, priv->enable_plugins);
   1032         break;
   1033     case PROP_RESIZABLE_TEXT_AREAS:
   1034         g_value_set_boolean(value, priv->resizable_text_areas);
   1035         break;
   1036     case PROP_USER_STYLESHEET_URI:
   1037         g_value_set_string(value, priv->user_stylesheet_uri);
   1038         break;
   1039     case PROP_ZOOM_STEP:
   1040         g_value_set_float(value, priv->zoom_step);
   1041         break;
   1042     case PROP_ENABLE_DEVELOPER_EXTRAS:
   1043         g_value_set_boolean(value, priv->enable_developer_extras);
   1044         break;
   1045     case PROP_ENABLE_PRIVATE_BROWSING:
   1046         g_value_set_boolean(value, priv->enable_private_browsing);
   1047         break;
   1048     case PROP_ENABLE_CARET_BROWSING:
   1049         g_value_set_boolean(value, priv->enable_caret_browsing);
   1050         break;
   1051     case PROP_ENABLE_HTML5_DATABASE:
   1052         g_value_set_boolean(value, priv->enable_html5_database);
   1053         break;
   1054     case PROP_ENABLE_HTML5_LOCAL_STORAGE:
   1055         g_value_set_boolean(value, priv->enable_html5_local_storage);
   1056         break;
   1057     case PROP_ENABLE_SPELL_CHECKING:
   1058         g_value_set_boolean(value, priv->enable_spell_checking);
   1059         break;
   1060     case PROP_SPELL_CHECKING_LANGUAGES:
   1061         g_value_set_string(value, priv->spell_checking_languages);
   1062         break;
   1063     case PROP_ENABLE_XSS_AUDITOR:
   1064         g_value_set_boolean(value, priv->enable_xss_auditor);
   1065         break;
   1066     case PROP_USER_AGENT:
   1067         g_value_set_string(value, priv->user_agent);
   1068         break;
   1069     case PROP_JAVASCRIPT_CAN_OPEN_WINDOWS_AUTOMATICALLY:
   1070         g_value_set_boolean(value, priv->javascript_can_open_windows_automatically);
   1071         break;
   1072    case PROP_ENABLE_OFFLINE_WEB_APPLICATION_CACHE:
   1073         g_value_set_boolean(value, priv->enable_offline_web_application_cache);
   1074         break;
   1075     case PROP_EDITING_BEHAVIOR:
   1076         g_value_set_enum(value, priv->editing_behavior);
   1077         break;
   1078    case PROP_ENABLE_UNIVERSAL_ACCESS_FROM_FILE_URIS:
   1079         g_value_set_boolean(value, priv->enable_universal_access_from_file_uris);
   1080         break;
   1081     case PROP_ENABLE_DOM_PASTE:
   1082         g_value_set_boolean(value, priv->enable_dom_paste);
   1083         break;
   1084     case PROP_TAB_KEY_CYCLES_THROUGH_ELEMENTS:
   1085         g_value_set_boolean(value, priv->tab_key_cycles_through_elements);
   1086         break;
   1087     case PROP_ENABLE_DEFAULT_CONTEXT_MENU:
   1088         g_value_set_boolean(value, priv->enable_default_context_menu);
   1089         break;
   1090     case PROP_ENABLE_SITE_SPECIFIC_QUIRKS:
   1091         g_value_set_boolean(value, priv->enable_site_specific_quirks);
   1092         break;
   1093     case PROP_ENABLE_PAGE_CACHE:
   1094         g_value_set_boolean(value, priv->enable_page_cache);
   1095         break;
   1096     default:
   1097         G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec);
   1098         break;
   1099     }
   1100 }
   1101 
   1102 /**
   1103  * webkit_web_settings_new:
   1104  *
   1105  * Creates a new #WebKitWebSettings instance with default values. It must
   1106  * be manually attached to a WebView.
   1107  *
   1108  * Returns: a new #WebKitWebSettings instance
   1109  **/
   1110 WebKitWebSettings* webkit_web_settings_new()
   1111 {
   1112     return WEBKIT_WEB_SETTINGS(g_object_new(WEBKIT_TYPE_WEB_SETTINGS, NULL));
   1113 }
   1114 
   1115 /**
   1116  * webkit_web_settings_copy:
   1117  *
   1118  * Copies an existing #WebKitWebSettings instance.
   1119  *
   1120  * Returns: a new #WebKitWebSettings instance
   1121  **/
   1122 WebKitWebSettings* webkit_web_settings_copy(WebKitWebSettings* web_settings)
   1123 {
   1124     WebKitWebSettingsPrivate* priv = web_settings->priv;
   1125 
   1126     WebKitWebSettings* copy = WEBKIT_WEB_SETTINGS(g_object_new(WEBKIT_TYPE_WEB_SETTINGS,
   1127                  "default-encoding", priv->default_encoding,
   1128                  "cursive-font-family", priv->cursive_font_family,
   1129                  "default-font-family", priv->default_font_family,
   1130                  "fantasy-font-family", priv->fantasy_font_family,
   1131                  "monospace-font-family", priv->monospace_font_family,
   1132                  "sans-serif-font-family", priv->sans_serif_font_family,
   1133                  "serif-font-family", priv->serif_font_family,
   1134                  "default-font-size", priv->default_font_size,
   1135                  "default-monospace-font-size", priv->default_monospace_font_size,
   1136                  "minimum-font-size", priv->minimum_font_size,
   1137                  "minimum-logical-font-size", priv->minimum_logical_font_size,
   1138                  "auto-load-images", priv->auto_load_images,
   1139                  "auto-shrink-images", priv->auto_shrink_images,
   1140                  "print-backgrounds", priv->print_backgrounds,
   1141                  "enable-scripts", priv->enable_scripts,
   1142                  "enable-plugins", priv->enable_plugins,
   1143                  "resizable-text-areas", priv->resizable_text_areas,
   1144                  "user-stylesheet-uri", priv->user_stylesheet_uri,
   1145                  "zoom-step", priv->zoom_step,
   1146                  "enable-developer-extras", priv->enable_developer_extras,
   1147                  "enable-private-browsing", priv->enable_private_browsing,
   1148                  "enable-spell-checking", priv->enable_spell_checking,
   1149                  "spell-checking-languages", priv->spell_checking_languages,
   1150                  "spell-checking-languages-list", priv->spell_checking_languages_list,
   1151                  "enable-caret-browsing", priv->enable_caret_browsing,
   1152                  "enable-html5-database", priv->enable_html5_database,
   1153                  "enable-html5-local-storage", priv->enable_html5_local_storage,
   1154                  "enable-xss-auditor", priv->enable_xss_auditor,
   1155                  "user-agent", webkit_web_settings_get_user_agent(web_settings),
   1156                  "javascript-can-open-windows-automatically", priv->javascript_can_open_windows_automatically,
   1157                  "enable-offline-web-application-cache", priv->enable_offline_web_application_cache,
   1158                  "editing-behavior", priv->editing_behavior,
   1159                  "enable-universal-access-from-file-uris", priv->enable_universal_access_from_file_uris,
   1160                  "enable-dom-paste", priv->enable_dom_paste,
   1161                  "tab-key-cycles-through-elements", priv->tab_key_cycles_through_elements,
   1162                  "enable-default-context-menu", priv->enable_default_context_menu,
   1163                  "enable-site-specific-quirks", priv->enable_site_specific_quirks,
   1164                  "enable-page-cache", priv->enable_page_cache,
   1165                  NULL));
   1166 
   1167     return copy;
   1168 }
   1169 
   1170 /**
   1171  * webkit_web_settings_add_extra_plugin_directory:
   1172  * @web_view: a #WebKitWebView
   1173  * @directory: the directory to add
   1174  *
   1175  * Adds the @directory to paths where @web_view will search for plugins.
   1176  *
   1177  * Since: 1.0.3
   1178  */
   1179 void webkit_web_settings_add_extra_plugin_directory(WebKitWebView* webView, const gchar* directory)
   1180 {
   1181     g_return_if_fail(WEBKIT_IS_WEB_VIEW(webView));
   1182 
   1183     PluginDatabase::installedPlugins()->addExtraPluginDirectory(filenameToString(directory));
   1184 }
   1185 
   1186 /**
   1187  * webkit_web_settings_get_spell_languages:
   1188  * @web_view: a #WebKitWebView
   1189  *
   1190  * Internal use only. Retrieves a GSList of SpellLanguages from the
   1191  * #WebKitWebSettings of @web_view.
   1192  *
   1193  * Since: 1.1.6
   1194  */
   1195 GSList* webkit_web_settings_get_spell_languages(WebKitWebView *web_view)
   1196 {
   1197     g_return_val_if_fail(WEBKIT_IS_WEB_VIEW(web_view), 0);
   1198 
   1199     WebKitWebSettings* settings = webkit_web_view_get_settings(web_view);
   1200     WebKitWebSettingsPrivate* priv = settings->priv;
   1201     GSList* list = priv->spell_checking_languages_list;
   1202 
   1203     return list;
   1204 }
   1205 
   1206 /**
   1207  * webkit_web_settings_get_user_agent:
   1208  * @web_settings: a #WebKitWebSettings
   1209  *
   1210  * Returns the User-Agent string currently used by the web view(s) associated
   1211  * with the @web_settings.
   1212  *
   1213  * Since: 1.1.11
   1214  */
   1215 G_CONST_RETURN gchar* webkit_web_settings_get_user_agent(WebKitWebSettings* webSettings)
   1216 {
   1217     g_return_val_if_fail(WEBKIT_IS_WEB_SETTINGS(webSettings), NULL);
   1218 
   1219     WebKitWebSettingsPrivate* priv = webSettings->priv;
   1220 
   1221     return priv->user_agent;
   1222 }
   1223