diff --git a/lib/CookieChanger.js b/lib/CookieChanger.js index 9661550..0bc154f 100644 --- a/lib/CookieChanger.js +++ b/lib/CookieChanger.js @@ -4,6 +4,7 @@ const {Ci} = require("chrome"); // export CookieChanger exports.CookieChanger = CookieChanger; exports.Cookies = Cookies; +exports.modifyPrefCookie = modifyPrefCookie; // save all CookieChangers var listeners = []; @@ -89,6 +90,34 @@ Cookies.prototype.set = function(key, value) { } +/** + * Set single keys in the PREF cookie used by youtube to store settings + * + * @param cookies Cookies The cookies instance to modify + * @param key string The key to set or replace if existing, eg. "f2" + * @param value string The value for the given key + */ +function modifyPrefCookie(cookies, key, value) { + var entry = key + "=" + value; + + if(cookies.has("PREF")) { + var pref = cookies.get("PREF"); + var pattern = new RegExp(key + "=[^&]+"); + + if(pref.length == 0) { + pref = entry; + } else if(-1 == pref.search(pattern)) { + pref += "&" + entry; + } else { + pref = pref.replace(pattern, entry); + } + cookies.set("PREF", pref); + } else { + cookies.set("PREF", entry); + } +} + + // Event listener that calls the other registered listeners based on // the active state and the given hostname. // The cookie header is only parsed when at least one callback is applicable. diff --git a/lib/main.js b/lib/main.js index 5c8807b..ee48861 100644 --- a/lib/main.js +++ b/lib/main.js @@ -8,7 +8,7 @@ var tabs = require("sdk/tabs"); const {UserAgentChanger} = require("./UserAgentChanger"); const {URIChanger} = require("./URIChanger"); const {PluginPermissionChanger} = require("./PluginPermissionChanger"); -const {CookieChanger} = require("./CookieChanger"); +const {CookieChanger, modifyPrefCookie} = require("./CookieChanger"); // Internet Explorer 10 on Windows 7 const IEUserAgent = "Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/6.0)"; @@ -31,20 +31,7 @@ var youtubeTheaterMode = new CookieChanger("www.youtube.com", (cookies) => { cookies.set("wide", "1"); }); var youtubeHTML5Test = new CookieChanger("www.youtube.com", (cookies) => { - if(cookies.has("PREF")) { - var pref = cookies.get("PREF"); - var pattern = /f2=\d+/; - if(pref.length == 0) { - pref = "f2=40000000"; - } else if(-1 == pref.search(pattern)) { - pref += "&f2=40000000"; - } else { - pref = pref.replace(pattern, "f2=40000000"); - } - cookies.set("PREF", pref); - } else { - cookies.set("PREF", "f2=40000000"); - } + modifyPrefCookie(cookies, "f2", "40000000"); }); function createContextMenuEntry() { diff --git a/test/test-cookies.js b/test/test-cookies.js index d06ba52..6b48d1b 100644 --- a/test/test-cookies.js +++ b/test/test-cookies.js @@ -25,4 +25,22 @@ exports.testCookieParsing = (assert) => { assert.equal(t("a=1; abc; b=2"), "a=1; b=2"); }; +exports.testModifyPref = (assert) => { + var t = (testcase, key, value) => { + var cookies = new Cookies(testcase); + modifyPrefCookie(cookies, key, value); + return cookies.unparse(); + }; + + var t1 = "PREF=f1=abc&f2=999"; + assert.equal(t(t1, "f1", "1234"), "PREF=f1=1234&f2=999"); + assert.equal(t(t1, "f2", "abcd"), "PREF=f1=abc&f2=abcd"); + assert.equal(t(t1, "f3", "123"), "PREF=f1=abc&f2=999&f3=123"); + assert.equal(t(t1, "f1", ""), "PREF=f1=&f2=999"); + assert.equal(t(t1, "f2", ""), "PREF=f1=abc&f2="); + + assert.equal(t("PREF=", "f2", "1"), "PREF=f2=1"); + assert.equal(t("", "f2", "1"), "PREF=f2=1"); +}; + require('sdk/test').run(exports);