diff --git a/README.md b/README.md index 4bf8efa..a8e09ab 100644 --- a/README.md +++ b/README.md @@ -20,12 +20,12 @@ Hit back and try another one! * Accessible: * In the context (right-click) menu for the current page, and for all links. - * In the toolbar, just customize it to drag the button in. - * With the keyboard: press `Ctrl-Shift-U` - * Directly in the net error ("Firefox could not load this page...") page. # Changelog + * Version 4 (Aug 19, 2017) + * completely rewritten as WebExtension + * Not everything from the old version ported over yet * Version 3 (Sep 9, 2015) * Fix layout on error page w.r.t. the "report error" dialog. * Add keyboard accessibility for cache retrieval buttons. diff --git a/_locales/en/messages.json b/_locales/en/messages.json new file mode 100644 index 0000000..79bab1a --- /dev/null +++ b/_locales/en/messages.json @@ -0,0 +1,72 @@ +{ + "extensionName": { + "message": "Resurrect Pages", + "description": "Name of the extension." + }, + + "extensionDescription": { + "message": "Resurrect dead pages, by finding their ghosts.", + "description": "Description of the add-on." + }, + + "contextMenuItemResurrectPage": { + "message": "Resurrect this page", + "description": "Resurrect this page" + }, + + "contextMenuItemResurrectLink": { + "message": "Resurrect this link", + "description": "Resurrect this link" + }, + + "contextMenuItemResurrectSelection": { + "message": "Resurrect this selection", + "description": "Resurrect this selection, TODO: only if its a link" + }, + + "contextMenuItemResurrectGoogle": { + "message": "with Google", + "description": "with Google" + }, + + "contextMenuItemResurrectGoogleText": { + "message": "with Google (text only)", + "description": "with Google (text only)" + }, + + "contextMenuItemResurrectArchive": { + "message": "with The Internet Archive", + "description": "with The Internet Archive" + }, + + "contextMenuItemResurrectArchiveIs": { + "message": "with archive.is", + "description": "with archive.is" + }, + + "contextMenuItemResurrectWebcitation": { + "message": "with WebCite", + "description": "with WebCite" + }, + + "contextMenuItemResurrectConfigCurrentTab": { + "message": "in the current tab", + "description": "in the current tab" + }, + + "contextMenuItemResurrectConfigNewTab": { + "message": "in a new tab (foreground)", + "description": "in a new tab (foreground)" + }, + + "contextMenuItemResurrectConfigNewBackgroundTab": { + "message": "in a new tab (background)", + "description": "in a new tab (background)" + }, + + "contextMenuItemResurrectConfigNewWindow": { + "message": "in a new window", + "description": "in a new window" + } + +} diff --git a/background.js b/background.js new file mode 100644 index 0000000..181b720 --- /dev/null +++ b/background.js @@ -0,0 +1,412 @@ +openInEnum = { + CURRENT_TAB : 0, + NEW_TAB : 1, + NEW_BGTAB : 2, + NEW_WINDOW : 3 +} + +var openIn = openInEnum.CURRENT_TAB; +browser.storage.local.get ("openIn").then (function (item) {if (item.openIn) {openIn = item.openIn}}, onError); + +function onCreated(n) { + if (browser.runtime.lastError) { + console.log(`Error: ${browser.runtime.lastError}`); + } +} + +function onRemoved() { } + +function onError(error) { + console.log(`Error: ${error}`); +} + +/* +Create all the context menu items. +*/ +// top level {{{ +browser.contextMenus.create({ + id: "resurrect-page", + title: browser.i18n.getMessage("contextMenuItemResurrectPage"), + contexts: ["page"] +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-link", + title: browser.i18n.getMessage("contextMenuItemResurrectLink"), + contexts: ["link"] +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-selection", + title: browser.i18n.getMessage("contextMenuItemResurrectSelection"), + contexts: ["selection"] +}, onCreated); +//}}} + +// resurrect page {{{ +browser.contextMenus.create({ + id: "resurrect-page-google", + title: browser.i18n.getMessage("contextMenuItemResurrectGoogle"), + icons: { 16: "icons/cacheicons/google.png" }, + contexts: ["all"], + parentId: "resurrect-page" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-page-googletext", + title: browser.i18n.getMessage("contextMenuItemResurrectGoogleText"), + icons: { 16: "icons/cacheicons/google.png" }, + contexts: ["all"], + parentId: "resurrect-page" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-page-archive", + title: browser.i18n.getMessage("contextMenuItemResurrectArchive"), + icons: { 16: "icons/cacheicons/waybackmachine.png" }, + contexts: ["all"], + parentId: "resurrect-page" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-page-archiveis", + title: browser.i18n.getMessage("contextMenuItemResurrectArchiveIs"), + icons: { 16: "icons/cacheicons/archiveis.png" }, + contexts: ["all"], + parentId: "resurrect-page" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-page-webcitation", + title: browser.i18n.getMessage("contextMenuItemResurrectWebcitation"), + icons: { 16: "icons/cacheicons/webcitation.png" }, + contexts: ["all"], + parentId: "resurrect-page" +}, onCreated); +//}}} + +// resurrect link {{{ +browser.contextMenus.create({ + id: "resurrect-link-google", + title: browser.i18n.getMessage("contextMenuItemResurrectGoogle"), + icons: { 16: "icons/cacheicons/google.png" }, + contexts: ["all"], + parentId: "resurrect-link" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-link-googletext", + title: browser.i18n.getMessage("contextMenuItemResurrectGoogleText"), + icons: { 16: "icons/cacheicons/google.png" }, + contexts: ["all"], + parentId: "resurrect-link" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-link-archive", + title: browser.i18n.getMessage("contextMenuItemResurrectArchive"), + icons: { 16: "icons/cacheicons/waybackmachine.png" }, + contexts: ["all"], + parentId: "resurrect-link" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-link-archiveis", + title: browser.i18n.getMessage("contextMenuItemResurrectArchiveIs"), + icons: { 16: "icons/cacheicons/archiveis.png" }, + contexts: ["all"], + parentId: "resurrect-link" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-link-webcitation", + title: browser.i18n.getMessage("contextMenuItemResurrectWebcitation"), + icons: { 16: "icons/cacheicons/webcitation.png" }, + contexts: ["all"], + parentId: "resurrect-link" +}, onCreated); +//}}} + +// resurrect selection {{{ +browser.contextMenus.create({ + id: "resurrect-selection-google", + title: browser.i18n.getMessage("contextMenuItemResurrectGoogle"), + icons: { 16: "icons/cacheicons/google.png" }, + contexts: ["all"], + parentId: "resurrect-selection" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-selection-googletext", + title: browser.i18n.getMessage("contextMenuItemResurrectGoogleText"), + icons: { 16: "icons/cacheicons/google.png" }, + contexts: ["all"], + parentId: "resurrect-selection" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-selection-archive", + title: browser.i18n.getMessage("contextMenuItemResurrectArchive"), + icons: { 16: "icons/cacheicons/waybackmachine.png" }, + contexts: ["all"], + parentId: "resurrect-selection" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-selection-archiveis", + title: browser.i18n.getMessage("contextMenuItemResurrectArchiveIs"), + icons: { 16: "icons/cacheicons/archiveis.png" }, + contexts: ["all"], + parentId: "resurrect-selection" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-selection-webcitation", + title: browser.i18n.getMessage("contextMenuItemResurrectWebcitation"), + icons: { 16: "icons/cacheicons/webcitation.png" }, + contexts: ["all"], + parentId: "resurrect-selection" +}, onCreated); +//}}} + +//config page {{{ +browser.contextMenus.create({ + id: "separator-1", + type: "separator", + contexts: ["all"], + parentId: "resurrect-page" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-page-current-tab", + type: "radio", + title: browser.i18n.getMessage("contextMenuItemResurrectConfigCurrentTab"), + contexts: ["all"], + checked: true, + parentId: "resurrect-page" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-page-new-tab", + type: "radio", + title: browser.i18n.getMessage("contextMenuItemResurrectConfigNewTab"), + contexts: ["all"], + checked: false, + parentId: "resurrect-page" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-page-new-background-tab", + type: "radio", + title: browser.i18n.getMessage("contextMenuItemResurrectConfigNewBackgroundTab"), + contexts: ["all"], + checked: false, + parentId: "resurrect-page" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-page-new-window", + type: "radio", + title: browser.i18n.getMessage("contextMenuItemResurrectConfigNewWindow"), + contexts: ["all"], + checked: false, + parentId: "resurrect-page" +}, onCreated); +//}}} + +//config link {{{ +browser.contextMenus.create({ + id: "separator-2", + type: "separator", + contexts: ["all"], + parentId: "resurrect-link" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-link-current-tab", + type: "radio", + title: browser.i18n.getMessage("contextMenuItemResurrectConfigCurrentTab"), + contexts: ["all"], + checked: true, + parentId: "resurrect-link" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-link-new-tab", + type: "radio", + title: browser.i18n.getMessage("contextMenuItemResurrectConfigNewTab"), + contexts: ["all"], + checked: false, + parentId: "resurrect-link" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-link-new-background-tab", + type: "radio", + title: browser.i18n.getMessage("contextMenuItemResurrectConfigNewBackgroundTab"), + contexts: ["all"], + checked: false, + parentId: "resurrect-link" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-link-new-window", + type: "radio", + title: browser.i18n.getMessage("contextMenuItemResurrectConfigNewWindow"), + contexts: ["all"], + checked: false, + parentId: "resurrect-link" +}, onCreated); +//}}} + +//config selection {{{ +browser.contextMenus.create({ + id: "separator-3", + type: "separator", + contexts: ["all"], + parentId: "resurrect-selection" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-selection-current-tab", + type: "radio", + title: browser.i18n.getMessage("contextMenuItemResurrectConfigCurrentTab"), + contexts: ["all"], + checked: true, + parentId: "resurrect-selection" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-selection-new-tab", + type: "radio", + title: browser.i18n.getMessage("contextMenuItemResurrectConfigNewTab"), + contexts: ["all"], + checked: false, + parentId: "resurrect-selection" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-selection-new-background-tab", + type: "radio", + title: browser.i18n.getMessage("contextMenuItemResurrectConfigNewBackgroundTab"), + contexts: ["all"], + checked: false, + parentId: "resurrect-selection" +}, onCreated); + +browser.contextMenus.create({ + id: "resurrect-selection-new-window", + type: "radio", + title: browser.i18n.getMessage("contextMenuItemResurrectConfigNewWindow"), + contexts: ["all"], + checked: false, + parentId: "resurrect-selection" +}, onCreated); +//}}} + + +browser.contextMenus.onClicked.addListener(function(info, tab) { + var gotoUrl=null; + + var rawUrl = info.pageUrl; + + switch (info.menuItemId) { + case "resurrect-page-google": + gotoUrl='https://www.google.com/search?q=cache:'+encodeURIComponent(info.pageUrl); + break; + case "resurrect-link-google": + gotoUrl='https://www.google.com/search?q=cache:'+encodeURIComponent(info.linkUrl); + break; + case "resurrect-selection-google": + gotoUrl='https://www.google.com/search?q=cache:'+encodeURIComponent(info.selectionText); + break; + + case "resurrect-page-googletext": + gotoUrl='https://www.google.com/search?strip=1&q=cache:'+encodeURIComponent(info.pageUrl); + break; + case "resurrect-link-googletext": + gotoUrl='https://www.google.com/search?strip=1&q=cache:'+encodeURIComponent(info.linkUrl); + break; + case "resurrect-selection-googletext": + gotoUrl='https://www.google.com/search?strip=1&q=cache:'+encodeURIComponent(info.selectionText); + break; + + case "resurrect-page-archive": + var dateStr = (new Date()).toISOString().replace(/-|T|:|\..*/g, ''); + gotoUrl='https://web.archive.org/web/'+dateStr+'/'+info.pageUrl + break; + case "resurrect-link-archive": + var dateStr = (new Date()).toISOString().replace(/-|T|:|\..*/g, ''); + gotoUrl='https://web.archive.org/web/'+dateStr+'/'+info.linkUrl + break; + case "resurrect-selection-archive": + var dateStr = (new Date()).toISOString().replace(/-|T|:|\..*/g, ''); + gotoUrl='https://web.archive.org/web/'+dateStr+'/'+info.selectionText + break; + + case "resurrect-page-archiveis": + gotoUrl='https://archive.is/'+info.pageUrl; + break; + case "resurrect-link-archiveis": + gotoUrl='https://archive.is/'+info.linkUrl; + break; + case "resurrect-selection-archiveis": + gotoUrl='https://archive.is/'+info.selectionText; + break; + + case "resurrect-page-webcitation": + gotoUrl='http://webcitation.org/query.php?url='+encodeURIComponent(info.pageUrl); + break; + case "resurrect-link-webcitation": + gotoUrl='http://webcitation.org/query.php?url='+encodeURIComponent(info.linkUrl); + break; + case "resurrect-selection-webcitation": + gotoUrl='http://webcitation.org/query.php?url='+encodeURIComponent(info.selectionText); + break; + + case "resurrect-page-current-tab": + case "resurrect-link-current-tab": + case "resurrect-selection-current-tab": + openIn = openInEnum.CURRENT_TAB; + browser.storage.local.set({openIn: openIn}); + return; + case "resurrect-page-new-tab": + case "resurrect-link-new-tab": + case "resurrect-selection-new-tab": + openIn = openInEnum.NEW_TAB; + browser.storage.local.set({openIn: openIn}); + return; + case "resurrect-page-new-background-tab": + case "resurrect-link-new-background-tab": + case "resurrect-selection-new-background-tab": + openIn = openInEnum.NEW_BGTAB; + browser.storage.local.set({openIn: openIn}); + return; + case "resurrect-page-new-window": + case "resurrect-link-new-window": + case "resurrect-selection-new-window": + openIn = openInEnum.NEW_WINDOW; + browser.storage.local.set({openIn: openIn}); + return; + } + + if (gotoUrl) { + console.log ("would've gone to " + gotoUrl + " opened in " + openIn); + switch (openIn) { + case openInEnum.CURRENT_TAB: + browser.tabs.update({ "url": gotoUrl}); + break; + case openInEnum.NEW_TAB: + browser.tabs.create({ "url": gotoUrl}); + break; + case openInEnum.NEW_BGTAB: + browser.tabs.create({ "url": gotoUrl, "active":false}); + break; + case openInEnum.NEW_WINDOW: + browser.windows.create({ "url": gotoUrl}); + break; + } + } +}); + + diff --git a/chrome.manifest b/chrome.manifest deleted file mode 100644 index f29ef28..0000000 --- a/chrome.manifest +++ /dev/null @@ -1,42 +0,0 @@ -content resurrect content/ contentaccessible=yes -skin resurrect classic/1.0 skin/ - -overlay chrome://browser/content/browser.xul chrome://resurrect/content/resurrect-overlay.xul -style chrome://global/content/customizeToolbar.xul chrome://resurrect/skin/resurrect-overlay.css - -locale resurrect ca-AD locale/ca-AD/ -locale resurrect cs-CZ locale/cs-CZ/ -locale resurrect da locale/da/ -locale resurrect da-DK locale/da-DK/ -locale resurrect de locale/de/ -locale resurrect de-DE locale/de-DE/ -locale resurrect el locale/el/ -locale resurrect el-GR locale/el-GR/ -locale resurrect en-US locale/en-US/ -locale resurrect es-AR locale/es-AR/ -locale resurrect es-CL locale/es-CL/ -locale resurrect es-ES locale/es-ES/ -locale resurrect fi locale/fi/ -locale resurrect fi-FI locale/fi-FI/ -locale resurrect fr locale/fr/ -locale resurrect fr-FR locale/fr-FR/ -locale resurrect hr-HR locale/hr-HR/ -locale resurrect it locale/it/ -locale resurrect it-IT locale/it-IT/ -locale resurrect ja-JP locale/ja-JP/ -locale resurrect ko-KR locale/ko-KR/ -locale resurrect nl locale/nl/ -locale resurrect nl-NL locale/nl-NL/ -locale resurrect pl locale/pl/ -locale resurrect pl-PL locale/pl-PL/ -locale resurrect pt-BR locale/pt-BR/ -locale resurrect pt-PT locale/pt-PT/ -locale resurrect ru-RU locale/ru-RU/ -locale resurrect sl-SI locale/sl-SI/ -locale resurrect sr locale/sr/ -locale resurrect sv-SE locale/sv-SE/ -locale resurrect tr locale/tr/ -locale resurrect tr-TR locale/tr-TR/ -locale resurrect uk-UA locale/uk-UA/ -locale resurrect zh-CN locale/zh-CN/ -locale resurrect zh-TW locale/zh-TW/ diff --git a/content/netError.xhtml b/content/netError.xhtml deleted file mode 100644 index 2b900d9..0000000 --- a/content/netError.xhtml +++ /dev/null @@ -1,40 +0,0 @@ - - - - -
- - - diff --git a/content/resurrect-overlay.xul b/content/resurrect-overlay.xul deleted file mode 100644 index 12d8e7f..0000000 --- a/content/resurrect-overlay.xul +++ /dev/null @@ -1,41 +0,0 @@ - - - -