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>  | 
