aboutsummaryrefslogtreecommitdiff
path: root/js
diff options
context:
space:
mode:
authorEinar Egilsson <einar@einaregilsson.com>2018-08-17 10:41:58 +0000
committerGitHub <noreply@github.com>2018-08-17 10:41:58 +0000
commit506f78a13124fdbe5e33485dbd0b079cd8fffd47 (patch)
tree0e269965cc77f6b78c4b8821c910518c259ab414 /js
parent005cdf5953a165c5f117102382cd38ecb641fa2f (diff)
parent12c3df39097905f981a392dceaa93ac879813159 (diff)
Merge pull request #120 from gkrishnaks/master
Typo correction in variable declaration, and closes feature requests #104, #86, #72 and fix for issue #115, updated excludeMatch() for faster regex check.
Diffstat (limited to 'js')
-rw-r--r--js/background.js192
-rw-r--r--js/controllers/editredirect.js2
-rw-r--r--js/controllers/importexport.js4
-rw-r--r--js/controllers/redirectorpage.js52
-rw-r--r--js/popup.js17
-rw-r--r--js/redirect.js7
6 files changed, 253 insertions, 21 deletions
diff --git a/js/background.js b/js/background.js
index d1a939e..e087c22 100644
--- a/js/background.js
+++ b/js/background.js
@@ -7,7 +7,9 @@ function log(msg) {
}
}
log.enabled = false;
+var enableNotifications=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 = {};
@@ -66,7 +68,7 @@ function checkRedirects(details) {
return {};
}
-
+
for (var i = 0; i < list.length; i++) {
var r = list[i];
var result = r.getMatch(details.url);
@@ -90,8 +92,10 @@ function checkRedirects(details) {
}
- log('Redirecting ' + details.url + ' ===> ' + result.redirectTo + ', type: ' + details.type + ', pattern: ' + r.includePattern);
-
+ log('Redirecting ' + details.url + ' ===> ' + result.redirectTo + ', type: ' + details.type + ', pattern: ' + r.includePattern + ' which is in Rule : ' + r.description);
+ if(enableNotifications){
+ sendNotifications(r, details.url, result.redirectTo);
+ }
ignoreNextRequest[result.redirectTo] = new Date().getTime();
return { redirectUrl: result.redirectTo };
@@ -125,7 +129,11 @@ function monitorChanges(changes, namespace) {
if (changes.logging) {
log('Logging settings have changed, updating...');
updateLogging();
- }
+ }
+ if (changes.enableNotifications){
+ log('notifications setting changed');
+ enableNotifications=changes.enableNotifications.newValue;
+ }
}
chrome.storage.onChanged.addListener(monitorChanges);
@@ -135,9 +143,14 @@ function createFilter(redirects) {
var types = [];
for (var i = 0; i < redirects.length; i++) {
redirects[i].appliesTo.forEach(function(type) {
+ // Added this condition below as part of fix for issue 115 https://github.com/einaregilsson/Redirector/issues/115
+ // Firefox considers responsive web images request as imageset. Chrome doesn't.
+ // Chrome throws an error for imageset type, so let's add to 'types' only for the values that chrome or firefox supports
+ if(chrome.webRequest.ResourceType[type.toUpperCase()]!== undefined){
if (types.indexOf(type) == -1) {
types.push(type);
}
+ }
});
}
types.sort();
@@ -171,7 +184,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 +214,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 +224,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 +334,78 @@ 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({enableNotifications:false},function(obj){
+ enableNotifications = obj.enableNotifications;
+ });
+
+ 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
+
+// Below is a feature request by an user who wished to see visual indication for an Redirect rule being applied on URL
+// https://github.com/einaregilsson/Redirector/issues/72
+// By default, we will have it as false. If user wishes to enable it from settings page, we can make it true until user disables it (or browser is restarted)
+
+// Upon browser startup, just set enableNotifications to false.
+// Listen to a message from Settings page to change this to true.
+function sendNotifications(redirect, originalUrl, redirectedUrl ){
+ //var message = "Applied rule : " + redirect.description + " and redirected original page " + originalUrl + " to " + redirectedUrl;
+ log("Showing redirect success notification");
+ //Firefox and other browsers does not yet support "list" type notification like in Chrome.
+ // Console.log(JSON.stringify(chrome.notifications)); -- This will still show "list" as one option but it just won't work as it's not implemented by Firefox yet
+ // Can't check if "chrome" typeof either, as Firefox supports both chrome and browser namespace.
+ // So let's use useragent.
+ // Opera UA has both chrome and OPR. So check against that ( Only chrome which supports list) - other browsers to get BASIC type notifications.
+
+ if(navigator.userAgent.toLowerCase().indexOf("chrome") > -1 && navigator.userAgent.toLowerCase().indexOf("OPR")<0){
+ var items = [{title:"Original page: ", message: originalUrl},{title:"Redirected to: ",message:redirectedUrl}];
+ var head = "Redirector - Applied rule : " + redirect.description;
+ chrome.notifications.create({
+ "type": "list",
+ "items": items,
+ "title": head,
+ "message": head,
+ "iconUrl": "images/icon-active-38.png"
+ }); }
+ else{
+ var message = "Applied rule : " + redirect.description + " and redirected original page " + originalUrl + " to " + redirectedUrl;
+
+ chrome.notifications.create({
+ "type": "basic",
+ "title": "Redirector",
+ "message": message,
+ "iconUrl": "images/icon-active-38.png"
+ });
+ }
+}
+
+chrome.runtime.onStartup.addListener(handleStartup);
+function handleStartup(){
+ enableNotifications=false;
+ chrome.storage.local.set({
+ enableNotifications: false
+ });
+} \ No newline at end of file
diff --git a/js/controllers/editredirect.js b/js/controllers/editredirect.js
index 3d63340..81a4ee9 100644
--- a/js/controllers/editredirect.js
+++ b/js/controllers/editredirect.js
@@ -79,7 +79,7 @@ redirectorApp.controller('EditRedirectCtrl', ['$scope', function($s) {
arr.splice(index, 1);
}
- var order = 'main_frame,sub_frame,stylesheet,script,image,object,xmlhttprequest,other';
+ var order = 'main_frame,sub_frame,stylesheet,script,image,imageset,object,xmlhttprequest,other';
arr.sort(function(a,b) {
return order.indexOf(a) - order.indexOf(b);
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
+}]);
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/js/popup.js b/js/popup.js
index 6658fc0..c27a29f 100644
--- a/js/popup.js
+++ b/js/popup.js
@@ -30,6 +30,23 @@ angular.module('popupApp', []).controller('PopupCtrl', ['$scope', function($s) {
});
};
+
+ //Toggle Notifications by sending a notifications
+ $s.enableNotifications = false;
+
+ storage.get({enableNotifications:false},function(obj){
+ $s.enableNotifications = obj.enableNotifications;
+ $s.$apply();
+ });
+
+ $s.toggleNotifications=function(){
+ storage.get({enableNotifications:false},function(obj){
+ storage.set({enableNotifications:!obj.enableNotifications});
+ $s.enableNotifications = !obj.enableNotifications;
+ $s.$apply();
+ });
+ }
+
$s.openRedirectorSettings = function() {
//switch to open one if we have it to minimize conflicts
diff --git a/js/redirect.js b/js/redirect.js
index 83681fc..ac06ff7 100644
--- a/js/redirect.js
+++ b/js/redirect.js
@@ -18,6 +18,7 @@ Redirect.requestTypes = {
stylesheet : "Stylesheets",
script : "Scripts",
image : "Images",
+ imageset: "Responsive Images in Firefox",
object : "Objects (e.g. Flash videos, Java applets)",
xmlhttprequest : "XMLHttpRequests (Ajax)",
other : "Other"
@@ -33,6 +34,7 @@ Redirect.prototype = {
error : null,
includePattern : '',
excludePattern : '',
+ patternDesc:'',
redirectUrl : '',
patternType : '',
processMatches : 'noProcessing',
@@ -56,6 +58,7 @@ Redirect.prototype = {
&& this.exampleUrl == redirect.exampleUrl
&& this.includePattern == redirect.includePattern
&& this.excludePattern == redirect.excludePattern
+ && this.patternDesc == redirect.patternDesc
&& this.redirectUrl == redirect.redirectUrl
&& this.patternType == redirect.patternType
&& this.processMatches == redirect.processMatches
@@ -70,6 +73,7 @@ Redirect.prototype = {
error : this.error,
includePattern : this.includePattern,
excludePattern : this.excludePattern,
+ patternDesc : this.patternDesc,
redirectUrl : this.redirectUrl,
patternType : this.patternType,
processMatches : this.processMatches,
@@ -208,6 +212,7 @@ Redirect.prototype = {
this.excludePattern = o.excludePattern || '';
this.redirectUrl = o.redirectUrl || '';
this.patternType = o.patternType || Redirect.WILDCARD;
+ this.patternDesc = o.patternDesc || '';
this.processMatches = o.processMatches || 'noProcessing';
if (!o.processMatches && o.unescapeMatches) {
this.processMatches = 'urlDecode';
@@ -261,7 +266,7 @@ Redirect.prototype = {
if (!this._rxExclude) {
return false;
}
- var shouldExclude = !!this._rxExclude.exec(url);
+ var shouldExclude = this._rxExclude.test(url);
this._rxExclude.lastIndex = 0;
return shouldExclude;
}