From 0e67ede5d1b4e9933e713046889a30b0d56f8ea8 Mon Sep 17 00:00:00 2001 From: Gokulakrishna Date: Wed, 16 May 2018 15:22:27 +0530 Subject: Typo correction - removed 2nd var on same variable in scope --- js/controllers/importexport.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'js/controllers') diff --git a/js/controllers/importexport.js b/js/controllers/importexport.js index b9a90c7..5ea9756 100644 --- a/js/controllers/importexport.js +++ b/js/controllers/importexport.js @@ -51,7 +51,7 @@ redirectorApp.config([ reader.onload = function(e) { var data; try { - var data = JSON.parse(reader.result); + data = JSON.parse(reader.result); } catch(e) { $s.showMessage('Failed to parse JSON data, invalid JSON: ' + (e.message||'').substr(0,100)); return $s.$parent.$apply(); @@ -107,4 +107,4 @@ redirectorApp.config([ } $s.updateExportLink(); //Run once so the a will have a href to begin with -}]); \ No newline at end of file +}]); -- cgit v1.2.3 From f01348a69915f1f9440d8b8f5b01e6fcd25d828f Mon Sep 17 00:00:00 2001 From: Gokulakrishna Date: Fri, 18 May 2018 19:20:37 +0530 Subject: Enable Sync or Local storage option. Closes #86 --- help.html | 24 +++++++- js/background.js | 123 ++++++++++++++++++++++++++++++++++++--- js/controllers/redirectorpage.js | 52 +++++++++++++++-- redirector.html | 1 + 4 files changed, 187 insertions(+), 13 deletions(-) (limited to 'js/controllers') diff --git a/help.html b/help.html index 8616d70..78ca8ad 100644 --- a/help.html +++ b/help.html @@ -33,6 +33,7 @@
  • Wildcards
  • Regular expressions
  • +
  • Storage Area (Sync vs Local)
  • Examples
    1. Static redirect
    2. @@ -149,7 +150,28 @@ the regular expressions. Captures are specified with parentheses. Example: http://example.com/index.asp\?id=(\d+) will match the url http://example.com/index.asp?id=12345 and $1 will be replaced by 12345. (A common mistake in regex patterns is to forget to escape the ? sign in the querystring of the url. ? is a special character in regular expressions so if you want to match an url with a querystring - you should escape it as \?).

      + you should escape it as \?). To test your regular expressions, you may use any website or service. For example, regexr.com

      + + +

      Storage Area (Sync vs Local)

      + +

      Storage Area, by default, is set to Local. If you wish to sync your redirector rules across devices, you may choose to enable Sync from Settings page. + When you toggle to Sync, data will be copied over to Sync storage and local storage will be deleted. + Similary, sync storage will be deleted if you disable sync and data will be moved to Local storage. +

      + Note:
      1. Google Chrome Sync and Mozilla Firefox Sync limits the storage size as per below. + This limit is decided by browser vendors and Redirector addon cannot do anything about changing the below.
      2. +
      3. You need to use chrome/firefox settings to setup a sync account for syncing to work. + If that is not completed, Sync will just act like local storage - take note of the storage sizes below. + If sync account is not setup in chrome/firefox browser settings, leave the storage area to LOCAL as it has much larger size than Sync storage size. +
      + +
        +
      • Local Storage: 5 MB - Redirector uses this as Default upon its installation
      • +
      • Sync Storage : 0.008192 MB to store "Redirects" (8192 bytes)
      • +
      +
      +

      Examples

      diff --git a/js/background.js b/js/background.js index d1a939e..4d6ac71 100644 --- a/js/background.js +++ b/js/background.js @@ -8,6 +8,7 @@ function log(msg) { } log.enabled = false; +var storageArea = chrome.storage.local; //Redirects partitioned by request type, so we have to run through //the minimum number of redirects for each request. var partitionedRedirects = {}; @@ -171,7 +172,7 @@ function setUpRedirectListener() { chrome.webRequest.onBeforeRequest.removeListener(checkRedirects); //Unsubscribe first, in case there are changes... - chrome.storage.local.get({redirects:[]}, function(obj) { + storageArea.get({redirects:[]}, function(obj) { var redirects = obj.redirects; if (redirects.length == 0) { log('No redirects defined, not setting up listener'); @@ -201,7 +202,9 @@ chrome.runtime.onMessage.addListener( log('Received background message: ' + JSON.stringify(request)); if (request.type == 'getredirects') { log('Getting redirects from storage'); - chrome.storage.local.get({redirects:[]}, function(obj) { + storageArea.get({ + redirects: [] + }, function (obj) { log('Got redirects from storage: ' + JSON.stringify(obj)); sendResponse(obj); log('Sent redirects to content page'); @@ -209,10 +212,95 @@ chrome.runtime.onMessage.addListener( } else if (request.type == 'saveredirects') { console.log('Saving redirects, count=' + request.redirects.length); delete request.type; - chrome.storage.local.set(request, function(a) { + storageArea.set(request, function (a) { + if(chrome.runtime.lastError) { + if(chrome.runtime.lastError.message.indexOf("QUOTA_BYTES_PER_ITEM quota exceeded")>-1){ + log("Redirects failed to save as size of redirects larger than allowed limit per item by Sync"); + sendResponse({ + message: "Redirects failed to save as size of redirects larger than what's allowed by Sync. Refer Help Page" + }); + } + } else { log('Finished saving redirects to storage'); - sendResponse({message:"Redirects saved"}); + sendResponse({ + message: "Redirects saved" + }); + } }); + } else if (request.type == 'ToggleSync') { + // Notes on Toggle Sync feature here https://github.com/einaregilsson/Redirector/issues/86#issuecomment-389943854 + // This provides for feature request - issue 86 + delete request.type; + log('toggling sync to ' + request.isSyncEnabled); + // Setting for Sync enabled or not, resides in Local. + chrome.storage.local.set({ + isSyncEnabled: request.isSyncEnabled + }, + function () { + if (request.isSyncEnabled) { + storageArea = chrome.storage.sync; + log('storageArea size for sync is 5 MB but one object (redirects) is allowed to hold only ' + storageArea.QUOTA_BYTES_PER_ITEM / 1000000 + ' MB, that is .. ' + storageArea.QUOTA_BYTES_PER_ITEM + " bytes"); + chrome.storage.local.getBytesInUse("redirects", + function (size) { + log("size of redirects is " + size + " bytes"); + if (size > storageArea.QUOTA_BYTES_PER_ITEM) { + log("size of redirects " + size + " is greater than allowed for Sync which is " + storageArea.QUOTA_BYTES_PER_ITEM); + // Setting storageArea back to Local. + storageArea = chrome.storage.local; + sendResponse({ + message: "Sync Not Possible - size of Redirects larger than what's allowed by Sync. Refer Help page" + }); + } else { + chrome.storage.local.get({ + redirects: [] + }, function (obj) { + //check if at least one rule is there. + if (obj.redirects.length>0) { + chrome.storage.sync.set(obj, function (a) { + log('redirects moved from Local to Sync Storage Area'); + //Remove Redirects from Local storage + chrome.storage.local.remove("redirects"); + // Call setupRedirectListener to setup the redirects + setUpRedirectListener(); + sendResponse({ + message: "syncEnabled" + }); + }); + } else { + log('No redirects are setup currently in Local, just enabling Sync'); + sendResponse({ + message: "syncEnabled" + }); + } + }); + } + }); + } else { + storageArea = chrome.storage.local; + log('storageArea size for local is ' + storageArea.QUOTA_BYTES / 1000000 + ' MB, that is .. ' + storageArea.QUOTA_BYTES + " bytes"); + chrome.storage.sync.get({ + redirects: [] + }, function (obj) { + if (obj.redirects.length>0) { + chrome.storage.local.set(obj, function (a) { + log('redirects moved from Sync to Local Storage Area'); + //Remove Redirects from sync storage + chrome.storage.sync.remove("redirects"); + // Call setupRedirectListener to setup the redirects + setUpRedirectListener(); + sendResponse({ + message: "syncDisabled" + }); + }); + } else { + sendResponse({ + message: "syncDisabled" + }); + } + }); + } + }); + } else { log('Unexpected message: ' + JSON.stringify(request)); return false; @@ -234,12 +322,31 @@ function updateLogging() { } updateLogging(); -chrome.storage.local.get({disabled:false}, function(obj) { - if (!obj.disabled) { - setUpRedirectListener(); +chrome.storage.local.get({ + isSyncEnabled: false +}, function (obj) { + if (obj.isSyncEnabled) { + storageArea = chrome.storage.sync; } else { - log('Redirector is disabled'); + storageArea = chrome.storage.local; } + // Now we know which storageArea to use, call setupInitial function + setupInitial(); }); + +//wrapped the below inside a function so that we can call this once we know the value of storageArea from above. + +function setupInitial() { + + chrome.storage.local.get({ + disabled: false + }, function (obj) { + if (!obj.disabled) { + setUpRedirectListener(); + } else { + log('Redirector is disabled'); + } + }); +} log('Redirector starting up...'); \ No newline at end of file diff --git a/js/controllers/redirectorpage.js b/js/controllers/redirectorpage.js index d18883c..e9ed30c 100644 --- a/js/controllers/redirectorpage.js +++ b/js/controllers/redirectorpage.js @@ -19,10 +19,45 @@ redirectorApp.controller('RedirectorPageCtrl', ['$scope', '$timeout', function($ var arr = $s.redirects.map(normalize); chrome.runtime.sendMessage({type:"saveredirects", redirects:arr}, function(response) { - console.log('Saved ' + arr.length + ' redirects at ' + new Date() + '. Message from background page:' + response.message); + console.log(response.message); + if(response.message.indexOf("Redirects failed to save") > -1){ + $s.showMessage(response.message, false); + }else{ + console.log('Saved ' + arr.length + ' redirects at ' + new Date() + '. Message from background page:' + response.message); + } }); } - + + // Default is LOCAL storage, allow user to select toggle to Sync if they wish + $s.isSyncEnabled = false; + + chrome.storage.local.get({isSyncEnabled:false},function(obj){ + $s.isSyncEnabled = obj.isSyncEnabled; + $s.$apply(); + }); + + $s.toggleSyncSetting = function(){ + chrome.runtime.sendMessage({type:"ToggleSync", isSyncEnabled: !$s.isSyncEnabled}, function(response) { + if(response.message === "syncEnabled"){ + $s.isSyncEnabled = true; + $s.showMessage('Sync is enabled!',true); + } else if(response.message === "syncDisabled"){ + $s.isSyncEnabled = false; + $s.showMessage('Sync is disabled - local storage will be used!',true); + } else if(response.message.indexOf("Sync Not Possible")>-1){ + $s.isSyncEnabled = false; + chrome.storage.local.set({isSyncEnabled: $s.isSyncEnabled}, function(){ + // console.log("set back to false"); + }); + $s.showMessage(response.message, false); + } + else { + $s.showMessage('Error occured when trying to change Sync settings. Refer logging and raise an issue',false); + } + $s.$apply(); + }); + } + $s.redirects = []; //Need to proxy this through the background page, because Firefox gives us dead objects @@ -39,12 +74,21 @@ redirectorApp.controller('RedirectorPageCtrl', ['$scope', '$timeout', function($ $s.showMessage = function(message, success) { $s.message = message; $s.messageType = success ? 'success' : 'error'; + var timer = 20; + /*if($s.message.indexOf("Error occured")>-1 || $s.message.indexOf("Sync Not Possible")>-1 || $s.message.indexOf("Redirects failed to save")>-1 ){ + timer = 10; + // just to reload the page - when I tested, $s.$apply() didn't refresh as I expected for "Sync Not Possible". + // Reloading the page is going to getRedirects and show actual values to user after showing 10 seconds error message + } */ //Remove the message in 20 seconds if it hasn't been changed... $timeout(function() { if ($s.message == message) { $s.message = null; - } - }, 20 * 1000); + } + /* if(timer == 10){ + chrome.tabs.reload(); + } */ + }, timer * 1000); } }]); diff --git a/redirector.html b/redirector.html index 7f04b68..3f9184b 100644 --- a/redirector.html +++ b/redirector.html @@ -192,6 +192,7 @@ +