diff --git a/src/background.js b/src/background.js index dfa30c3..ac7c578 100644 --- a/src/background.js +++ b/src/background.js @@ -4,9 +4,9 @@ * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ -/* globals chrome, cws_match_pattern, ows_match_pattern, amo_match_patterns, +/* globals chrome, cws_match_pattern, mea_match_pattern, ows_match_pattern, amo_match_patterns, amo_file_version_match_patterns, - cws_pattern, ows_pattern, amo_pattern, amo_file_version_pattern, + cws_pattern, mea_pattern, ows_pattern, amo_pattern, amo_file_version_pattern, get_crx_url, get_zip_name, console, */ /* globals encodeQueryString */ @@ -28,7 +28,7 @@ function togglePageAction(isEnabled) { browser.tabs.onUpdated.addListener(tabsOnUpdatedCheckPageAction); } browser.tabs.query({ - url: [cws_match_pattern, ows_match_pattern].concat(amo_match_patterns, amo_file_version_match_patterns), + url: [cws_match_pattern, mea_match_pattern, ows_match_pattern].concat(amo_match_patterns, amo_file_version_match_patterns), }).then(function(tabs) { if (isEnabled) { tabs.forEach(showPageActionIfNeeded); @@ -128,6 +128,7 @@ chrome.runtime.onInstalled.addListener(function() { chrome.tabs.query({ url: [ cws_match_pattern, + mea_match_pattern, ows_match_pattern, ].concat(amo_match_patterns, amo_file_version_match_patterns), }, function(tabs) { @@ -226,6 +227,6 @@ function showPageActionIfNeeded(details_or_tab) { } } function isPageActionNeededForUrl(url) { - return cws_pattern.test(url) || ows_pattern.test(url) || amo_pattern.test(url) || - amo_file_version_pattern.test(url); + return cws_pattern.test(url) || mea_pattern.test(url) || ows_pattern.test(url) || + amo_pattern.test(url) || amo_file_version_pattern.test(url); } diff --git a/src/bg-contextmenu.js b/src/bg-contextmenu.js index 1ab720b..4d92b01 100644 --- a/src/bg-contextmenu.js +++ b/src/bg-contextmenu.js @@ -5,7 +5,7 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* jshint browser:true, devel:true */ -/* globals chrome, cws_match_pattern, ows_match_pattern, amo_match_patterns, amo_file_version_match_patterns, get_crx_url */ +/* globals chrome, cws_match_pattern, mea_match_pattern, ows_match_pattern, amo_match_patterns, amo_file_version_match_patterns, get_crx_url */ /* globals encodeQueryString */ 'use strict'; @@ -30,6 +30,7 @@ '*://*/*.XPI*', '*://*/*.xpi*', cws_match_pattern, + mea_match_pattern, ows_match_pattern, ].concat(amo_file_version_match_patterns); @@ -180,6 +181,7 @@ contexts: ['all'], documentUrlPatterns: [ cws_match_pattern, + mea_match_pattern, ows_match_pattern, ].concat(amo_file_version_match_patterns), }); diff --git a/src/crxviewer.html b/src/crxviewer.html index f98ddbd..459e01e 100644 --- a/src/crxviewer.html +++ b/src/crxviewer.html @@ -62,7 +62,7 @@
Enter the URL of a Chrome Extension, Firefox addon, zip file, - or the page in the Chrome Web Store, Firefox addon gallery or Opera addon gallery. + or the page in the Chrome Web Store, Firefox addon gallery, Edge Addons Store or Opera addon gallery. or select a local file → diff --git a/src/crxviewer.js b/src/crxviewer.js index 8de76cf..9ecb28d 100644 --- a/src/crxviewer.js +++ b/src/crxviewer.js @@ -1574,7 +1574,7 @@ function initialize() { // the get_crx_url method only takes the extension ID and generates the other // parameters based on the current platform. if (!is_crx_download_url(crx_url)) { - if (cws_pattern.test(crx_url)) { + if (cws_pattern.test(crx_url) || mea_pattern.test(crx_url)) { // Prefer given URL because its slug contains an extra human-readable short name. webstore_url = crx_url; } diff --git a/src/cws_pattern.js b/src/cws_pattern.js index 587ad6b..7aed966 100644 --- a/src/cws_pattern.js +++ b/src/cws_pattern.js @@ -5,8 +5,8 @@ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ /* globals location, getPlatformInfo, navigator */ -/* exported cws_match_pattern, ows_match_pattern, amo_match_patterns, amo_file_version_match_patterns */ -/* exported cws_pattern, ows_pattern, amo_pattern, amo_file_version_pattern */ +/* exported cws_match_pattern, mea_match_pattern, ows_match_pattern, amo_match_patterns, amo_file_version_match_patterns */ +/* exported cws_pattern, mea_pattern, ows_pattern, amo_pattern, amo_file_version_pattern */ /* exported get_crx_url, get_webstore_url, get_zip_name, is_crx_url, is_not_crx_url, getParam */ /* exported is_crx_download_url */ /* exported get_amo_domain, get_amo_slug */ @@ -20,6 +20,11 @@ var cws_download_pattern = /^https?:\/\/clients2\.google\.com\/service\/update2\ // match pattern per Chrome spec var cws_match_pattern = '*://chrome.google.com/webstore/detail/*'; +// Microsoft Edge Addons Store +var mea_pattern = /^https?:\/\/microsoftedge.microsoft.com\/addons\/.+?\/([a-z]{32})(?=[\/#?]|$)/; +var mea_download_pattern = /^https?:\/\/edge\.microsoft\.com\/extensionwebstorebase\/v1\/crx\b.*?%3D([a-z]{32})%26uc/; +var mea_match_pattern = '*://microsoftedge.microsoft.com/addons/detail/*'; + // Opera add-on gallery var ows_pattern = /^https?:\/\/addons.opera.com\/.*?extensions\/(?:details|download)\/([^\/?#]+)/i; var ows_match_pattern = '*://addons.opera.com/*extensions/details/*'; @@ -83,7 +88,7 @@ function get_xpi_url(amoDomain, addonSlug) { } // Returns location of CRX file for a given extensionID or CWS url or Opera add-on URL -// or Firefox addon URL. +// or Firefox addon URL or Microsoft Edge addon URL. function get_crx_url(extensionID_or_url) { var url; var match = ows_pattern.exec(extensionID_or_url); @@ -101,6 +106,10 @@ function get_crx_url(extensionID_or_url) { if (match) { return 'https://' + match[1] + '/firefox/downloads/file/' + match[2] + (match[3] || '/addon.xpi'); } + match = mea_pattern.exec(url) || mea_download_pattern.exec(url); + if (match) { + return 'https://edge.microsoft.com/extensionwebstorebase/v1/crx?response=redirect&x=id%3D' + match[1] + '%26installsource%3Dondemand%26uc'; + } // Chrome Web Store match = get_extensionID(extensionID_or_url); var extensionID = match ? match : extensionID_or_url; @@ -159,6 +168,10 @@ function get_webstore_url(url) { if (cws) { return 'https://chrome.google.com/webstore/detail/' + cws[1]; } + var mea = mea_pattern.exec(url) || mea_download_pattern.exec(url); + if (mea) { + return 'https://microsoftedge.microsoft.com/addons/detail/' + mea[1]; + } var ows = ows_pattern.exec(url); if (ows) { return 'https://addons.opera.com/extensions/details/' + ows[1]; @@ -248,12 +261,12 @@ function get_equivalent_download_url(url) { } function is_crx_url(url) { - return cws_pattern.test(url) || ows_pattern.test(url) || /\.(crx|nex)\b/.test(url); + return cws_pattern.test(url) || mea_pattern.test(url) || ows_pattern.test(url) || /\.(crx|nex)\b/.test(url); } // Whether the given URL is not a CRX file, with certainty. function is_not_crx_url(url) { - if (is_crx_url(url) || cws_download_pattern.test(url)) + if (is_crx_url(url) || cws_download_pattern.test(url) || mea_download_pattern.test(url)) return false; return amo_pattern.test(url) || amo_download_pattern.test(url) || @@ -262,7 +275,7 @@ function is_not_crx_url(url) { } function is_crx_download_url(url) { - return cws_download_pattern.test(url) || amo_download_pattern.test(url); + return cws_download_pattern.test(url) || mea_download_pattern.test(url) || amo_download_pattern.test(url); } // |name| should not contain special RegExp characters, except possibly maybe a '[]' at the end.