Only apply parameters when needed
[surf.git] / surf.c
diff --git a/surf.c b/surf.c
index 694eff8..d9b7987 100644 (file)
--- a/surf.c
+++ b/surf.c
@@ -92,7 +92,7 @@ typedef enum {
        StrictTLS,
        Style,
        ZoomLevel,
-       ParameterLast,
+       ParameterLast
 } ParamName;
 
 typedef union {
@@ -170,7 +170,7 @@ static void gettogglestats(Client *c);
 static void getpagestats(Client *c);
 static WebKitCookieAcceptPolicy cookiepolicy_get(void);
 static char cookiepolicy_set(const WebKitCookieAcceptPolicy p);
-static void seturiparameters(Client *c, const char *uri);
+static void seturiparameters(Client *c, const char *uri, ParamName *params);
 static void setparameter(Client *c, int refresh, ParamName p, const Arg *a);
 static const char *getcert(const char *uri);
 static void setcert(Client *c, const char *file);
@@ -256,6 +256,50 @@ static const char *useragent;
 static Parameter *curconfig;
 char *argv0;
 
+static ParamName loadtransient[] = {
+       Certificate,
+       CookiePolicies,
+       DiskCache,
+       DNSPrefetch,
+       FileURLsCrossAccess,
+       JavaScript,
+       LoadImages,
+       PreferredLanguages,
+       ShowIndicators,
+       StrictTLS,
+       ParameterLast
+};
+
+static ParamName loadcommitted[] = {
+       AcceleratedCanvas,
+//     AccessMicrophone,
+//     AccessWebcam,
+       CaretBrowsing,
+       DefaultCharset,
+       FontSize,
+       FrameFlattening,
+       Geolocation,
+       HideBackground,
+       Inspector,
+       Java,
+//     KioskMode,
+       MediaManualPlay,
+       Plugins,
+       RunInFullscreen,
+       ScrollBars,
+       SiteQuirks,
+       SmoothScrolling,
+       SpellChecking,
+       SpellLanguages,
+       Style,
+       ZoomLevel,
+       ParameterLast
+};
+
+static ParamName loadfinished[] = {
+       ParameterLast
+};
+
 /* configuration, allows nested code to access above variables */
 #include "config.h"
 
@@ -641,10 +685,10 @@ cookiepolicy_set(const WebKitCookieAcceptPolicy p)
 }
 
 void
-seturiparameters(Client *c, const char *uri)
+seturiparameters(Client *c, const char *uri, ParamName *params)
 {
-       Parameter *newconfig = NULL;
-       int i;
+       Parameter *config, *newconfig = NULL;
+       int i, p;
 
        for (i = 0; i < LENGTH(uriparams); ++i) {
                if (uriparams[i].uri &&
@@ -656,16 +700,26 @@ seturiparameters(Client *c, const char *uri)
 
        if (!newconfig)
                newconfig = defconfig;
-       if (newconfig == curconfig)
-               return;
 
-       for (i = 0; i < ParameterLast; ++i) {
-               if (defconfig[i].force)
-                       continue;
-               if (newconfig[i].force)
-                       setparameter(c, 0, i, &newconfig[i].val);
-               else if (curconfig[i].force)
-                       setparameter(c, 0, i, &defconfig[i].val);
+       for (i = 0; (p = params[i]) != ParameterLast; ++i) {
+               switch(p) {
+               case Certificate:
+               case CookiePolicies:
+               case Style:
+                       config = defconfig[p].force ? defconfig :
+                                newconfig[p].force ? newconfig :
+                                defconfig;
+                       break;
+               default:
+                       if (defconfig[p].force)
+                               continue;
+                       config = newconfig[p].force ? newconfig :
+                                curconfig[p].force ? defconfig :
+                                NULL;
+               }
+
+               if (config)
+                       setparameter(c, 0, p, &config[p].val);
        }
 
        curconfig = newconfig;
@@ -782,11 +836,10 @@ setparameter(Client *c, int refresh, ParamName p, const Arg *a)
                    WEBKIT_TLS_ERRORS_POLICY_IGNORE);
                break;
        case Style:
+               webkit_user_content_manager_remove_all_style_sheets(
+                   webkit_web_view_get_user_content_manager(c->view));
                if (a->b)
                        setstyle(c, getstyle(geturi(c)));
-               else
-                       webkit_user_content_manager_remove_all_style_sheets(
-                           webkit_web_view_get_user_content_manager(c->view));
                refresh = 0;
                break;
        case ZoomLevel:
@@ -1396,7 +1449,7 @@ loadchanged(WebKitWebView *v, WebKitLoadEvent e, Client *c)
                setatom(c, AtomUri, uri);
                c->title = uri;
                c->https = c->insecure = 0;
-               seturiparameters(c, uri);
+               seturiparameters(c, uri, loadtransient);
                if (c->errorpage)
                        c->errorpage = 0;
                else
@@ -1405,13 +1458,15 @@ loadchanged(WebKitWebView *v, WebKitLoadEvent e, Client *c)
        case WEBKIT_LOAD_REDIRECTED:
                setatom(c, AtomUri, uri);
                c->title = uri;
-               seturiparameters(c, uri);
+               seturiparameters(c, uri, loadtransient);
                break;
        case WEBKIT_LOAD_COMMITTED:
+               seturiparameters(c, uri, loadcommitted);
                c->https = webkit_web_view_get_tls_info(c->view, &c->cert,
                                                        &c->tlserr);
                break;
        case WEBKIT_LOAD_FINISHED:
+               seturiparameters(c, uri, loadfinished);
                /* Disabled until we write some WebKitWebExtension for
                 * manipulating the DOM directly.
                evalscript(c, "document.documentElement.style.overflow = '%s'",