diff options
-rw-r--r-- | help.html | 24 | ||||
-rw-r--r-- | js/background.js | 123 | ||||
-rw-r--r-- | js/controllers/redirectorpage.js | 52 | ||||
-rw-r--r-- | redirector.html | 1 |
4 files changed, 187 insertions, 13 deletions
@@ -33,6 +33,7 @@ </li> <li><a href="#wildcards">Wildcards</a></li> <li><a href="#regularexpressions">Regular expressions</a></li> + <li><a href="#storageArea">Storage Area (Sync vs Local)</a></li> <li><a href="#examples">Examples</a> <ol> <li><a href="#ex1">Static redirect</a></li> @@ -149,7 +150,28 @@ the regular expressions. Captures are specified with parentheses. Example: <span class="pattern">http://example.com/index.asp\?id=(\d+)</span> will match the url <span class="url">http://example.com/index.asp?id=12345</span> 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 \?).</p> + you should escape it as \?). To test your regular expressions, you may use any website or service. For example, <a href="https://regexr.com" target="_blank">regexr.com</a> </p> + + <a name="storageArea"></a> + <h4>Storage Area (Sync vs Local)</h4> + + <p>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. + <div> + <em>Note:</em><ol> <li>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.</li> + <li>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. + </li> </ol> + + <ul> + <li>Local Storage: 5 MB - Redirector uses this as Default upon its installation</li> + <li>Sync Storage : 0.008192 MB to store "Redirects" (8192 bytes) </li> + </ul> +</div> + </p> <a name="examples"></a> <h4>Examples</h4> 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 @@ <a class="btn medium grey move-down-btn" ng-class="{disabled:$last}" ng-click="moveDown($index)">▼</a> </div> </div> + <label><input type="checkbox" ng-model="isSyncEnabled" ng-click="toggleSyncSetting()" /> Enable Storage Sync</label> </div> <footer> |