Project

General

Profile

« Previous | Next » 

Revision 2059fab6

Added by jahoti about 2 years ago

Revamp default settings

Default settings are now provided in the same format as data exported from the
extension, incorporating them into the main program as part of the build
process. Also, modify their contents; the apparently non-functional FSF stuff
is gone, replaced with fixes for BandCamp, WorldCat, and SumOfUs.

View differences:

background/main.js
32 32

  
33 33
    /*
34 34
     * Below we add sample settings to the extension.
35
     * Those should be considered example values for viewing in the options
36
     * page. They won't make my.fsf.org work. The only scripts that does
37
     * something useful right now is the opencores one.
38 35
     */
39 36

  
40
    let components = [];
41
    for (let script_data of [
42
	{url: "http://127.0.0.1:8000/myfsf_define_CRM.js",
43
	 hash:"bf0cc81c7e8d5f800877b4bc3f14639f946f5ac6d4dc120255ffac5eba5e48fe"},
44
	{url: "https://my.fsf.org/misc/jquery.js?v=1.4.4",
45
	 hash:"261ae472fa0cbf27c80c9200a1599a60fde581a0e652eee4bf41def8cb61f2d0"},
46
	{url: "https://my.fsf.org/misc/jquery-extend-3.4.0.js?v=1.4.4",
47
	 hash:"c54103ba57ee210ca55c052e70415402707548a4e6a68dd6efb3895019bee392"},
48
	{url: "https://my.fsf.org/misc/jquery-html-prefilter-3.5.0-backport.js?v=1.4.4",
49
	 hash:"fad84efa145fb507e5df9b582fa01b1c4e6313de7f72ebdd55726d92fa4dbf06"},
50
	{url: "https://my.fsf.org/misc/jquery.once.js?v=1.2",
51
	 hash:"1430f42c0d760ba8e05bb3762480502e541f654fec5739ee40625ab22dc38c4f"},
52
	{url: "https://my.fsf.org/misc/drupal.js?qmaukd",
53
	 hash:"2e08dccbd4d8b728a6871562995a4636b89bfe0ed3b8fb0138191c922228b116"},
54
	{url: "https://my.fsf.org/sites/all/modules/civicrm/bower_components/jquery/dist/jquery.min.js?qmaukd",
55
	 hash:"a6d01520d28d15dbe476de84eea90eb3ee2d058722efc062ec73cb5fad78a17b"},
56
	{url: "https://my.fsf.org/sites/all/modules/civicrm/bower_components/jquery-ui/jquery-ui.min.js?qmaukd",
57
	 hash:"28ce75d953678c4942df47a11707a15e3c756021cf89090e3e6aa7ad6b6971c3"},
58
	{url: "https://my.fsf.org/sites/all/modules/civicrm/bower_components/lodash-compat/lodash.min.js?qmaukd",
59
	 hash:"f2871cc80c52fe8c04c582c4a49797c9c8fd80391cf1452e47f7fe97835ed5cc"},
60
	{url: "https://my.fsf.org/sites/all/modules/civicrm/packages/jquery/plugins/jquery.mousewheel.min.js?qmaukd",
61
	 hash:"f50233e84c2ac7ada37a094d3f7d3b3f7c97716d6b7b47bf69619d93ee4ac1ce"},
62
	{url: "https://my.fsf.org/sites/all/modules/civicrm/bower_components/select2/select2.min.js?qmaukd",
63
	 hash:"ce61298fb9aa4ec49ccd4172d097e36a9e5db3af06a7b82796659368f15b7c1b"},
64
	{url: "https://my.fsf.org/sites/all/modules/civi crm/packages/jquery/plugins/jquery.form.min.js?qmaukd",
65
	 hash:"c90f0e501d2948fbc2b61bffd654fa4ab64741fd48923782419eeb14d3816fb8"},
66
	{url: "https://my.fsf.org/sites/all/modules/civicrm/packages/jquery/plugins/jquery.timeentry.min.js?qmaukd",
67
	 hash:"8e85df981e8ad7049d06dfb075277d038734d36a7097c7f021021b2bdccfe9bb"},
68
	{url: "https://my.fsf.org/sites/all/modules/civicrm/packages/jquery/plugins/jquery.blockUI.min.js?qmaukd",
69
	 hash:"806aedff52ac822f2adc5797073e1e5c5cec32eb9f15f2319cb32a347dcd232b"},
70
	{url: "https://my.fsf.org/sites/all/modules/civicrm/bower_components/datatables/media/js/jquery.dataTables.min.js?qmaukd",
71
	 hash:"b796504d9b1b422f0dc6ccc2d740ac78a8c9e5078cc3934836d39742b1121925"},
72
	{url: "https://my.fsf.org/sites/all/modules/civicrm/bower_components/jquery-validation/dist/jquery.validate.min.js?qmaukd",
73
	 hash:"f0f5373ad203101ea91bf826c5a7ef8f7cd74887f06bad2cb9277a504503b9e2"},
74
	{url: "https://my.fsf.org/sites/all/modules/civicrm/packages/jquery/plugins/jquery.ui.datepicker.validation.min.js?qmaukd",
75
	 hash:"c6e6f6bf7f8fff25cca338045774e267e8eaa2d48ac9100540f3d59a6d2b3c61"},
76
	{url: "https://my.fsf.org/sites/all/modules/civicrm/js/Common.js?qmaukd",
77
	 hash:"17aa222a3af2e8958be16accb5e77ef39f67009cb3b500718d8fffd45b399148"},
78
	{url: "https://my.fsf.org/sites/all/modules/civicrm/js/crm.datepicker.js?qmaukd",
79
	 hash:"9bd8d10208aa99c156325f7819da6f0dd62ba221ac4119c3ccd4834e2cf36535"},
80
	{url: "https://my.fsf.org/sites/all/modules/civicrm/js/crm.ajax.js?qmaukd",
81
	 hash:"6401a4e257b7499ae4a00be2c200e4504a2c9b3d6b278a830c31a7b63374f0fe"},
82
	{url: "https://my.fsf.org/sites/all/modules/civicrm/js/wysiwyg/crm.wysiwyg.js?qmaukd",
83
	 hash:"fa962356072a36672c3b4b25bdeb657f020995a067e20a29cd5bb84b05157762"},
84
	{url: "https://my.fsf.org/sites/all/modules/civicrm/js/noconflict.js?qmaukd",
85
	 hash:"58d6d9f496a235d23cf891926d71f2104e4f2afe1d14bb4e2b5233f646c35e62"},
86
	{url: "https://my.fsf.org/sites/all/modules/matomo/matomo.js?qmaukd",
87
	 hash:"7f39ccd085f348189cd2fb62ea4d4a658d96f6bba266265880b98605e777e2de"},
88
	{url: "https://my.fsf.org/sites/all/themes/fsf_venture/js/global.js?qmaukd",
89
	 hash:"aa7983f6b902f9f4415cfc8346e0c3f194cc95b78f52f2ad09ec7effa1326b9c"},
90
	{url: "https://my.fsf.org/sites/all/themes/fsf_venture/js/jquery.superfish.min.js?qmaukd",
91
	 hash:"5ef1f93bf3901227056bf9ed0ed93a148eec4dda30f419756b12bedd1098815e"},
92
	{url: "https://my.fsf.org/sites/all/themes/fsf_venture/js/jquery.sidr.min.js?qmaukd",
93
	 hash:"c4914d415826676c6af2e61f16edb72c5388f8600ba6de9049892aee49d980a0"},
94
	{url: "https://my.fsf.org/sites/all/themes/fsf_venture/js/jquery.flexslider.min.js?qmaukd",
95
	 hash:"cefaf715761b4494913851249b9d40dacb4a8cb61242b0efc859dc586d56e0d4"},
96
	{url: "http://127.0.0.1:8000/myfsf_crap.js",
97
	 hash:"d91ccf21592d0f861ea0ba946bc257fc5d88269327cad0a91387da6cb8ff633e"},
98
	{url: "https://my.fsf.org/sites/all/modules/civicrm/templates/CRM/Core/BillingBlock.js?r=lp7Di",
99
	 hash:"2f25d35e7a0c0060ab0a444a577f09dd3c9934ae898a7ee0eb20b6c986ab5a1c"},
100
	{url: "https://my.fsf.org/extensions/com.aghstrategies.giftmemberships/js/giftpricefield.js?r=lp7Di",
101
	 hash:"f86080e6bd306fe46474039aeca2808235005bce5a2a29416d08210022039a45"},
102
	{url: "https://my.fsf.org/extensions/com.ginkgostreet.negativenegator/js/negativenegator.js?r=lp7Di",
103
	 hash:"d0e87bac832856db70947d82a7ab4e0b7c8b1070d5f1a32335345e033ece3a14"}
104
    ]) {
105
	let name_regex = /\/([^/]+)\.js/;
106
	let name = name_regex.exec(script_data.url)[1];
107
	await storage.set(TYPE_PREFIX.SCRIPT, name, script_data);
108
	components.push([TYPE_PREFIX.SCRIPT, name]);
37
    for (let setting of // The next line is replaced with the contents of /default_settings.json by the build script
38
        `DEFAULT SETTINGS`
39
    ) {
40
	let [key, value] = Object.entries(setting)[0];
41
	storage.set(key[0], key.substring(1), value);
109 42
    }
110

  
111
    await storage.set(TYPE_PREFIX.BAG, "myfsf_join", components);
112

  
113
    await storage.set(TYPE_PREFIX.PAGE, "https://my.fsf.org/join", {
114
	components: [TYPE_PREFIX.BAG, "myfsf_join"]
115
    });
116

  
117
    let hello_script = {
118
	text: "console.log(\"hello, every1!\");\n"
119
    };
120
    await storage.set(TYPE_PREFIX.SCRIPT, "hello", hello_script);
121
    await storage.set(TYPE_PREFIX.BAG, "hello",
122
		      [[TYPE_PREFIX.SCRIPT, "hello"]]);
123
    await storage.set(TYPE_PREFIX.PAGE, "https://my.fsf.org/", {
124
	components: [TYPE_PREFIX.BAG, "hello"],
125
	allow: true
126
    });
127

  
128
    let opencores_script = {
129
	text: `\
130
let data = JSON.parse(document.getElementById("__NEXT_DATA__").textContent);
131
let sections = {};
132
for (let h1 of document.getElementsByClassName("cMJCrc")) {
133
    let ul = document.createElement("ul");
134
    if (h1.nextElementSibling !== null)
135
	h1.parentNode.insertBefore(ul, h1.nextElementSibling);
136
    else
137
	h1.parentNode.appendChild(ul);
138

  
139
    sections[h1.children[1].firstChild.textContent] = ul;
140
}
141

  
142
for (let prop of data.props.pageProps.list) {
143
    let ul = sections[prop.category];
144
    if (ul === undefined) {
145
	console.log(\`unknown category "\${prop.category}" for project "\${prop.title}"\`);
146
	continue;
147
    }
148

  
149
    let li = document.createElement("li");
150
    let a = document.createElement("a");
151
    a.setAttribute("href", "/projects/" + prop.slug);
152
    a.textContent = prop.title;
153

  
154
    li.appendChild(a);
155
    ul.appendChild(li);
156
}
157
`
158
    };
159

  
160
    await storage.set(TYPE_PREFIX.SCRIPT, "opencores", opencores_script);
161
    await storage.set(TYPE_PREFIX.PAGE, "https://opencores.org/projects", {
162
	components: [TYPE_PREFIX.SCRIPT, "opencores"],
163
	allow: false
164
    });
165 43
}
166 44

  
167 45
browser.runtime.onInstalled.addListener(init_myext);
build.sh
271 271
(() => {
272 272
$(map_get IMPORTCODES $FILEKEY)
273 273

  
274
"; cat $FILE; echo "
274
";
275

  
276
# A hack to insert the contents of default_settings.json at the appropriate location in background/main.js
277
if [ "$FILE" = "background/main.js" ]; then
278
    # Uses an internal sed expression to escape and indent the JSON file for use in the external sed expression
279
    sed 's/^        `DEFAULT SETTINGS`$/'"$(sed -E 's/([\\\&\/])/\\\1/g; s/^/        /; s/$/\\/' < default_settings.json) "/g < "$FILE"
280
else
281
    cat $FILE
282
fi
283

  
284
echo "
275 285

  
276 286
$(map_get EXPORTCODES $FILEKEY)
277 287
})();") > $BUILDDIR/$FILE
default_settings.json
1
[
2
    {
3
	"sbandcamp": {
4
	    "text": "/*\n\tCopyright © 2021 jahoti (jahoti@tilde.team)\n\t\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use this file except in compliance with the License.\n\tYou may obtain a copy of the License at\n\t\n\t   http://www.apache.org/licenses/LICENSE-2.0\n\t\n\tUnless required by applicable law or agreed to in writing, software\n\tdistributed under the License is distributed on an \"AS IS\" BASIS,\n\tWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\tSee the License for the specific language governing permissions and\n\tlimitations under the License.\n*/\n\nvar div, player, playerBox = document.querySelector('.inline_player');\nplayerBox.innerHTML = '';\n\nfor (var track of JSON.parse(document.querySelector('[data-tralbum]').dataset.tralbum).trackinfo) {\n\tdiv = document.createElement('div');\n\tplayer = document.createElement('audio');\n\t\n\tdiv.innerText = track.title + ': ';\n\tplayer.src = track.file['mp3-128']; // Is this always available?\n\tdiv.append(player);\n\tplayerBox.append(div);\n}"
5
	}
6
    },
7
    {
8
	"sopencores": {
9
	    "text":"let data = JSON.parse(document.getElementById(\"__NEXT_DATA__\").textContent);\nlet sections = {};\nfor (let h1 of document.getElementsByClassName(\"cMJCrc\")) {\n    let ul = document.createElement(\"ul\");\n    if (h1.nextElementSibling !== null)\n\th1.parentNode.insertBefore(ul, h1.nextElementSibling);\n    else\n\th1.parentNode.appendChild(ul);\n\n    sections[h1.children[1].firstChild.textContent] = ul;\n}\n\nfor (let prop of data.props.pageProps.list) {\n    let ul = sections[prop.category];\n    if (ul === undefined) {\n\tconsole.log(`unknown category \"${prop.category}\" for project \"${prop.title}\"`);\n\tcontinue;\n    }\n\n    let li = document.createElement(\"li\");\n    let a = document.createElement(\"a\");\n    a.setAttribute(\"href\", \"/projects/\" + prop.slug);\n    a.textContent = prop.title;\n\n    li.appendChild(a);\n    ul.appendChild(li);\n}\n"
10
	}
11
    },
12
    {
13
	"ssumofus (sign petition)": {
14
	    "text": "/*\n\tCopyright © 2021 jahoti (jahoti@tilde.team)\n\t\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use this file except in compliance with the License.\n\tYou may obtain a copy of the License at\n\t\n\t   http://www.apache.org/licenses/LICENSE-2.0\n\t\n\tUnless required by applicable law or agreed to in writing, software\n\tdistributed under the License is distributed on an \"AS IS\" BASIS,\n\tWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\tSee the License for the specific language governing permissions and\n\tlimitations under the License.\n*/\n\nfunction submitFormItem() {\n\tvar name, val, queryString = '', xhr = new content.XMLHttpRequest();\n\tfor (var formItem of this.querySelectorAll('select, input:not([type=\"radio\"]):not([type=\"checkbox\"])' +\n\t\t':not([type=\"submit\"]):not([type=\"reset\"])')) {\n\t\tqueryString += (queryString && '&') + formItem.name + '=' + encodeURIComponent(formItem.value);\n\t}\n\t\n\txhr.onreadystatechange = function () {\n\t\tif (this.readyState === 4) {\n\t\t\tif (this.status === 200) location.href =  JSON.parse(this.responseText).follow_up_url;\n\t\t\telse if (this.status === 422) {\n\t\t\t\tvar failMessage = [], response = JSON.parse(this.responseText);\n\t\t\t\tfor (field in response.errors) for (error of response.errors[field]) {\n\t\t\t\t\tfailMessage.push('Field \"' + field + '\" ' + error);\n\t\t\t\t}\n\t\t\t\talert(failMessage.join('\\n'));\n\t\t\t}\n\t\t\telse alert('Submission failed: response code ' + this.status);\n\t\t}\n\t}\n\t\n\txhr.open('POST', this.action, true); // Manually add the domain, as it's not properly handled in extensions\n\txhr.setRequestHeader('X-CSRF-Token', csrf);\n\txhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');\n\txhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');\n\txhr.send(queryString);\n\treturn false;\n}\n\n// Apply CSS as necessary\nif (notice = document.querySelector('#petition-bar-main > span')) notice.style.display = 'none'; // Hide the totally mistaken (even without this extension) anti-anti-JS warning\ndocument.querySelector('.script-dependent').style.display = 'block';\ndocument.querySelector('.button-wrapper').style.position = 'static'; // Stop the \"submit\" button obscuring the form\n\n\n\ncsrf = document.querySelector('meta[name=\"csrf-token\"]').content\nfor (var button of document.querySelectorAll('button[type=\"submit\"].button.action-form__submit-button')) button.form.onsubmit = submitFormItem;"
15
	}
16
    },
17
    {
18
	"sworldcat (library holdings)": {
19
	    "text": "/*\n\tCopyright © 2021 jahoti (jahoti@tilde.team)\n\t\n\tLicensed under the Apache License, Version 2.0 (the \"License\");\n\tyou may not use this file except in compliance with the License.\n\tYou may obtain a copy of the License at\n\t\n\t   http://www.apache.org/licenses/LICENSE-2.0\n\t\n\tUnless required by applicable law or agreed to in writing, software\n\tdistributed under the License is distributed on an \"AS IS\" BASIS,\n\tWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n\tSee the License for the specific language governing permissions and\n\tlimitations under the License.\n*/\n\nvar pathParts = location.pathname.split('/'), itemRef = pathParts[pathParts.length - 1];\n\n// Generate a function which, when invoked, loads the catalog holdings starting at i (one-indexed) focused on loc\nfunction generateGoTo(i, set_loc) {\n\treturn function () {\n\t\t; // If this is a new search, \"set_loc\" won't be set; set it\n\t\tvar xhr = new content.XMLHttpRequest(), loc = set_loc || encodeURIComponent(locInput.value);\n\t\txhr.onreadystatechange = function () {\n\t\t\tif (this.readyState === 4) {\n\t\t\t\tif (this.status === 200) {\n\t\t\t\t\tretrieved.innerHTML = this.responseText;\n\t\t\t\t\t\n\t\t\t\t\tvar i, node = document.getElementById('libslocator');\n\t\t\t\t\tnode.parentNode.removeChild(node);\n\t\t\t\t\tfor (node of retrieved.querySelectorAll('a[href^=\"javascript:findLibs(\\'\\', \"]')) {\n\t\t\t\t\t\ti = parseInt(node.href.split(',', 2)[1]);\n\t\t\t\t\t\tnode.onclick = generateGoTo(i, loc);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse alert('Search failed: response code ' + this.status);\n\t\t\t}\n\t\t}\n\t\t\n\t\txhr.open('GET', 'https://www.worldcat.org/wcpa/servlet/org.oclc.lac.ui.ajax.ServiceServlet?wcoclcnum=' + itemRef + '&start_holding='\n\t\t\t\t+ i + '&serviceCommand=holdingsdata&loc=' + loc, true);\n\t\txhr.send();\n\t\treturn false; // Make sure the browser doesn't try to submit any holding form\n\t};\n}\n\n\nvar retriever = document.querySelector('.retrieving'), retrieved = document.getElementById('donelocator');\n\nvar locForm = document.createElement('form'), locLabel = document.createElement('label'), locInput = document.createElement('input'),\n\tlocSubmit = document.createElement('input');\n\nlocForm.appendChild(locLabel);\nlocForm.appendChild(locInput);\nlocForm.appendChild(locSubmit);\n\nlocInput.name = locLabel.htmlFor = 'cat_location';\nlocInput.type = 'text';\nlocInput.required = 'yes';\nlocLabel.innerText = 'Find copies closest to: ';\nlocSubmit.value = 'Go';\nlocSubmit.type = 'submit';\nlocForm.onsubmit = generateGoTo(1);\n\nretriever.parentNode.replaceChild(locForm, retriever);"
20
	}
21
    },
22
    {
23
	"phttps://*.bandcamp.com/track/*": {
24
	    "components": ["s", "bandcamp"]
25
	}
26
    },
27
    {
28
	"phttps://opencores.org/projects": {
29
	    "components": ["s", "opencores"]
30
	}
31
    },
32
    {
33
	"phttps://actions.sumofus.org/a/*": {
34
	    "components": ["s", "sumofus (sign petition)"],
35
	}
36
    },
37
    {
38
	"phttps://worldcat.org/title/**": {
39
	    "components": ["s", "worldcat (library holdings)"]
40
	}
41
    },
42
    {
43
	"phttps://www.worldcat.org/title/**": {
44
	    "components": ["s", "worldcat (library holdings)"]
45
	}
46
    }
47
]

Also available in: Unified diff