user chrome.storage
This commit is contained in:
parent
c8abebedc8
commit
e47689270e
4 changed files with 133 additions and 89 deletions
|
@ -1,4 +1,8 @@
|
||||||
{
|
{
|
||||||
|
"extention_name": {
|
||||||
|
"message": "Piwik Injector",
|
||||||
|
"description": "name of the extention"
|
||||||
|
},
|
||||||
"extention_description": {
|
"extention_description": {
|
||||||
"message": "Füge eigenes Javascript auf beliebigen Seiten ein.",
|
"message": "Füge eigenes Javascript auf beliebigen Seiten ein.",
|
||||||
"description": "a short description shown in the extention list"
|
"description": "a short description shown in the extention list"
|
||||||
|
|
|
@ -107,9 +107,14 @@ a:hover {
|
||||||
}
|
}
|
||||||
|
|
||||||
.controls__save,
|
.controls__save,
|
||||||
.controls__reset {
|
.controls__reset,
|
||||||
|
.controls__remove-draft {
|
||||||
margin-right: 10px;
|
margin-right: 10px;
|
||||||
font-size: 18px;
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.button-warning {
|
||||||
|
background: rgb(223, 117, 20);
|
||||||
}
|
}
|
||||||
|
|
||||||
#editor {
|
#editor {
|
||||||
|
|
197
js/popup.js
197
js/popup.js
|
@ -18,7 +18,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
expertMode: document.getElementById("expert-mode")
|
expertMode: document.getElementById("expert-mode")
|
||||||
},
|
},
|
||||||
applyi18n: function() {
|
applyi18n: function() {
|
||||||
var translatableIDs = ["error-message", "error-tip", "save", "reset", "goto-host", "enable-description", "host-label", "expert-mode-label"];
|
var translatableIDs = ["error-message", "error-tip", "save", "reset", "goto-host", "enable-description", "host-label", "expert-mode-label", "draft-remove"];
|
||||||
translatableIDs.forEach(function(id) {
|
translatableIDs.forEach(function(id) {
|
||||||
var translateKey = id.replace(/-/g, "_");
|
var translateKey = id.replace(/-/g, "_");
|
||||||
document.getElementById(id).innerText = chrome.i18n.getMessage(translateKey);
|
document.getElementById(id).innerText = chrome.i18n.getMessage(translateKey);
|
||||||
|
@ -36,8 +36,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
url: undefined,
|
url: undefined,
|
||||||
emptyDataPattern: {
|
emptyDataPattern: {
|
||||||
config: {
|
config: {
|
||||||
enable: false,
|
enable: false
|
||||||
extra: ''
|
|
||||||
},
|
},
|
||||||
source: ''
|
source: ''
|
||||||
},
|
},
|
||||||
|
@ -180,7 +179,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
|
||||||
popup.host = response.host;
|
popup.host = response.host;
|
||||||
popup.protocol = response.protocol;
|
popup.protocol = response.protocol;
|
||||||
popup.key = popup.protocol + "//" + popup.host;
|
popup.url = popup.protocol + "//" + popup.host;
|
||||||
|
|
||||||
// Load storage (global, local) IMPORTANT: Must be called first of all storage operations
|
// Load storage (global, local) IMPORTANT: Must be called first of all storage operations
|
||||||
popup.storage.load();
|
popup.storage.load();
|
||||||
|
@ -188,29 +187,31 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
// Set storage to store data accessible from all hosts
|
// Set storage to store data accessible from all hosts
|
||||||
popup.storage.setMode(popup.storage.MODE.global);
|
popup.storage.setMode(popup.storage.MODE.global);
|
||||||
|
|
||||||
var hosts = popup.storage.get('hosts') || [],
|
chrome.storage.sync.get("hosts", function(items) {
|
||||||
url = popup.protocol + "//" + response.host;
|
var hosts = items.hosts;
|
||||||
|
if (!hosts) {
|
||||||
// Add current host to list
|
hosts = [];
|
||||||
if (hosts.indexOf(url) === -1) {
|
}
|
||||||
hosts.push(url);
|
// Add current host to list
|
||||||
}
|
if (hosts.indexOf(popup.url) === -1) {
|
||||||
|
hosts.push(popup.url);
|
||||||
// Fill 'hosts select'
|
}
|
||||||
hosts.forEach(function(host) {
|
// Fill 'hosts select'
|
||||||
var option = document.createElement('option');
|
hosts.forEach(function(host) {
|
||||||
option.innerText = host;
|
var option = document.createElement('option');
|
||||||
if (host === url) {
|
option.innerText = host;
|
||||||
option.setAttribute('selected', 'selected');
|
if (host === popup.url) {
|
||||||
}
|
option.setAttribute('selected', 'selected');
|
||||||
popup.el.hostSelect.appendChild(option);
|
}
|
||||||
});
|
popup.el.hostSelect.appendChild(option);
|
||||||
|
});
|
||||||
// Store host (current included in array) if customjs is defined
|
|
||||||
if (response.customjs) {
|
|
||||||
popup.storage.set('hosts', hosts);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
// Store host (current included in array) if customjs is defined
|
||||||
|
if (response.customjs) {
|
||||||
|
chrome.storage.sync.set({"hosts": hosts});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
);
|
||||||
/**
|
/**
|
||||||
* Set-up data (script, enable, include, extra)
|
* Set-up data (script, enable, include, extra)
|
||||||
*/
|
*/
|
||||||
|
@ -242,7 +243,11 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Apply data (draft if exist)
|
// Apply data (draft if exist)
|
||||||
popup.applyData(popup.storage.get('draft'));
|
chrome.storage.local.get(popup.url, function(items) {
|
||||||
|
if (items && Object.keys(items).length !== 0) { // if draft exists
|
||||||
|
popup.applyData(items[popup.url].draft);
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -267,7 +272,8 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
var js = popup.piwik.defaultTrackingCode;
|
var js = popup.piwik.defaultTrackingCode;
|
||||||
js = js.replace("{{PIWIKURL}}", piwikURL);
|
js = js.replace("{{PIWIKURL}}", piwikURL);
|
||||||
js = js.replace("{{SITEID}}", String(siteID));
|
js = js.replace("{{SITEID}}", String(siteID));
|
||||||
popup.editor.apply(js)
|
popup.editor.apply(js);
|
||||||
|
chrome.storage.sync.set({"piwik": {piwikURL: piwikURL, siteID: siteID}});
|
||||||
},
|
},
|
||||||
setExpertMode: function(expertMode, onLoad) {
|
setExpertMode: function(expertMode, onLoad) {
|
||||||
popup.editor.editorInstance.setOptions({
|
popup.editor.editorInstance.setOptions({
|
||||||
|
@ -295,6 +301,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
// base64 may be smaller, but does not handle unicode characters
|
// base64 may be smaller, but does not handle unicode characters
|
||||||
// attempt base64 first, fall back to escaped text
|
// attempt base64 first, fall back to escaped text
|
||||||
try {
|
try {
|
||||||
|
throw new Error;
|
||||||
b64 += (';base64,' + btoa(script));
|
b64 += (';base64,' + btoa(script));
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
|
@ -303,6 +310,18 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
|
||||||
return b64;
|
return b64;
|
||||||
},
|
},
|
||||||
|
decodeDataUrl: function(dataUrl) {
|
||||||
|
if (dataUrl.indexOf('data:text/javascript;base64,') === 0) {
|
||||||
|
dataUrl = dataUrl.replace('data:text/javascript;base64,', '');
|
||||||
|
return atob(dataUrl);
|
||||||
|
}
|
||||||
|
else if (dataUrl.indexOf('data:text/javascript;charset=utf-8,') === 0) {
|
||||||
|
dataUrl = dataUrl.replace('data:text/javascript;charset=utf-8,', '');
|
||||||
|
return decodeURIComponent(dataUrl);
|
||||||
|
} else {
|
||||||
|
return dataUrl
|
||||||
|
}
|
||||||
|
},
|
||||||
applyData: function(data, notDraft) {
|
applyData: function(data, notDraft) {
|
||||||
|
|
||||||
if (data && !notDraft) {
|
if (data && !notDraft) {
|
||||||
|
@ -311,6 +330,9 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
|
||||||
data = data || this.data;
|
data = data || this.data;
|
||||||
// Default value for source
|
// Default value for source
|
||||||
|
|
||||||
|
data.source = popup.decodeDataUrl(data.source);
|
||||||
|
console.info(data);
|
||||||
if (!data.source) {
|
if (!data.source) {
|
||||||
data.source = popup.editor.defaultValue;
|
data.source = popup.editor.defaultValue;
|
||||||
}
|
}
|
||||||
|
@ -350,11 +372,11 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
data.source = popup.generateScriptDataUrl(data.source);
|
data.source = popup.generateScriptDataUrl(data.source);
|
||||||
|
|
||||||
// Send new data to apply
|
// Send new data to apply
|
||||||
chrome.tabs.sendMessage(popup.tabId, {method: "setData", customjs: data, reload: true});
|
// chrome.tabs.sendMessage(popup.tabId, {method: "setData", customjs: data, reload: true});
|
||||||
|
|
||||||
// Save local copy of data
|
var syncdata = {};
|
||||||
popup.storage.setMode(popup.storage.MODE.private);
|
syncdata[popup.url] = data;
|
||||||
popup.storage.set('data', popup.data);
|
chrome.storage.sync.set(syncdata);
|
||||||
|
|
||||||
// Clear draft
|
// Clear draft
|
||||||
popup.removeDraft();
|
popup.removeDraft();
|
||||||
|
@ -379,14 +401,16 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
|
||||||
// Remove host from hosts inside global storage
|
// Remove host from hosts inside global storage
|
||||||
popup.storage.setMode(popup.storage.MODE.global);
|
popup.storage.setMode(popup.storage.MODE.global);
|
||||||
var oldHosts = popup.storage.get('hosts'),
|
|
||||||
newHosts = [];
|
chrome.storage.sync.get("hosts", function(items) {
|
||||||
oldHosts.forEach(function(host) {
|
var hosts = items.hosts;
|
||||||
if (host !== popup.protocol + '//' + popup.host) {
|
var index = hosts.indexOf(popup.url);
|
||||||
newHosts.push(host);
|
if (index > -1) {
|
||||||
}
|
hosts.splice(index, 1);
|
||||||
});
|
}
|
||||||
popup.storage.set('hosts', newHosts);
|
chrome.storage.sync.set({"hosts": hosts});
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
// Remove customjs from frontend
|
// Remove customjs from frontend
|
||||||
chrome.tabs.sendMessage(popup.tabId, {method: "removeData", reload: false});
|
chrome.tabs.sendMessage(popup.tabId, {method: "removeData", reload: false});
|
||||||
|
@ -460,8 +484,10 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
}
|
}
|
||||||
if ((source || !popup.data.source) && source !== popup.data.source) {
|
if ((source || !popup.data.source) && source !== popup.data.source) {
|
||||||
|
|
||||||
popup.storage.setMode(popup.storage.MODE.private);
|
var data = {};
|
||||||
popup.storage.set('draft', draft);
|
data[popup.url] = {draft: draft};
|
||||||
|
popup.el.draftRemoveLink.classList.remove('is-hidden');
|
||||||
|
chrome.storage.local.set(data);
|
||||||
|
|
||||||
// Auto switch 'enable checkbox' on source edit
|
// Auto switch 'enable checkbox' on source edit
|
||||||
if (!popup.el.enableCheck.classList.contains('not-auto-change')) {
|
if (!popup.el.enableCheck.classList.contains('not-auto-change')) {
|
||||||
|
@ -469,7 +495,7 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
draftAutoSaveInterval = setInterval(draftAutoSave, 2000);
|
draftAutoSaveInterval = setInterval(draftAutoSave, 1000);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -477,48 +503,52 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
popup.el.hostSelect.addEventListener('change', function(e) {
|
popup.el.hostSelect.addEventListener('change', function(e) {
|
||||||
var host = this.value,
|
var host = this.value;
|
||||||
hostData = JSON.parse(localStorage.getItem(popup.key + '-' + host), true);
|
chrome.storage.sync.get(host, function(items) {
|
||||||
|
var hostData = items[host];
|
||||||
|
console.info(hostData);
|
||||||
|
console.log(host);
|
||||||
|
if (host !== popup.url) {
|
||||||
|
// Stop making drafts
|
||||||
|
clearInterval(draftAutoSaveInterval);
|
||||||
|
|
||||||
|
// Show goto link
|
||||||
|
popup.el.hostGoToLink.classList.remove('is-hidden');
|
||||||
|
|
||||||
if (host !== popup.protocol + '//' + popup.host) {
|
// Hide controls
|
||||||
// Stop making drafts
|
popup.el.saveBtn.classList.add('pure-button-disabled');
|
||||||
clearInterval(draftAutoSaveInterval);
|
popup.el.resetBtn.classList.add('pure-button-disabled');
|
||||||
|
popup.el.draftRemoveLink.classList.add('is-hidden');
|
||||||
|
|
||||||
// Show goto link
|
// Apply other host data
|
||||||
popup.el.hostGoToLink.classList.remove('is-hidden');
|
try {
|
||||||
|
popup.applyData(hostData, true);
|
||||||
// Hide controls
|
}
|
||||||
popup.el.saveBtn.classList.add('pure-button-disabled');
|
// Hotfix for host without customjs
|
||||||
popup.el.resetBtn.classList.add('pure-button-disabled');
|
catch (err) {
|
||||||
popup.el.draftRemoveLink.classList.add('is-hidden');
|
popup.applyData(Object.assign(true, {}, popup.emptyDataPattern), true);
|
||||||
|
}
|
||||||
// Apply other host data
|
|
||||||
try {
|
|
||||||
popup.applyData(hostData.data, true);
|
|
||||||
}
|
}
|
||||||
// Hotfix for host without customjs
|
else {
|
||||||
catch (err) {
|
// Start making drafts
|
||||||
popup.applyData(Object.assign(true, {}, popup.emptyDataPattern), true);
|
draftAutoSaveInterval = setInterval(draftAutoSave, 1000);
|
||||||
|
|
||||||
|
// Hide goto link
|
||||||
|
popup.el.hostGoToLink.classList.add('is-hidden');
|
||||||
|
|
||||||
|
// Show controls
|
||||||
|
popup.el.saveBtn.classList.remove('pure-button-disabled');
|
||||||
|
popup.el.resetBtn.classList.remove('pure-button-disabled');
|
||||||
|
if (popup.storage.get('draft')) {
|
||||||
|
popup.el.draftRemoveLink.classList.remove('is-hidden');
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply current host data
|
||||||
|
// popup.applyData(hostData.draft || hostData.data, !hostData.draft);
|
||||||
|
popup.applyData(hostData);
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
else {
|
|
||||||
// Start making drafts
|
|
||||||
draftAutoSaveInterval = setInterval(draftAutoSave, 2000);
|
|
||||||
|
|
||||||
// Hide goto link
|
|
||||||
popup.el.hostGoToLink.classList.add('is-hidden');
|
|
||||||
|
|
||||||
// Show controls
|
|
||||||
popup.el.saveBtn.classList.remove('pure-button-disabled');
|
|
||||||
popup.el.resetBtn.classList.remove('pure-button-disabled');
|
|
||||||
if (popup.storage.get('draft')) {
|
|
||||||
popup.el.draftRemoveLink.classList.remove('is-hidden');
|
|
||||||
}
|
|
||||||
|
|
||||||
// Apply current host data
|
|
||||||
popup.applyData(hostData.draft || hostData.data, !hostData.draft);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
|
@ -550,10 +580,17 @@ document.addEventListener('DOMContentLoaded', function() {
|
||||||
|
|
||||||
popup.piwik.loadExpertMode();
|
popup.piwik.loadExpertMode();
|
||||||
|
|
||||||
popup.el.expertMode.addEventListener("change", function() {
|
popup.el.expertMode.addEventListener("change", function(event) {
|
||||||
var enabled = event.target.checked;
|
var enabled = event.target.checked;
|
||||||
popup.piwik.setExpertMode(enabled)
|
popup.piwik.setExpertMode(enabled)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
chrome.storage.sync.get("piwik", function(items) {
|
||||||
|
if (items && Object.keys(items).length !== 0) {
|
||||||
|
popup.el.piwikURL.value = items.items.piwikURL;
|
||||||
|
popup.el.siteID.value = items.piwik.siteID;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
}, false);
|
}, false);
|
||||||
|
|
12
popup.html
12
popup.html
|
@ -41,13 +41,11 @@
|
||||||
<input type="hidden" name="script" value="">
|
<input type="hidden" name="script" value="">
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="pure-g">
|
<div class="pure-g controls">
|
||||||
<div class="pure-u-3-5 controls">
|
<button id="save" class="controls__save pure-button pure-button-primary"
|
||||||
<button id="save" class="controls__save pure-button pure-button-primary"
|
name="save"></button>
|
||||||
name="save"></button>
|
<button id="reset" class="controls__reset pure-button" name="reset"></button>
|
||||||
<button id="reset" class="controls__reset pure-button" name="reset"></button>
|
<button id="draft-remove" class="controls__remove-draft pure-button button-warning is-hidden"></button>
|
||||||
<a id="draft-remove" class="controls__remove-draft red-text is-hidden" href="#"></a>
|
|
||||||
</div>
|
|
||||||
</div><!-- .controls -->
|
</div><!-- .controls -->
|
||||||
|
|
||||||
<!--</form>-->
|
<!--</form>-->
|
||||||
|
|
Reference in a new issue