@@ -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:
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.
+
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 @@
▼
+