зеркало из https://github.com/mozilla/gecko-dev.git
Merge m-c to inbound, a=merge
MozReview-Commit-ID: LZOwJMXpznP
This commit is contained in:
Коммит
7462f47787
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -15,6 +15,7 @@ registerCleanupFunction(function() {
|
|||
Services.perms.removeFromPrincipal(principal, "offline-app");
|
||||
Services.prefs.clearUserPref("offline-apps.quota.warn");
|
||||
Services.prefs.clearUserPref("offline-apps.allow_by_default");
|
||||
Services.prefs.clearUserPref("browser.preferences.useOldOrganization");
|
||||
let {OfflineAppCacheHelper} = Components.utils.import("resource:///modules/offlineAppCache.jsm", {});
|
||||
OfflineAppCacheHelper.clear();
|
||||
});
|
||||
|
@ -33,6 +34,7 @@ function checkInContentPreferences(win) {
|
|||
function test() {
|
||||
waitForExplicitFinish();
|
||||
|
||||
Services.prefs.setBoolPref("browser.preferences.useOldOrganization", false);
|
||||
Services.prefs.setBoolPref("offline-apps.allow_by_default", false);
|
||||
|
||||
// Open a new tab.
|
||||
|
|
|
@ -24,7 +24,7 @@ add_task(async function test() {
|
|||
// Mixed Script Test
|
||||
var url = HTTPS_TEST_ROOT + "file_bug822367_1.html";
|
||||
BrowserTestUtils.loadURI(gTestBrowser, url);
|
||||
await BrowserTestUtils.browserLoaded(gTestBrowser);
|
||||
await BrowserTestUtils.browserLoaded(gTestBrowser, false, url);
|
||||
});
|
||||
|
||||
// Mixed Script Test
|
||||
|
@ -48,7 +48,7 @@ add_task(async function MixedTest1B() {
|
|||
add_task(async function MixedTest2() {
|
||||
var url = HTTPS_TEST_ROOT_2 + "file_bug822367_2.html";
|
||||
BrowserTestUtils.loadURI(gTestBrowser, url);
|
||||
await BrowserTestUtils.browserLoaded(gTestBrowser);
|
||||
await BrowserTestUtils.browserLoaded(gTestBrowser, false, url);
|
||||
|
||||
assertMixedContentBlockingState(gTestBrowser, {activeLoaded: false, activeBlocked: false, passiveLoaded: false});
|
||||
});
|
||||
|
@ -57,7 +57,7 @@ add_task(async function MixedTest2() {
|
|||
add_task(async function MixedTest3() {
|
||||
var url = HTTPS_TEST_ROOT + "file_bug822367_3.html";
|
||||
BrowserTestUtils.loadURI(gTestBrowser, url);
|
||||
await BrowserTestUtils.browserLoaded(gTestBrowser);
|
||||
await BrowserTestUtils.browserLoaded(gTestBrowser, false, url);
|
||||
});
|
||||
|
||||
add_task(async function MixedTest3A() {
|
||||
|
@ -86,7 +86,7 @@ add_task(async function MixedTest3B() {
|
|||
add_task(async function MixedTest4() {
|
||||
var url = HTTPS_TEST_ROOT_2 + "file_bug822367_4.html";
|
||||
BrowserTestUtils.loadURI(gTestBrowser, url);
|
||||
await BrowserTestUtils.browserLoaded(gTestBrowser);
|
||||
await BrowserTestUtils.browserLoaded(gTestBrowser, false, url);
|
||||
});
|
||||
|
||||
add_task(async function MixedTest4A() {
|
||||
|
@ -120,7 +120,7 @@ add_task(async function MixedTest4C() {
|
|||
add_task(async function MixedTest5() {
|
||||
var url = HTTPS_TEST_ROOT + "file_bug822367_5.html";
|
||||
BrowserTestUtils.loadURI(gTestBrowser, url);
|
||||
await BrowserTestUtils.browserLoaded(gTestBrowser);
|
||||
await BrowserTestUtils.browserLoaded(gTestBrowser, false, url);
|
||||
});
|
||||
|
||||
add_task(async function MixedTest5A() {
|
||||
|
@ -143,7 +143,7 @@ add_task(async function MixedTest5B() {
|
|||
add_task(async function MixedTest6() {
|
||||
var url = HTTPS_TEST_ROOT_2 + "file_bug822367_6.html";
|
||||
BrowserTestUtils.loadURI(gTestBrowser, url);
|
||||
await BrowserTestUtils.browserLoaded(gTestBrowser);
|
||||
await BrowserTestUtils.browserLoaded(gTestBrowser, false, url);
|
||||
});
|
||||
|
||||
add_task(async function MixedTest6A() {
|
||||
|
|
|
@ -229,7 +229,7 @@ var CustomizableUIInternal = {
|
|||
panelPlacements.push("characterencoding-button");
|
||||
}
|
||||
|
||||
if (!AppConstants.RELEASE_OR_BETA) {
|
||||
if (AppConstants.MOZ_DEV_EDITION || AppConstants.NIGHTLY_BUILD) {
|
||||
if (Services.prefs.getBoolPref("extensions.webcompat-reporter.enabled")) {
|
||||
panelPlacements.push("webcompat-reporter-button");
|
||||
}
|
||||
|
|
|
@ -119,11 +119,11 @@ function isInDevEdition() {
|
|||
}
|
||||
|
||||
function isInNightly() {
|
||||
return AppConstants.NIGHTLY_BUILD && !AppConstants.MOZ_DEV_EDITION;
|
||||
return AppConstants.NIGHTLY_BUILD;
|
||||
}
|
||||
|
||||
function isNotReleaseOrBeta() {
|
||||
return !AppConstants.RELEASE_OR_BETA;
|
||||
return (isInDevEdition() || isInNightly());
|
||||
}
|
||||
|
||||
function removeNonReleaseButtons(areaPanelPlacements) {
|
||||
|
|
|
@ -7,6 +7,8 @@ from marionette_driver.errors import NoAlertPresentException
|
|||
|
||||
|
||||
class TestFirefoxRefresh(MarionetteTestCase):
|
||||
_sandbox = "firefox-refresh"
|
||||
|
||||
_username = "marionette-test-login"
|
||||
_password = "marionette-test-password"
|
||||
_bookmarkURL = "about:mozilla"
|
||||
|
@ -37,7 +39,7 @@ class TestFirefoxRefresh(MarionetteTestCase):
|
|||
"password"
|
||||
);
|
||||
Services.logins.addLogin(myLogin)
|
||||
""", script_args=[self._username, self._password])
|
||||
""", script_args=(self._username, self._password))
|
||||
|
||||
def createBookmark(self):
|
||||
self.marionette.execute_script("""
|
||||
|
@ -45,7 +47,7 @@ class TestFirefoxRefresh(MarionetteTestCase):
|
|||
let title = arguments[1];
|
||||
PlacesUtils.bookmarks.insertBookmark(PlacesUtils.bookmarks.bookmarksMenuFolder,
|
||||
makeURI(url), 0, title);
|
||||
""", script_args=[self._bookmarkURL, self._bookmarkText])
|
||||
""", script_args=(self._bookmarkURL, self._bookmarkText))
|
||||
|
||||
def createHistory(self):
|
||||
error = self.runAsyncCode("""
|
||||
|
@ -71,7 +73,7 @@ class TestFirefoxRefresh(MarionetteTestCase):
|
|||
},
|
||||
}
|
||||
);
|
||||
""", script_args=[self._historyURL, self._historyTitle])
|
||||
""", script_args=(self._historyURL, self._historyTitle))
|
||||
if error:
|
||||
print error
|
||||
|
||||
|
@ -95,7 +97,7 @@ class TestFirefoxRefresh(MarionetteTestCase):
|
|||
}
|
||||
}
|
||||
});
|
||||
""", script_args=[self._formHistoryFieldName, self._formHistoryValue])
|
||||
""", script_args=(self._formHistoryFieldName, self._formHistoryValue))
|
||||
if error:
|
||||
print error
|
||||
|
||||
|
@ -105,7 +107,7 @@ class TestFirefoxRefresh(MarionetteTestCase):
|
|||
let expireTime = Math.floor(Date.now() / 1000) + 15 * 60;
|
||||
Services.cookies.add(arguments[0], arguments[1], arguments[2], arguments[3],
|
||||
true, false, false, expireTime);
|
||||
""", script_args=[self._cookieHost, self._cookiePath, self._cookieName, self._cookieValue])
|
||||
""", script_args=(self._cookieHost, self._cookiePath, self._cookieName, self._cookieValue))
|
||||
|
||||
def createSession(self):
|
||||
self.runAsyncCode("""
|
||||
|
@ -142,7 +144,7 @@ class TestFirefoxRefresh(MarionetteTestCase):
|
|||
gBrowser.removeTab(tab);
|
||||
}
|
||||
}
|
||||
""", script_args=[self._expectedURLs])
|
||||
""", script_args=(self._expectedURLs,))
|
||||
|
||||
def checkPassword(self):
|
||||
loginInfo = self.marionette.execute_script("""
|
||||
|
@ -166,7 +168,7 @@ class TestFirefoxRefresh(MarionetteTestCase):
|
|||
let url = arguments[0];
|
||||
let bookmarkIds = PlacesUtils.bookmarks.getBookmarkIdsForURI(makeURI(url), {}, {});
|
||||
return bookmarkIds.length == 1 ? PlacesUtils.bookmarks.getItemTitle(bookmarkIds[0]) : "";
|
||||
""", script_args=[self._bookmarkURL])
|
||||
""", script_args=(self._bookmarkURL,))
|
||||
self.assertEqual(titleInBookmarks, self._bookmarkText)
|
||||
|
||||
def checkHistory(self):
|
||||
|
@ -180,7 +182,7 @@ class TestFirefoxRefresh(MarionetteTestCase):
|
|||
}).catch(e => {
|
||||
marionetteScriptFinished("Unexpected error in fetching page: " + e);
|
||||
});
|
||||
""", script_args=[self._historyURL])
|
||||
""", script_args=(self._historyURL,))
|
||||
if type(historyResult) == str:
|
||||
self.fail(historyResult)
|
||||
return
|
||||
|
@ -201,7 +203,7 @@ class TestFirefoxRefresh(MarionetteTestCase):
|
|||
marionetteScriptFinished(results);
|
||||
},
|
||||
});
|
||||
""", script_args=[self._formHistoryFieldName])
|
||||
""", script_args=(self._formHistoryFieldName,))
|
||||
if type(formFieldResults) == str:
|
||||
self.fail(formFieldResults)
|
||||
return
|
||||
|
@ -243,7 +245,7 @@ class TestFirefoxRefresh(MarionetteTestCase):
|
|||
} catch (ex) {
|
||||
return "got exception trying to fetch cookie: " + ex;
|
||||
}
|
||||
""", script_args=[self._cookieHost])
|
||||
""", script_args=(self._cookieHost,))
|
||||
if not isinstance(cookieInfo, dict):
|
||||
self.fail(cookieInfo)
|
||||
return
|
||||
|
@ -309,18 +311,27 @@ class TestFirefoxRefresh(MarionetteTestCase):
|
|||
|
||||
def setUpScriptData(self):
|
||||
self.marionette.set_context(self.marionette.CONTEXT_CHROME)
|
||||
self.marionette.execute_script("""
|
||||
self.runCode("""
|
||||
window.global = {};
|
||||
global.LoginInfo = Components.Constructor("@mozilla.org/login-manager/loginInfo;1", "nsILoginInfo", "init");
|
||||
global.profSvc = Cc["@mozilla.org/toolkit/profile-service;1"].getService(Ci.nsIToolkitProfileService);
|
||||
global.Preferences = Cu.import("resource://gre/modules/Preferences.jsm", {}).Preferences;
|
||||
global.FormHistory = Cu.import("resource://gre/modules/FormHistory.jsm", {}).FormHistory;
|
||||
""", new_sandbox=False, sandbox='system')
|
||||
""")
|
||||
|
||||
def runCode(self, script, *args, **kwargs):
|
||||
return self.marionette.execute_script(script, new_sandbox=False, sandbox='system', *args, **kwargs)
|
||||
return self.marionette.execute_script(script,
|
||||
new_sandbox=False,
|
||||
sandbox=self._sandbox,
|
||||
*args,
|
||||
**kwargs)
|
||||
|
||||
def runAsyncCode(self, script, *args, **kwargs):
|
||||
return self.marionette.execute_async_script(script, new_sandbox=False, sandbox='system', *args, **kwargs)
|
||||
return self.marionette.execute_async_script(script,
|
||||
new_sandbox=False,
|
||||
sandbox=self._sandbox,
|
||||
*args,
|
||||
**kwargs)
|
||||
|
||||
def setUp(self):
|
||||
MarionetteTestCase.setUp(self)
|
||||
|
@ -361,7 +372,7 @@ class TestFirefoxRefresh(MarionetteTestCase):
|
|||
let profile = global.profSvc.getProfileByName(name);
|
||||
profile.remove(false)
|
||||
global.profSvc.flush();
|
||||
""", script_args=[self.profileNameToRemove])
|
||||
""", script_args=(self.profileNameToRemove,))
|
||||
# And delete all the files.
|
||||
shutil.rmtree(self.reset_profile_path, ignore_errors=False, onerror=handleRemoveReadonly)
|
||||
|
||||
|
@ -387,7 +398,7 @@ class TestFirefoxRefresh(MarionetteTestCase):
|
|||
env.set("MOZ_RESET_PROFILE_RESTART", "1");
|
||||
env.set("XRE_PROFILE_PATH", arguments[0]);
|
||||
env.set("XRE_PROFILE_NAME", profileName);
|
||||
""", script_args=[self.marionette.instance.profile.profile, profileName])
|
||||
""", script_args=(self.marionette.instance.profile.profile, profileName,))
|
||||
|
||||
profileLeafName = os.path.basename(os.path.normpath(self.marionette.instance.profile.profile))
|
||||
|
||||
|
@ -414,7 +425,7 @@ class TestFirefoxRefresh(MarionetteTestCase):
|
|||
container.append(dirName);
|
||||
container.append(arguments[0]);
|
||||
return container.path;
|
||||
""", script_args = [profileLeafName])
|
||||
""", script_args=(profileLeafName,))
|
||||
|
||||
self.assertTrue(os.path.isdir(self.reset_profile_path), "Reset profile path should be present")
|
||||
self.assertTrue(os.path.isdir(self.desktop_backup_path), "Backup profile path should be present")
|
||||
|
|
|
@ -3,6 +3,15 @@
|
|||
|
||||
Components.utils.import("resource://gre/modules/Promise.jsm");
|
||||
|
||||
// Tests within /browser/components/preferences/in-content-new/tests/
|
||||
// test the "new" preferences organization, after it was reorganized.
|
||||
// Thus, all of these tests should set the "oldOrganization" to false
|
||||
// before running.
|
||||
Services.prefs.setBoolPref("browser.preferences.useOldOrganization", false);
|
||||
registerCleanupFunction(function() {
|
||||
Services.prefs.clearUserPref("browser.preferences.useOldOrganization");
|
||||
});
|
||||
|
||||
const kDefaultWait = 2000;
|
||||
|
||||
function is_hidden(aElement) {
|
||||
|
|
|
@ -76,8 +76,10 @@ function test() {
|
|||
function doSearch(doc) {
|
||||
// Re-add the listener, and perform a search
|
||||
gBrowser.addProgressListener(listener);
|
||||
doc.getElementById("newtab-search-text").value = "foo";
|
||||
doc.getElementById("newtab-search-submit").click();
|
||||
let input = doc.querySelector("input[id*=search-]");
|
||||
input.focus();
|
||||
input.value = "foo";
|
||||
EventUtils.synthesizeKey("VK_RETURN", {});
|
||||
}
|
||||
|
||||
// load about:newtab, but remove the listener first so it doesn't
|
||||
|
@ -95,20 +97,15 @@ function test() {
|
|||
|
||||
// Observe page setup
|
||||
let win = gBrowser.contentWindowAsCPOW;
|
||||
if (win.gSearch.currentEngineName ==
|
||||
Services.search.currentEngine.name) {
|
||||
doSearch(win.document);
|
||||
} else {
|
||||
info("Waiting for newtab search init");
|
||||
win.addEventListener("ContentSearchService", function done(contentSearchServiceEvent) {
|
||||
info("Got newtab search event " + contentSearchServiceEvent.detail.type);
|
||||
if (contentSearchServiceEvent.detail.type == "State") {
|
||||
win.removeEventListener("ContentSearchService", done);
|
||||
// Let gSearch respond to the event before continuing.
|
||||
executeSoon(() => doSearch(win.document));
|
||||
}
|
||||
});
|
||||
}
|
||||
info("Waiting for newtab search init");
|
||||
win.addEventListener("ContentSearchService", function done(contentSearchServiceEvent) {
|
||||
info("Got newtab search event " + contentSearchServiceEvent.detail.type);
|
||||
if (contentSearchServiceEvent.detail.type == "State") {
|
||||
win.removeEventListener("ContentSearchService", done);
|
||||
// Let gSearch respond to the event before continuing.
|
||||
executeSoon(() => doSearch(win.document));
|
||||
}
|
||||
});
|
||||
}, true);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -76,8 +76,10 @@ function test() {
|
|||
function doSearch(doc) {
|
||||
// Re-add the listener, and perform a search
|
||||
gBrowser.addProgressListener(listener);
|
||||
doc.getElementById("newtab-search-text").value = "foo";
|
||||
doc.getElementById("newtab-search-submit").click();
|
||||
let input = doc.querySelector("input[id*=search-]");
|
||||
input.focus();
|
||||
input.value = "foo";
|
||||
EventUtils.synthesizeKey("VK_RETURN", {});
|
||||
}
|
||||
|
||||
// load about:newtab, but remove the listener first so it doesn't
|
||||
|
@ -95,20 +97,15 @@ function test() {
|
|||
|
||||
// Observe page setup
|
||||
let win = gBrowser.contentWindowAsCPOW;
|
||||
if (win.gSearch.currentEngineName ==
|
||||
Services.search.currentEngine.name) {
|
||||
doSearch(win.document);
|
||||
} else {
|
||||
info("Waiting for newtab search init");
|
||||
win.addEventListener("ContentSearchService", function done(contentSearchServiceEvent) {
|
||||
info("Got newtab search event " + contentSearchServiceEvent.detail.type);
|
||||
if (contentSearchServiceEvent.detail.type == "State") {
|
||||
win.removeEventListener("ContentSearchService", done);
|
||||
// Let gSearch respond to the event before continuing.
|
||||
executeSoon(() => doSearch(win.document));
|
||||
}
|
||||
});
|
||||
}
|
||||
info("Waiting for newtab search init");
|
||||
win.addEventListener("ContentSearchService", function done(contentSearchServiceEvent) {
|
||||
info("Got newtab search event " + contentSearchServiceEvent.detail.type);
|
||||
if (contentSearchServiceEvent.detail.type == "State") {
|
||||
win.removeEventListener("ContentSearchService", done);
|
||||
// Let gSearch respond to the event before continuing.
|
||||
executeSoon(() => doSearch(win.document));
|
||||
}
|
||||
});
|
||||
}, true);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -76,8 +76,10 @@ function test() {
|
|||
function doSearch(doc) {
|
||||
// Re-add the listener, and perform a search
|
||||
gBrowser.addProgressListener(listener);
|
||||
doc.getElementById("newtab-search-text").value = "foo";
|
||||
doc.getElementById("newtab-search-submit").click();
|
||||
let input = doc.querySelector("input[id*=search-]");
|
||||
input.focus();
|
||||
input.value = "foo";
|
||||
EventUtils.synthesizeKey("VK_RETURN", {});
|
||||
}
|
||||
|
||||
// load about:newtab, but remove the listener first so it doesn't
|
||||
|
@ -95,20 +97,15 @@ function test() {
|
|||
|
||||
// Observe page setup
|
||||
let win = gBrowser.contentWindowAsCPOW;
|
||||
if (win.gSearch.currentEngineName ==
|
||||
Services.search.currentEngine.name) {
|
||||
doSearch(win.document);
|
||||
} else {
|
||||
info("Waiting for newtab search init");
|
||||
win.addEventListener("ContentSearchService", function done(contentSearchServiceEvent) {
|
||||
info("Got newtab search event " + contentSearchServiceEvent.detail.type);
|
||||
if (contentSearchServiceEvent.detail.type == "State") {
|
||||
win.removeEventListener("ContentSearchService", done);
|
||||
// Let gSearch respond to the event before continuing.
|
||||
executeSoon(() => doSearch(win.document));
|
||||
}
|
||||
});
|
||||
}
|
||||
info("Waiting for newtab search init");
|
||||
win.addEventListener("ContentSearchService", function done(contentSearchServiceEvent) {
|
||||
info("Got newtab search event " + contentSearchServiceEvent.detail.type);
|
||||
if (contentSearchServiceEvent.detail.type == "State") {
|
||||
win.removeEventListener("ContentSearchService", done);
|
||||
// Let gSearch respond to the event before continuing.
|
||||
executeSoon(() => doSearch(win.document));
|
||||
}
|
||||
});
|
||||
}, true);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -74,8 +74,10 @@ function test() {
|
|||
function doSearch(doc) {
|
||||
// Re-add the listener, and perform a search
|
||||
gBrowser.addProgressListener(listener);
|
||||
doc.getElementById("newtab-search-text").value = "foo";
|
||||
doc.getElementById("newtab-search-submit").click();
|
||||
let input = doc.querySelector("input[id*=search-]");
|
||||
input.focus();
|
||||
input.value = "foo";
|
||||
EventUtils.synthesizeKey("VK_RETURN", {});
|
||||
}
|
||||
|
||||
// load about:newtab, but remove the listener first so it doesn't
|
||||
|
@ -93,20 +95,15 @@ function test() {
|
|||
|
||||
// Observe page setup
|
||||
let win = gBrowser.contentWindowAsCPOW;
|
||||
if (win.gSearch.currentEngineName ==
|
||||
Services.search.currentEngine.name) {
|
||||
doSearch(win.document);
|
||||
} else {
|
||||
info("Waiting for newtab search init");
|
||||
win.addEventListener("ContentSearchService", function done(searchServiceEvent) {
|
||||
info("Got newtab search event " + searchServiceEvent.detail.type);
|
||||
if (searchServiceEvent.detail.type == "State") {
|
||||
win.removeEventListener("ContentSearchService", done);
|
||||
// Let gSearch respond to the event before continuing.
|
||||
executeSoon(() => doSearch(win.document));
|
||||
}
|
||||
});
|
||||
}
|
||||
info("Waiting for newtab search init");
|
||||
win.addEventListener("ContentSearchService", function done(searchServiceEvent) {
|
||||
info("Got newtab search event " + searchServiceEvent.detail.type);
|
||||
if (searchServiceEvent.detail.type == "State") {
|
||||
win.removeEventListener("ContentSearchService", done);
|
||||
// Let gSearch respond to the event before continuing.
|
||||
executeSoon(() => doSearch(win.document));
|
||||
}
|
||||
});
|
||||
}, true);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -76,8 +76,10 @@ function test() {
|
|||
function doSearch(doc) {
|
||||
// Re-add the listener, and perform a search
|
||||
gBrowser.addProgressListener(listener);
|
||||
doc.getElementById("newtab-search-text").value = "foo";
|
||||
doc.getElementById("newtab-search-submit").click();
|
||||
let input = doc.querySelector("input[id*=search-]");
|
||||
input.focus();
|
||||
input.value = "foo";
|
||||
EventUtils.synthesizeKey("VK_RETURN", {});
|
||||
}
|
||||
|
||||
// load about:newtab, but remove the listener first so it doesn't
|
||||
|
@ -95,20 +97,15 @@ function test() {
|
|||
|
||||
// Observe page setup
|
||||
let win = gBrowser.contentWindowAsCPOW;
|
||||
if (win.gSearch.currentEngineName ==
|
||||
Services.search.currentEngine.name) {
|
||||
doSearch(win.document);
|
||||
} else {
|
||||
info("Waiting for newtab search init");
|
||||
win.addEventListener("ContentSearchService", function done(searchServiceEvent) {
|
||||
info("Got newtab search event " + searchServiceEvent.detail.type);
|
||||
if (searchServiceEvent.detail.type == "State") {
|
||||
win.removeEventListener("ContentSearchService", done);
|
||||
// Let gSearch respond to the event before continuing.
|
||||
executeSoon(() => doSearch(win.document));
|
||||
}
|
||||
});
|
||||
}
|
||||
info("Waiting for newtab search init");
|
||||
win.addEventListener("ContentSearchService", function done(searchServiceEvent) {
|
||||
info("Got newtab search event " + searchServiceEvent.detail.type);
|
||||
if (searchServiceEvent.detail.type == "State") {
|
||||
win.removeEventListener("ContentSearchService", done);
|
||||
// Let gSearch respond to the event before continuing.
|
||||
executeSoon(() => doSearch(win.document));
|
||||
}
|
||||
});
|
||||
}, true);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -22,6 +22,11 @@ if not CONFIG['RELEASE_OR_BETA']:
|
|||
'flyweb',
|
||||
'formautofill',
|
||||
'presentation',
|
||||
]
|
||||
|
||||
# Only include the following system add-ons if building DevEdition or Nightly
|
||||
if CONFIG['MOZ_DEV_EDITION'] or CONFIG['NIGHTLY_BUILD']:
|
||||
DIRS += [
|
||||
'webcompat-reporter',
|
||||
]
|
||||
|
||||
|
|
|
@ -107,6 +107,8 @@ endif
|
|||
@$(MAKE) -C ../extensions/pocket/locale AB_CD=$* XPI_NAME=locale-$*
|
||||
ifndef RELEASE_OR_BETA
|
||||
@$(MAKE) -C ../extensions/presentation/locale AB_CD=$* XPI_NAME=locale-$*
|
||||
endif
|
||||
ifneq '$(or $(MOZ_DEV_EDITION),$(NIGHTLY_BUILD))' ''
|
||||
@$(MAKE) -C ../extensions/webcompat-reporter/locales AB_CD=$* XPI_NAME=locale-$*
|
||||
endif
|
||||
@$(MAKE) -C ../../intl/locales AB_CD=$* XPI_NAME=locale-$*
|
||||
|
|
|
@ -18,7 +18,7 @@ def test(mod, path, entity = None):
|
|||
if mod not in ("browser", "extensions/spellcheck"):
|
||||
# we only have exceptions for browser and extensions/spellcheck
|
||||
return "error"
|
||||
if not entity:
|
||||
if entity is None:
|
||||
# the only files to ignore are spell checkers
|
||||
if mod == "extensions/spellcheck":
|
||||
return "ignore"
|
||||
|
|
|
@ -0,0 +1,169 @@
|
|||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# 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/.
|
||||
|
||||
basepath = "../.."
|
||||
|
||||
locales = [
|
||||
"ach",
|
||||
"af",
|
||||
"an",
|
||||
"ar",
|
||||
"as",
|
||||
"ast",
|
||||
"az",
|
||||
"be",
|
||||
"bg",
|
||||
"bn-BD",
|
||||
"bn-IN",
|
||||
"br",
|
||||
"bs",
|
||||
"ca",
|
||||
"cak",
|
||||
"cs",
|
||||
"cy",
|
||||
"da",
|
||||
"de",
|
||||
"dsb",
|
||||
"el",
|
||||
"en-GB",
|
||||
"en-ZA",
|
||||
"eo",
|
||||
"es-AR",
|
||||
"es-CL",
|
||||
"es-ES",
|
||||
"es-MX",
|
||||
"et",
|
||||
"eu",
|
||||
"fa",
|
||||
"ff",
|
||||
"fi",
|
||||
"fr",
|
||||
"fy-NL",
|
||||
"ga-IE",
|
||||
"gd",
|
||||
"gl",
|
||||
"gn",
|
||||
"gu-IN",
|
||||
"he",
|
||||
"hi-IN",
|
||||
"hr",
|
||||
"hsb",
|
||||
"hu",
|
||||
"hy-AM",
|
||||
"id",
|
||||
"is",
|
||||
"it",
|
||||
"ja",
|
||||
"ja-JP-mac",
|
||||
"ka",
|
||||
"kab",
|
||||
"kk",
|
||||
"km",
|
||||
"kn",
|
||||
"ko",
|
||||
"lij",
|
||||
"lo",
|
||||
"lt",
|
||||
"ltg",
|
||||
"lv",
|
||||
"mai",
|
||||
"mk",
|
||||
"ml",
|
||||
"mr",
|
||||
"ms",
|
||||
"my",
|
||||
"nb-NO",
|
||||
"ne-NP",
|
||||
"nl",
|
||||
"nn-NO",
|
||||
"or",
|
||||
"pa-IN",
|
||||
"pl",
|
||||
"pt-BR",
|
||||
"pt-PT",
|
||||
"rm",
|
||||
"ro",
|
||||
"ru",
|
||||
"si",
|
||||
"sk",
|
||||
"sl",
|
||||
"son",
|
||||
"sq",
|
||||
"sr",
|
||||
"sv-SE",
|
||||
"ta",
|
||||
"te",
|
||||
"th",
|
||||
"tl",
|
||||
"tr",
|
||||
"uk",
|
||||
"ur",
|
||||
"uz",
|
||||
"vi",
|
||||
"xh",
|
||||
"zh-CN",
|
||||
"zh-TW",
|
||||
]
|
||||
|
||||
[env]
|
||||
l = "{l10n_base}/{locale}/"
|
||||
|
||||
|
||||
[[paths]]
|
||||
reference = "browser/locales/en-US/**"
|
||||
l10n = "{l}browser/**"
|
||||
|
||||
[[paths]]
|
||||
reference = "browser/branding/official/locales/en-US/**"
|
||||
l10n = "{l}browser/branding/official/**"
|
||||
|
||||
[[paths]]
|
||||
reference = "browser/extensions/onboarding/locales/en-US/**"
|
||||
l10n = "{l}browser/extensions/onboarding/**"
|
||||
|
||||
[[paths]]
|
||||
reference = "browser/extensions/webcompat-reporter/locales/en-US/**"
|
||||
l10n = "{l}browser/extensions/webcompat-reporter/**"
|
||||
|
||||
[[paths]]
|
||||
reference = "services/sync/locales/en-US/**"
|
||||
l10n = "{l}services/sync/**"
|
||||
|
||||
|
||||
[[includes]]
|
||||
path = "toolkit/locales/l10n.toml"
|
||||
|
||||
[[includes]]
|
||||
path = "devtools/client/locales/l10n.toml"
|
||||
|
||||
# Filters
|
||||
# The filters below are evaluated one after the other, in the given order.
|
||||
# Enter a combination of path as in the localization, key, and an action,
|
||||
# to change the default behavior of compare-locales and l10n merge.
|
||||
#
|
||||
# For browser/locales/en-US/chrome/browser/foo.properties,
|
||||
# path would be {l}browser/chrome/browser/foo.properties
|
||||
# key: the key/id of the entity
|
||||
# If key isn't specified, the complete file can be missing.
|
||||
[[filters]]
|
||||
path = "{l}browser/defines.inc"
|
||||
key = "MOZ_LANGPACK_CONTRIBUTORS"
|
||||
action = "ignore"
|
||||
|
||||
[[filters]]
|
||||
path = [
|
||||
"{l}browser/defines.inc",
|
||||
"{l}browser/firefox-l10n.js",
|
||||
]
|
||||
action = "ignore"
|
||||
|
||||
[[filters]]
|
||||
path = "{l}browser/chrome/browser-region/region.properties"
|
||||
key = [
|
||||
"re:^browser\\.search\\.order\\.[1-9]$",
|
||||
"re:^browser\\.contentHandlers\\.types\\.[0-5]\\..*$",
|
||||
"re:^gecko\\.handlerService\\.schemes\\..*$",
|
||||
"re:^gecko\\.handlerService\\.defaultHandlersVersion$"
|
||||
]
|
||||
action = "ignore"
|
|
@ -88,7 +88,7 @@ XPCOMUtils.defineLazyGetter(this, "DEFAULT_AREA_PLACEMENTS", function() {
|
|||
result["PanelUI-contents"].push("characterencoding-button");
|
||||
}
|
||||
|
||||
if (!AppConstants.RELEASE_OR_BETA) {
|
||||
if (AppConstants.MOZ_DEV_EDITION || AppConstants.NIGHTLY_BUILD) {
|
||||
if (Services.prefs.getBoolPref("extensions.webcompat-reporter.enabled")) {
|
||||
result["PanelUI-contents"].push("webcompat-reporter-button");
|
||||
}
|
||||
|
|
|
@ -31,12 +31,12 @@
|
|||
--toolbarbutton-active-background: rgba(154,154,154,.5) linear-gradient(rgba(255,255,255,.7), rgba(255,255,255,.4));
|
||||
--toolbarbutton-active-bordercolor: rgba(0,0,0,.3);
|
||||
--toolbarbutton-active-boxshadow: 0 1px 1px rgba(0,0,0,.1) inset, 0 0 1px rgba(0,0,0,.3) inset;
|
||||
|
||||
--toolbarbutton-checkedhover-backgroundcolor: rgba(200,200,200,.5);
|
||||
%endif
|
||||
|
||||
--toolbarbutton-vertical-text-padding: calc(var(--toolbarbutton-inner-padding) - 1px);
|
||||
|
||||
--toolbarbutton-checkedhover-backgroundcolor: rgba(200,200,200,.5);
|
||||
|
||||
--panel-separator-color: ThreeDShadow;
|
||||
--arrowpanel-dimmed: hsla(0,0%,80%,.3);
|
||||
--arrowpanel-dimmed-further: hsla(0,0%,80%,.45);
|
||||
|
|
|
@ -40,9 +40,9 @@
|
|||
--toolbarbutton-active-boxshadow: 0 1px 0 hsla(0,0%,100%,.5),
|
||||
0 1px 0 hsla(0,0%,0%,.05) inset,
|
||||
0 1px 1px hsla(0,0%,0%,.2) inset;
|
||||
%endif
|
||||
|
||||
--toolbarbutton-checkedhover-backgroundcolor: hsla(0,0%,0%,.09);
|
||||
%endif
|
||||
|
||||
--urlbar-dropmarker-url: url("chrome://browser/skin/urlbar-history-dropmarker.png");
|
||||
--urlbar-dropmarker-region: rect(0, 11px, 14px, 0);
|
||||
|
|
|
@ -53,6 +53,7 @@
|
|||
--urlbar-dropmarker-active-2x-region: rect(0px, 33px, 14px, 22px);
|
||||
}
|
||||
|
||||
%ifndef MOZ_PHOTON_THEME
|
||||
/* Override the lwtheme-specific styling for toolbar buttons */
|
||||
:root:-moz-lwtheme-brighttext,
|
||||
toolbar:-moz-lwtheme-brighttext {
|
||||
|
@ -63,9 +64,8 @@ toolbar:-moz-lwtheme-brighttext {
|
|||
--toolbarbutton-active-boxshadow: none;
|
||||
--toolbarbutton-active-bordercolor: rgba(25,33,38,.8);
|
||||
--toolbarbutton-checkedhover-backgroundcolor: #3C5283;
|
||||
|
||||
}
|
||||
|
||||
%endif
|
||||
:root:-moz-lwtheme-darktext {
|
||||
--url-and-searchbar-background-color: #fff;
|
||||
|
||||
|
@ -88,6 +88,7 @@ toolbar:-moz-lwtheme-brighttext {
|
|||
--pinned-tab-glow: radial-gradient(22px at center calc(100% - 2px), rgba(76,158,217,0.9) 13%, transparent 16%);
|
||||
}
|
||||
|
||||
%ifndef MOZ_PHOTON_THEME
|
||||
/* Override the lwtheme-specific styling for toolbar buttons */
|
||||
:root:-moz-lwtheme-darktext,
|
||||
toolbar:-moz-lwtheme-darktext {
|
||||
|
@ -100,7 +101,6 @@ toolbar:-moz-lwtheme-darktext {
|
|||
--toolbarbutton-checkedhover-backgroundcolor: #d7d7d8;
|
||||
}
|
||||
|
||||
%ifndef MOZ_PHOTON_THEME
|
||||
/* Give some space to drag the window around while customizing
|
||||
(normal space to left and right of tabs doesn't work in this case) */
|
||||
#main-window[tabsintitlebar][customizing] {
|
||||
|
|
|
@ -17,6 +17,8 @@
|
|||
--toolbarbutton-inner-padding: 6px;
|
||||
|
||||
--backbutton-background: hsla(0,100%,100%,.8);
|
||||
--backbutton-hover-background: var(--backbutton-background);
|
||||
--backbutton-active-background: var(--toolbarbutton-active-background);
|
||||
|
||||
--backbutton-border-color: hsla(240,5%,5%,.3);
|
||||
%else
|
||||
|
@ -34,8 +36,8 @@
|
|||
--toolbarbutton-inner-padding: 9px;
|
||||
}
|
||||
|
||||
toolbar:-moz-lwtheme {
|
||||
%ifndef MOZ_PHOTON_THEME
|
||||
toolbar:-moz-lwtheme {
|
||||
--toolbarbutton-hover-background: rgba(255,255,255,.25);
|
||||
--toolbarbutton-active-background: rgba(70%,70%,70%,.25);
|
||||
|
||||
|
@ -43,13 +45,17 @@ toolbar:-moz-lwtheme {
|
|||
|
||||
--toolbarbutton-active-bordercolor: rgba(0,0,0,.3);
|
||||
--toolbarbutton-active-boxshadow: 0 0 2px rgba(0,0,0,.6) inset;
|
||||
%endif
|
||||
|
||||
--toolbarbutton-checkedhover-backgroundcolor: rgba(85%,85%,85%,.25);
|
||||
}
|
||||
|
||||
%ifdef MOZ_PHOTON_THEME
|
||||
%else
|
||||
toolbar[brighttext] {
|
||||
--backbutton-background: hsla(240,5%,5%,.1);
|
||||
--toolbarbutton-hover-background: hsla(0,0%,100%,.2);
|
||||
--toolbarbutton-active-background: hsla(0,0%,100%,.3);
|
||||
|
||||
--backbutton-background: var(--toolbarbutton-hover-background);
|
||||
--backbutton-hover-background: var(--toolbarbutton-active-background);
|
||||
--backbutton-active-background: hsla(0,0%,100%,.4);
|
||||
}
|
||||
%endif
|
||||
|
||||
|
@ -288,8 +294,10 @@ toolbarbutton.bookmark-item:not(.subviewbutton):hover:not([disabled="true"]):not
|
|||
@conditionalForwardWithUrlbar@ > #forward-button:not([open]):not(:active):not([disabled]):hover > .toolbarbutton-icon,
|
||||
%endif
|
||||
#nav-bar .toolbarbutton-1:not([buttonover]):not([open]):not(:active):hover > .toolbarbutton-menubutton-dropmarker:not([disabled]) > .dropmarker-icon {
|
||||
%ifdef MOZ_PHOTON_THEME
|
||||
background-color: var(--toolbarbutton-hover-background);
|
||||
%else
|
||||
background: var(--toolbarbutton-hover-background);
|
||||
%ifndef MOZ_PHOTON_THEME
|
||||
border-color: var(--toolbarbutton-hover-bordercolor);
|
||||
box-shadow: var(--toolbarbutton-hover-boxshadow);
|
||||
%endif
|
||||
|
@ -304,8 +312,10 @@ toolbarbutton.bookmark-item[open="true"],
|
|||
#nav-bar .toolbarbutton-1:not([disabled=true]):-moz-any([open],[checked],:hover:active) > .toolbarbutton-icon,
|
||||
#nav-bar .toolbarbutton-1:not([disabled=true]):-moz-any([open],[checked],:hover:active) > .toolbarbutton-text,
|
||||
#nav-bar .toolbarbutton-1:not([disabled=true]):-moz-any([open],[checked],:hover:active) > .toolbarbutton-badge-stack {
|
||||
%ifdef MOZ_PHOTON_THEME
|
||||
background-color: var(--toolbarbutton-active-background);
|
||||
%else
|
||||
background: var(--toolbarbutton-active-background);
|
||||
%ifndef MOZ_PHOTON_THEME
|
||||
border-color: var(--toolbarbutton-active-bordercolor);
|
||||
box-shadow: var(--toolbarbutton-active-boxshadow);
|
||||
%endif
|
||||
|
@ -314,7 +324,11 @@ toolbarbutton.bookmark-item[open="true"],
|
|||
}
|
||||
|
||||
#nav-bar .toolbarbutton-1[checked]:not(:active):hover > .toolbarbutton-icon {
|
||||
%ifdef MOZ_PHOTON_THEME
|
||||
background-color: var(--toolbarbutton-hover-background);
|
||||
%else
|
||||
background-color: var(--toolbarbutton-checkedhover-backgroundcolor);
|
||||
%endif
|
||||
transition: background-color .4s;
|
||||
}
|
||||
|
||||
|
@ -382,10 +396,10 @@ toolbarbutton.bookmark-item[open="true"],
|
|||
|
||||
:root:not([uidensity=compact]) #back-button > .toolbarbutton-icon {
|
||||
%ifdef MOZ_PHOTON_THEME
|
||||
background: var(--backbutton-background);
|
||||
border: 1px solid var(--backbutton-border-color);
|
||||
background-color: var(--backbutton-background);
|
||||
background-origin: padding-box;
|
||||
background-clip: padding-box;
|
||||
border: 1px solid var(--backbutton-border-color);
|
||||
%endif
|
||||
border-radius: 10000px;
|
||||
max-width: 32px;
|
||||
|
@ -404,14 +418,14 @@ toolbarbutton.bookmark-item[open="true"],
|
|||
|
||||
%ifdef MOZ_PHOTON_THEME
|
||||
:root:not([uidensity=compact]) #back-button:not([disabled]):not([open]):hover > .toolbarbutton-icon {
|
||||
background: var(--backbutton-background) !important;
|
||||
background-color: var(--backbutton-hover-background) !important;
|
||||
box-shadow: 0 1px 6px hsla(0,0%,0%,.1);
|
||||
border-color: hsla(240,5%,5%,.35);
|
||||
}
|
||||
|
||||
:root:not([uidensity=compact]) #back-button[open] > .toolbarbutton-icon,
|
||||
:root:not([uidensity=compact]) #back-button:not([disabled]):hover:active > .toolbarbutton-icon {
|
||||
background: var(--toolbarbutton-active-background) !important;
|
||||
background-color: var(--backbutton-active-background) !important;
|
||||
border-color: hsla(240,5%,5%,.40);
|
||||
}
|
||||
%endif
|
||||
|
|
|
@ -37,9 +37,9 @@
|
|||
|
||||
--toolbarbutton-active-bordercolor: rgba(0,0,0,.3);
|
||||
--toolbarbutton-active-boxshadow: 0 0 0 1px rgba(0,0,0,.15) inset;
|
||||
%endif
|
||||
|
||||
--toolbarbutton-checkedhover-backgroundcolor: rgba(0,0,0,.1);
|
||||
%endif
|
||||
|
||||
--urlbar-dropmarker-url: url("chrome://browser/skin/urlbar-history-dropmarker.png");
|
||||
--urlbar-dropmarker-region: rect(0px, 11px, 14px, 0px);
|
||||
|
@ -64,6 +64,7 @@
|
|||
}
|
||||
}
|
||||
|
||||
%ifndef MOZ_PHOTON_THEME
|
||||
toolbar[brighttext] {
|
||||
--toolbarbutton-hover-background: rgba(255,255,255,.25);
|
||||
--toolbarbutton-hover-bordercolor: rgba(255,255,255,.5);
|
||||
|
@ -74,7 +75,7 @@ toolbar[brighttext] {
|
|||
|
||||
--toolbarbutton-checkedhover-backgroundcolor: rgba(255,255,255,.3);
|
||||
}
|
||||
|
||||
%endif
|
||||
#menubar-items {
|
||||
-moz-box-orient: vertical; /* for flex hack */
|
||||
}
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# 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/.
|
||||
|
||||
basepath = "../../.."
|
||||
|
||||
[env]
|
||||
l = "{l10n_base}/{locale}/"
|
||||
|
||||
[[paths]]
|
||||
reference = "devtools/client/locales/en-US/**"
|
||||
l10n = "{l}devtools/client/**"
|
|
@ -0,0 +1,12 @@
|
|||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# 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/.
|
||||
|
||||
basepath = "../../.."
|
||||
|
||||
[env]
|
||||
l = "{l10n_base}/{locale}/"
|
||||
|
||||
[[paths]]
|
||||
reference = "devtools/shared/locales/en-US/**"
|
||||
l10n = "{l}devtools/shared/**"
|
|
@ -33,6 +33,7 @@
|
|||
#include "mozilla/Preferences.h"
|
||||
#include "mozilla/Telemetry.h"
|
||||
#include "BatteryManager.h"
|
||||
#include "mozilla/dom/CredentialsContainer.h"
|
||||
#include "mozilla/dom/GamepadServiceTest.h"
|
||||
#include "mozilla/dom/PowerManager.h"
|
||||
#include "mozilla/dom/WakeLock.h"
|
||||
|
@ -48,7 +49,6 @@
|
|||
#include "mozilla/dom/VRDisplay.h"
|
||||
#include "mozilla/dom/VRDisplayEvent.h"
|
||||
#include "mozilla/dom/VRServiceTest.h"
|
||||
#include "mozilla/dom/WebAuthentication.h"
|
||||
#include "mozilla/dom/workers/RuntimeService.h"
|
||||
#include "mozilla/Hal.h"
|
||||
#include "mozilla/ClearOnShutdown.h"
|
||||
|
@ -205,7 +205,7 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Navigator)
|
|||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mPowerManager)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mConnection)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mStorageManager)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mAuthentication)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCredentials)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mMediaDevices)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mTimeManager)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mServiceWorkerContainer)
|
||||
|
@ -2001,13 +2001,13 @@ Navigator::GetPresentation(ErrorResult& aRv)
|
|||
return mPresentation;
|
||||
}
|
||||
|
||||
WebAuthentication*
|
||||
Navigator::Authentication()
|
||||
CredentialsContainer*
|
||||
Navigator::Credentials()
|
||||
{
|
||||
if (!mAuthentication) {
|
||||
mAuthentication = new WebAuthentication(GetWindow());
|
||||
if (!mCredentials) {
|
||||
mCredentials = new CredentialsContainer(GetWindow());
|
||||
}
|
||||
return mAuthentication;
|
||||
return mCredentials;
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
|
|
|
@ -42,7 +42,7 @@ class ServiceWorkerContainer;
|
|||
class DOMRequest;
|
||||
struct FlyWebPublishOptions;
|
||||
struct FlyWebFilter;
|
||||
class WebAuthentication;
|
||||
class CredentialsContainer;
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
|
@ -225,7 +225,7 @@ public:
|
|||
|
||||
already_AddRefed<ServiceWorkerContainer> ServiceWorker();
|
||||
|
||||
mozilla::dom::WebAuthentication* Authentication();
|
||||
mozilla::dom::CredentialsContainer* Credentials();
|
||||
|
||||
void GetLanguages(nsTArray<nsString>& aLanguages);
|
||||
|
||||
|
@ -294,7 +294,7 @@ private:
|
|||
RefPtr<Promise> mBatteryPromise;
|
||||
RefPtr<PowerManager> mPowerManager;
|
||||
RefPtr<network::Connection> mConnection;
|
||||
RefPtr<WebAuthentication> mAuthentication;
|
||||
RefPtr<CredentialsContainer> mCredentials;
|
||||
RefPtr<MediaDevices> mMediaDevices;
|
||||
RefPtr<time::TimeManager> mTimeManager;
|
||||
RefPtr<ServiceWorkerContainer> mServiceWorkerContainer;
|
||||
|
|
|
@ -0,0 +1,50 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#include "mozilla/dom/Credential.h"
|
||||
#include "mozilla/dom/CredentialManagementBinding.h"
|
||||
#include "nsCycleCollectionParticipant.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(Credential, mParent)
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTING_ADDREF(Credential)
|
||||
NS_IMPL_CYCLE_COLLECTING_RELEASE(Credential)
|
||||
|
||||
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Credential)
|
||||
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
|
||||
NS_INTERFACE_MAP_ENTRY(nsISupports)
|
||||
NS_INTERFACE_MAP_END
|
||||
|
||||
Credential::Credential(nsPIDOMWindowInner* aParent)
|
||||
: mParent(aParent)
|
||||
{}
|
||||
|
||||
Credential::~Credential()
|
||||
{}
|
||||
|
||||
JSObject*
|
||||
Credential::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
|
||||
{
|
||||
return CredentialBinding::Wrap(aCx, this, aGivenProto);
|
||||
}
|
||||
|
||||
void
|
||||
Credential::GetId(nsAString& aId) const
|
||||
{
|
||||
aId.Assign(mId);
|
||||
}
|
||||
|
||||
void
|
||||
Credential::GetType(nsAString& aType) const
|
||||
{
|
||||
aType.Assign(mType);
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
|
@ -0,0 +1,56 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#ifndef mozilla_dom_Credential_h
|
||||
#define mozilla_dom_Credential_h
|
||||
|
||||
#include "mozilla/dom/CredentialManagementBinding.h"
|
||||
#include "nsCycleCollectionParticipant.h"
|
||||
#include "nsPIDOMWindow.h"
|
||||
#include "nsWrapperCache.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
class Credential : public nsISupports
|
||||
, public nsWrapperCache
|
||||
{
|
||||
public:
|
||||
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
|
||||
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(Credential)
|
||||
|
||||
public:
|
||||
explicit Credential(nsPIDOMWindowInner* aParent);
|
||||
|
||||
protected:
|
||||
virtual ~Credential();
|
||||
|
||||
public:
|
||||
nsISupports*
|
||||
GetParentObject() const
|
||||
{
|
||||
return mParent;
|
||||
}
|
||||
|
||||
JSObject*
|
||||
WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
|
||||
|
||||
void
|
||||
GetId(nsAString& aId) const;
|
||||
|
||||
void
|
||||
GetType(nsAString& aType) const;
|
||||
|
||||
private:
|
||||
nsCOMPtr<nsPIDOMWindowInner> mParent;
|
||||
nsAutoString mId;
|
||||
nsAutoString mType;
|
||||
};
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // mozilla_dom_Credential_h
|
|
@ -0,0 +1,54 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#include "mozilla/dom/CredentialsContainer.h"
|
||||
#include "mozilla/dom/Promise.h"
|
||||
#include "mozilla/dom/WebAuthnManager.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(CredentialsContainer, mParent)
|
||||
NS_IMPL_CYCLE_COLLECTING_ADDREF(CredentialsContainer)
|
||||
NS_IMPL_CYCLE_COLLECTING_RELEASE(CredentialsContainer)
|
||||
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(CredentialsContainer)
|
||||
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
|
||||
NS_INTERFACE_MAP_ENTRY(nsISupports)
|
||||
NS_INTERFACE_MAP_END
|
||||
|
||||
CredentialsContainer::CredentialsContainer(nsPIDOMWindowInner* aParent) :
|
||||
mParent(aParent)
|
||||
{
|
||||
MOZ_ASSERT(aParent);
|
||||
}
|
||||
|
||||
CredentialsContainer::~CredentialsContainer()
|
||||
{}
|
||||
|
||||
JSObject*
|
||||
CredentialsContainer::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
|
||||
{
|
||||
return CredentialsContainerBinding::Wrap(aCx, this, aGivenProto);
|
||||
}
|
||||
|
||||
already_AddRefed<Promise>
|
||||
CredentialsContainer::Get(const CredentialRequestOptions& aOptions)
|
||||
{
|
||||
RefPtr<WebAuthnManager> mgr = WebAuthnManager::GetOrCreate();
|
||||
MOZ_ASSERT(mgr);
|
||||
return mgr->GetAssertion(mParent, aOptions.mPublicKey);
|
||||
}
|
||||
|
||||
already_AddRefed<Promise>
|
||||
CredentialsContainer::Create(const CredentialCreationOptions& aOptions)
|
||||
{
|
||||
RefPtr<WebAuthnManager> mgr = WebAuthnManager::GetOrCreate();
|
||||
MOZ_ASSERT(mgr);
|
||||
return mgr->MakeCredential(mParent, aOptions.mPublicKey);
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
|
@ -0,0 +1,47 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#ifndef mozilla_dom_CredentialsContainer_h
|
||||
#define mozilla_dom_CredentialsContainer_h
|
||||
|
||||
#include "mozilla/dom/CredentialManagementBinding.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
class CredentialsContainer final : public nsISupports
|
||||
, public nsWrapperCache
|
||||
{
|
||||
public:
|
||||
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
|
||||
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(CredentialsContainer)
|
||||
|
||||
explicit CredentialsContainer(nsPIDOMWindowInner* aParent);
|
||||
|
||||
nsPIDOMWindowInner*
|
||||
GetParentObject() const
|
||||
{
|
||||
return mParent;
|
||||
}
|
||||
|
||||
virtual JSObject*
|
||||
WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
|
||||
|
||||
already_AddRefed<Promise>
|
||||
Get(const CredentialRequestOptions& aOptions);
|
||||
already_AddRefed<Promise>
|
||||
Create(const CredentialCreationOptions& aOptions);
|
||||
|
||||
private:
|
||||
~CredentialsContainer();
|
||||
|
||||
nsCOMPtr<nsPIDOMWindowInner> mParent;
|
||||
};
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // mozilla_dom_CredentialsContainer_h
|
|
@ -0,0 +1,22 @@
|
|||
# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
|
||||
# vim: set filetype=python:
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# 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/.
|
||||
|
||||
with Files("**"):
|
||||
BUG_COMPONENT = ("Core", "DOM: Device Interfaces")
|
||||
|
||||
EXPORTS.mozilla.dom += [
|
||||
'Credential.h',
|
||||
'CredentialsContainer.h',
|
||||
]
|
||||
|
||||
UNIFIED_SOURCES += [
|
||||
'Credential.cpp',
|
||||
'CredentialsContainer.cpp',
|
||||
]
|
||||
|
||||
include('/ipc/chromium/chromium-config.mozbuild')
|
||||
|
||||
FINAL_LIBRARY = 'xul'
|
|
@ -50,6 +50,7 @@ DIRS += [
|
|||
'cache',
|
||||
'canvas',
|
||||
'commandhandler',
|
||||
'credentialmanagement',
|
||||
'crypto',
|
||||
'encoding',
|
||||
'events',
|
||||
|
|
|
@ -0,0 +1,66 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#include "mozilla/dom/WebAuthenticationBinding.h"
|
||||
#include "mozilla/dom/AuthenticatorAssertionResponse.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
NS_IMPL_ADDREF_INHERITED(AuthenticatorAssertionResponse, AuthenticatorResponse)
|
||||
NS_IMPL_RELEASE_INHERITED(AuthenticatorAssertionResponse, AuthenticatorResponse)
|
||||
|
||||
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(AuthenticatorAssertionResponse)
|
||||
NS_INTERFACE_MAP_END_INHERITING(AuthenticatorResponse)
|
||||
|
||||
AuthenticatorAssertionResponse::AuthenticatorAssertionResponse(nsPIDOMWindowInner* aParent)
|
||||
: AuthenticatorResponse(aParent)
|
||||
{}
|
||||
|
||||
AuthenticatorAssertionResponse::~AuthenticatorAssertionResponse()
|
||||
{}
|
||||
|
||||
JSObject*
|
||||
AuthenticatorAssertionResponse::WrapObject(JSContext* aCx,
|
||||
JS::Handle<JSObject*> aGivenProto)
|
||||
{
|
||||
return AuthenticatorAssertionResponseBinding::Wrap(aCx, this, aGivenProto);
|
||||
}
|
||||
|
||||
void
|
||||
AuthenticatorAssertionResponse::GetAuthenticatorData(JSContext* aCx,
|
||||
JS::MutableHandle<JSObject*> aRetVal) const
|
||||
{
|
||||
aRetVal.set(mAuthenticatorData.ToUint8Array(aCx));
|
||||
}
|
||||
|
||||
nsresult
|
||||
AuthenticatorAssertionResponse::SetAuthenticatorData(CryptoBuffer& aBuffer)
|
||||
{
|
||||
if (NS_WARN_IF(!mAuthenticatorData.Assign(aBuffer))) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void
|
||||
AuthenticatorAssertionResponse::GetSignature(JSContext* aCx,
|
||||
JS::MutableHandle<JSObject*> aRetVal) const
|
||||
{
|
||||
aRetVal.set(mSignature.ToUint8Array(aCx));
|
||||
}
|
||||
|
||||
nsresult
|
||||
AuthenticatorAssertionResponse::SetSignature(CryptoBuffer& aBuffer)
|
||||
{
|
||||
if (NS_WARN_IF(!mSignature.Assign(aBuffer))) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
|
@ -0,0 +1,56 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#ifndef mozilla_dom_AuthenticatorAssertionResponse_h
|
||||
#define mozilla_dom_AuthenticatorAssertionResponse_h
|
||||
|
||||
#include "js/TypeDecls.h"
|
||||
#include "mozilla/Attributes.h"
|
||||
#include "mozilla/ErrorResult.h"
|
||||
#include "mozilla/dom/AuthenticatorResponse.h"
|
||||
#include "mozilla/dom/BindingDeclarations.h"
|
||||
#include "mozilla/dom/CryptoBuffer.h"
|
||||
#include "nsCycleCollectionParticipant.h"
|
||||
#include "nsWrapperCache.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
class AuthenticatorAssertionResponse final : public AuthenticatorResponse
|
||||
{
|
||||
public:
|
||||
NS_DECL_ISUPPORTS_INHERITED
|
||||
|
||||
explicit AuthenticatorAssertionResponse(nsPIDOMWindowInner* aParent);
|
||||
|
||||
protected:
|
||||
~AuthenticatorAssertionResponse() override;
|
||||
|
||||
public:
|
||||
virtual JSObject*
|
||||
WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
|
||||
|
||||
void
|
||||
GetAuthenticatorData(JSContext* aCx, JS::MutableHandle<JSObject*> aRetVal) const;
|
||||
|
||||
nsresult
|
||||
SetAuthenticatorData(CryptoBuffer& aBuffer);
|
||||
|
||||
void
|
||||
GetSignature(JSContext* aCx, JS::MutableHandle<JSObject*> aRetVal) const;
|
||||
|
||||
nsresult
|
||||
SetSignature(CryptoBuffer& aBuffer);
|
||||
|
||||
private:
|
||||
CryptoBuffer mAuthenticatorData;
|
||||
CryptoBuffer mSignature;
|
||||
};
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // mozilla_dom_AuthenticatorAssertionResponse_h
|
|
@ -0,0 +1,50 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#include "mozilla/dom/WebAuthenticationBinding.h"
|
||||
#include "mozilla/dom/AuthenticatorAttestationResponse.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
NS_IMPL_ADDREF_INHERITED(AuthenticatorAttestationResponse, AuthenticatorResponse)
|
||||
NS_IMPL_RELEASE_INHERITED(AuthenticatorAttestationResponse, AuthenticatorResponse)
|
||||
|
||||
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(AuthenticatorAttestationResponse)
|
||||
NS_INTERFACE_MAP_END_INHERITING(AuthenticatorResponse)
|
||||
|
||||
AuthenticatorAttestationResponse::AuthenticatorAttestationResponse(nsPIDOMWindowInner* aParent)
|
||||
: AuthenticatorResponse(aParent)
|
||||
{}
|
||||
|
||||
AuthenticatorAttestationResponse::~AuthenticatorAttestationResponse()
|
||||
{}
|
||||
|
||||
JSObject*
|
||||
AuthenticatorAttestationResponse::WrapObject(JSContext* aCx,
|
||||
JS::Handle<JSObject*> aGivenProto)
|
||||
{
|
||||
return AuthenticatorAttestationResponseBinding::Wrap(aCx, this, aGivenProto);
|
||||
}
|
||||
|
||||
void
|
||||
AuthenticatorAttestationResponse::GetAttestationObject(JSContext* aCx,
|
||||
JS::MutableHandle<JSObject*> aRetVal) const
|
||||
{
|
||||
aRetVal.set(mAttestationObject.ToUint8Array(aCx));
|
||||
}
|
||||
|
||||
nsresult
|
||||
AuthenticatorAttestationResponse::SetAttestationObject(CryptoBuffer& aBuffer)
|
||||
{
|
||||
if (NS_WARN_IF(!mAttestationObject.Assign(aBuffer))) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
|
@ -0,0 +1,49 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#ifndef mozilla_dom_AuthenticatorAttestationResponse_h
|
||||
#define mozilla_dom_AuthenticatorAttestationResponse_h
|
||||
|
||||
#include "js/TypeDecls.h"
|
||||
#include "mozilla/Attributes.h"
|
||||
#include "mozilla/ErrorResult.h"
|
||||
#include "mozilla/dom/AuthenticatorResponse.h"
|
||||
#include "mozilla/dom/BindingDeclarations.h"
|
||||
#include "mozilla/dom/CryptoBuffer.h"
|
||||
#include "nsCycleCollectionParticipant.h"
|
||||
#include "nsWrapperCache.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
class AuthenticatorAttestationResponse final : public AuthenticatorResponse
|
||||
{
|
||||
public:
|
||||
NS_DECL_ISUPPORTS_INHERITED
|
||||
|
||||
explicit AuthenticatorAttestationResponse(nsPIDOMWindowInner* aParent);
|
||||
|
||||
protected:
|
||||
~AuthenticatorAttestationResponse() override;
|
||||
|
||||
public:
|
||||
virtual JSObject*
|
||||
WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
|
||||
|
||||
void
|
||||
GetAttestationObject(JSContext* aCx, JS::MutableHandle<JSObject*> aRetVal) const;
|
||||
|
||||
nsresult
|
||||
SetAttestationObject(CryptoBuffer& aBuffer);
|
||||
|
||||
private:
|
||||
CryptoBuffer mAttestationObject;
|
||||
};
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // mozilla_dom_AuthenticatorAttestationResponse_h
|
|
@ -0,0 +1,53 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#include "mozilla/dom/WebAuthenticationBinding.h"
|
||||
#include "mozilla/dom/AuthenticatorResponse.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
// Only needed for refcounted objects.
|
||||
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(AuthenticatorResponse, mParent)
|
||||
NS_IMPL_CYCLE_COLLECTING_ADDREF(AuthenticatorResponse)
|
||||
NS_IMPL_CYCLE_COLLECTING_RELEASE(AuthenticatorResponse)
|
||||
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(AuthenticatorResponse)
|
||||
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
|
||||
NS_INTERFACE_MAP_ENTRY(nsISupports)
|
||||
NS_INTERFACE_MAP_END
|
||||
|
||||
AuthenticatorResponse::AuthenticatorResponse(nsPIDOMWindowInner* aParent)
|
||||
: mParent(aParent)
|
||||
{}
|
||||
|
||||
AuthenticatorResponse::~AuthenticatorResponse()
|
||||
{}
|
||||
|
||||
JSObject*
|
||||
AuthenticatorResponse::WrapObject(JSContext* aCx,
|
||||
JS::Handle<JSObject*> aGivenProto)
|
||||
{
|
||||
return AuthenticatorResponseBinding::Wrap(aCx, this, aGivenProto);
|
||||
}
|
||||
|
||||
void
|
||||
AuthenticatorResponse::GetClientDataJSON(JSContext* aCx,
|
||||
JS::MutableHandle<JSObject*> aRetVal) const
|
||||
{
|
||||
aRetVal.set(mClientDataJSON.ToUint8Array(aCx));
|
||||
}
|
||||
|
||||
nsresult
|
||||
AuthenticatorResponse::SetClientDataJSON(CryptoBuffer& aBuffer)
|
||||
{
|
||||
if (NS_WARN_IF(!mClientDataJSON.Assign(aBuffer))) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
|
@ -4,33 +4,31 @@
|
|||
* 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/. */
|
||||
|
||||
#ifndef mozilla_dom_ScopedCredential_h
|
||||
#define mozilla_dom_ScopedCredential_h
|
||||
#ifndef mozilla_dom_AuthenticatorResponse_h
|
||||
#define mozilla_dom_AuthenticatorResponse_h
|
||||
|
||||
#include "js/TypeDecls.h"
|
||||
#include "mozilla/Attributes.h"
|
||||
#include "mozilla/ErrorResult.h"
|
||||
#include "mozilla/dom/BindingDeclarations.h"
|
||||
#include "mozilla/dom/CryptoBuffer.h"
|
||||
#include "mozilla/dom/WebAuthenticationBinding.h"
|
||||
#include "nsCycleCollectionParticipant.h"
|
||||
#include "nsWrapperCache.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
class ScopedCredential final : public nsISupports
|
||||
, public nsWrapperCache
|
||||
class AuthenticatorResponse : public nsISupports
|
||||
, public nsWrapperCache
|
||||
{
|
||||
public:
|
||||
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
|
||||
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(ScopedCredential)
|
||||
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(AuthenticatorResponse)
|
||||
|
||||
public:
|
||||
explicit ScopedCredential(nsPIDOMWindowInner* aParent);
|
||||
explicit AuthenticatorResponse(nsPIDOMWindowInner* aParent);
|
||||
|
||||
protected:
|
||||
~ScopedCredential();
|
||||
virtual ~AuthenticatorResponse();
|
||||
|
||||
public:
|
||||
nsISupports*
|
||||
|
@ -42,25 +40,21 @@ public:
|
|||
virtual JSObject*
|
||||
WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
|
||||
|
||||
ScopedCredentialType
|
||||
Type() const;
|
||||
void
|
||||
GetFormat(nsString& aRetVal) const;
|
||||
|
||||
void
|
||||
GetId(JSContext* aCx, JS::MutableHandle<JSObject*> aRetVal) const;
|
||||
GetClientDataJSON(JSContext* aCx, JS::MutableHandle<JSObject*> aRetVal) const;
|
||||
|
||||
nsresult
|
||||
SetType(ScopedCredentialType aType);
|
||||
|
||||
nsresult
|
||||
SetId(CryptoBuffer& aBuffer);
|
||||
SetClientDataJSON(CryptoBuffer& aBuffer);
|
||||
|
||||
private:
|
||||
nsCOMPtr<nsPIDOMWindowInner> mParent;
|
||||
CryptoBuffer mIdBuffer;
|
||||
ScopedCredentialType mType;
|
||||
CryptoBuffer mClientDataJSON;
|
||||
};
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // mozilla_dom_ScopedCredential_h
|
||||
#endif // mozilla_dom_AuthenticatorResponse_h
|
|
@ -20,11 +20,7 @@ namespace mozilla {
|
|||
namespace dom {
|
||||
|
||||
struct WebAuthnScopedCredentialDescriptor {
|
||||
// Converted from mozilla::dom::ScopedCredentialType enum
|
||||
uint32_t type;
|
||||
uint8_t[] id;
|
||||
// Converted from mozilla::dom::WebAuthnTransport enum
|
||||
uint32_t[] transports;
|
||||
};
|
||||
|
||||
struct WebAuthnExtension {
|
||||
|
|
|
@ -0,0 +1,69 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#include "mozilla/dom/PublicKeyCredential.h"
|
||||
#include "mozilla/dom/WebAuthenticationBinding.h"
|
||||
#include "nsCycleCollectionParticipant.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_INHERITED(PublicKeyCredential, Credential, mResponse)
|
||||
|
||||
NS_IMPL_ADDREF_INHERITED(PublicKeyCredential, Credential)
|
||||
NS_IMPL_RELEASE_INHERITED(PublicKeyCredential, Credential)
|
||||
|
||||
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(PublicKeyCredential)
|
||||
NS_INTERFACE_MAP_END_INHERITING(Credential)
|
||||
|
||||
NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN_INHERITED(PublicKeyCredential, Credential)
|
||||
NS_IMPL_CYCLE_COLLECTION_TRACE_END
|
||||
|
||||
PublicKeyCredential::PublicKeyCredential(nsPIDOMWindowInner* aParent)
|
||||
: Credential(aParent)
|
||||
{}
|
||||
|
||||
PublicKeyCredential::~PublicKeyCredential()
|
||||
{}
|
||||
|
||||
JSObject*
|
||||
PublicKeyCredential::WrapObject(JSContext* aCx,
|
||||
JS::Handle<JSObject*> aGivenProto)
|
||||
{
|
||||
return PublicKeyCredentialBinding::Wrap(aCx, this, aGivenProto);
|
||||
}
|
||||
|
||||
void
|
||||
PublicKeyCredential::GetRawId(JSContext* aCx,
|
||||
JS::MutableHandle<JSObject*> aRetVal) const
|
||||
{
|
||||
aRetVal.set(mRawId.ToUint8Array(aCx));
|
||||
}
|
||||
|
||||
already_AddRefed<AuthenticatorResponse>
|
||||
PublicKeyCredential::Response() const
|
||||
{
|
||||
RefPtr<AuthenticatorResponse> temp(mResponse);
|
||||
return temp.forget();
|
||||
}
|
||||
|
||||
nsresult
|
||||
PublicKeyCredential::SetRawId(CryptoBuffer& aBuffer)
|
||||
{
|
||||
if (NS_WARN_IF(!mRawId.Assign(aBuffer))) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
void
|
||||
PublicKeyCredential::SetResponse(RefPtr<AuthenticatorResponse> aResponse)
|
||||
{
|
||||
mResponse = aResponse;
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
|
@ -0,0 +1,59 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#ifndef mozilla_dom_PublicKeyCredential_h
|
||||
#define mozilla_dom_PublicKeyCredential_h
|
||||
|
||||
#include "js/TypeDecls.h"
|
||||
#include "mozilla/Attributes.h"
|
||||
#include "mozilla/dom/BindingDeclarations.h"
|
||||
#include "mozilla/dom/Credential.h"
|
||||
#include "mozilla/ErrorResult.h"
|
||||
#include "nsCycleCollectionParticipant.h"
|
||||
#include "nsWrapperCache.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
class PublicKeyCredential final : public Credential
|
||||
{
|
||||
public:
|
||||
NS_DECL_ISUPPORTS_INHERITED
|
||||
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_INHERITED(PublicKeyCredential,
|
||||
Credential)
|
||||
|
||||
explicit PublicKeyCredential(nsPIDOMWindowInner* aParent);
|
||||
|
||||
protected:
|
||||
~PublicKeyCredential() override;
|
||||
|
||||
public:
|
||||
virtual JSObject*
|
||||
WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
|
||||
|
||||
void
|
||||
GetRawId(JSContext* cx, JS::MutableHandle<JSObject*> aRetVal) const;
|
||||
|
||||
already_AddRefed<AuthenticatorResponse>
|
||||
Response() const;
|
||||
|
||||
nsresult
|
||||
SetRawId(CryptoBuffer& aBuffer);
|
||||
|
||||
void
|
||||
SetResponse(RefPtr<AuthenticatorResponse>);
|
||||
|
||||
private:
|
||||
CryptoBuffer mRawId;
|
||||
RefPtr<AuthenticatorResponse> mResponse;
|
||||
// Extensions are not supported yet.
|
||||
// <some type> mClientExtensionResults;
|
||||
};
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // mozilla_dom_PublicKeyCredential_h
|
|
@ -1,66 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#include "mozilla/dom/ScopedCredential.h"
|
||||
#include "mozilla/dom/WebAuthenticationBinding.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
// Only needed for refcounted objects.
|
||||
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(ScopedCredential, mParent)
|
||||
NS_IMPL_CYCLE_COLLECTING_ADDREF(ScopedCredential)
|
||||
NS_IMPL_CYCLE_COLLECTING_RELEASE(ScopedCredential)
|
||||
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ScopedCredential)
|
||||
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
|
||||
NS_INTERFACE_MAP_ENTRY(nsISupports)
|
||||
NS_INTERFACE_MAP_END
|
||||
|
||||
ScopedCredential::ScopedCredential(nsPIDOMWindowInner* aParent)
|
||||
: mParent(aParent)
|
||||
, mType(ScopedCredentialType::ScopedCred)
|
||||
{}
|
||||
|
||||
ScopedCredential::~ScopedCredential()
|
||||
{}
|
||||
|
||||
JSObject*
|
||||
ScopedCredential::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
|
||||
{
|
||||
return ScopedCredentialBinding::Wrap(aCx, this, aGivenProto);
|
||||
}
|
||||
|
||||
ScopedCredentialType
|
||||
ScopedCredential::Type() const
|
||||
{
|
||||
return mType;
|
||||
}
|
||||
|
||||
void
|
||||
ScopedCredential::GetId(JSContext* aCx,
|
||||
JS::MutableHandle<JSObject*> aRetVal) const
|
||||
{
|
||||
aRetVal.set(mIdBuffer.ToUint8Array(aCx));
|
||||
}
|
||||
|
||||
nsresult
|
||||
ScopedCredential::SetType(ScopedCredentialType aType)
|
||||
{
|
||||
mType = aType;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
ScopedCredential::SetId(CryptoBuffer& aBuffer)
|
||||
{
|
||||
if (!mIdBuffer.Assign(aBuffer)) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
|
@ -1,63 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#include "mozilla/dom/ScopedCredentialInfo.h"
|
||||
#include "mozilla/dom/WebAuthenticationBinding.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
// Only needed for refcounted objects.
|
||||
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(ScopedCredentialInfo, mParent)
|
||||
NS_IMPL_CYCLE_COLLECTING_ADDREF(ScopedCredentialInfo)
|
||||
NS_IMPL_CYCLE_COLLECTING_RELEASE(ScopedCredentialInfo)
|
||||
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(ScopedCredentialInfo)
|
||||
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
|
||||
NS_INTERFACE_MAP_ENTRY(nsISupports)
|
||||
NS_INTERFACE_MAP_END
|
||||
|
||||
ScopedCredentialInfo::ScopedCredentialInfo(nsPIDOMWindowInner* aParent)
|
||||
: mParent(aParent)
|
||||
{}
|
||||
|
||||
ScopedCredentialInfo::~ScopedCredentialInfo()
|
||||
{}
|
||||
|
||||
JSObject*
|
||||
ScopedCredentialInfo::WrapObject(JSContext* aCx,
|
||||
JS::Handle<JSObject*> aGivenProto)
|
||||
{
|
||||
return ScopedCredentialInfoBinding::Wrap(aCx, this, aGivenProto);
|
||||
}
|
||||
|
||||
already_AddRefed<ScopedCredential>
|
||||
ScopedCredentialInfo::Credential() const
|
||||
{
|
||||
RefPtr<ScopedCredential> temp(mCredential);
|
||||
return temp.forget();
|
||||
}
|
||||
|
||||
already_AddRefed<WebAuthnAttestation>
|
||||
ScopedCredentialInfo::Attestation() const
|
||||
{
|
||||
RefPtr<WebAuthnAttestation> temp(mAttestation);
|
||||
return temp.forget();
|
||||
}
|
||||
|
||||
void
|
||||
ScopedCredentialInfo::SetCredential(RefPtr<ScopedCredential> aCredential)
|
||||
{
|
||||
mCredential = aCredential;
|
||||
}
|
||||
|
||||
void
|
||||
ScopedCredentialInfo::SetAttestation(RefPtr<WebAuthnAttestation> aAttestation)
|
||||
{
|
||||
mAttestation = aAttestation;
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
|
@ -1,74 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#ifndef mozilla_dom_ScopedCredentialInfo_h
|
||||
#define mozilla_dom_ScopedCredentialInfo_h
|
||||
|
||||
#include "js/TypeDecls.h"
|
||||
#include "mozilla/Attributes.h"
|
||||
#include "mozilla/dom/BindingDeclarations.h"
|
||||
#include "mozilla/ErrorResult.h"
|
||||
#include "nsCycleCollectionParticipant.h"
|
||||
#include "nsWrapperCache.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
class CryptoKey;
|
||||
class ScopedCredential;
|
||||
class WebAuthnAttestation;
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
class ScopedCredentialInfo final : public nsISupports
|
||||
, public nsWrapperCache
|
||||
{
|
||||
public:
|
||||
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
|
||||
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(ScopedCredentialInfo)
|
||||
|
||||
public:
|
||||
explicit ScopedCredentialInfo(nsPIDOMWindowInner* aParent);
|
||||
|
||||
protected:
|
||||
~ScopedCredentialInfo();
|
||||
|
||||
public:
|
||||
nsISupports*
|
||||
GetParentObject() const
|
||||
{
|
||||
return mParent;
|
||||
}
|
||||
|
||||
virtual JSObject*
|
||||
WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
|
||||
|
||||
already_AddRefed<ScopedCredential>
|
||||
Credential() const;
|
||||
|
||||
already_AddRefed<WebAuthnAttestation>
|
||||
Attestation() const;
|
||||
|
||||
void
|
||||
SetCredential(RefPtr<ScopedCredential>);
|
||||
|
||||
void
|
||||
SetAttestation(RefPtr<WebAuthnAttestation>);
|
||||
|
||||
private:
|
||||
nsCOMPtr<nsPIDOMWindowInner> mParent;
|
||||
RefPtr<WebAuthnAttestation> mAttestation;
|
||||
RefPtr<ScopedCredential> mCredential;
|
||||
};
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // mozilla_dom_ScopedCredentialInfo_h
|
|
@ -1,58 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#include "mozilla/dom/WebAuthentication.h"
|
||||
#include "mozilla/dom/WebAuthnManager.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
// Only needed for refcounted objects.
|
||||
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(WebAuthentication, mParent)
|
||||
NS_IMPL_CYCLE_COLLECTING_ADDREF(WebAuthentication)
|
||||
NS_IMPL_CYCLE_COLLECTING_RELEASE(WebAuthentication)
|
||||
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(WebAuthentication)
|
||||
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
|
||||
NS_INTERFACE_MAP_ENTRY(nsISupports)
|
||||
NS_INTERFACE_MAP_END
|
||||
|
||||
WebAuthentication::WebAuthentication(nsPIDOMWindowInner* aParent) :
|
||||
mParent(aParent)
|
||||
{
|
||||
MOZ_ASSERT(aParent);
|
||||
}
|
||||
|
||||
WebAuthentication::~WebAuthentication()
|
||||
{}
|
||||
|
||||
JSObject*
|
||||
WebAuthentication::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
|
||||
{
|
||||
return WebAuthenticationBinding::Wrap(aCx, this, aGivenProto);
|
||||
}
|
||||
|
||||
already_AddRefed<Promise>
|
||||
WebAuthentication::MakeCredential(JSContext* aCx, const Account& aAccount,
|
||||
const Sequence<ScopedCredentialParameters>& aCryptoParameters,
|
||||
const ArrayBufferViewOrArrayBuffer& aChallenge,
|
||||
const ScopedCredentialOptions& aOptions)
|
||||
{
|
||||
RefPtr<WebAuthnManager> mgr = WebAuthnManager::GetOrCreate();
|
||||
MOZ_ASSERT(mgr);
|
||||
return mgr->MakeCredential(mParent, aCx, aAccount, aCryptoParameters, aChallenge, aOptions);
|
||||
}
|
||||
|
||||
already_AddRefed<Promise>
|
||||
WebAuthentication::GetAssertion(const ArrayBufferViewOrArrayBuffer& aChallenge,
|
||||
const AssertionOptions& aOptions)
|
||||
{
|
||||
RefPtr<WebAuthnManager> mgr = WebAuthnManager::GetOrCreate();
|
||||
MOZ_ASSERT(mgr);
|
||||
return mgr->GetAssertion(mParent, aChallenge, aOptions);
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
|
@ -1,66 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#ifndef mozilla_dom_WebAuthentication_h
|
||||
#define mozilla_dom_WebAuthentication_h
|
||||
|
||||
#include "mozilla/dom/WebAuthenticationBinding.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
struct Account;
|
||||
class ArrayBufferViewOrArrayBuffer;
|
||||
struct AssertionOptions;
|
||||
struct ScopedCredentialOptions;
|
||||
struct ScopedCredentialParameters;
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
class WebAuthentication final : public nsISupports
|
||||
, public nsWrapperCache
|
||||
{
|
||||
public:
|
||||
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
|
||||
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(WebAuthentication)
|
||||
|
||||
explicit WebAuthentication(nsPIDOMWindowInner* aParent);
|
||||
|
||||
nsPIDOMWindowInner*
|
||||
GetParentObject() const
|
||||
{
|
||||
return mParent;
|
||||
}
|
||||
|
||||
virtual JSObject*
|
||||
WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
|
||||
|
||||
already_AddRefed<Promise>
|
||||
MakeCredential(JSContext* aCx, const Account& accountInformation,
|
||||
const Sequence<ScopedCredentialParameters>& cryptoParameters,
|
||||
const ArrayBufferViewOrArrayBuffer& attestationChallenge,
|
||||
const ScopedCredentialOptions& options);
|
||||
|
||||
already_AddRefed<Promise>
|
||||
GetAssertion(const ArrayBufferViewOrArrayBuffer& assertionChallenge,
|
||||
const AssertionOptions& options);
|
||||
private:
|
||||
~WebAuthentication();
|
||||
|
||||
already_AddRefed<Promise> CreatePromise();
|
||||
nsresult GetOrigin(/*out*/ nsAString& aOrigin);
|
||||
|
||||
nsCOMPtr<nsPIDOMWindowInner> mParent;
|
||||
};
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // mozilla_dom_WebAuthentication_h
|
|
@ -1,98 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#include "mozilla/dom/WebAuthenticationBinding.h"
|
||||
#include "mozilla/dom/WebAuthnAssertion.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
// Only needed for refcounted objects.
|
||||
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(WebAuthnAssertion, mParent)
|
||||
NS_IMPL_CYCLE_COLLECTING_ADDREF(WebAuthnAssertion)
|
||||
NS_IMPL_CYCLE_COLLECTING_RELEASE(WebAuthnAssertion)
|
||||
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(WebAuthnAssertion)
|
||||
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
|
||||
NS_INTERFACE_MAP_ENTRY(nsISupports)
|
||||
NS_INTERFACE_MAP_END
|
||||
|
||||
WebAuthnAssertion::WebAuthnAssertion(nsPIDOMWindowInner* aParent)
|
||||
: mParent(aParent)
|
||||
{}
|
||||
|
||||
WebAuthnAssertion::~WebAuthnAssertion()
|
||||
{}
|
||||
|
||||
JSObject*
|
||||
WebAuthnAssertion::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
|
||||
{
|
||||
return WebAuthnAssertionBinding::Wrap(aCx, this, aGivenProto);
|
||||
}
|
||||
|
||||
already_AddRefed<ScopedCredential>
|
||||
WebAuthnAssertion::Credential() const
|
||||
{
|
||||
RefPtr<ScopedCredential> temp(mCredential);
|
||||
return temp.forget();
|
||||
}
|
||||
|
||||
void
|
||||
WebAuthnAssertion::GetClientData(JSContext* aCx,
|
||||
JS::MutableHandle<JSObject*> aRetVal) const
|
||||
{
|
||||
aRetVal.set(mClientData.ToUint8Array(aCx));
|
||||
}
|
||||
|
||||
void
|
||||
WebAuthnAssertion::GetAuthenticatorData(JSContext* aCx,
|
||||
JS::MutableHandle<JSObject*> aRetVal) const
|
||||
{
|
||||
aRetVal.set(mAuthenticatorData.ToUint8Array(aCx));
|
||||
}
|
||||
|
||||
void
|
||||
WebAuthnAssertion::GetSignature(JSContext* aCx,
|
||||
JS::MutableHandle<JSObject*> aRetVal) const
|
||||
{
|
||||
aRetVal.set(mSignature.ToUint8Array(aCx));
|
||||
}
|
||||
|
||||
nsresult
|
||||
WebAuthnAssertion::SetCredential(RefPtr<ScopedCredential> aCredential)
|
||||
{
|
||||
mCredential = aCredential;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
WebAuthnAssertion::SetClientData(CryptoBuffer& aBuffer)
|
||||
{
|
||||
if (!mClientData.Assign(aBuffer)) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
WebAuthnAssertion::SetAuthenticatorData(CryptoBuffer& aBuffer)
|
||||
{
|
||||
if (!mAuthenticatorData.Assign(aBuffer)) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
WebAuthnAssertion::SetSignature(CryptoBuffer& aBuffer)
|
||||
{
|
||||
if (!mSignature.Assign(aBuffer)) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
|
@ -1,86 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#ifndef mozilla_dom_WebAuthnAssertion_h
|
||||
#define mozilla_dom_WebAuthnAssertion_h
|
||||
|
||||
#include "js/TypeDecls.h"
|
||||
#include "mozilla/Attributes.h"
|
||||
#include "mozilla/ErrorResult.h"
|
||||
#include "mozilla/dom/BindingDeclarations.h"
|
||||
#include "nsCycleCollectionParticipant.h"
|
||||
#include "nsWrapperCache.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
class ScopedCredential;
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
class WebAuthnAssertion final : public nsISupports
|
||||
, public nsWrapperCache
|
||||
{
|
||||
public:
|
||||
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
|
||||
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(WebAuthnAssertion)
|
||||
|
||||
public:
|
||||
explicit WebAuthnAssertion(nsPIDOMWindowInner* aParent);
|
||||
|
||||
protected:
|
||||
~WebAuthnAssertion();
|
||||
|
||||
public:
|
||||
nsPIDOMWindowInner*
|
||||
GetParentObject() const
|
||||
{
|
||||
return mParent;
|
||||
}
|
||||
|
||||
virtual JSObject*
|
||||
WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
|
||||
|
||||
already_AddRefed<ScopedCredential>
|
||||
Credential() const;
|
||||
|
||||
void
|
||||
GetClientData(JSContext* cx, JS::MutableHandle<JSObject*> aRetVal) const;
|
||||
|
||||
void
|
||||
GetAuthenticatorData(JSContext* cx, JS::MutableHandle<JSObject*> aRetVal) const;
|
||||
|
||||
void
|
||||
GetSignature(JSContext* cx, JS::MutableHandle<JSObject*> aRetVal) const;
|
||||
|
||||
nsresult
|
||||
SetCredential(RefPtr<ScopedCredential> aCredential);
|
||||
|
||||
nsresult
|
||||
SetClientData(CryptoBuffer& aBuffer);
|
||||
|
||||
nsresult
|
||||
SetAuthenticatorData(CryptoBuffer& aBuffer);
|
||||
|
||||
nsresult
|
||||
SetSignature(CryptoBuffer& aBuffer);
|
||||
|
||||
private:
|
||||
nsCOMPtr<nsPIDOMWindowInner> mParent;
|
||||
RefPtr<ScopedCredential> mCredential;
|
||||
CryptoBuffer mAuthenticatorData;
|
||||
CryptoBuffer mClientData;
|
||||
CryptoBuffer mSignature;
|
||||
};
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // mozilla_dom_WebAuthnAssertion_h
|
|
@ -1,98 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#include "mozilla/dom/WebAuthenticationBinding.h"
|
||||
#include "mozilla/dom/WebAuthnAttestation.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
// Only needed for refcounted objects.
|
||||
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(WebAuthnAttestation, mParent)
|
||||
NS_IMPL_CYCLE_COLLECTING_ADDREF(WebAuthnAttestation)
|
||||
NS_IMPL_CYCLE_COLLECTING_RELEASE(WebAuthnAttestation)
|
||||
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(WebAuthnAttestation)
|
||||
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
|
||||
NS_INTERFACE_MAP_ENTRY(nsISupports)
|
||||
NS_INTERFACE_MAP_END
|
||||
|
||||
WebAuthnAttestation::WebAuthnAttestation(nsPIDOMWindowInner* aParent)
|
||||
: mParent(aParent)
|
||||
{}
|
||||
|
||||
WebAuthnAttestation::~WebAuthnAttestation()
|
||||
{}
|
||||
|
||||
JSObject*
|
||||
WebAuthnAttestation::WrapObject(JSContext* aCx,
|
||||
JS::Handle<JSObject*> aGivenProto)
|
||||
{
|
||||
return WebAuthnAttestationBinding::Wrap(aCx, this, aGivenProto);
|
||||
}
|
||||
|
||||
void
|
||||
WebAuthnAttestation::GetFormat(nsString& aRetVal) const
|
||||
{
|
||||
aRetVal = mFormat;
|
||||
}
|
||||
|
||||
void
|
||||
WebAuthnAttestation::GetClientData(JSContext* aCx,
|
||||
JS::MutableHandle<JSObject*> aRetVal) const
|
||||
{
|
||||
aRetVal.set(mClientData.ToUint8Array(aCx));
|
||||
}
|
||||
|
||||
void
|
||||
WebAuthnAttestation::GetAuthenticatorData(JSContext* aCx,
|
||||
JS::MutableHandle<JSObject*> aRetVal) const
|
||||
{
|
||||
aRetVal.set(mAuthenticatorData.ToUint8Array(aCx));
|
||||
}
|
||||
|
||||
void
|
||||
WebAuthnAttestation::GetAttestation(JSContext* aCx,
|
||||
JS::MutableHandle<JS::Value> aRetVal) const
|
||||
{
|
||||
aRetVal.setObject(*mAttestation.ToUint8Array(aCx));
|
||||
}
|
||||
|
||||
nsresult
|
||||
WebAuthnAttestation::SetFormat(nsString aFormat)
|
||||
{
|
||||
mFormat = aFormat;
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
WebAuthnAttestation::SetClientData(CryptoBuffer& aBuffer)
|
||||
{
|
||||
if (!mClientData.Assign(aBuffer)) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
WebAuthnAttestation::SetAuthenticatorData(CryptoBuffer& aBuffer)
|
||||
{
|
||||
if (!mAuthenticatorData.Assign(aBuffer)) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
nsresult
|
||||
WebAuthnAttestation::SetAttestation(CryptoBuffer& aBuffer)
|
||||
{
|
||||
if (!mAttestation.Assign(aBuffer)) {
|
||||
return NS_ERROR_OUT_OF_MEMORY;
|
||||
}
|
||||
return NS_OK;
|
||||
}
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
|
@ -1,79 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim:set ts=2 sw=2 sts=2 et cindent: */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/. */
|
||||
|
||||
#ifndef mozilla_dom_WebAuthnAttestation_h
|
||||
#define mozilla_dom_WebAuthnAttestation_h
|
||||
|
||||
#include "js/TypeDecls.h"
|
||||
#include "mozilla/Attributes.h"
|
||||
#include "mozilla/ErrorResult.h"
|
||||
#include "mozilla/dom/BindingDeclarations.h"
|
||||
#include "mozilla/dom/CryptoBuffer.h"
|
||||
#include "nsCycleCollectionParticipant.h"
|
||||
#include "nsWrapperCache.h"
|
||||
|
||||
namespace mozilla {
|
||||
namespace dom {
|
||||
|
||||
class WebAuthnAttestation final : public nsISupports
|
||||
, public nsWrapperCache
|
||||
{
|
||||
public:
|
||||
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
|
||||
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(WebAuthnAttestation)
|
||||
|
||||
public:
|
||||
explicit WebAuthnAttestation(nsPIDOMWindowInner* aParent);
|
||||
|
||||
protected:
|
||||
~WebAuthnAttestation();
|
||||
|
||||
public:
|
||||
nsISupports*
|
||||
GetParentObject() const
|
||||
{
|
||||
return mParent;
|
||||
}
|
||||
|
||||
virtual JSObject*
|
||||
WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
|
||||
|
||||
void
|
||||
GetFormat(nsString& aRetVal) const;
|
||||
|
||||
void
|
||||
GetClientData(JSContext* aCx, JS::MutableHandle<JSObject*> aRetVal) const;
|
||||
|
||||
void
|
||||
GetAuthenticatorData(JSContext* caCxx, JS::MutableHandle<JSObject*> aRetVal) const;
|
||||
|
||||
void
|
||||
GetAttestation(JSContext* aCx, JS::MutableHandle<JS::Value> aRetVal) const;
|
||||
|
||||
nsresult
|
||||
SetFormat(nsString aFormat);
|
||||
|
||||
nsresult
|
||||
SetClientData(CryptoBuffer& aBuffer);
|
||||
|
||||
nsresult
|
||||
SetAuthenticatorData(CryptoBuffer& aBuffer);
|
||||
|
||||
nsresult
|
||||
SetAttestation(CryptoBuffer& aBuffer);
|
||||
|
||||
private:
|
||||
nsCOMPtr<nsPIDOMWindowInner> mParent;
|
||||
nsString mFormat;
|
||||
CryptoBuffer mClientData;
|
||||
CryptoBuffer mAuthenticatorData;
|
||||
CryptoBuffer mAttestation;
|
||||
};
|
||||
|
||||
} // namespace dom
|
||||
} // namespace mozilla
|
||||
|
||||
#endif // mozilla_dom_WebAuthnAttestation_h
|
|
@ -8,6 +8,7 @@
|
|||
#include "nsNetCID.h"
|
||||
#include "nsICryptoHash.h"
|
||||
#include "mozilla/ClearOnShutdown.h"
|
||||
#include "mozilla/dom/AuthenticatorAttestationResponse.h"
|
||||
#include "mozilla/dom/Promise.h"
|
||||
#include "mozilla/dom/WebAuthnManager.h"
|
||||
#include "mozilla/dom/WebAuthnUtil.h"
|
||||
|
@ -39,7 +40,7 @@ NS_IMPL_ISUPPORTS(WebAuthnManager, nsIIPCBackgroundChildCreateCallback);
|
|||
|
||||
template<class OOS>
|
||||
static nsresult
|
||||
GetAlgorithmName(JSContext* aCx, const OOS& aAlgorithm,
|
||||
GetAlgorithmName(const OOS& aAlgorithm,
|
||||
/* out */ nsString& aName)
|
||||
{
|
||||
MOZ_ASSERT(aAlgorithm.IsString()); // TODO: remove assertion when we coerce.
|
||||
|
@ -99,10 +100,10 @@ AssembleClientData(const nsAString& aOrigin, const CryptoBuffer& aChallenge,
|
|||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
WebAuthnClientData clientDataObject;
|
||||
clientDataObject.mOrigin.Assign(aOrigin);
|
||||
clientDataObject.mHashAlg.SetAsString().Assign(NS_LITERAL_STRING("S256"));
|
||||
CollectedClientData clientDataObject;
|
||||
clientDataObject.mChallenge.Assign(challengeBase64);
|
||||
clientDataObject.mOrigin.Assign(aOrigin);
|
||||
clientDataObject.mHashAlg.Assign(NS_LITERAL_STRING("S256"));
|
||||
|
||||
nsAutoString temp;
|
||||
if (NS_WARN_IF(!clientDataObject.ToJSON(temp))) {
|
||||
|
@ -214,11 +215,8 @@ WebAuthnManager::Get()
|
|||
}
|
||||
|
||||
already_AddRefed<Promise>
|
||||
WebAuthnManager::MakeCredential(nsPIDOMWindowInner* aParent, JSContext* aCx,
|
||||
const Account& aAccountInformation,
|
||||
const Sequence<ScopedCredentialParameters>& aCryptoParameters,
|
||||
const ArrayBufferViewOrArrayBuffer& aChallenge,
|
||||
const ScopedCredentialOptions& aOptions)
|
||||
WebAuthnManager::MakeCredential(nsPIDOMWindowInner* aParent,
|
||||
const MakeCredentialOptions& aOptions)
|
||||
{
|
||||
MOZ_ASSERT(aParent);
|
||||
|
||||
|
@ -244,15 +242,15 @@ WebAuthnManager::MakeCredential(nsPIDOMWindowInner* aParent, JSContext* aCx,
|
|||
// closest value lying within that range.
|
||||
|
||||
double adjustedTimeout = 30.0;
|
||||
if (aOptions.mTimeoutSeconds.WasPassed()) {
|
||||
adjustedTimeout = aOptions.mTimeoutSeconds.Value();
|
||||
if (aOptions.mTimeout.WasPassed()) {
|
||||
adjustedTimeout = aOptions.mTimeout.Value();
|
||||
adjustedTimeout = std::max(15.0, adjustedTimeout);
|
||||
adjustedTimeout = std::min(120.0, adjustedTimeout);
|
||||
}
|
||||
|
||||
nsCString rpId;
|
||||
if (!aOptions.mRpId.WasPassed()) {
|
||||
// If rpId is not specified, then set rpId to callerOrigin, and rpIdHash to
|
||||
if (!aOptions.mRp.mId.WasPassed()) {
|
||||
// If rp.id is not specified, then set rpId to callerOrigin, and rpIdHash to
|
||||
// the SHA-256 hash of rpId.
|
||||
rpId.Assign(NS_ConvertUTF16toUTF8(origin));
|
||||
} else {
|
||||
|
@ -264,7 +262,7 @@ WebAuthnManager::MakeCredential(nsPIDOMWindowInner* aParent, JSContext* aCx,
|
|||
// Otherwise, reject promise with a DOMException whose name is
|
||||
// "SecurityError", and terminate this algorithm.
|
||||
|
||||
if (NS_FAILED(RelaxSameOrigin(aParent, aOptions.mRpId.Value(), rpId))) {
|
||||
if (NS_FAILED(RelaxSameOrigin(aParent, aOptions.mRp.mId.Value(), rpId))) {
|
||||
promise->MaybeReject(NS_ERROR_DOM_SECURITY_ERR);
|
||||
return promise.forget();
|
||||
}
|
||||
|
@ -292,15 +290,15 @@ WebAuthnManager::MakeCredential(nsPIDOMWindowInner* aParent, JSContext* aCx,
|
|||
|
||||
// Process each element of cryptoParameters using the following steps, to
|
||||
// produce a new sequence normalizedParameters.
|
||||
nsTArray<ScopedCredentialParameters> normalizedParams;
|
||||
for (size_t a = 0; a < aCryptoParameters.Length(); ++a) {
|
||||
nsTArray<PublicKeyCredentialParameters> normalizedParams;
|
||||
for (size_t a = 0; a < aOptions.mParameters.Length(); ++a) {
|
||||
// Let current be the currently selected element of
|
||||
// cryptoParameters.
|
||||
|
||||
// If current.type does not contain a ScopedCredentialType
|
||||
// If current.type does not contain a PublicKeyCredentialType
|
||||
// supported by this implementation, then stop processing current and move
|
||||
// on to the next element in cryptoParameters.
|
||||
if (aCryptoParameters[a].mType != ScopedCredentialType::ScopedCred) {
|
||||
if (aOptions.mParameters[a].mType != PublicKeyCredentialType::Public_key) {
|
||||
continue;
|
||||
}
|
||||
|
||||
|
@ -311,16 +309,16 @@ WebAuthnManager::MakeCredential(nsPIDOMWindowInner* aParent, JSContext* aCx,
|
|||
// element in cryptoParameters.
|
||||
|
||||
nsString algName;
|
||||
if (NS_FAILED(GetAlgorithmName(aCx, aCryptoParameters[a].mAlgorithm,
|
||||
if (NS_FAILED(GetAlgorithmName(aOptions.mParameters[a].mAlgorithm,
|
||||
algName))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// Add a new object of type ScopedCredentialParameters to
|
||||
// Add a new object of type PublicKeyCredentialParameters to
|
||||
// normalizedParameters, with type set to current.type and algorithm set to
|
||||
// normalizedAlgorithm.
|
||||
ScopedCredentialParameters normalizedObj;
|
||||
normalizedObj.mType = aCryptoParameters[a].mType;
|
||||
PublicKeyCredentialParameters normalizedObj;
|
||||
normalizedObj.mType = aOptions.mParameters[a].mType;
|
||||
normalizedObj.mAlgorithm.SetAsString().Assign(algName);
|
||||
|
||||
if (!normalizedParams.AppendElement(normalizedObj, mozilla::fallible)){
|
||||
|
@ -332,7 +330,7 @@ WebAuthnManager::MakeCredential(nsPIDOMWindowInner* aParent, JSContext* aCx,
|
|||
// If normalizedAlgorithm is empty and cryptoParameters was not empty, cancel
|
||||
// the timer started in step 2, reject promise with a DOMException whose name
|
||||
// is "NotSupportedError", and terminate this algorithm.
|
||||
if (normalizedParams.IsEmpty() && !aCryptoParameters.IsEmpty()) {
|
||||
if (normalizedParams.IsEmpty() && !aOptions.mParameters.IsEmpty()) {
|
||||
promise->MaybeReject(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
|
||||
return promise.forget();
|
||||
}
|
||||
|
@ -340,16 +338,17 @@ WebAuthnManager::MakeCredential(nsPIDOMWindowInner* aParent, JSContext* aCx,
|
|||
// TODO: The following check should not be here. This is checking for
|
||||
// parameters specific to the soft key, and should be put in the soft key
|
||||
// manager in the parent process. Still need to serialize
|
||||
// ScopedCredentialParameters first.
|
||||
// PublicKeyCredentialParameters first.
|
||||
|
||||
// Check if at least one of the specified combinations of ScopedCredentialType
|
||||
// and cryptographic parameters is supported. If not, return an error code
|
||||
// equivalent to NotSupportedError and terminate the operation.
|
||||
// Check if at least one of the specified combinations of
|
||||
// PublicKeyCredentialParameters and cryptographic parameters is supported. If
|
||||
// not, return an error code equivalent to NotSupportedError and terminate the
|
||||
// operation.
|
||||
|
||||
bool isValidCombination = false;
|
||||
|
||||
for (size_t a = 0; a < normalizedParams.Length(); ++a) {
|
||||
if (normalizedParams[a].mType == ScopedCredentialType::ScopedCred &&
|
||||
if (normalizedParams[a].mType == PublicKeyCredentialType::Public_key &&
|
||||
normalizedParams[a].mAlgorithm.IsString() &&
|
||||
normalizedParams[a].mAlgorithm.GetAsString().EqualsLiteral(
|
||||
WEBCRYPTO_NAMED_CURVE_P256)) {
|
||||
|
@ -378,7 +377,7 @@ WebAuthnManager::MakeCredential(nsPIDOMWindowInner* aParent, JSContext* aCx,
|
|||
// and compute the clientDataJSON and clientDataHash.
|
||||
|
||||
CryptoBuffer challenge;
|
||||
if (!challenge.Assign(aChallenge)) {
|
||||
if (!challenge.Assign(aOptions.mChallenge)) {
|
||||
promise->MaybeReject(NS_ERROR_DOM_SECURITY_ERR);
|
||||
return promise.forget();
|
||||
}
|
||||
|
@ -406,15 +405,9 @@ WebAuthnManager::MakeCredential(nsPIDOMWindowInner* aParent, JSContext* aCx,
|
|||
if (aOptions.mExcludeList.WasPassed()) {
|
||||
for (const auto& s: aOptions.mExcludeList.Value()) {
|
||||
WebAuthnScopedCredentialDescriptor c;
|
||||
c.type() = static_cast<uint32_t>(s.mType);
|
||||
CryptoBuffer cb;
|
||||
cb.Assign(s.mId);
|
||||
c.id() = cb;
|
||||
if (s.mTransports.WasPassed()) {
|
||||
for (const auto& t: s.mTransports.Value()) {
|
||||
c.transports().AppendElement(static_cast<uint32_t>(t));
|
||||
}
|
||||
}
|
||||
excludeList.AppendElement(c);
|
||||
}
|
||||
}
|
||||
|
@ -463,8 +456,7 @@ WebAuthnManager::StartSign() {
|
|||
|
||||
already_AddRefed<Promise>
|
||||
WebAuthnManager::GetAssertion(nsPIDOMWindowInner* aParent,
|
||||
const ArrayBufferViewOrArrayBuffer& aChallenge,
|
||||
const AssertionOptions& aOptions)
|
||||
const PublicKeyCredentialRequestOptions& aOptions)
|
||||
{
|
||||
MOZ_ASSERT(aParent);
|
||||
|
||||
|
@ -489,11 +481,11 @@ WebAuthnManager::GetAssertion(nsPIDOMWindowInner* aParent,
|
|||
// reasonable range as defined by the platform and if not, correct it to the
|
||||
// closest value lying within that range.
|
||||
|
||||
double adjustedTimeout = 30.0;
|
||||
if (aOptions.mTimeoutSeconds.WasPassed()) {
|
||||
adjustedTimeout = aOptions.mTimeoutSeconds.Value();
|
||||
adjustedTimeout = std::max(15.0, adjustedTimeout);
|
||||
adjustedTimeout = std::min(120.0, adjustedTimeout);
|
||||
uint32_t adjustedTimeout = 30000;
|
||||
if (aOptions.mTimeout.WasPassed()) {
|
||||
adjustedTimeout = aOptions.mTimeout.Value();
|
||||
adjustedTimeout = std::max(15000u, adjustedTimeout);
|
||||
adjustedTimeout = std::min(120000u, adjustedTimeout);
|
||||
}
|
||||
|
||||
nsCString rpId;
|
||||
|
@ -541,7 +533,7 @@ WebAuthnManager::GetAssertion(nsPIDOMWindowInner* aParent,
|
|||
// representing this request. Choose a hash algorithm for hashAlg and compute
|
||||
// the clientDataJSON and clientDataHash.
|
||||
CryptoBuffer challenge;
|
||||
if (!challenge.Assign(aChallenge)) {
|
||||
if (!challenge.Assign(aOptions.mChallenge)) {
|
||||
promise->MaybeReject(NS_ERROR_DOM_SECURITY_ERR);
|
||||
return promise.forget();
|
||||
}
|
||||
|
@ -567,23 +559,17 @@ WebAuthnManager::GetAssertion(nsPIDOMWindowInner* aParent,
|
|||
|
||||
// Note: we only support U2F-style authentication for now, so we effectively
|
||||
// require an AllowList.
|
||||
if (!aOptions.mAllowList.WasPassed()) {
|
||||
if (aOptions.mAllowList.Length() < 1) {
|
||||
promise->MaybeReject(NS_ERROR_DOM_NOT_ALLOWED_ERR);
|
||||
return promise.forget();
|
||||
}
|
||||
|
||||
nsTArray<WebAuthnScopedCredentialDescriptor> allowList;
|
||||
for (const auto& s: aOptions.mAllowList.Value()) {
|
||||
for (const auto& s: aOptions.mAllowList) {
|
||||
WebAuthnScopedCredentialDescriptor c;
|
||||
c.type() = static_cast<uint32_t>(s.mType);
|
||||
CryptoBuffer cb;
|
||||
cb.Assign(s.mId);
|
||||
c.id() = cb;
|
||||
if (s.mTransports.WasPassed()) {
|
||||
for (const auto& t: s.mTransports.Value()) {
|
||||
c.transports().AppendElement(static_cast<uint32_t>(t));
|
||||
}
|
||||
}
|
||||
allowList.AppendElement(c);
|
||||
}
|
||||
|
||||
|
@ -597,7 +583,7 @@ WebAuthnManager::GetAssertion(nsPIDOMWindowInner* aParent,
|
|||
|
||||
WebAuthnTransactionInfo info(rpIdHash,
|
||||
clientDataHash,
|
||||
10000,
|
||||
adjustedTimeout,
|
||||
allowList,
|
||||
extensions);
|
||||
RefPtr<MozPromise<nsresult, nsresult, false>> p = GetOrCreateBackgroundActor();
|
||||
|
@ -674,25 +660,19 @@ WebAuthnManager::FinishMakeCredential(nsTArray<uint8_t>& aRegBuffer,
|
|||
return;
|
||||
}
|
||||
|
||||
// Create a new ScopedCredentialInfo object named value and populate its
|
||||
// fields with the values returned from the authenticator as well as the
|
||||
// clientDataJSON computed earlier.
|
||||
// Create a new PublicKeyCredential object and populate its fields with the
|
||||
// values returned from the authenticator as well as the clientDataJSON
|
||||
// computed earlier.
|
||||
RefPtr<AuthenticatorAttestationResponse> attestation =
|
||||
new AuthenticatorAttestationResponse(mCurrentParent);
|
||||
attestation->SetClientDataJSON(clientDataBuf);
|
||||
attestation->SetAttestationObject(regData);
|
||||
|
||||
RefPtr<ScopedCredential> credential = new ScopedCredential(mCurrentParent);
|
||||
credential->SetType(ScopedCredentialType::ScopedCred);
|
||||
credential->SetId(keyHandleBuf);
|
||||
RefPtr<PublicKeyCredential> credential = new PublicKeyCredential(mCurrentParent);
|
||||
credential->SetRawId(keyHandleBuf);
|
||||
credential->SetResponse(attestation);
|
||||
|
||||
RefPtr<WebAuthnAttestation> attestation = new WebAuthnAttestation(mCurrentParent);
|
||||
attestation->SetFormat(NS_LITERAL_STRING("u2f"));
|
||||
attestation->SetClientData(clientDataBuf);
|
||||
attestation->SetAuthenticatorData(authenticatorDataBuf);
|
||||
attestation->SetAttestation(regData);
|
||||
|
||||
RefPtr<ScopedCredentialInfo> info = new ScopedCredentialInfo(mCurrentParent);
|
||||
info->SetCredential(credential);
|
||||
info->SetAttestation(attestation);
|
||||
|
||||
mTransactionPromise->MaybeResolve(info);
|
||||
mTransactionPromise->MaybeResolve(credential);
|
||||
MaybeClearTransaction();
|
||||
}
|
||||
|
||||
|
@ -737,21 +717,21 @@ WebAuthnManager::FinishGetAssertion(nsTArray<uint8_t>& aCredentialId,
|
|||
|
||||
// If any authenticator returns success:
|
||||
|
||||
// Create a new WebAuthnAssertion object named value and populate its fields
|
||||
// Create a new PublicKeyCredential object named value and populate its fields
|
||||
// with the values returned from the authenticator as well as the
|
||||
// clientDataJSON computed earlier.
|
||||
|
||||
RefPtr<ScopedCredential> credential = new ScopedCredential(mCurrentParent);
|
||||
credential->SetType(ScopedCredentialType::ScopedCred);
|
||||
credential->SetId(credentialBuf);
|
||||
|
||||
RefPtr<WebAuthnAssertion> assertion = new WebAuthnAssertion(mCurrentParent);
|
||||
assertion->SetCredential(credential);
|
||||
assertion->SetClientData(clientDataBuf);
|
||||
RefPtr<AuthenticatorAssertionResponse> assertion =
|
||||
new AuthenticatorAssertionResponse(mCurrentParent);
|
||||
assertion->SetClientDataJSON(clientDataBuf);
|
||||
assertion->SetAuthenticatorData(authenticatorDataBuf);
|
||||
assertion->SetSignature(signatureData);
|
||||
|
||||
mTransactionPromise->MaybeResolve(assertion);
|
||||
RefPtr<PublicKeyCredential> credential =
|
||||
new PublicKeyCredential(mCurrentParent);
|
||||
credential->SetRawId(credentialBuf);
|
||||
credential->SetResponse(assertion);
|
||||
|
||||
mTransactionPromise->MaybeResolve(credential);
|
||||
MaybeClearTransaction();
|
||||
}
|
||||
|
||||
|
|
|
@ -7,9 +7,9 @@
|
|||
#ifndef mozilla_dom_WebAuthnManager_h
|
||||
#define mozilla_dom_WebAuthnManager_h
|
||||
|
||||
#include "nsIIPCBackgroundChildCreateCallback.h"
|
||||
#include "mozilla/MozPromise.h"
|
||||
#include "mozilla/dom/PWebAuthnTransaction.h"
|
||||
#include "nsIIPCBackgroundChildCreateCallback.h"
|
||||
|
||||
/*
|
||||
* Content process manager for the WebAuthn protocol. Created on calls to the
|
||||
|
@ -73,16 +73,12 @@ public:
|
|||
Cancel(const nsresult& aError);
|
||||
|
||||
already_AddRefed<Promise>
|
||||
MakeCredential(nsPIDOMWindowInner* aParent, JSContext* aCx,
|
||||
const Account& aAccountInformation,
|
||||
const Sequence<ScopedCredentialParameters>& aCryptoParameters,
|
||||
const ArrayBufferViewOrArrayBuffer& aAttestationChallenge,
|
||||
const ScopedCredentialOptions& aOptions);
|
||||
MakeCredential(nsPIDOMWindowInner* aParent,
|
||||
const MakeCredentialOptions& aOptions);
|
||||
|
||||
already_AddRefed<Promise>
|
||||
GetAssertion(nsPIDOMWindowInner* aParent,
|
||||
const ArrayBufferViewOrArrayBuffer& aAssertionChallenge,
|
||||
const AssertionOptions& aOptions);
|
||||
const PublicKeyCredentialRequestOptions& aOptions);
|
||||
|
||||
void StartRegister();
|
||||
void StartSign();
|
||||
|
|
|
@ -12,15 +12,14 @@ IPDL_SOURCES += [
|
|||
]
|
||||
|
||||
EXPORTS.mozilla.dom += [
|
||||
'AuthenticatorAssertionResponse.h',
|
||||
'AuthenticatorAttestationResponse.h',
|
||||
'AuthenticatorResponse.h',
|
||||
'NSSU2FTokenRemote.h',
|
||||
'ScopedCredential.h',
|
||||
'ScopedCredentialInfo.h',
|
||||
'PublicKeyCredential.h',
|
||||
'U2FSoftTokenManager.h',
|
||||
'U2FTokenManager.h',
|
||||
'U2FTokenTransport.h',
|
||||
'WebAuthentication.h',
|
||||
'WebAuthnAssertion.h',
|
||||
'WebAuthnAttestation.h',
|
||||
'WebAuthnManager.h',
|
||||
'WebAuthnRequest.h',
|
||||
'WebAuthnTransactionChild.h',
|
||||
|
@ -29,14 +28,13 @@ EXPORTS.mozilla.dom += [
|
|||
]
|
||||
|
||||
UNIFIED_SOURCES += [
|
||||
'AuthenticatorAssertionResponse.cpp',
|
||||
'AuthenticatorAttestationResponse.cpp',
|
||||
'AuthenticatorResponse.cpp',
|
||||
'NSSU2FTokenRemote.cpp',
|
||||
'ScopedCredential.cpp',
|
||||
'ScopedCredentialInfo.cpp',
|
||||
'PublicKeyCredential.cpp',
|
||||
'U2FSoftTokenManager.cpp',
|
||||
'U2FTokenManager.cpp',
|
||||
'WebAuthentication.cpp',
|
||||
'WebAuthnAssertion.cpp',
|
||||
'WebAuthnAttestation.cpp',
|
||||
'WebAuthnManager.cpp',
|
||||
'WebAuthnTransactionChild.cpp',
|
||||
'WebAuthnTransactionParent.cpp',
|
||||
|
|
|
@ -16,91 +16,112 @@
|
|||
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1309284">Mozilla Bug 1309284</a>
|
||||
|
||||
<script class="testbody" type="text/javascript">
|
||||
"use strict";
|
||||
"use strict";
|
||||
|
||||
// Execute the full-scope test
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
// Execute the full-scope test
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
function arrivingHereIsBad(aResult) {
|
||||
ok(false, "Bad result! Received a: " + aResult);
|
||||
return Promise.resolve();
|
||||
}
|
||||
function arrivingHereIsBad(aResult) {
|
||||
ok(false, "Bad result! Received a: " + aResult);
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
function expectNotAllowedError(aResult) {
|
||||
ok(aResult.toString().startsWith("NotAllowedError"), "Expecting a NotAllowedError");
|
||||
return Promise.resolve();
|
||||
}
|
||||
function expectNotAllowedError(aResult) {
|
||||
ok(aResult.toString().startsWith("NotAllowedError"), "Expecting a NotAllowedError");
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
function expectTypeError(aResult) {
|
||||
ok(aResult.toString().startsWith("TypeError"), "Expecting a TypeError");
|
||||
return Promise.resolve();
|
||||
}
|
||||
function expectTypeError(aResult) {
|
||||
ok(aResult.toString().startsWith("TypeError"), "Expecting a TypeError");
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
SpecialPowers.pushPrefEnv({"set": [["security.webauth.webauthn", true],
|
||||
["security.webauth.webauthn_enable_softtoken", true],
|
||||
["security.webauth.webauthn_enable_usbtoken", false]]},
|
||||
runTests);
|
||||
SpecialPowers.pushPrefEnv({"set": [["security.webauth.webauthn", true],
|
||||
["security.webauth.webauthn_enable_softtoken", true],
|
||||
["security.webauth.webauthn_enable_usbtoken", false]]},
|
||||
runTests);
|
||||
|
||||
function runTests() {
|
||||
isnot(navigator.authentication, undefined, "WebAuthn API endpoint must exist");
|
||||
isnot(navigator.authentication.makeCredential, undefined, "WebAuthn makeCredential API endpoint must exist");
|
||||
isnot(navigator.authentication.getAssertion, undefined, "WebAuthn getAssertion API endpoint must exist");
|
||||
function runTests() {
|
||||
is(navigator.authentication, undefined, "navigator.authentication does not exist any longer");
|
||||
isnot(navigator.credentials, undefined, "Credential Management API endpoint must exist");
|
||||
isnot(navigator.credentials.create, undefined, "CredentialManagement create API endpoint must exist");
|
||||
isnot(navigator.credentials.get, undefined, "CredentialManagement get API endpoint must exist");
|
||||
|
||||
let authn = navigator.authentication;
|
||||
let credm = navigator.credentials;
|
||||
|
||||
let gAssertionChallenge = new Uint8Array(16);
|
||||
window.crypto.getRandomValues(gAssertionChallenge);
|
||||
let gAssertionChallenge = new Uint8Array(16);
|
||||
window.crypto.getRandomValues(gAssertionChallenge);
|
||||
|
||||
let invalidCred = { type: "Magic", id: base64ToBytes("AAA=") };
|
||||
let unknownCred = { type: "ScopedCred", id: base64ToBytes("AAA=") };
|
||||
let invalidCred = {type: "Magic", id: base64ToBytes("AAA=")};
|
||||
let unknownCred = {type: "public-key", id: base64ToBytes("AAA=")};
|
||||
|
||||
var testFuncs = [
|
||||
function () {
|
||||
// Test basic good call, but without giving a credential so expect failures
|
||||
// this is OK by the standard, but not supported by U2F-backed authenticators
|
||||
// like the soft token in use here.
|
||||
return authn.getAssertion(gAssertionChallenge)
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectNotAllowedError);
|
||||
},
|
||||
function () {
|
||||
// Test with an unexpected option
|
||||
return authn.getAssertion(gAssertionChallenge, { unknownValue: "hi" })
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectNotAllowedError);
|
||||
},
|
||||
function () {
|
||||
// Test with an invalid credential
|
||||
return authn.getAssertion(gAssertionChallenge, { allowList: [invalidCred] })
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
function () {
|
||||
// Test with an unknown credential
|
||||
return authn.getAssertion(gAssertionChallenge, { allowList: [unknownCred] })
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectNotAllowedError);
|
||||
},
|
||||
function () {
|
||||
// Test with an unexpected option and an invalid credential
|
||||
return authn.getAssertion(gAssertionChallenge, { unknownValue: "hi" })
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectNotAllowedError);
|
||||
}
|
||||
];
|
||||
var testFuncs = [
|
||||
function () {
|
||||
// Test basic good call, but without giving a credential so expect failures
|
||||
// this is OK by the standard, but not supported by U2F-backed authenticators
|
||||
// like the soft token in use here.
|
||||
let publicKeyCredentialRequestOptions = {
|
||||
challenge: gAssertionChallenge
|
||||
};
|
||||
return credm.get({publicKey: publicKeyCredentialRequestOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectNotAllowedError);
|
||||
},
|
||||
function () {
|
||||
// Test with an unexpected option
|
||||
let publicKeyCredentialRequestOptions = {
|
||||
challenge: gAssertionChallenge,
|
||||
unknownValue: "hi"
|
||||
};
|
||||
return credm.get({publicKey: publicKeyCredentialRequestOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectNotAllowedError);
|
||||
},
|
||||
function () {
|
||||
// Test with an invalid credential
|
||||
let publicKeyCredentialRequestOptions = {
|
||||
challenge: gAssertionChallenge,
|
||||
allowList: [invalidCred]
|
||||
};
|
||||
return credm.get({publicKey: publicKeyCredentialRequestOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
function () {
|
||||
// Test with an unknown credential
|
||||
let publicKeyCredentialRequestOptions = {
|
||||
challenge: gAssertionChallenge,
|
||||
allowList: [unknownCred]
|
||||
};
|
||||
return credm.get({publicKey: publicKeyCredentialRequestOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectNotAllowedError);
|
||||
},
|
||||
function () {
|
||||
// Test with an unexpected option and an invalid credential
|
||||
let publicKeyCredentialRequestOptions = {
|
||||
challenge: gAssertionChallenge,
|
||||
unknownValue: "hi",
|
||||
allowList: [invalidCred]
|
||||
};
|
||||
return credm.get({publicKey: publicKeyCredentialRequestOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
}
|
||||
];
|
||||
|
||||
var i = 0;
|
||||
var runNextTest = () => {
|
||||
if (i == testFuncs.length) {
|
||||
SimpleTest.finish();
|
||||
return;
|
||||
}
|
||||
testFuncs[i]().then(() => { runNextTest(); });
|
||||
i = i + 1;
|
||||
};
|
||||
runNextTest();
|
||||
var i = 0;
|
||||
var runNextTest = () => {
|
||||
if (i == testFuncs.length) {
|
||||
SimpleTest.finish();
|
||||
return;
|
||||
}
|
||||
testFuncs[i]().then(() => { runNextTest(); });
|
||||
i = i + 1;
|
||||
};
|
||||
runNextTest();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
||||
|
||||
|
|
|
@ -25,11 +25,12 @@ SpecialPowers.pushPrefEnv({"set": [["security.webauth.webauthn", true],
|
|||
["security.webauth.webauthn_enable_softtoken", true],
|
||||
["security.webauth.webauthn_enable_usbtoken", false]]},
|
||||
function() {
|
||||
isnot(navigator.authentication, undefined, "WebAuthn API endpoint must exist");
|
||||
isnot(navigator.authentication.makeCredential, undefined, "WebAuthn makeCredential API endpoint must exist");
|
||||
isnot(navigator.authentication.getAssertion, undefined, "WebAuthn getAssertion API endpoint must exist");
|
||||
is(navigator.authentication, undefined, "navigator.authentication does not exist any longer");
|
||||
isnot(navigator.credentials, undefined, "Credential Management API endpoint must exist");
|
||||
isnot(navigator.credentials.create, undefined, "CredentialManagement create API endpoint must exist");
|
||||
isnot(navigator.credentials.get, undefined, "CredentialManagement get API endpoint must exist");
|
||||
|
||||
let authn = navigator.authentication;
|
||||
let credm = navigator.credentials;
|
||||
|
||||
let gCredentialChallenge = new Uint8Array(16);
|
||||
window.crypto.getRandomValues(gCredentialChallenge);
|
||||
|
@ -39,28 +40,23 @@ function() {
|
|||
testMakeCredential();
|
||||
|
||||
function checkCredentialValid(aCredInfo) {
|
||||
/* ScopedCredentialInfo
|
||||
- Credential
|
||||
-- ID: Key Handle buffer pulled from U2F Register() Response
|
||||
-- Type: "ScopedCred"
|
||||
- WebAuthnAttestation
|
||||
-- Format: "u2f"
|
||||
-- ClientData: serialized JSON
|
||||
-- AuthenticatorData: RP ID Hash || U2F Sign() Response
|
||||
-- Attestation: U2F Register() Response */
|
||||
/* PublicKeyCredential : Credential
|
||||
- rawId: Key Handle buffer pulled from U2F Register() Response
|
||||
- response : AuthenticatorAttestationResponse : AuthenticatorResponse
|
||||
- attestationObject: RP ID Hash || U2F Sign() Response
|
||||
- clientDataJSON: serialized JSON
|
||||
- clientExtensionResults: (not yet supported)
|
||||
*/
|
||||
|
||||
is(aCredInfo.credential.type, "ScopedCred", "Type is correct");
|
||||
ok(aCredInfo.credential.id.length > 0, "Key ID exists");
|
||||
ok(aCredInfo.rawId.length > 0, "Key ID exists");
|
||||
|
||||
is(aCredInfo.attestation.format, "u2f", "Format is correct");
|
||||
is(aCredInfo.attestation.attestation[0], 0x05, "Reserved byte is correct");
|
||||
ok(aCredInfo.attestation.authenticatorData.length > 0, "Authenticator data exists");
|
||||
let clientData = JSON.parse(buffer2string(aCredInfo.attestation.clientData));
|
||||
is(aCredInfo.response.attestationObject[0], 0x05, "Reserved byte is correct");
|
||||
let clientData = JSON.parse(buffer2string(aCredInfo.response.clientDataJSON));
|
||||
is(clientData.challenge, bytesToBase64UrlSafe(gCredentialChallenge), "Challenge is correct");
|
||||
is(clientData.origin, window.location.origin, "Origin is correct");
|
||||
is(clientData.hashAlg, "S256", "Hash algorithm is correct");
|
||||
|
||||
return decodeU2FRegistration(aCredInfo.attestation.attestation)
|
||||
return decodeU2FRegistration(aCredInfo.response.attestationObject)
|
||||
.then(function(u2fObj) {
|
||||
aCredInfo.u2fReg = u2fObj;
|
||||
return aCredInfo;
|
||||
|
@ -68,37 +64,36 @@ function() {
|
|||
}
|
||||
|
||||
function checkAssertionAndSigValid(aPublicKey, aAssertion) {
|
||||
/* WebAuthnAssertion
|
||||
- Credential
|
||||
-- ID: ID of Credential from AllowList that succeeded
|
||||
-- Type: "ScopedCred"
|
||||
- ClientData: serialized JSON
|
||||
- AuthenticatorData: RP ID Hash || U2F Sign() Response
|
||||
- Signature: U2F Sign() Response */
|
||||
/* PublicKeyCredential : Credential
|
||||
- rawId: ID of Credential from AllowList that succeeded
|
||||
- response : AuthenticatorAssertionResponse : AuthenticatorResponse
|
||||
- clientDataJSON: serialized JSON
|
||||
- authenticatorData: RP ID Hash || U2F Sign() Response
|
||||
- signature: U2F Sign() Response
|
||||
*/
|
||||
|
||||
is(aAssertion.credential.type, "ScopedCred", "Type is correct");
|
||||
ok(aAssertion.credential.id.length > 0, "Key ID exists");
|
||||
ok(aAssertion.rawId.length > 0, "Key ID exists");
|
||||
|
||||
ok(aAssertion.authenticatorData.length > 0, "Authenticator data exists");
|
||||
let clientData = JSON.parse(buffer2string(aAssertion.clientData));
|
||||
ok(aAssertion.response.authenticatorData.length > 0, "Authenticator data exists");
|
||||
let clientData = JSON.parse(buffer2string(aAssertion.response.clientDataJSON));
|
||||
is(clientData.challenge, bytesToBase64UrlSafe(gAssertionChallenge), "Challenge is correct");
|
||||
is(clientData.origin, window.location.origin, "Origin is correct");
|
||||
is(clientData.hashAlg, "S256", "Hash algorithm is correct");
|
||||
|
||||
// Parse the signature data
|
||||
if (aAssertion.signature[0] != 0x01) {
|
||||
if (aAssertion.response.signature[0] != 0x01) {
|
||||
throw "User presence byte not set";
|
||||
}
|
||||
let presenceAndCounter = aAssertion.signature.slice(0,5);
|
||||
let signatureValue = aAssertion.signature.slice(5);
|
||||
let presenceAndCounter = aAssertion.response.signature.slice(0,5);
|
||||
let signatureValue = aAssertion.response.signature.slice(5);
|
||||
|
||||
let rpIdHash = aAssertion.authenticatorData.slice(0,32);
|
||||
let rpIdHash = aAssertion.response.authenticatorData.slice(0,32);
|
||||
|
||||
// Assemble the signed data and verify the signature
|
||||
return deriveAppAndChallengeParam(clientData.origin, aAssertion.clientData)
|
||||
return deriveAppAndChallengeParam(clientData.origin, aAssertion.response.clientDataJSON)
|
||||
.then(function(aParams) {
|
||||
console.log(aParams.appParam, rpIdHash, presenceAndCounter, aParams.challengeParam);
|
||||
console.log("ClientData buffer: ", hexEncode(aAssertion.clientData));
|
||||
console.log("ClientData buffer: ", hexEncode(aAssertion.response.clientDataJSON));
|
||||
console.log("ClientDataHash: ", hexEncode(aParams.challengeParam));
|
||||
return assembleSignedData(aParams.appParam, presenceAndCounter, aParams.challengeParam);
|
||||
})
|
||||
|
@ -109,10 +104,16 @@ function() {
|
|||
}
|
||||
|
||||
function testMakeCredential() {
|
||||
let acct = {rpDisplayName: "none", displayName: "none", id: "none"};
|
||||
let param = {type: "ScopedCred", algorithm: "p-256"};
|
||||
|
||||
authn.makeCredential(acct, [param], gCredentialChallenge)
|
||||
let rp = {id: document.origin, name: "none", icon: "none"};
|
||||
let user = {id: "none", name: "none", icon: "none", displayName: "none"};
|
||||
let param = {type: "public-key", algorithm: "P-256"};
|
||||
let makeCredentialOptions = {
|
||||
rp: rp,
|
||||
user: user,
|
||||
challenge: gCredentialChallenge,
|
||||
parameters: [param]
|
||||
};
|
||||
credm.create({publicKey: makeCredentialOptions})
|
||||
.then(checkCredentialValid)
|
||||
.then(testMakeDuplicate)
|
||||
.catch(function(aReason) {
|
||||
|
@ -122,33 +123,43 @@ function() {
|
|||
}
|
||||
|
||||
function testMakeDuplicate(aCredInfo) {
|
||||
let acct = {rpDisplayName: "none", displayName: "none", id: "none"};
|
||||
let param = {type: "ScopedCred", algorithm: "p-256"};
|
||||
let options = {rpId: document.origin,
|
||||
excludeList: [aCredInfo.credential]};
|
||||
|
||||
authn.makeCredential(acct, [param], gCredentialChallenge, options)
|
||||
let rp = {id: document.origin, name: "none", icon: "none"};
|
||||
let user = {id: "none", name: "none", icon: "none", displayName: "none"};
|
||||
let param = {type: "public-key", algorithm: "P-256"};
|
||||
let makeCredentialOptions = {
|
||||
rp: rp,
|
||||
user: user,
|
||||
challenge: gCredentialChallenge,
|
||||
parameters: [param],
|
||||
excludeList: [{type: "public-key", id: Uint8Array.from(aCredInfo.rawId),
|
||||
transports: ["usb"]}]
|
||||
};
|
||||
credm.create({publicKey: makeCredentialOptions})
|
||||
.then(function() {
|
||||
// We should have errored here!
|
||||
ok(false, "The excludeList didn't stop a duplicate being created!");
|
||||
SimpleTest.finish();
|
||||
})
|
||||
.catch(function(aReason) {
|
||||
ok(aReason.toString().startsWith("NotAllowedError"), "Expect NotAllowedError, got" + aReason);
|
||||
ok(aReason.toString().startsWith("NotAllowedError"), "Expect NotAllowedError, got " + aReason);
|
||||
testAssertion(aCredInfo);
|
||||
});
|
||||
}
|
||||
|
||||
function testAssertion(aCredInfo) {
|
||||
let newCredential = {
|
||||
type: aCredInfo.credential.type,
|
||||
id: Uint8Array.from(aCredInfo.credential.id),
|
||||
transports: [ "usb" ],
|
||||
type: "public-key",
|
||||
id: Uint8Array.from(aCredInfo.rawId),
|
||||
transports: ["usb"],
|
||||
}
|
||||
|
||||
let assertOptions = {rpId: document.origin, timeoutSeconds: 5,
|
||||
allowList: [ newCredential ]};
|
||||
authn.getAssertion(gAssertionChallenge, assertOptions)
|
||||
let publicKeyCredentialRequestOptions = {
|
||||
challenge: gAssertionChallenge,
|
||||
timeout: 5000, // the minimum timeout is actually 15 seconds
|
||||
rpId: document.origin,
|
||||
allowList: [newCredential]
|
||||
};
|
||||
credm.get({publicKey: publicKeyCredentialRequestOptions})
|
||||
.then(function(aAssertion) {
|
||||
/* Pass along the pubKey. */
|
||||
return checkAssertionAndSigValid(aCredInfo.u2fReg.publicKey, aAssertion);
|
||||
|
|
|
@ -16,179 +16,231 @@
|
|||
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1309284">Mozilla Bug 1309284</a>
|
||||
|
||||
<script class="testbody" type="text/javascript">
|
||||
"use strict";
|
||||
"use strict";
|
||||
|
||||
// Execute the full-scope test
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
// Execute the full-scope test
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
function arrivingHereIsGood(aResult) {
|
||||
ok(true, "Good result! Received a: " + aResult);
|
||||
return Promise.resolve();
|
||||
}
|
||||
function arrivingHereIsGood(aResult) {
|
||||
ok(true, "Good result! Received a: " + aResult);
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
function arrivingHereIsBad(aResult) {
|
||||
ok(false, "Bad result! Received a: " + aResult);
|
||||
return Promise.resolve();
|
||||
}
|
||||
function arrivingHereIsBad(aResult) {
|
||||
ok(false, "Bad result! Received a: " + aResult);
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
function expectNotAllowedError(aResult) {
|
||||
ok(aResult.toString().startsWith("NotAllowedError"), "Expecting a NotAllowedError");
|
||||
return Promise.resolve();
|
||||
}
|
||||
function expectNotAllowedError(aResult) {
|
||||
ok(aResult.toString().startsWith("NotAllowedError"), "Expecting a NotAllowedError");
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
function expectTypeError(aResult) {
|
||||
ok(aResult.toString().startsWith("TypeError"), "Expecting a TypeError");
|
||||
return Promise.resolve();
|
||||
}
|
||||
function expectTypeError(aResult) {
|
||||
ok(aResult.toString().startsWith("TypeError"), "Expecting a TypeError");
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
function expectNotSupportedError(aResult) {
|
||||
ok(aResult.toString().startsWith("NotSupportedError"), "Expecting a NotSupportedError");
|
||||
return Promise.resolve();
|
||||
}
|
||||
function expectNotSupportedError(aResult) {
|
||||
ok(aResult.toString().startsWith("NotSupportedError"), "Expecting a NotSupportedError");
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
SpecialPowers.pushPrefEnv({"set": [["security.webauth.webauthn", true],
|
||||
["security.webauth.webauthn_enable_softtoken", true],
|
||||
["security.webauth.webauthn_enable_usbtoken", false]]}, runTests);
|
||||
function runTests() {
|
||||
isnot(navigator.authentication, undefined, "WebAuthn API endpoint must exist");
|
||||
isnot(navigator.authentication.makeCredential, undefined, "WebAuthn makeCredential API endpoint must exist");
|
||||
isnot(navigator.authentication.getAssertion, undefined, "WebAuthn getAssertion API endpoint must exist");
|
||||
SpecialPowers.pushPrefEnv({"set": [["security.webauth.webauthn", true],
|
||||
["security.webauth.webauthn_enable_softtoken", true],
|
||||
["security.webauth.webauthn_enable_usbtoken", false]]}, runTests);
|
||||
function runTests() {
|
||||
is(navigator.authentication, undefined, "navigator.authentication does not exist any longer");
|
||||
isnot(navigator.credentials, undefined, "Credential Management API endpoint must exist");
|
||||
isnot(navigator.credentials.create, undefined, "CredentialManagement create API endpoint must exist");
|
||||
isnot(navigator.credentials.get, undefined, "CredentialManagement get API endpoint must exist");
|
||||
|
||||
let authn = navigator.authentication;
|
||||
let credm = navigator.credentials;
|
||||
|
||||
let gCredentialChallenge = new Uint8Array(16);
|
||||
window.crypto.getRandomValues(gCredentialChallenge);
|
||||
let gCredentialChallenge = new Uint8Array(16);
|
||||
window.crypto.getRandomValues(gCredentialChallenge);
|
||||
|
||||
let acct = {rpDisplayName: "none", displayName: "none", id: "none"};
|
||||
let param = {type: "ScopedCred", algorithm: "p-256"};
|
||||
let unsupportedParam = {type: "ScopedCred", algorithm: "3DES"};
|
||||
let badParam = {type: "SimplePassword", algorithm: "MaxLength=2"};
|
||||
let rp = {id: "none", name: "none", icon: "none"};
|
||||
let user = {id: "none", name: "none", icon: "none", displayName: "none"};
|
||||
let param = {type: "public-key", algorithm: "p-256"};
|
||||
let unsupportedParam = {type: "public-key", algorithm: "3DES"};
|
||||
let badParam = {type: "SimplePassword", algorithm: "MaxLength=2"};
|
||||
|
||||
var testFuncs = [
|
||||
// Test basic good call
|
||||
function() {
|
||||
return authn.makeCredential(acct, [param], gCredentialChallenge)
|
||||
.then(arrivingHereIsGood)
|
||||
.catch(arrivingHereIsBad);
|
||||
},
|
||||
var testFuncs = [
|
||||
// Test basic good call
|
||||
function() {
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, user: user, challenge: gCredentialChallenge, parameters: [param]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsGood)
|
||||
.catch(arrivingHereIsBad);
|
||||
},
|
||||
|
||||
// Test empty account
|
||||
function() {
|
||||
return authn.makeCredential({}, [param], gCredentialChallenge)
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
// Test empty account
|
||||
function() {
|
||||
let makeCredentialOptions = {
|
||||
challenge: gCredentialChallenge, parameters: [param]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
|
||||
// Test without a parameter
|
||||
function() {
|
||||
return authn.makeCredential(acct, [], gCredentialChallenge)
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectNotSupportedError);
|
||||
},
|
||||
// Test without a parameter
|
||||
function() {
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, user: user, challenge: gCredentialChallenge, parameters: []
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectNotSupportedError);
|
||||
},
|
||||
|
||||
// Test without a parameter array at all
|
||||
function() {
|
||||
return authn.makeCredential(acct, null, gCredentialChallenge)
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
// Test without a parameter array at all
|
||||
function() {
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, user: user, challenge: gCredentialChallenge
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
|
||||
// Test with an unsupported parameter
|
||||
function() {
|
||||
return authn.makeCredential(acct, [unsupportedParam], gCredentialChallenge)
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectNotSupportedError);
|
||||
},
|
||||
// Test with an unsupported parameter
|
||||
function() {
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, user: user, challenge: gCredentialChallenge, parameters: [unsupportedParam]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectNotSupportedError);
|
||||
},
|
||||
|
||||
// Test with an unsupported parameter and a good one
|
||||
function() {
|
||||
return authn.makeCredential(acct, [unsupportedParam, param], gCredentialChallenge)
|
||||
.then(arrivingHereIsGood)
|
||||
.catch(arrivingHereIsBad);
|
||||
},
|
||||
// Test with an unsupported parameter and a good one
|
||||
function() {
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, user: user, challenge: gCredentialChallenge,
|
||||
parameters: [param, unsupportedParam]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsGood)
|
||||
.catch(arrivingHereIsBad);
|
||||
},
|
||||
|
||||
// Test with a bad parameter
|
||||
function() {
|
||||
return authn.makeCredential(acct, [badParam], gCredentialChallenge)
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
// Test with a bad parameter
|
||||
function() {
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, user: user, challenge: gCredentialChallenge, parameters: [badParam]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
|
||||
// Test with an unsupported parameter, and a bad one
|
||||
function() {
|
||||
return authn.makeCredential(acct, [unsupportedParam, badParam],
|
||||
gCredentialChallenge)
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
// Test with an unsupported parameter, and a bad one
|
||||
function() {
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, user: user, challenge: gCredentialChallenge,
|
||||
parameters: [unsupportedParam, badParam]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
|
||||
// Test with an unsupported parameter, a bad one, and a good one. This
|
||||
// should still fail, as anything with a badParam should fail.
|
||||
function() {
|
||||
return authn.makeCredential(acct, [unsupportedParam, badParam, param],
|
||||
gCredentialChallenge)
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
// Test with an unsupported parameter, a bad one, and a good one. This
|
||||
// should still fail, as anything with a badParam should fail.
|
||||
function() {
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, user: user, challenge: gCredentialChallenge,
|
||||
parameters: [param, unsupportedParam, badParam]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
|
||||
// Test without a challenge
|
||||
function() {
|
||||
return authn.makeCredential(acct, [param], null)
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
// Test without a challenge
|
||||
function() {
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, user: user, parameters: [param]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
|
||||
// Test with an invalid challenge
|
||||
function() {
|
||||
return authn.makeCredential(acct, [param], "begone, thou ill-fitting moist glove!")
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
// Test with an invalid challenge
|
||||
function() {
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, user: user, challenge: "begone, thou ill-fitting moist glove!",
|
||||
parameters: [unsupportedParam]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
|
||||
// Test with duplicate parameters
|
||||
function() {
|
||||
return authn.makeCredential(acct, [param, param, param], gCredentialChallenge)
|
||||
.then(arrivingHereIsGood)
|
||||
.catch(arrivingHereIsBad);
|
||||
},
|
||||
// Test with duplicate parameters
|
||||
function() {
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, user: user, challenge: gCredentialChallenge,
|
||||
parameters: [param, param, param]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsGood)
|
||||
.catch(arrivingHereIsBad);
|
||||
},
|
||||
|
||||
// Test an incomplete account
|
||||
function() {
|
||||
return authn.makeCredential({id: "none"
|
||||
}, [param], gCredentialChallenge)
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
// Test with missing rp
|
||||
function() {
|
||||
let makeCredentialOptions = {
|
||||
user: user, challenge: gCredentialChallenge, parameters: [param]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
|
||||
function() {
|
||||
return authn.makeCredential({name: "none", imageURL: "http://example.com/404"},
|
||||
[param], gCredentialChallenge)
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
// Test with missing user
|
||||
function() {
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, challenge: gCredentialChallenge, parameters: [param]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectTypeError);
|
||||
},
|
||||
|
||||
// Test a complete account
|
||||
function() {
|
||||
return authn.makeCredential({rpDisplayName: "Foxxy", displayName: "Foxxy V",
|
||||
id: "foxes_are_the_best@example.com",
|
||||
name: "Fox F. Foxington",
|
||||
imageURL: "https://example.com/fox.svg"},
|
||||
[param], gCredentialChallenge)
|
||||
.then(arrivingHereIsGood)
|
||||
.catch(arrivingHereIsBad);
|
||||
}];
|
||||
// Test a complete account
|
||||
function() {
|
||||
let completeRP = {id: "Foxxy RP", name: "Foxxy Name",
|
||||
icon: "https://example.com/fox.svg"};
|
||||
let completeUser = {id: "foxes_are_the_best@example.com",
|
||||
name: "Fox F. Foxington",
|
||||
icon: "https://example.com/fox.svg",
|
||||
displayName: "Foxxy V"};
|
||||
let makeCredentialOptions = {
|
||||
rp: completeRP, user: completeUser, challenge: gCredentialChallenge,
|
||||
parameters: [param]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsGood)
|
||||
.catch(arrivingHereIsBad);
|
||||
}];
|
||||
|
||||
var i = 0;
|
||||
var runNextTest = () => {
|
||||
if (i == testFuncs.length) {
|
||||
SimpleTest.finish();
|
||||
return;
|
||||
}
|
||||
testFuncs[i]().then(() => { runNextTest(); });
|
||||
i = i + 1;
|
||||
};
|
||||
runNextTest();
|
||||
};
|
||||
var i = 0;
|
||||
var runNextTest = () => {
|
||||
if (i == testFuncs.length) {
|
||||
SimpleTest.finish();
|
||||
return;
|
||||
}
|
||||
testFuncs[i]().then(() => { runNextTest(); });
|
||||
i = i + 1;
|
||||
};
|
||||
runNextTest();
|
||||
};
|
||||
|
||||
</script>
|
||||
|
||||
|
|
|
@ -26,11 +26,12 @@ SpecialPowers.pushPrefEnv({"set": [["security.webauth.webauthn", true],
|
|||
["security.webauth.webauthn_enable_softtoken", false],
|
||||
["security.webauth.webauthn_enable_usbtoken", false]]},
|
||||
function() {
|
||||
isnot(navigator.authentication, undefined, "WebAuthn API endpoint must exist");
|
||||
isnot(navigator.authentication.makeCredential, undefined, "WebAuthn makeCredential API endpoint must exist");
|
||||
isnot(navigator.authentication.getAssertion, undefined, "WebAuthn getAssertion API endpoint must exist");
|
||||
is(navigator.authentication, undefined, "navigator.authentication does not exist any longer");
|
||||
isnot(navigator.credentials, undefined, "Credential Management API endpoint must exist");
|
||||
isnot(navigator.credentials.create, undefined, "CredentialManagement create API endpoint must exist");
|
||||
isnot(navigator.credentials.get, undefined, "CredentialManagement get API endpoint must exist");
|
||||
|
||||
let authn = navigator.authentication;
|
||||
let credm = navigator.credentials;
|
||||
|
||||
let credentialChallenge = new Uint8Array(16);
|
||||
window.crypto.getRandomValues(credentialChallenge);
|
||||
|
@ -42,9 +43,13 @@ function() {
|
|||
testMakeCredential();
|
||||
|
||||
function testMakeCredential() {
|
||||
let acct = {rpDisplayName: "none", displayName: "none", id: "none"};
|
||||
let param = {type: "ScopedCred", algorithm: "p-256"};
|
||||
authn.makeCredential(acct, [param], credentialChallenge)
|
||||
let rp = {id: "none", name: "none", icon: "none"};
|
||||
let user = {id: "none", name: "none", icon: "none", displayName: "none"};
|
||||
let param = {type: "public-key", algorithm: "p-256"};
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, user: user, challenge: credentialChallenge, parameters: [param]
|
||||
};
|
||||
credm.create({publicKey: makeCredentialOptions})
|
||||
.then(function(aResult) {
|
||||
ok(false, "Should have failed.");
|
||||
testAssertion();
|
||||
|
@ -57,13 +62,17 @@ function() {
|
|||
|
||||
function testAssertion() {
|
||||
let newCredential = {
|
||||
type: "ScopedCred",
|
||||
type: "public-key",
|
||||
id: credentialId,
|
||||
transports: [ "usb" ],
|
||||
transports: ["usb"],
|
||||
}
|
||||
let assertOptions = {rpId: document.origin, timeoutSeconds: 5,
|
||||
allowList: [ newCredential ]};
|
||||
authn.getAssertion(assertionChallenge, assertOptions)
|
||||
let publicKeyCredentialRequestOptions = {
|
||||
challenge: assertionChallenge,
|
||||
timeout: 5000, // the minimum timeout is actually 15 seconds
|
||||
rpId: document.origin,
|
||||
allowList: [newCredential]
|
||||
};
|
||||
credm.get({publicKey: publicKeyCredentialRequestOptions})
|
||||
.then(function(aResult) {
|
||||
ok(false, "Should have failed.");
|
||||
SimpleTest.finish();
|
||||
|
|
|
@ -16,169 +16,221 @@
|
|||
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=1309284">Mozilla Bug 1309284</a>
|
||||
|
||||
<script class="testbody" type="text/javascript">
|
||||
"use strict";
|
||||
"use strict";
|
||||
|
||||
// Execute the full-scope test
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
// Execute the full-scope test
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
var gTrackedCredential = {};
|
||||
var gTrackedCredential = {};
|
||||
|
||||
function arrivingHereIsGood(aResult) {
|
||||
ok(true, "Good result! Received a: " + aResult);
|
||||
return Promise.resolve();
|
||||
}
|
||||
function arrivingHereIsGood(aResult) {
|
||||
ok(true, "Good result! Received a: " + aResult);
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
function arrivingHereIsBad(aResult) {
|
||||
// TODO: Change to `ok` when Bug 1329764 lands
|
||||
todo(false, "Bad result! Received a: " + aResult);
|
||||
return Promise.resolve();
|
||||
}
|
||||
function arrivingHereIsBad(aResult) {
|
||||
// TODO: Change to `ok` when Bug 1329764 lands
|
||||
todo(false, "Bad result! Received a: " + aResult);
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
function expectSecurityError(aResult) {
|
||||
// TODO: Change to `ok` when Bug 1329764 lands
|
||||
todo(aResult.toString().startsWith("SecurityError"), "Expecting a SecurityError");
|
||||
return Promise.resolve();
|
||||
}
|
||||
function expectSecurityError(aResult) {
|
||||
// TODO: Change to `ok` when Bug 1329764 lands
|
||||
todo(aResult.toString().startsWith("SecurityError"), "Expecting a SecurityError");
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
function keepThisScopedCredential(aScopedCredInfo) {
|
||||
gTrackedCredential = {
|
||||
type: aScopedCredInfo.credential.type,
|
||||
id: Uint8Array.from(aScopedCredInfo.credential.id),
|
||||
transports: [ "usb" ],
|
||||
}
|
||||
return Promise.resolve(aScopedCredInfo);
|
||||
}
|
||||
function keepThisPublicKeyCredential(aPublicKeyCredential) {
|
||||
gTrackedCredential = {
|
||||
type: "public-key",
|
||||
id: Uint8Array.from(aPublicKeyCredential.rawId),
|
||||
transports: [ "usb" ],
|
||||
}
|
||||
return Promise.resolve(aPublicKeyCredential);
|
||||
}
|
||||
|
||||
function runTests() {
|
||||
isnot(navigator.authentication, undefined, "WebAuthn API endpoint must exist");
|
||||
isnot(navigator.authentication.makeCredential, undefined,
|
||||
"WebAuthn makeCredential API endpoint must exist");
|
||||
isnot(navigator.authentication.getAssertion, undefined,
|
||||
"WebAuthn getAssertion API endpoint must exist");
|
||||
function runTests() {
|
||||
is(navigator.authentication, undefined, "navigator.authentication does not exist any longer");
|
||||
isnot(navigator.credentials, undefined, "Credential Management API endpoint must exist");
|
||||
isnot(navigator.credentials.create, undefined, "CredentialManagement create API endpoint must exist");
|
||||
isnot(navigator.credentials.get, undefined, "CredentialManagement get API endpoint must exist");
|
||||
|
||||
let authn = navigator.authentication;
|
||||
let credm = navigator.credentials;
|
||||
|
||||
let chall = new Uint8Array(16);
|
||||
window.crypto.getRandomValues(chall);
|
||||
let chall = new Uint8Array(16);
|
||||
window.crypto.getRandomValues(chall);
|
||||
|
||||
let acct = {rpDisplayName: "none", displayName: "none", id: "none"};
|
||||
let param = {type: "ScopedCred", algorithm: "p-256"};
|
||||
let user = {id: "none", name: "none", icon: "none", displayName: "none"};
|
||||
let param = {type: "public-key", algorithm: "p-256"};
|
||||
|
||||
var testFuncs = [
|
||||
function() {
|
||||
// Test basic good call
|
||||
return authn.makeCredential(acct, [param], chall, {rpId: document.origin})
|
||||
.then(keepThisScopedCredential)
|
||||
.then(arrivingHereIsGood)
|
||||
.catch(arrivingHereIsBad);
|
||||
},
|
||||
var testFuncs = [
|
||||
function() {
|
||||
// Test basic good call
|
||||
let rp = {id: document.origin};
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, user: user, challenge: chall, parameters: [param]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(keepThisPublicKeyCredential)
|
||||
.then(arrivingHereIsGood)
|
||||
.catch(arrivingHereIsBad);
|
||||
},
|
||||
|
||||
function() {
|
||||
// Test rpId being unset
|
||||
return authn.makeCredential(acct, [param], chall, {})
|
||||
.then(arrivingHereIsGood)
|
||||
.catch(arrivingHereIsBad);
|
||||
},
|
||||
function() {
|
||||
// Test this origin with optional fields
|
||||
return authn.makeCredential(acct, [param], chall,
|
||||
{rpId: "user:pass@" + document.origin + ":8888"})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError);
|
||||
},
|
||||
function() {
|
||||
// Test blank rpId
|
||||
return authn.makeCredential(acct, [param], chall, {rpId: ""})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError);
|
||||
},
|
||||
function() {
|
||||
// Test subdomain of this origin
|
||||
return authn.makeCredential(acct, [param], chall,
|
||||
{rpId: "subdomain." + document.origin})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError);
|
||||
},
|
||||
function() {
|
||||
// Test another origin
|
||||
return authn.makeCredential(acct, [param], chall, {rpId: "example.com"})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError);
|
||||
},
|
||||
function () {
|
||||
// est a different domain within the same TLD
|
||||
return authn.makeCredential(acct, [param], chall, {rpId: "alt.test"})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError);
|
||||
},
|
||||
function () {
|
||||
// Test basic good call
|
||||
return authn.getAssertion(chall, {allowList: [ gTrackedCredential ],
|
||||
rpId: document.origin})
|
||||
.then(arrivingHereIsGood)
|
||||
.catch(arrivingHereIsBad);
|
||||
},
|
||||
function () {
|
||||
// Test rpId being unset
|
||||
return authn.getAssertion(chall, {allowList: [ gTrackedCredential ]})
|
||||
.then(arrivingHereIsGood)
|
||||
.catch(arrivingHereIsBad);
|
||||
},
|
||||
function () {
|
||||
// Test this origin with optional fields
|
||||
return authn.getAssertion(chall, {allowList: [ gTrackedCredential ],
|
||||
rpId: "user:pass@" + document.origin + ":8888"})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError);
|
||||
},
|
||||
function () {
|
||||
// Test blank rpId
|
||||
return authn.getAssertion(chall, {allowList: [ gTrackedCredential ],
|
||||
rpId: ""})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError);
|
||||
},
|
||||
function () {
|
||||
// Test subdomain of this origin
|
||||
return authn.getAssertion(chall, {allowList: [ gTrackedCredential ],
|
||||
rpId: "subdomain." + document.origin})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError);
|
||||
},
|
||||
function () {
|
||||
// Test another origin
|
||||
return authn.getAssertion(chall, {allowList: [ gTrackedCredential ],
|
||||
rpId: "example.com"})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError);
|
||||
},
|
||||
function () {
|
||||
// Test a different domain within the same TLD
|
||||
return authn.getAssertion(chall, {allowList: [ gTrackedCredential ],
|
||||
rpId: "alt.test"})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError)
|
||||
},
|
||||
function () {
|
||||
SimpleTest.finish();
|
||||
}
|
||||
];
|
||||
var i = 0;
|
||||
var runNextTest = () => {
|
||||
if (i == testFuncs.length) {
|
||||
SimpleTest.finish();
|
||||
return;
|
||||
}
|
||||
console.log(i);
|
||||
testFuncs[i]().then(() => { runNextTest(); });
|
||||
i = i + 1;
|
||||
};
|
||||
runNextTest();
|
||||
};
|
||||
SpecialPowers.pushPrefEnv({"set": [["security.webauth.webauthn", true],
|
||||
["security.webauth.webauthn_enable_softtoken", true],
|
||||
["security.webauth.webauthn_enable_usbtoken", false]]},
|
||||
runTests);
|
||||
function() {
|
||||
// Test rp.id being unset
|
||||
let makeCredentialOptions = {
|
||||
rp: {}, user: user, challenge: chall, parameters: [param]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsGood)
|
||||
.catch(arrivingHereIsBad);
|
||||
},
|
||||
function() {
|
||||
// Test this origin with optional fields
|
||||
let rp = {id: "user:pass@" + document.origin + ":8888"};
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, user: user, challenge: chall, parameters: [param]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError);
|
||||
},
|
||||
function() {
|
||||
// Test blank rp.id
|
||||
let rp = {id: ""};
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, user: user, challenge: chall, parameters: [param]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError);
|
||||
},
|
||||
function() {
|
||||
// Test subdomain of this origin
|
||||
let rp = {id: "subdomain." + document.origin};
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, user: user, challenge: chall, parameters: [param]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError);
|
||||
},
|
||||
function() {
|
||||
// Test another origin
|
||||
let rp = {id: "example.com"};
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, user: user, challenge: chall, parameters: [param]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError);
|
||||
},
|
||||
function () {
|
||||
// Test a different domain within the same TLD
|
||||
let rp = {id: "alt.test"};
|
||||
let makeCredentialOptions = {
|
||||
rp: rp, user: user, challenge: chall, parameters: [param]
|
||||
};
|
||||
return credm.create({publicKey: makeCredentialOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError);
|
||||
},
|
||||
function () {
|
||||
// Test basic good call
|
||||
let publicKeyCredentialRequestOptions = {
|
||||
challenge: chall,
|
||||
rpId: document.origin,
|
||||
allowList: [gTrackedCredential]
|
||||
};
|
||||
return credm.get({publicKey: publicKeyCredentialRequestOptions})
|
||||
.then(arrivingHereIsGood)
|
||||
.catch(arrivingHereIsBad);
|
||||
},
|
||||
function () {
|
||||
// Test rpId being unset
|
||||
let publicKeyCredentialRequestOptions = {
|
||||
challenge: chall,
|
||||
allowList: [gTrackedCredential]
|
||||
};
|
||||
return credm.get({publicKey: publicKeyCredentialRequestOptions})
|
||||
.then(arrivingHereIsGood)
|
||||
.catch(arrivingHereIsBad);
|
||||
},
|
||||
function () {
|
||||
// Test this origin with optional fields
|
||||
let publicKeyCredentialRequestOptions = {
|
||||
challenge: chall,
|
||||
rpId: "user:pass@" + document.origin + ":8888",
|
||||
allowList: [gTrackedCredential]
|
||||
};
|
||||
return credm.get({publicKey: publicKeyCredentialRequestOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError);
|
||||
},
|
||||
function () {
|
||||
// Test blank rpId
|
||||
let publicKeyCredentialRequestOptions = {
|
||||
challenge: chall,
|
||||
rpId: "",
|
||||
allowList: [gTrackedCredential]
|
||||
};
|
||||
return credm.get({publicKey: publicKeyCredentialRequestOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError);
|
||||
},
|
||||
function () {
|
||||
// Test subdomain of this origin
|
||||
let publicKeyCredentialRequestOptions = {
|
||||
challenge: chall,
|
||||
rpId: "subdomain." + document.origin,
|
||||
allowList: [gTrackedCredential]
|
||||
};
|
||||
return credm.get({publicKey: publicKeyCredentialRequestOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError);
|
||||
},
|
||||
function () {
|
||||
// Test another origin
|
||||
let publicKeyCredentialRequestOptions = {
|
||||
challenge: chall,
|
||||
rpId: "example.com",
|
||||
allowList: [gTrackedCredential]
|
||||
};
|
||||
return credm.get({publicKey: publicKeyCredentialRequestOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError);
|
||||
},
|
||||
function () {
|
||||
// Test a different domain within the same TLD
|
||||
let publicKeyCredentialRequestOptions = {
|
||||
challenge: chall,
|
||||
rpId: "alt.test",
|
||||
allowList: [gTrackedCredential]
|
||||
};
|
||||
return credm.get({publicKey: publicKeyCredentialRequestOptions})
|
||||
.then(arrivingHereIsBad)
|
||||
.catch(expectSecurityError)
|
||||
},
|
||||
function () {
|
||||
SimpleTest.finish();
|
||||
}
|
||||
];
|
||||
var i = 0;
|
||||
var runNextTest = () => {
|
||||
if (i == testFuncs.length) {
|
||||
SimpleTest.finish();
|
||||
return;
|
||||
}
|
||||
console.log(i);
|
||||
testFuncs[i]().then(() => { runNextTest(); });
|
||||
i = i + 1;
|
||||
};
|
||||
runNextTest();
|
||||
};
|
||||
SpecialPowers.pushPrefEnv({"set": [["security.webauth.webauthn", true],
|
||||
["security.webauth.webauthn_enable_softtoken", true],
|
||||
["security.webauth.webauthn_enable_usbtoken", false]]},
|
||||
runTests);
|
||||
|
||||
</script>
|
||||
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
/* -*- Mode: IDL; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* This Source Code Form is subject to the terms of the Mozilla Public
|
||||
* 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/.
|
||||
*
|
||||
* The origin of this IDL file is
|
||||
* https://www.w3.org/TR/credential-management-1/
|
||||
*/
|
||||
|
||||
[Exposed=Window, SecureContext, Pref="security.webauth.webauthn"]
|
||||
interface Credential {
|
||||
readonly attribute USVString id;
|
||||
readonly attribute DOMString type;
|
||||
};
|
||||
|
||||
[Exposed=Window, SecureContext, Pref="security.webauth.webauthn"]
|
||||
interface CredentialsContainer {
|
||||
Promise<Credential?> get(optional CredentialRequestOptions options);
|
||||
Promise<Credential?> create(optional CredentialCreationOptions options);
|
||||
};
|
||||
|
||||
dictionary CredentialRequestOptions {
|
||||
PublicKeyCredentialRequestOptions publicKey;
|
||||
};
|
||||
|
||||
dictionary CredentialCreationOptions {
|
||||
MakeCredentialOptions publicKey;
|
||||
};
|
|
@ -371,5 +371,5 @@ interface NavigatorConcurrentHardware {
|
|||
|
||||
partial interface Navigator {
|
||||
[Pref="security.webauth.webauthn", SameObject]
|
||||
readonly attribute WebAuthentication authentication;
|
||||
readonly attribute CredentialsContainer credentials;
|
||||
};
|
||||
|
|
|
@ -10,104 +10,102 @@
|
|||
/***** Interfaces to Data *****/
|
||||
|
||||
[SecureContext, Pref="security.webauth.webauthn"]
|
||||
interface ScopedCredentialInfo {
|
||||
readonly attribute ScopedCredential credential;
|
||||
readonly attribute WebAuthnAttestation attestation;
|
||||
interface PublicKeyCredential : Credential {
|
||||
readonly attribute ArrayBuffer rawId;
|
||||
readonly attribute AuthenticatorResponse response;
|
||||
// Extensions are not supported yet.
|
||||
// readonly attribute AuthenticationExtensions clientExtensionResults;
|
||||
};
|
||||
|
||||
dictionary Account {
|
||||
required DOMString rpDisplayName;
|
||||
required DOMString displayName;
|
||||
required DOMString id;
|
||||
DOMString name;
|
||||
DOMString imageURL;
|
||||
[SecureContext, Pref="security.webauth.webauthn"]
|
||||
interface AuthenticatorResponse {
|
||||
readonly attribute ArrayBuffer clientDataJSON;
|
||||
};
|
||||
|
||||
[SecureContext, Pref="security.webauth.webauthn"]
|
||||
interface AuthenticatorAttestationResponse : AuthenticatorResponse {
|
||||
readonly attribute ArrayBuffer attestationObject;
|
||||
};
|
||||
|
||||
dictionary PublicKeyCredentialParameters {
|
||||
required PublicKeyCredentialType type;
|
||||
required WebAuthnAlgorithmID algorithm; // NOTE: changed from AllgorithmIdentifier because typedef (object or DOMString) not serializable
|
||||
};
|
||||
|
||||
dictionary PublicKeyCredentialUserEntity : PublicKeyCredentialEntity {
|
||||
DOMString displayName;
|
||||
};
|
||||
|
||||
dictionary MakeCredentialOptions {
|
||||
required PublicKeyCredentialEntity rp;
|
||||
required PublicKeyCredentialUserEntity user;
|
||||
|
||||
required BufferSource challenge;
|
||||
required sequence<PublicKeyCredentialParameters> parameters;
|
||||
|
||||
unsigned long timeout;
|
||||
sequence<PublicKeyCredentialDescriptor> excludeList;
|
||||
AuthenticatorSelectionCriteria authenticatorSelection;
|
||||
// Extensions are not supported yet.
|
||||
// AuthenticationExtensions extensions;
|
||||
};
|
||||
|
||||
dictionary PublicKeyCredentialEntity {
|
||||
DOMString id;
|
||||
DOMString name;
|
||||
USVString icon;
|
||||
};
|
||||
|
||||
dictionary AuthenticatorSelectionCriteria {
|
||||
Attachment attachment;
|
||||
boolean requireResidentKey = false;
|
||||
};
|
||||
|
||||
enum Attachment {
|
||||
"platform",
|
||||
"cross-platform"
|
||||
};
|
||||
|
||||
dictionary PublicKeyCredentialRequestOptions {
|
||||
required BufferSource challenge;
|
||||
unsigned long timeout;
|
||||
USVString rpId;
|
||||
sequence<PublicKeyCredentialDescriptor> allowList = [];
|
||||
// Extensions are not supported yet.
|
||||
// AuthenticationExtensions extensions;
|
||||
};
|
||||
|
||||
dictionary CollectedClientData {
|
||||
required DOMString challenge;
|
||||
required DOMString origin;
|
||||
required DOMString hashAlg;
|
||||
DOMString tokenBinding;
|
||||
// Extensions are not supported yet.
|
||||
// AuthenticationExtensions clientExtensions;
|
||||
// AuthenticationExtensions authenticatorExtensions;
|
||||
};
|
||||
|
||||
enum PublicKeyCredentialType {
|
||||
"public-key"
|
||||
};
|
||||
|
||||
dictionary PublicKeyCredentialDescriptor {
|
||||
required PublicKeyCredentialType type;
|
||||
required BufferSource id;
|
||||
sequence<WebAuthnTransport> transports;
|
||||
};
|
||||
|
||||
typedef (boolean or DOMString) WebAuthnAlgorithmID; // Fix when upstream there's a definition of how to serialize AlgorithmIdentifier
|
||||
|
||||
dictionary ScopedCredentialParameters {
|
||||
required ScopedCredentialType type;
|
||||
required WebAuthnAlgorithmID algorithm; // NOTE: changed from AllgorithmIdentifier because typedef (object or DOMString) not serializable
|
||||
};
|
||||
|
||||
dictionary ScopedCredentialOptions {
|
||||
unsigned long timeoutSeconds;
|
||||
USVString rpId;
|
||||
sequence<ScopedCredentialDescriptor> excludeList;
|
||||
WebAuthnExtensions extensions;
|
||||
};
|
||||
|
||||
[SecureContext, Pref="security.webauth.webauthn"]
|
||||
interface WebAuthnAssertion {
|
||||
readonly attribute ScopedCredential credential;
|
||||
readonly attribute ArrayBuffer clientData;
|
||||
interface AuthenticatorAssertionResponse : AuthenticatorResponse {
|
||||
readonly attribute ArrayBuffer authenticatorData;
|
||||
readonly attribute ArrayBuffer signature;
|
||||
};
|
||||
|
||||
dictionary AssertionOptions {
|
||||
unsigned long timeoutSeconds;
|
||||
USVString rpId;
|
||||
sequence<ScopedCredentialDescriptor> allowList;
|
||||
WebAuthnExtensions extensions;
|
||||
};
|
||||
|
||||
dictionary WebAuthnExtensions {
|
||||
};
|
||||
|
||||
[SecureContext, Pref="security.webauth.webauthn"]
|
||||
interface WebAuthnAttestation {
|
||||
readonly attribute USVString format;
|
||||
readonly attribute ArrayBuffer clientData;
|
||||
readonly attribute ArrayBuffer authenticatorData;
|
||||
readonly attribute any attestation;
|
||||
};
|
||||
|
||||
// Renamed from "ClientData" to avoid a collision with U2F
|
||||
dictionary WebAuthnClientData {
|
||||
required DOMString challenge;
|
||||
required DOMString origin;
|
||||
required WebAuthnAlgorithmID hashAlg; // NOTE: changed from AllgorithmIdentifier because typedef (object or DOMString) not serializable
|
||||
DOMString tokenBinding;
|
||||
WebAuthnExtensions extensions;
|
||||
};
|
||||
|
||||
enum ScopedCredentialType {
|
||||
"ScopedCred"
|
||||
};
|
||||
|
||||
[SecureContext, Pref="security.webauth.webauthn"]
|
||||
interface ScopedCredential {
|
||||
readonly attribute ScopedCredentialType type;
|
||||
readonly attribute ArrayBuffer id;
|
||||
};
|
||||
|
||||
dictionary ScopedCredentialDescriptor {
|
||||
required ScopedCredentialType type;
|
||||
required BufferSource id;
|
||||
sequence <WebAuthnTransport> transports;
|
||||
};
|
||||
|
||||
// Renamed from "Transport" to avoid a collision with U2F
|
||||
enum WebAuthnTransport {
|
||||
"usb",
|
||||
"nfc",
|
||||
"ble"
|
||||
};
|
||||
|
||||
/***** The Main API *****/
|
||||
|
||||
[SecureContext, Pref="security.webauth.webauthn"]
|
||||
interface WebAuthentication {
|
||||
Promise<ScopedCredentialInfo> makeCredential (
|
||||
Account accountInformation,
|
||||
sequence<ScopedCredentialParameters> cryptoParameters,
|
||||
BufferSource attestationChallenge,
|
||||
optional ScopedCredentialOptions options
|
||||
);
|
||||
|
||||
Promise<WebAuthnAssertion> getAssertion (
|
||||
BufferSource assertionChallenge,
|
||||
optional AssertionOptions options
|
||||
);
|
||||
};
|
||||
|
|
|
@ -444,6 +444,7 @@ WEBIDL_FILES = [
|
|||
'ConvolverNode.webidl',
|
||||
'Coordinates.webidl',
|
||||
'CreateOfferRequest.webidl',
|
||||
'CredentialManagement.webidl',
|
||||
'Crypto.webidl',
|
||||
'CSPDictionaries.webidl',
|
||||
'CSPReport.webidl',
|
||||
|
|
|
@ -3,9 +3,9 @@
|
|||
fuzzy-if(Android,1,2) skip-if(!Android) pref(apz.allow_zooming,true) == async-scrollbar-1-v.html async-scrollbar-1-v-ref.html
|
||||
fuzzy-if(Android,4,5) skip-if(!Android) pref(apz.allow_zooming,true) == async-scrollbar-1-h.html async-scrollbar-1-h-ref.html
|
||||
fuzzy-if(Android,3,5) skip-if(!Android) pref(apz.allow_zooming,true) == async-scrollbar-1-vh.html async-scrollbar-1-vh-ref.html
|
||||
fuzzy-if(Android,1,2) skip-if(!Android) pref(apz.allow_zooming,true) fails-if(styloVsGecko) == async-scrollbar-1-v-rtl.html async-scrollbar-1-v-rtl-ref.html
|
||||
fuzzy-if(Android,1,2) skip-if(!Android) pref(apz.allow_zooming,true) == async-scrollbar-1-v-rtl.html async-scrollbar-1-v-rtl-ref.html
|
||||
fuzzy-if(Android,4,5) skip-if(!Android) pref(apz.allow_zooming,true) == async-scrollbar-1-h-rtl.html async-scrollbar-1-h-rtl-ref.html
|
||||
fuzzy-if(Android,3,7) skip-if(!Android) pref(apz.allow_zooming,true) fails-if(styloVsGecko) == async-scrollbar-1-vh-rtl.html async-scrollbar-1-vh-rtl-ref.html
|
||||
fuzzy-if(Android,3,7) skip-if(!Android) pref(apz.allow_zooming,true) == async-scrollbar-1-vh-rtl.html async-scrollbar-1-vh-rtl-ref.html
|
||||
|
||||
# Different async zoom levels. Since the scrollthumb gets async-scaled in the
|
||||
# compositor, the border-radius ends of the scrollthumb are going to be a little
|
||||
|
|
|
@ -0,0 +1,17 @@
|
|||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<style>
|
||||
span { color: green; }
|
||||
b { color: purple }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div>
|
||||
<span>This should be green</span>
|
||||
<p>
|
||||
<span>This should also be green</span><br/>
|
||||
<b>This should be purple</b>
|
||||
</p>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,26 @@
|
|||
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||
<head>
|
||||
<bindings xmlns="http://www.mozilla.org/xbl"
|
||||
xmlns:xhtml="http://www.w3.org/1999/xhtml">
|
||||
<binding id="a">
|
||||
<content>
|
||||
<span>This should be green</span>
|
||||
<xhtml:p>
|
||||
<children></children>
|
||||
</xhtml:p>
|
||||
</content>
|
||||
</binding>
|
||||
</bindings>
|
||||
<style>
|
||||
div > span { color: green; }
|
||||
p > span { color: red !important; }
|
||||
p { color: purple }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div style="-moz-binding: url(#a)">
|
||||
<span>This should also be green</span><br/>
|
||||
<b>This should be purple</b>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
|
@ -1913,24 +1913,24 @@ skip-if(!Android) == 1133905-3-rtl.html 1133905-ref-rtl.html
|
|||
skip-if(!Android) == 1133905-4-rtl.html 1133905-ref-rtl.html
|
||||
skip-if(!Android) == 1133905-5-rtl.html 1133905-ref-rtl.html
|
||||
skip-if(!Android) == 1133905-6-rtl.html 1133905-ref-rtl.html
|
||||
skip-if(!Android) fails-if(Android) fails-if(styloVsGecko) == 1133905-1-v-rtl.html 1133905-ref-v-rtl.html
|
||||
skip-if(!Android) fails-if(Android) fails-if(styloVsGecko) == 1133905-2-v-rtl.html 1133905-ref-v-rtl.html
|
||||
skip-if(!Android) fails-if(Android) fails-if(styloVsGecko) == 1133905-3-v-rtl.html 1133905-ref-v-rtl.html
|
||||
skip-if(!Android) fails-if(styloVsGecko) == 1133905-4-v-rtl.html 1133905-ref-v-rtl.html
|
||||
skip-if(!Android) fails-if(Android) fails-if(styloVsGecko) == 1133905-5-v-rtl.html 1133905-ref-v-rtl.html
|
||||
skip-if(!Android) fails-if(Android) fails-if(styloVsGecko) == 1133905-6-v-rtl.html 1133905-ref-v-rtl.html
|
||||
skip-if(!Android) fails-if(Android) == 1133905-1-v-rtl.html 1133905-ref-v-rtl.html
|
||||
skip-if(!Android) fails-if(Android) == 1133905-2-v-rtl.html 1133905-ref-v-rtl.html
|
||||
skip-if(!Android) fails-if(Android) == 1133905-3-v-rtl.html 1133905-ref-v-rtl.html
|
||||
skip-if(!Android) == 1133905-4-v-rtl.html 1133905-ref-v-rtl.html
|
||||
skip-if(!Android) fails-if(Android) == 1133905-5-v-rtl.html 1133905-ref-v-rtl.html
|
||||
skip-if(!Android) fails-if(Android) == 1133905-6-v-rtl.html 1133905-ref-v-rtl.html
|
||||
skip-if(!Android) == 1133905-1-h-rtl.html 1133905-ref-h-rtl.html
|
||||
skip-if(!Android) == 1133905-2-h-rtl.html 1133905-ref-h-rtl.html
|
||||
skip-if(!Android) == 1133905-3-h-rtl.html 1133905-ref-h-rtl.html
|
||||
skip-if(!Android) == 1133905-4-h-rtl.html 1133905-ref-h-rtl.html
|
||||
skip-if(!Android) == 1133905-5-h-rtl.html 1133905-ref-h-rtl.html
|
||||
skip-if(!Android) == 1133905-6-h-rtl.html 1133905-ref-h-rtl.html
|
||||
skip-if(!Android) fails-if(Android) fails-if(styloVsGecko) == 1133905-1-vh-rtl.html 1133905-ref-vh-rtl.html
|
||||
skip-if(!Android) fails-if(Android) fails-if(styloVsGecko) == 1133905-2-vh-rtl.html 1133905-ref-vh-rtl.html
|
||||
skip-if(!Android) fails-if(Android) fails-if(styloVsGecko) == 1133905-3-vh-rtl.html 1133905-ref-vh-rtl.html
|
||||
skip-if(!Android) fails-if(styloVsGecko) == 1133905-4-vh-rtl.html 1133905-ref-vh-rtl.html
|
||||
skip-if(!Android) fails-if(Android) fails-if(styloVsGecko) == 1133905-5-vh-rtl.html 1133905-ref-vh-rtl.html
|
||||
skip-if(!Android) fails-if(Android) fails-if(styloVsGecko) == 1133905-6-vh-rtl.html 1133905-ref-vh-rtl.html
|
||||
skip-if(!Android) fails-if(Android) == 1133905-1-vh-rtl.html 1133905-ref-vh-rtl.html
|
||||
skip-if(!Android) fails-if(Android) == 1133905-2-vh-rtl.html 1133905-ref-vh-rtl.html
|
||||
skip-if(!Android) fails-if(Android) == 1133905-3-vh-rtl.html 1133905-ref-vh-rtl.html
|
||||
skip-if(!Android) == 1133905-4-vh-rtl.html 1133905-ref-vh-rtl.html
|
||||
skip-if(!Android) fails-if(Android) == 1133905-5-vh-rtl.html 1133905-ref-vh-rtl.html
|
||||
skip-if(!Android) fails-if(Android) == 1133905-6-vh-rtl.html 1133905-ref-vh-rtl.html
|
||||
== 1150021-1.xul 1150021-1-ref.xul
|
||||
== 1151145-1.html 1151145-1-ref.html
|
||||
== 1151306-1.html 1151306-1-ref.html
|
||||
|
@ -2010,3 +2010,4 @@ fails-if(!stylo||styloVsGecko) == 1365162-1.html 1365162-1-ref.html
|
|||
== 1367592-1.html 1367592-1-ref.html
|
||||
== 1369584-1a.html 1369584-1-ref.html
|
||||
== 1369584-1b.html 1369584-1-ref.html
|
||||
== 1369954-1.xhtml 1369954-1-ref.xhtml
|
||||
|
|
|
@ -11,3 +11,14 @@ skip-if(!Android) fails-if(styloVsGecko) == time-simple-unthemed.html time-simpl
|
|||
# type change
|
||||
skip-if(Android) fails-if(styloVsGecko) == to-time-from-other-type-unthemed.html time-simple-unthemed.html
|
||||
skip-if(Android) == from-time-to-other-type-unthemed.html from-time-to-other-type-unthemed-ref.html
|
||||
|
||||
# content should not overflow on small width/height
|
||||
skip-if(Android) == time-small-width.html time-small-width-ref.html
|
||||
skip-if(Android) == time-small-height.html time-small-height-ref.html
|
||||
skip-if(Android) == time-small-width-height.html time-small-width-height-ref.html
|
||||
|
||||
# content (text) should be left aligned
|
||||
skip-if(Android) == time-content-left-aligned.html time-content-left-aligned-ref.html
|
||||
|
||||
# reset button should be right aligned
|
||||
skip-if(Android) fails-if(styloVsGecko) == time-reset-button-right-aligned.html time-reset-button-right-aligned-ref.html
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<body>
|
||||
<input type="time" style="width: 200px;">
|
||||
<!-- div to cover the right area -->
|
||||
<div style="display:block; position:absolute; background-color:black;
|
||||
top:0px; left:40px; width:200px; height:100px;"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<body>
|
||||
<input type="time" style="width: 50px;">
|
||||
<!-- div to cover the right area -->
|
||||
<div style="display:block; position:absolute; background-color:black;
|
||||
top:0px; left:40px; width:200px; height:100px;"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,9 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<body>
|
||||
<input type="time" value="10:00" style="float: right; color: white;">
|
||||
<!-- div to cover the left area -->
|
||||
<div style="display:block; position:absolute; background-color:black;
|
||||
top:0px; right:30px; width:500px; height:100px;"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,10 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<body>
|
||||
<input type="time" value="10:00" style="width: 150px; float: right;
|
||||
color: white;">
|
||||
<!-- div to cover the left area -->
|
||||
<div style="display:block; position:absolute; background-color:black;
|
||||
top:0px; right:30px; width:500px; height:100px;"></div>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,18 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
input {
|
||||
width: 200px;
|
||||
height: 5px;
|
||||
outline: 1px dotted black;
|
||||
/* Disable baseline alignment, so that our y-position isn't influenced by the
|
||||
* choice of font inside of input: */
|
||||
vertical-align: top;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<input>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,19 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
input {
|
||||
width: 200px;
|
||||
height: 5px;
|
||||
outline: 1px dotted black;
|
||||
color: white;
|
||||
/* Disable baseline alignment, so that our y-position isn't influenced by the
|
||||
* choice of font inside of input: */
|
||||
vertical-align: top;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<input type="time">
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,18 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
input {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
outline: 1px dotted black;
|
||||
/* Disable baseline alignment, so that our y-position isn't influenced by the
|
||||
* choice of font inside of input: */
|
||||
vertical-align: top;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<input>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,19 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
input {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
outline: 1px dotted black;
|
||||
color: white;
|
||||
/* Disable baseline alignment, so that our y-position isn't influenced by the
|
||||
* choice of font inside of input: */
|
||||
vertical-align: top;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<input type="time">
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,19 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
input {
|
||||
width: 10px;
|
||||
height: 1.5em;
|
||||
outline: 1px dotted black;
|
||||
background: white;
|
||||
/* Disable baseline alignment, so that our y-position isn't influenced by the
|
||||
* choice of font inside of input: */
|
||||
vertical-align: top;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<input>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,20 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<style>
|
||||
input {
|
||||
width: 10px;
|
||||
height: 1.5em;
|
||||
outline: 1px dotted black;
|
||||
color: white;
|
||||
background: white;
|
||||
/* Disable baseline alignment, so that our y-position isn't influenced by the
|
||||
* choice of font inside of input: */
|
||||
vertical-align: top;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<input type="time">
|
||||
</body>
|
||||
</html>
|
|
@ -1011,9 +1011,9 @@ fails-if(Android) == css-writing-modes-3/sizing-orthog-vlr-in-htb-021.xht css-wr
|
|||
== css-writing-modes-3/sizing-orthog-vlr-in-htb-022.xht css-writing-modes-3/sizing-orthog-vlr-in-htb-022-ref.xht
|
||||
== css-writing-modes-3/sizing-orthog-vlr-in-htb-023.xht css-writing-modes-3/sizing-orthog-vlr-in-htb-023-ref.xht
|
||||
== css-writing-modes-3/sizing-orthog-vlr-in-htb-024.xht css-writing-modes-3/sizing-orthog-vlr-in-htb-018-ref.xht
|
||||
== css-writing-modes-3/sizing-orthog-vrl-in-htb-001.xht css-writing-modes-3/sizing-orthog-vrl-in-htb-001-ref.xht
|
||||
fails-if(stylo) == css-writing-modes-3/sizing-orthog-vrl-in-htb-001.xht css-writing-modes-3/sizing-orthog-vrl-in-htb-001-ref.xht
|
||||
fails-if(Android) == css-writing-modes-3/sizing-orthog-vrl-in-htb-003.xht css-writing-modes-3/sizing-orthog-vrl-in-htb-003-ref.xht
|
||||
== css-writing-modes-3/sizing-orthog-vrl-in-htb-004.xht css-writing-modes-3/sizing-orthog-vrl-in-htb-004-ref.xht
|
||||
fails-if(stylo) == css-writing-modes-3/sizing-orthog-vrl-in-htb-004.xht css-writing-modes-3/sizing-orthog-vrl-in-htb-004-ref.xht
|
||||
== css-writing-modes-3/sizing-orthog-vrl-in-htb-006.xht css-writing-modes-3/sizing-orthog-vrl-in-htb-006-ref.xht
|
||||
== css-writing-modes-3/sizing-orthog-vrl-in-htb-007.xht css-writing-modes-3/sizing-orthog-vrl-in-htb-007-ref.xht
|
||||
fails-if(OSX||winWidget||Android) == css-writing-modes-3/sizing-orthog-vrl-in-htb-008.xht css-writing-modes-3/sizing-orthog-vrl-in-htb-008-ref.xht
|
||||
|
@ -1021,7 +1021,7 @@ fails-if(Android) == css-writing-modes-3/sizing-orthog-vrl-in-htb-009.xht css-wr
|
|||
== css-writing-modes-3/sizing-orthog-vrl-in-htb-010.xht css-writing-modes-3/sizing-orthog-vrl-in-htb-010-ref.xht
|
||||
== css-writing-modes-3/sizing-orthog-vrl-in-htb-011.xht css-writing-modes-3/sizing-orthog-vrl-in-htb-011-ref.xht
|
||||
== css-writing-modes-3/sizing-orthog-vrl-in-htb-012.xht css-writing-modes-3/sizing-orthog-vrl-in-htb-012-ref.xht
|
||||
== css-writing-modes-3/sizing-orthog-vrl-in-htb-013.xht css-writing-modes-3/sizing-orthog-vrl-in-htb-013-ref.xht
|
||||
fails-if(stylo) == css-writing-modes-3/sizing-orthog-vrl-in-htb-013.xht css-writing-modes-3/sizing-orthog-vrl-in-htb-013-ref.xht
|
||||
fails-if(Android) == css-writing-modes-3/sizing-orthog-vrl-in-htb-015.xht css-writing-modes-3/sizing-orthog-vrl-in-htb-015-ref.xht
|
||||
== css-writing-modes-3/sizing-orthog-vrl-in-htb-016.xht css-writing-modes-3/sizing-orthog-vrl-in-htb-016-ref.xht
|
||||
== css-writing-modes-3/sizing-orthog-vrl-in-htb-018.xht css-writing-modes-3/sizing-orthog-vrl-in-htb-018-ref.xht
|
||||
|
|
|
@ -158,7 +158,7 @@ Gecko_IsSignificantChild(RawGeckoNodeBorrowed aNode, bool aTextIsSignificant,
|
|||
}
|
||||
|
||||
RawGeckoNodeBorrowedOrNull
|
||||
Gecko_GetParentNode(RawGeckoNodeBorrowed aNode)
|
||||
Gecko_GetFlattenedTreeParentNode(RawGeckoNodeBorrowed aNode)
|
||||
{
|
||||
MOZ_ASSERT(!FlattenedTreeParentIsParent<nsIContent::eForStyle>(aNode),
|
||||
"Should have taken the inline path");
|
||||
|
@ -191,19 +191,14 @@ Gecko_GetNextSibling(RawGeckoNodeBorrowed aNode)
|
|||
return aNode->GetNextSibling();
|
||||
}
|
||||
|
||||
RawGeckoElementBorrowedOrNull
|
||||
Gecko_GetParentElement(RawGeckoElementBorrowed aElement)
|
||||
{
|
||||
return aElement->GetFlattenedTreeParentElementForStyle();
|
||||
}
|
||||
|
||||
RawGeckoElementBorrowedOrNull
|
||||
Gecko_GetFirstChildElement(RawGeckoElementBorrowed aElement)
|
||||
{
|
||||
return aElement->GetFirstElementChild();
|
||||
}
|
||||
|
||||
RawGeckoElementBorrowedOrNull Gecko_GetLastChildElement(RawGeckoElementBorrowed aElement)
|
||||
RawGeckoElementBorrowedOrNull
|
||||
Gecko_GetLastChildElement(RawGeckoElementBorrowed aElement)
|
||||
{
|
||||
return aElement->GetLastElementChild();
|
||||
}
|
||||
|
@ -245,6 +240,18 @@ Gecko_DropStyleChildrenIterator(StyleChildrenIteratorOwned aIterator)
|
|||
delete aIterator;
|
||||
}
|
||||
|
||||
bool
|
||||
Gecko_ElementHasBindingWithAnonymousContent(RawGeckoElementBorrowed aElement)
|
||||
{
|
||||
if (!aElement->HasFlag(NODE_MAY_BE_IN_BINDING_MNGR)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
nsBindingManager* manager = aElement->OwnerDoc()->BindingManager();
|
||||
nsXBLBinding* binding = manager->GetBindingWithContent(aElement);
|
||||
return binding && binding->GetAnonymousContent();
|
||||
}
|
||||
|
||||
RawGeckoNodeBorrowed
|
||||
Gecko_GetNextStyleChild(StyleChildrenIteratorBorrowedMut aIterator)
|
||||
{
|
||||
|
|
|
@ -127,7 +127,7 @@ bool Gecko_FlattenedTreeParentIsParent(RawGeckoNodeBorrowed node);
|
|||
bool Gecko_IsSignificantChild(RawGeckoNodeBorrowed node,
|
||||
bool text_is_significant,
|
||||
bool whitespace_is_significant);
|
||||
RawGeckoNodeBorrowedOrNull Gecko_GetParentNode(RawGeckoNodeBorrowed node);
|
||||
RawGeckoNodeBorrowedOrNull Gecko_GetFlattenedTreeParentNode(RawGeckoNodeBorrowed node);
|
||||
RawGeckoNodeBorrowedOrNull Gecko_GetFirstChild(RawGeckoNodeBorrowed node);
|
||||
RawGeckoNodeBorrowedOrNull Gecko_GetLastChild(RawGeckoNodeBorrowed node);
|
||||
RawGeckoNodeBorrowedOrNull Gecko_GetPrevSibling(RawGeckoNodeBorrowed node);
|
||||
|
@ -155,6 +155,7 @@ void Gecko_LoadStyleSheet(mozilla::css::Loader* loader,
|
|||
StyleChildrenIteratorOwnedOrNull Gecko_MaybeCreateStyleChildrenIterator(RawGeckoNodeBorrowed node);
|
||||
void Gecko_DropStyleChildrenIterator(StyleChildrenIteratorOwned it);
|
||||
RawGeckoNodeBorrowedOrNull Gecko_GetNextStyleChild(StyleChildrenIteratorBorrowedMut it);
|
||||
bool Gecko_ElementHasBindingWithAnonymousContent(RawGeckoElementBorrowed element);
|
||||
|
||||
// Selector Matching.
|
||||
uint64_t Gecko_ElementState(RawGeckoElementBorrowed element);
|
||||
|
|
|
@ -1187,6 +1187,11 @@ input[type="number"] > div > div > div:hover {
|
|||
background-color: lightblue;
|
||||
}
|
||||
|
||||
input[type="date"],
|
||||
input[type="time"] {
|
||||
overflow: hidden !important;
|
||||
}
|
||||
|
||||
:-moz-autofill, :-moz-autofill-preview {
|
||||
filter: grayscale(21%) brightness(88%) contrast(161%) invert(10%) sepia(40%) saturate(206%);
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@ load 409807-1.xul
|
|||
load 414170-1.xul
|
||||
load 430394-1.xul
|
||||
load 454186-1.xul
|
||||
load 479931-1.xhtml
|
||||
asserts-if(stylo,3) load 479931-1.xhtml # bug 1324698
|
||||
load 509602-1.xul
|
||||
load 585815.html
|
||||
load 601427.html
|
||||
|
|
|
@ -53,7 +53,7 @@ def test(mod, path, entity = None):
|
|||
# we only have exceptions for mobile*
|
||||
return "error"
|
||||
if mod == "mobile/android":
|
||||
if not entity:
|
||||
if entity is None:
|
||||
if (re.match(r"mobile-l10n.js", path) or
|
||||
re.match(r"defines.inc", path)):
|
||||
return "ignore"
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
% resource search-plugins chrome://browser/locale/searchplugins/
|
||||
|
||||
# overrides for toolkit l10n, also for en-US
|
||||
# keep this file list in sync with filter.py
|
||||
# keep this file list in sync with l10n.toml and filter.py
|
||||
relativesrcdir toolkit/locales:
|
||||
locale/@AB_CD@/browser/overrides/about.dtd (%chrome/global/about.dtd)
|
||||
locale/@AB_CD@/browser/overrides/aboutAbout.dtd (%chrome/global/aboutAbout.dtd)
|
||||
|
|
|
@ -0,0 +1,246 @@
|
|||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# 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/.
|
||||
|
||||
basepath = "../../.."
|
||||
|
||||
locales = [
|
||||
"an",
|
||||
"ar",
|
||||
"as",
|
||||
"ast",
|
||||
"az",
|
||||
"be",
|
||||
"bg",
|
||||
"bn-BD",
|
||||
"bn-IN",
|
||||
"br",
|
||||
"ca",
|
||||
"cak",
|
||||
"cs",
|
||||
"cy",
|
||||
"da",
|
||||
"de",
|
||||
"dsb",
|
||||
"el",
|
||||
"en-GB",
|
||||
"en-ZA",
|
||||
"eo",
|
||||
"es-AR",
|
||||
"es-CL",
|
||||
"es-ES",
|
||||
"es-MX",
|
||||
"et",
|
||||
"eu",
|
||||
"fa",
|
||||
"ff",
|
||||
"fi",
|
||||
"fr",
|
||||
"fy-NL",
|
||||
"ga-IE",
|
||||
"gd",
|
||||
"gl",
|
||||
"gn",
|
||||
"gu-IN",
|
||||
"he",
|
||||
"hi-IN",
|
||||
"hr",
|
||||
"hsb",
|
||||
"hu",
|
||||
"hy-AM",
|
||||
"id",
|
||||
"is",
|
||||
"it",
|
||||
"ja",
|
||||
"ka",
|
||||
"kab",
|
||||
"kk",
|
||||
"kn",
|
||||
"ko",
|
||||
"lo",
|
||||
"lt",
|
||||
"lv",
|
||||
"mai",
|
||||
"ml",
|
||||
"mr",
|
||||
"ms",
|
||||
"my",
|
||||
"nb-NO",
|
||||
"ne-NP",
|
||||
"nl",
|
||||
"nn-NO",
|
||||
"or",
|
||||
"pa-IN",
|
||||
"pl",
|
||||
"pt-BR",
|
||||
"pt-PT",
|
||||
"rm",
|
||||
"ro",
|
||||
"ru",
|
||||
"sk",
|
||||
"sl",
|
||||
"son",
|
||||
"sq",
|
||||
"sr",
|
||||
"sv-SE",
|
||||
"ta",
|
||||
"te",
|
||||
"th",
|
||||
"tr",
|
||||
"trs",
|
||||
"uk",
|
||||
"ur",
|
||||
"uz",
|
||||
"wo",
|
||||
"xh",
|
||||
"zam",
|
||||
"zh-CN",
|
||||
"zh-TW",
|
||||
]
|
||||
|
||||
[build]
|
||||
exclude-multi-locale = [
|
||||
"be",
|
||||
"bn-BD",
|
||||
"ne-NP",
|
||||
"trs",
|
||||
"wo",
|
||||
"zam",
|
||||
]
|
||||
|
||||
[env]
|
||||
l = "{l10n_base}/{locale}/"
|
||||
|
||||
|
||||
[[paths]]
|
||||
reference = "mobile/locales/en-US/**"
|
||||
l10n = "{l}mobile/**"
|
||||
|
||||
[[paths]]
|
||||
reference = "mobile/android/locales/en-US/**"
|
||||
l10n = "{l}mobile/android/**"
|
||||
|
||||
[[paths]]
|
||||
reference = "mobile/android/base/locales/en-US/**"
|
||||
l10n = "{l}mobile/android/base/**"
|
||||
test = [
|
||||
"android-dtd",
|
||||
]
|
||||
|
||||
# hand-picked paths from toolkit, keep in sync with jar.mn
|
||||
[[paths]]
|
||||
reference = "dom/locales/en-US/chrome/global.dtd"
|
||||
l10n = "{l}dom/chrome/global.dtd"
|
||||
|
||||
[[paths]]
|
||||
reference = "dom/locales/en-US/chrome/accessibility/AccessFu.properties"
|
||||
l10n = "{l}dom/chrome/accessibility/AccessFu.properties"
|
||||
|
||||
[[paths]]
|
||||
reference = "dom/locales/en-US/chrome/dom/dom.properties"
|
||||
l10n = "{l}dom/chrome/dom/dom.properties"
|
||||
|
||||
[[paths]]
|
||||
reference = "dom/locales/en-US/chrome/plugins.properties"
|
||||
l10n = "{l}dom/chrome/plugins.properties"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/chrome/global/about.dtd"
|
||||
l10n = "{l}toolkit/chrome/global/about.dtd"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/chrome/global/aboutAbout.dtd"
|
||||
l10n = "{l}toolkit/chrome/global/aboutAbout.dtd"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/chrome/global/aboutReader.properties"
|
||||
l10n = "{l}toolkit/chrome/global/aboutReader.properties"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/chrome/global/aboutRights.dtd"
|
||||
l10n = "{l}toolkit/chrome/global/aboutRights.dtd"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/chrome/global/charsetMenu.properties"
|
||||
l10n = "{l}toolkit/chrome/global/charsetMenu.properties"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/chrome/global/commonDialogs.properties"
|
||||
l10n = "{l}toolkit/chrome/global/commonDialogs.properties"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/chrome/global/intl.properties"
|
||||
l10n = "{l}toolkit/chrome/global/intl.properties"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/chrome/global/intl.css"
|
||||
l10n = "{l}toolkit/chrome/global/intl.css"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/chrome/passwordmgr/passwordmgr.properties"
|
||||
l10n = "{l}toolkit/chrome/passwordmgr/passwordmgr.properties"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/chrome/search/search.properties"
|
||||
l10n = "{l}toolkit/chrome/search/search.properties"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/chrome/pluginproblem/pluginproblem.dtd"
|
||||
l10n = "{l}toolkit/chrome/pluginproblem/pluginproblem.dtd"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/chrome/global/aboutSupport.dtd"
|
||||
l10n = "{l}toolkit/chrome/global/aboutSupport.dtd"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/chrome/global/aboutSupport.properties"
|
||||
l10n = "{l}toolkit/chrome/global/aboutSupport.properties"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/crashreporter/crashes.dtd"
|
||||
l10n = "{l}toolkit/crashreporter/crashes.dtd"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/crashreporter/crashes.properties"
|
||||
l10n = "{l}toolkit/crashreporter/crashes.properties"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/chrome/global/mozilla.dtd"
|
||||
l10n = "{l}toolkit/chrome/global/mozilla.dtd"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/chrome/global/aboutTelemetry.dtd"
|
||||
l10n = "{l}toolkit/chrome/global/aboutTelemetry.dtd"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/chrome/global/aboutTelemetry.properties"
|
||||
l10n = "{l}toolkit/chrome/global/aboutTelemetry.properties"
|
||||
|
||||
[[paths]]
|
||||
reference = "toolkit/locales/en-US/chrome/global/aboutWebrtc.properties"
|
||||
l10n = "{l}toolkit/chrome/global/aboutWebrtc.properties"
|
||||
|
||||
|
||||
[[filters]]
|
||||
path = [
|
||||
"{l}mobile/android/mobile-l10n.js",
|
||||
"{l}mobile/android/defines.inc",
|
||||
]
|
||||
action = "ignore"
|
||||
|
||||
[[filters]]
|
||||
path = "{l}mobile/android/defines.inc"
|
||||
key = "MOZ_LANGPACK_CONTRIBUTORS"
|
||||
action = "ignore"
|
||||
|
||||
[[filters]]
|
||||
path = "{l}mobile/chrome/region.properties"
|
||||
key = [
|
||||
"re:^browser\\.search\\.order\\.[1-9]$",
|
||||
"re:^browser\\.search\\.[a-zA-Z]+\\.US",
|
||||
"re:^browser\\.contentHandlers\\.types\\.[0-5]\\..*$",
|
||||
"re:^gecko\\.handlerService\\.schemes\\..+$",
|
||||
"re:^gecko\\.handlerService\\.defaultHandlersVersion$",
|
||||
"re:^browser\\.suggestedsites\\..+$",
|
||||
]
|
||||
action = "ignore"
|
|
@ -6,6 +6,6 @@ package org.mozilla.gecko.fxa.activities;
|
|||
|
||||
public class FxAccountGetStartedActivityWeb extends FxAccountWebFlowActivity {
|
||||
public FxAccountGetStartedActivityWeb() {
|
||||
super(CANNOT_RESUME_WHEN_ACCOUNTS_EXIST, "signup");
|
||||
super(CANNOT_RESUME_WHEN_ACCOUNTS_EXIST, "signin");
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4867,7 +4867,7 @@ pref("layers.popups.compositing.enabled", false);
|
|||
|
||||
// Report Site Issue button
|
||||
pref("extensions.webcompat-reporter.newIssueEndpoint", "https://webcompat.com/issues/new");
|
||||
#ifndef RELEASE_OR_BETA
|
||||
#if defined(MOZ_DEV_EDITION) || defined(NIGHTLY_BUILD)
|
||||
pref("extensions.webcompat-reporter.enabled", true);
|
||||
#else
|
||||
pref("extensions.webcompat-reporter.enabled", false);
|
||||
|
|
|
@ -40,6 +40,10 @@ with Files('GNUmakefile'):
|
|||
with Files('*gradle*'):
|
||||
BUG_COMPONENT = ('Firefox for Android', 'Build Config & IDE Support')
|
||||
|
||||
with Files('**/l10n.toml'):
|
||||
BUG_COMPONENT = ('Core', 'Localization')
|
||||
FINAL = True
|
||||
|
||||
with Files('README.txt'):
|
||||
BUG_COMPONENT = ('Core', 'General')
|
||||
|
||||
|
@ -69,6 +73,7 @@ if not CONFIG['JS_STANDALONE']:
|
|||
# These python manifests are included here so they get picked up without an objdir
|
||||
PYTHON_UNITTEST_MANIFESTS += [
|
||||
'testing/marionette/harness/marionette_harness/tests/harness_unit/python.ini',
|
||||
'testing/mochitest/tests/python/python.ini',
|
||||
]
|
||||
|
||||
CONFIGURE_SUBST_FILES += [
|
||||
|
|
|
@ -542,7 +542,7 @@ void CacheIOThread::LoopOneLevel(uint32_t aLevel)
|
|||
mCurrentlyExecutingLevel = aLevel;
|
||||
|
||||
bool returnEvents = false;
|
||||
bool reportTelementry = true;
|
||||
bool reportTelemetry = true;
|
||||
|
||||
EventQueue::size_type index;
|
||||
{
|
||||
|
@ -556,8 +556,8 @@ void CacheIOThread::LoopOneLevel(uint32_t aLevel)
|
|||
break;
|
||||
}
|
||||
|
||||
if (reportTelementry) {
|
||||
reportTelementry = false;
|
||||
if (reportTelemetry) {
|
||||
reportTelemetry = false;
|
||||
CacheIOTelemetry::Report(aLevel, length);
|
||||
}
|
||||
|
||||
|
|
|
@ -2086,7 +2086,7 @@ uint32_t CacheStorageService::CacheQueueSize(bool highPriority)
|
|||
return thread->QueueSize(highPriority);
|
||||
}
|
||||
|
||||
// Telementry collection
|
||||
// Telemetry collection
|
||||
|
||||
namespace {
|
||||
|
||||
|
|
|
@ -5397,6 +5397,7 @@ if test "$ACCESSIBILITY" -a "$MOZ_ENABLE_GTK" ; then
|
|||
AC_DEFINE_UNQUOTED(ATK_REV_VERSION, $ATK_REV_VERSION)
|
||||
fi
|
||||
|
||||
AC_SUBST(MOZ_DEV_EDITION)
|
||||
if test -n "$MOZ_DEV_EDITION"; then
|
||||
AC_DEFINE(MOZ_DEV_EDITION)
|
||||
fi
|
||||
|
|
|
@ -6,8 +6,8 @@ from __future__ import absolute_import, print_function, unicode_literals
|
|||
|
||||
import argparse
|
||||
import logging
|
||||
import mozpack.path as mozpath
|
||||
import os
|
||||
import tempfile
|
||||
|
||||
from concurrent.futures import (
|
||||
ThreadPoolExecutor,
|
||||
|
@ -19,6 +19,7 @@ import mozinfo
|
|||
from manifestparser import TestManifest
|
||||
from manifestparser import filters as mpf
|
||||
|
||||
import mozpack.path as mozpath
|
||||
from mozbuild.base import (
|
||||
MachCommandBase,
|
||||
)
|
||||
|
@ -69,13 +70,21 @@ class MachCommands(MachCommandBase):
|
|||
metavar='TEST',
|
||||
help=('Tests to run. Each test can be a single file or a directory. '
|
||||
'Default test resolution relies on PYTHON_UNITTEST_MANIFESTS.'))
|
||||
def python_test(self,
|
||||
tests=[],
|
||||
test_objects=None,
|
||||
subsuite=None,
|
||||
verbose=False,
|
||||
stop=False,
|
||||
jobs=1):
|
||||
def python_test(self, *args, **kwargs):
|
||||
try:
|
||||
tempdir = os.environ[b'PYTHON_TEST_TMP'] = str(tempfile.mkdtemp(suffix='-python-test'))
|
||||
return self.run_python_tests(*args, **kwargs)
|
||||
finally:
|
||||
import mozfile
|
||||
mozfile.remove(tempdir)
|
||||
|
||||
def run_python_tests(self,
|
||||
tests=[],
|
||||
test_objects=None,
|
||||
subsuite=None,
|
||||
verbose=False,
|
||||
stop=False,
|
||||
jobs=1):
|
||||
self._activate_virtualenv()
|
||||
|
||||
def find_tests_by_path():
|
||||
|
@ -129,26 +138,38 @@ class MachCommands(MachCommandBase):
|
|||
filters.append(mpf.subsuite(subsuite))
|
||||
|
||||
tests = mp.active_tests(filters=filters, disabled=False, **mozinfo.info)
|
||||
parallel = []
|
||||
sequential = []
|
||||
for test in tests:
|
||||
if test.get('sequential'):
|
||||
sequential.append(test)
|
||||
else:
|
||||
parallel.append(test)
|
||||
|
||||
self.jobs = jobs
|
||||
self.terminate = False
|
||||
self.verbose = verbose
|
||||
|
||||
return_code = 0
|
||||
|
||||
def on_test_finished(result):
|
||||
output, ret, test_path = result
|
||||
|
||||
for line in output:
|
||||
self.log(logging.INFO, 'python-test', {'line': line.rstrip()}, '{line}')
|
||||
|
||||
if ret and not return_code:
|
||||
self.log(logging.ERROR, 'python-test', {'test_path': test_path, 'ret': ret},
|
||||
'Setting retcode to {ret} from {test_path}')
|
||||
return return_code or ret
|
||||
|
||||
with ThreadPoolExecutor(max_workers=self.jobs) as executor:
|
||||
futures = [executor.submit(self._run_python_test, test['path'])
|
||||
for test in tests]
|
||||
for test in parallel]
|
||||
|
||||
try:
|
||||
for future in as_completed(futures):
|
||||
output, ret, test_path = future.result()
|
||||
|
||||
for line in output:
|
||||
self.log(logging.INFO, 'python-test', {'line': line.rstrip()}, '{line}')
|
||||
|
||||
if ret and not return_code:
|
||||
self.log(logging.ERROR, 'python-test', {'test_path': test_path, 'ret': ret}, 'Setting retcode to {ret} from {test_path}')
|
||||
return_code = return_code or ret
|
||||
return_code = on_test_finished(future.result())
|
||||
except KeyboardInterrupt:
|
||||
# Hack to force stop currently running threads.
|
||||
# https://gist.github.com/clchiou/f2608cbe54403edb0b13
|
||||
|
@ -156,7 +177,11 @@ class MachCommands(MachCommandBase):
|
|||
thread._threads_queues.clear()
|
||||
raise
|
||||
|
||||
self.log(logging.INFO, 'python-test', {'return_code': return_code}, 'Return code from mach python-test: {return_code}')
|
||||
for test in sequential:
|
||||
return_code = on_test_finished(self._run_python_test(test['path']))
|
||||
|
||||
self.log(logging.INFO, 'python-test', {'return_code': return_code},
|
||||
'Return code from mach python-test: {return_code}')
|
||||
return return_code
|
||||
|
||||
def _run_python_test(self, test_path):
|
||||
|
|
|
@ -346,7 +346,6 @@ class MacArtifactJob(ArtifactJob):
|
|||
# These get copied into dist/bin without the path, so "root/a/b/c" -> "dist/bin/c".
|
||||
paths_no_keep_path = ('Contents/MacOS', [
|
||||
'crashreporter.app/Contents/MacOS/crashreporter',
|
||||
'crashreporter.app/Contents/MacOS/minidump-analyzer',
|
||||
'firefox',
|
||||
'firefox-bin',
|
||||
'libfreebl3.dylib',
|
||||
|
@ -370,15 +369,20 @@ class MacArtifactJob(ArtifactJob):
|
|||
])
|
||||
|
||||
# These get copied into dist/bin with the path, so "root/a/b/c" -> "dist/bin/a/b/c".
|
||||
paths_keep_path = ('Contents/Resources', [
|
||||
'browser/components/libbrowsercomps.dylib',
|
||||
'dependentlibs.list',
|
||||
# 'firefox',
|
||||
'gmp-clearkey/0.1/libclearkey.dylib',
|
||||
# 'gmp-fake/1.0/libfake.dylib',
|
||||
# 'gmp-fakeopenh264/1.0/libfakeopenh264.dylib',
|
||||
'**/interfaces.xpt',
|
||||
])
|
||||
paths_keep_path = [
|
||||
('Contents/MacOS', [
|
||||
'crashreporter.app/Contents/MacOS/minidump-analyzer',
|
||||
]),
|
||||
('Contents/Resources', [
|
||||
'browser/components/libbrowsercomps.dylib',
|
||||
'dependentlibs.list',
|
||||
# 'firefox',
|
||||
'gmp-clearkey/0.1/libclearkey.dylib',
|
||||
# 'gmp-fake/1.0/libfake.dylib',
|
||||
# 'gmp-fakeopenh264/1.0/libfakeopenh264.dylib',
|
||||
'**/interfaces.xpt',
|
||||
]),
|
||||
]
|
||||
|
||||
with JarWriter(file=processed_filename, optimize=False, compress_level=5) as writer:
|
||||
root, paths = paths_no_keep_path
|
||||
|
@ -391,15 +395,15 @@ class MacArtifactJob(ArtifactJob):
|
|||
destpath = mozpath.join('bin', os.path.basename(p))
|
||||
writer.add(destpath.encode('utf-8'), f, mode=f.mode)
|
||||
|
||||
root, paths = paths_keep_path
|
||||
finder = UnpackFinder(mozpath.join(source, root))
|
||||
for path in paths:
|
||||
for p, f in finder.find(path):
|
||||
self.log(logging.INFO, 'artifact',
|
||||
{'path': p},
|
||||
'Adding {path} to processed archive')
|
||||
destpath = mozpath.join('bin', p)
|
||||
writer.add(destpath.encode('utf-8'), f.open(), mode=f.mode)
|
||||
for root, paths in paths_keep_path:
|
||||
finder = UnpackFinder(mozpath.join(source, root))
|
||||
for path in paths:
|
||||
for p, f in finder.find(path):
|
||||
self.log(logging.INFO, 'artifact',
|
||||
{'path': p},
|
||||
'Adding {path} to processed archive')
|
||||
destpath = mozpath.join('bin', p)
|
||||
writer.add(destpath.encode('utf-8'), f.open(), mode=f.mode)
|
||||
|
||||
finally:
|
||||
os.chdir(oldcwd)
|
||||
|
|
|
@ -1161,4 +1161,4 @@ static const TransportSecurityPreload kPublicKeyPinningPreloadList[] = {
|
|||
|
||||
static const int32_t kUnknownId = -1;
|
||||
|
||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1505406187197000);
|
||||
static const PRTime kPreloadPKPinsExpirationTime = INT64_C(1505489147596000);
|
||||
|
|
|
@ -9,18 +9,16 @@
|
|||
0x44.net: did not receive HSTS header
|
||||
0x539.pw: could not connect to host
|
||||
0x90.fi: could not connect to host
|
||||
0xAA55.me: could not connect to host
|
||||
0xa.in: could not connect to host
|
||||
0xaa55.me: could not connect to host
|
||||
0xb612.org: could not connect to host
|
||||
0xf00.ch: did not receive HSTS header
|
||||
1001.best: could not connect to host
|
||||
100dayloans.com: max-age too low: 0
|
||||
1017scribes.com: did not receive HSTS header
|
||||
1018hosting.nl: did not receive HSTS header
|
||||
1022996493.rsc.cdn77.org: could not connect to host
|
||||
10seos.com: did not receive HSTS header
|
||||
10tacle.io: could not connect to host
|
||||
118855.com: did not receive HSTS header
|
||||
123test.de: did not receive HSTS header
|
||||
126ium.moe: could not connect to host
|
||||
127011-networks.ch: could not connect to host
|
||||
|
@ -59,7 +57,6 @@
|
|||
368mibn.com: could not connect to host
|
||||
38sihu.com: could not connect to host
|
||||
39sihu.com: could not connect to host
|
||||
3ags.de: did not receive HSTS header
|
||||
3chit.cf: could not connect to host
|
||||
3click-loan.com: could not connect to host
|
||||
3delivered.com: could not connect to host
|
||||
|
@ -71,7 +68,6 @@
|
|||
404404.info: could not connect to host
|
||||
420dongstorm.com: could not connect to host
|
||||
42ms.org: could not connect to host
|
||||
441jj.com: did not receive HSTS header
|
||||
4455software.com: did not receive HSTS header
|
||||
4679.space: could not connect to host
|
||||
4azino777.ru: did not receive HSTS header
|
||||
|
@ -88,7 +84,7 @@
|
|||
6120.eu: did not receive HSTS header
|
||||
69square.com: could not connect to host
|
||||
7kovrikov.ru: did not receive HSTS header
|
||||
808.lv: could not connect to host
|
||||
808.lv: did not receive HSTS header
|
||||
83i.net: could not connect to host
|
||||
911911.pw: could not connect to host
|
||||
922.be: could not connect to host
|
||||
|
@ -114,8 +110,6 @@ abilitylist.org: did not receive HSTS header
|
|||
abioniere.de: could not connect to host
|
||||
ablogagency.net: could not connect to host
|
||||
abnarnro.com: could not connect to host
|
||||
abolitionist.com: could not connect to host
|
||||
abolitionistsociety.com: could not connect to host
|
||||
about.ge: did not receive HSTS header
|
||||
aboutmyip.info: did not receive HSTS header
|
||||
aboutyou-deals.de: did not receive HSTS header
|
||||
|
@ -274,12 +268,10 @@ amimoto-ami.com: max-age too low: 3153600
|
|||
amitube.com: could not connect to host
|
||||
amlvfs.net: could not connect to host
|
||||
amoory.com: did not receive HSTS header
|
||||
amphetamines.org: could not connect to host
|
||||
amri.nl: did not receive HSTS header
|
||||
anadoluefessporkulubu.org: could not connect to host
|
||||
anagra.ms: could not connect to host
|
||||
analytic-s.ml: did not receive HSTS header
|
||||
anarchistischegroepnijmegen.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no]
|
||||
ancientkarma.com: could not connect to host
|
||||
andere-gedanken.net: max-age too low: 10
|
||||
anderslind.dk: could not connect to host
|
||||
|
@ -300,7 +292,6 @@ andymartin.cc: could not connect to host
|
|||
anfsanchezo.co: did not receive HSTS header
|
||||
anfsanchezo.me: could not connect to host
|
||||
anghami.com: did not receive HSTS header
|
||||
animal-rights.com: could not connect to host
|
||||
animeday.ml: could not connect to host
|
||||
animesfusion.com.br: could not connect to host
|
||||
animesharp.com: could not connect to host
|
||||
|
@ -414,7 +405,7 @@ asr.li: could not connect to host
|
|||
asr.rocks: could not connect to host
|
||||
asr.solar: could not connect to host
|
||||
asrob.eu: did not receive HSTS header
|
||||
ass.org.au: did not receive HSTS header
|
||||
ass.org.au: could not connect to host
|
||||
assekuranzjobs.de: could not connect to host
|
||||
asset-alive.com: did not receive HSTS header
|
||||
asset-alive.net: did not receive HSTS header
|
||||
|
@ -483,6 +474,7 @@ axeny.com: did not receive HSTS header
|
|||
ayuru.info: did not receive HSTS header
|
||||
az.search.yahoo.com: did not receive HSTS header
|
||||
azino777.ru: did not receive HSTS header
|
||||
azort.com: did not receive HSTS header
|
||||
azprep.us: could not connect to host
|
||||
b-landia.net: could not connect to host
|
||||
b303.me: did not receive HSTS header
|
||||
|
@ -520,7 +512,6 @@ banqingdiao.com: could not connect to host
|
|||
barbaros.info: could not connect to host
|
||||
barely.sexy: did not receive HSTS header
|
||||
bariller.fr: could not connect to host
|
||||
barnabycolby.io: could not connect to host
|
||||
barrelhead.org: could not connect to host
|
||||
barss.io: could not connect to host
|
||||
barunisystems.com: could not connect to host
|
||||
|
@ -583,6 +574,7 @@ benjakesjohnson.com: could not connect to host
|
|||
benk.press: could not connect to host
|
||||
benny003.de: did not receive HSTS header
|
||||
benohead.com: did not receive HSTS header
|
||||
bentley.link: could not connect to host
|
||||
benzkosmetik.de: did not receive HSTS header
|
||||
beourvictim.com: max-age too low: 2678400
|
||||
berger.work: could not connect to host
|
||||
|
@ -613,7 +605,7 @@ bfelob.gov: max-age too low: 86400
|
|||
bffm.biz: max-age too low: 0
|
||||
bgcparkstad.nl: did not receive HSTS header
|
||||
bgmn.net: could not connect to host
|
||||
bhatia.at: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no]
|
||||
bhatia.at: could not connect to host
|
||||
bi.search.yahoo.com: did not receive HSTS header
|
||||
biblerhymes.com: did not receive HSTS header
|
||||
bidon.ca: did not receive HSTS header
|
||||
|
@ -634,11 +626,9 @@ billrusling.com: could not connect to host
|
|||
binderapp.net: could not connect to host
|
||||
bingofriends.com: could not connect to host
|
||||
biofam.ru: did not receive HSTS header
|
||||
biointelligence-explosion.com: could not connect to host
|
||||
bioknowme.com: did not receive HSTS header
|
||||
bionicspirit.com: could not connect to host
|
||||
biophysik-ssl.de: did not receive HSTS header
|
||||
biopsychiatry.com: could not connect to host
|
||||
biou.me: could not connect to host
|
||||
birkman.com: did not receive HSTS header
|
||||
bisterfeldt.com: did not receive HSTS header
|
||||
|
@ -647,7 +637,7 @@ bitbit.org: did not receive HSTS header
|
|||
bitchan.it: could not connect to host
|
||||
bitcoinprivacy.net: did not receive HSTS header
|
||||
bitcoinworld.me: could not connect to host
|
||||
bitconcepts.co.uk: did not receive HSTS header
|
||||
bitconcepts.co.uk: could not connect to host
|
||||
biteoftech.com: did not receive HSTS header
|
||||
bitf.ly: could not connect to host
|
||||
bitfactory.ws: could not connect to host
|
||||
|
@ -658,7 +648,6 @@ bithosting.io: did not receive HSTS header
|
|||
bitnet.io: did not receive HSTS header
|
||||
bitrage.de: could not connect to host
|
||||
bitraum.io: could not connect to host
|
||||
bitref.com: did not receive HSTS header
|
||||
bitsafe.systems: did not receive HSTS header
|
||||
bitvigor.com: could not connect to host
|
||||
bivsi.com: could not connect to host
|
||||
|
@ -676,6 +665,7 @@ blackly.uk: max-age too low: 0
|
|||
blackpayment.ru: could not connect to host
|
||||
blackunicorn.wtf: could not connect to host
|
||||
blakerandall.xyz: could not connect to host
|
||||
blantik.net: could not connect to host
|
||||
blendle.nl: did not receive HSTS header
|
||||
blendlecdn.com: could not connect to host
|
||||
blenheimchalcot.com: did not receive HSTS header
|
||||
|
@ -690,8 +680,6 @@ blog.torproject.org: did not receive HSTS header
|
|||
blogabout.ru: did not receive HSTS header
|
||||
bloglikepro.com: could not connect to host
|
||||
blowjs.com: could not connect to host
|
||||
bltc.com: could not connect to host
|
||||
bltc.org: could not connect to host
|
||||
blubbablasen.de: could not connect to host
|
||||
blucas.org: did not receive HSTS header
|
||||
blueglobalmedia.com: could not connect to host
|
||||
|
@ -758,7 +746,6 @@ bridholm.se: could not connect to host
|
|||
brightstarkids.com.au: did not receive HSTS header
|
||||
britzer-toner.de: did not receive HSTS header
|
||||
brks.xyz: could not connect to host
|
||||
brn.by: could not connect to host
|
||||
broken-oak.com: could not connect to host
|
||||
brokenhands.io: could not connect to host
|
||||
brookechase.com: did not receive HSTS header
|
||||
|
@ -787,6 +774,7 @@ buildsaver.co.za: did not receive HSTS header
|
|||
built.by: did not receive HSTS header
|
||||
bul3seas.eu: could not connect to host
|
||||
bulkbuy.tech: could not connect to host
|
||||
bullbits.com: could not connect to host
|
||||
bulletpoint.cz: could not connect to host
|
||||
bullterrier.me: could not connect to host
|
||||
bulmafox.com: could not connect to host
|
||||
|
@ -816,7 +804,6 @@ buybaby.eu: did not receive HSTS header
|
|||
buyfox.de: did not receive HSTS header
|
||||
bw81.xyz: could not connect to host
|
||||
bwear4all.de: did not receive HSTS header
|
||||
bwwb.nu: could not connect to host
|
||||
by4cqb.cn: could not connect to host
|
||||
bydisk.com: could not connect to host
|
||||
bypassed.press: could not connect to host
|
||||
|
@ -835,7 +822,6 @@ c3b.info: could not connect to host
|
|||
cabarave.com: could not connect to host
|
||||
cabsites.com: could not connect to host
|
||||
cabusar.fr: could not connect to host
|
||||
cacao-chocolate.com: could not connect to host
|
||||
caconnect.org: could not connect to host
|
||||
cadao.me: did not receive HSTS header
|
||||
cadoth.net: did not receive HSTS header
|
||||
|
@ -869,7 +855,6 @@ candicontrols.com: did not receive HSTS header
|
|||
candratech.com: could not connect to host
|
||||
candylion.rocks: could not connect to host
|
||||
canfly.org: could not connect to host
|
||||
cannabis-marijuana.com: could not connect to host
|
||||
canyonshoa.com: did not receive HSTS header
|
||||
capecycles.co.za: did not receive HSTS header
|
||||
capeyorkfire.com.au: did not receive HSTS header
|
||||
|
@ -908,7 +893,7 @@ cavaleria.ro: did not receive HSTS header
|
|||
caveclan.org: did not receive HSTS header
|
||||
cavedevs.de: could not connect to host
|
||||
cavedroid.xyz: could not connect to host
|
||||
cbengineeringinc.com: could not connect to host
|
||||
cbengineeringinc.com: did not receive HSTS header
|
||||
cbhq.net: could not connect to host
|
||||
ccblog.de: did not receive HSTS header
|
||||
cctech.ph: did not receive HSTS header
|
||||
|
@ -980,7 +965,6 @@ chloe.re: did not receive HSTS header
|
|||
chlouis.net: could not connect to host
|
||||
chm.vn: did not receive HSTS header
|
||||
chontalpa.pw: could not connect to host
|
||||
chopperforums.com: could not connect to host
|
||||
choruscrowd.com: could not connect to host
|
||||
chosenplaintext.org: could not connect to host
|
||||
chotu.net: could not connect to host
|
||||
|
@ -1086,10 +1070,10 @@ codelayer.ca: could not connect to host
|
|||
codelitmus.com: did not receive HSTS header
|
||||
codemonkeyrawks.net: did not receive HSTS header
|
||||
codepoet.de: could not connect to host
|
||||
codepult.com: could not connect to host
|
||||
codepx.com: did not receive HSTS header
|
||||
codewild.de: could not connect to host
|
||||
codiva.io: max-age too low: 2592000
|
||||
codymoniz.com: did not receive HSTS header
|
||||
coffeeetc.co.uk: did not receive HSTS header
|
||||
coffeestrategies.com: max-age too low: 0
|
||||
coiffeurschnittstelle.ch: did not receive HSTS header
|
||||
|
@ -1139,7 +1123,6 @@ continuumgaming.com: could not connect to host
|
|||
controlcenter.gigahost.dk: did not receive HSTS header
|
||||
convert.zone: could not connect to host
|
||||
cooink.net: could not connect to host
|
||||
cookingreporter.com: did not receive HSTS header
|
||||
coolchevy.org.ua: did not receive HSTS header
|
||||
coole-meister.de: could not connect to host
|
||||
cooxa.com: did not receive HSTS header
|
||||
|
@ -1156,6 +1139,7 @@ corgicloud.com: could not connect to host
|
|||
corkyoga.site: could not connect to host
|
||||
cormactagging.ie: could not connect to host
|
||||
cormilu.com.br: did not receive HSTS header
|
||||
corozanu.ro: did not receive HSTS header
|
||||
correctpaardbatterijnietje.nl: did not receive HSTS header
|
||||
corruption-mc.net: could not connect to host
|
||||
corruption-rsps.net: could not connect to host
|
||||
|
@ -1228,9 +1212,10 @@ csvape.com: did not receive HSTS header
|
|||
ct-status.org: could not connect to host
|
||||
ct.search.yahoo.com: did not receive HSTS header
|
||||
cthulhuden.com: could not connect to host
|
||||
cubekrowd.net: could not connect to host
|
||||
cubeserver.eu: could not connect to host
|
||||
cubewano.com: could not connect to host
|
||||
cubostecnologia.com: could not connect to host
|
||||
cubostecnologia.com: did not receive HSTS header
|
||||
cucc.date: did not receive HSTS header
|
||||
cujanovic.com: did not receive HSTS header
|
||||
culinae.nl: could not connect to host
|
||||
|
@ -1273,7 +1258,6 @@ dalfiume.it: max-age too low: 1000
|
|||
dalingk.co: could not connect to host
|
||||
damedrogy.cz: could not connect to host
|
||||
damianuv-blog.cz: did not receive HSTS header
|
||||
damip.net: could not connect to host
|
||||
dancerdates.net: could not connect to host
|
||||
daniel-steuer.de: could not connect to host
|
||||
danielcowie.me: could not connect to host
|
||||
|
@ -1314,7 +1298,6 @@ datenreiter.cf: could not connect to host
|
|||
datenreiter.gq: could not connect to host
|
||||
datenreiter.ml: could not connect to host
|
||||
datenreiter.tk: could not connect to host
|
||||
david-pearce.com: could not connect to host
|
||||
davidandkailey.com: could not connect to host
|
||||
davidglidden.eu: did not receive HSTS header
|
||||
davidhunter.scot: did not receive HSTS header
|
||||
|
@ -1398,7 +1381,6 @@ dfviana.com.br: did not receive HSTS header
|
|||
dhome.at: did not receive HSTS header
|
||||
dhpcs.com: did not receive HSTS header
|
||||
dhpiggott.net: did not receive HSTS header
|
||||
diablofan.hopto.org: could not connect to host
|
||||
diablotine.rocks: could not connect to host
|
||||
dianlujitao.com: did not receive HSTS header
|
||||
diarbag.us: max-age too low: 0
|
||||
|
@ -1445,7 +1427,6 @@ dl.google.com: did not receive HSTS header (error ignored - included regardless)
|
|||
dlc.viasinc.com: could not connect to host
|
||||
dlemper.de: did not receive HSTS header
|
||||
dlitz.net: could not connect to host
|
||||
dlld.com: could not connect to host
|
||||
dlscomputers.com.au: did not receive HSTS header
|
||||
dmcibulldog.com: did not receive HSTS header
|
||||
dmtry.me: did not receive HSTS header
|
||||
|
@ -1488,6 +1469,7 @@ doodledraw.ninja: did not receive HSTS header
|
|||
dooku.cz: could not connect to host
|
||||
doomleika.com: could not connect to host
|
||||
doooonoooob.com: could not connect to host
|
||||
dorianmuthig.com: could not connect to host
|
||||
doridian.com: could not connect to host
|
||||
doridian.de: could not connect to host
|
||||
doridian.net: did not receive HSTS header
|
||||
|
@ -1528,18 +1510,20 @@ drumbandesperanto.nl: could not connect to host
|
|||
ds-christiansen.de: could not connect to host
|
||||
dshiv.io: could not connect to host
|
||||
dtub.co: did not receive HSTS header
|
||||
dubik.su: could not connect to host
|
||||
dubrovskiy.net: could not connect to host
|
||||
dubrovskiy.pro: could not connect to host
|
||||
duesee.org: could not connect to host
|
||||
dullsir.com: did not receive HSTS header
|
||||
dungi.org: could not connect to host
|
||||
dutchessuganda.com: did not receive HSTS header
|
||||
dutchrank.com: did not receive HSTS header
|
||||
duuu.ch: could not connect to host
|
||||
dworzak.ch: could not connect to host
|
||||
dycontrol.de: could not connect to host
|
||||
dyktig.as: did not receive HSTS header
|
||||
dylanscott.com.au: did not receive HSTS header
|
||||
dynamic-innovations.net: could not connect to host
|
||||
dynamicsnetwork.net: could not connect to host
|
||||
dynamize.solutions: did not receive HSTS header
|
||||
dyrkar.com: did not receive HSTS header
|
||||
dzimejl.sk: did not receive HSTS header
|
||||
|
@ -1597,7 +1581,6 @@ eeqj.com: could not connect to host
|
|||
effectiveosgi.com: could not connect to host
|
||||
efficienthealth.com: did not receive HSTS header
|
||||
effortlesshr.com: did not receive HSTS header
|
||||
egbert.net: could not connect to host
|
||||
egit.co: could not connect to host
|
||||
eglek.com: did not receive HSTS header
|
||||
ego-world.org: could not connect to host
|
||||
|
@ -1617,7 +1600,6 @@ electricant.com: did not receive HSTS header
|
|||
electricant.nl: did not receive HSTS header
|
||||
electricianforum.co.uk: did not receive HSTS header
|
||||
electromc.com: could not connect to host
|
||||
element-43.com: did not receive HSTS header
|
||||
elemenx.com: did not receive HSTS header
|
||||
elemprendedor.com.ve: could not connect to host
|
||||
elenag.ga: could not connect to host
|
||||
|
@ -1637,6 +1619,7 @@ email.lookout.com: could not connect to host
|
|||
emanatepixels.com: could not connect to host
|
||||
embroidered-stuff.com: could not connect to host
|
||||
emeldi-commerce.com: max-age too low: 0
|
||||
emielraaijmakers.nl: could not connect to host
|
||||
emilyhorsman.com: could not connect to host
|
||||
eminovic.me: could not connect to host
|
||||
emjainteractive.com: did not receive HSTS header
|
||||
|
@ -1648,6 +1631,7 @@ empleostampico.com: did not receive HSTS header
|
|||
empty-r.com: did not receive HSTS header
|
||||
enaah.de: could not connect to host
|
||||
enargia.jp: max-age too low: 0
|
||||
encode.space: could not connect to host
|
||||
encoder.pw: could not connect to host
|
||||
encontrebarato.com.br: did not receive HSTS header
|
||||
encrypted.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
|
@ -1667,7 +1651,6 @@ enjoy-nepal.de: max-age too low: 0
|
|||
enjoymayfield.com: max-age too low: 0
|
||||
enskat.de: could not connect to host
|
||||
enskatson-sippe.de: could not connect to host
|
||||
entactogens.com: could not connect to host
|
||||
enteente.club: could not connect to host
|
||||
enteente.space: could not connect to host
|
||||
enteente.xyz: could not connect to host
|
||||
|
@ -1675,7 +1658,6 @@ enterdev.co: did not receive HSTS header
|
|||
enterprise-threat-monitor.com: max-age too low: 0
|
||||
enterprisecarclub.co.uk: did not receive HSTS header
|
||||
entersynapse.com: did not receive HSTS header
|
||||
entheogens.com: could not connect to host
|
||||
entrepreneur.or.id: did not receive HSTS header
|
||||
enum.eu.org: could not connect to host
|
||||
enumify.com: could not connect to host
|
||||
|
@ -1707,7 +1689,6 @@ ersindemirtas.com: did not receive HSTS header
|
|||
eru.me: did not receive HSTS header
|
||||
esc.chat: could not connect to host
|
||||
escalate.eu: could not connect to host
|
||||
escortmantra.com: could not connect to host
|
||||
escotour.com: could not connect to host
|
||||
esec.rs: did not receive HSTS header
|
||||
esko.bar: could not connect to host
|
||||
|
@ -1844,7 +1825,6 @@ fettbrot.tk: did not receive HSTS header
|
|||
fexmen.com: could not connect to host
|
||||
ffmradio.de: did not receive HSTS header
|
||||
fics-twosigma.com: could not connect to host
|
||||
fiendishmasterplan.com: could not connect to host
|
||||
fiftyshadesofluca.ml: could not connect to host
|
||||
fig.co: did not receive HSTS header
|
||||
fightr.co: could not connect to host
|
||||
|
@ -1944,6 +1924,7 @@ foxdev.io: did not receive HSTS header
|
|||
foxley-farm.co.uk: did not receive HSTS header
|
||||
foxley-seeds.co.uk: did not receive HSTS header
|
||||
foxleyseeds.co.uk: could not connect to host
|
||||
foxmay.co.uk: could not connect to host
|
||||
foxtrot.pw: could not connect to host
|
||||
fr33d0m.link: could not connect to host
|
||||
fralef.me: did not receive HSTS header
|
||||
|
@ -1972,10 +1953,11 @@ freeutopia.org: did not receive HSTS header
|
|||
frenzel.dk: could not connect to host
|
||||
freqlabs.com: did not receive HSTS header
|
||||
freshfind.xyz: could not connect to host
|
||||
freshlymind.com: could not connect to host
|
||||
freshlymind.com: did not receive HSTS header
|
||||
frforms.com: did not receive HSTS header
|
||||
friendica.ch: could not connect to host
|
||||
friendlyfiregameshow.com: could not connect to host
|
||||
frimons.com: could not connect to host
|
||||
froggstack.de: could not connect to host
|
||||
frontisme.nl: could not connect to host
|
||||
frontmin.com: did not receive HSTS header
|
||||
|
@ -2062,7 +2044,6 @@ gatapro.net: could not connect to host
|
|||
gatorsa.es: did not receive HSTS header
|
||||
gdegem.org: did not receive HSTS header
|
||||
gdpventure.com: max-age too low: 0
|
||||
gdz.tv: did not receive HSTS header
|
||||
gebn.co.uk: did not receive HSTS header
|
||||
gedankenbude.info: could not connect to host
|
||||
geekcast.co.uk: did not receive HSTS header
|
||||
|
@ -2076,6 +2057,7 @@ genyaa.com: could not connect to host
|
|||
genyhitch.com: did not receive HSTS header
|
||||
geofox.org: did not receive HSTS header
|
||||
georgesonarthurs.com.au: did not receive HSTS header
|
||||
geoscan.aero: could not connect to host
|
||||
gerencianet.com.br: did not receive HSTS header
|
||||
gersting.net: could not connect to host
|
||||
gesiwista.net: could not connect to host
|
||||
|
@ -2183,7 +2165,6 @@ gootlijsten.nl: did not receive HSTS header
|
|||
goozz.nl: could not connect to host
|
||||
gopay.cz: did not receive HSTS header
|
||||
gorilla-gym.site: could not connect to host
|
||||
gostudy.net: did not receive HSTS header
|
||||
gotgenes.com: could not connect to host
|
||||
gothamlimo.com: could not connect to host
|
||||
goto.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
|
@ -2228,7 +2209,6 @@ gripopgriep.net: could not connect to host
|
|||
groenemeijer.frl: max-age too low: 2628000
|
||||
groetzner.net: did not receive HSTS header
|
||||
grossmann.gr: could not connect to host
|
||||
groupe-cassous.com: did not receive HSTS header
|
||||
groups.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
grozip.com: could not connect to host
|
||||
grunex.com: did not receive HSTS header
|
||||
|
@ -2244,7 +2224,7 @@ gtanda.tk: could not connect to host
|
|||
gtech.work: did not receive HSTS header
|
||||
gtldna.com: could not connect to host
|
||||
gtlfsonlinepay.com: did not receive HSTS header
|
||||
gtour.info: did not receive HSTS header
|
||||
gtour.info: could not connect to host
|
||||
gtraxapp.com: could not connect to host
|
||||
gts-schulsoftware.de: did not receive HSTS header
|
||||
guava.studio: did not receive HSTS header
|
||||
|
@ -2260,6 +2240,7 @@ gunnarhafdal.com: did not receive HSTS header
|
|||
gunnaro.com: could not connect to host
|
||||
guntbert.net: could not connect to host
|
||||
guoqiang.info: could not connect to host
|
||||
gurochan.ch: could not connect to host
|
||||
gurom.lv: could not connect to host
|
||||
gurusupe.com: could not connect to host
|
||||
guso.gq: could not connect to host
|
||||
|
@ -2297,7 +2278,7 @@ hackerspace-ntnu.no: did not receive HSTS header
|
|||
hackest.org: did not receive HSTS header
|
||||
hackit.im: could not connect to host
|
||||
hadzic.co: could not connect to host
|
||||
haeckdesign.com: could not connect to host
|
||||
haeckdesign.com: did not receive HSTS header
|
||||
haeckl.eu: did not receive HSTS header
|
||||
haehnlein.at: could not connect to host
|
||||
haf.gr: could not connect to host
|
||||
|
@ -2348,6 +2329,7 @@ hausarzt-stader-str.de: did not receive HSTS header
|
|||
haveeruexaminer.com: could not connect to host
|
||||
haveforeningen-enghaven.dk: did not receive HSTS header
|
||||
havenswift-hosting.co.uk: did not receive HSTS header
|
||||
hawkeyeinsight.com: max-age too low: 0
|
||||
haxoff.com: could not connect to host
|
||||
haxx.hu: could not connect to host
|
||||
haydenhill.us: could not connect to host
|
||||
|
@ -2378,7 +2360,7 @@ helgakristoffer.wedding: could not connect to host
|
|||
helingqi.com: could not connect to host
|
||||
helloworldhost.com: did not receive HSTS header
|
||||
helpadmin.net: could not connect to host
|
||||
helpium.de: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no]
|
||||
helpium.de: could not connect to host
|
||||
helpmebuild.com: did not receive HSTS header
|
||||
hemdal.se: could not connect to host
|
||||
hencagon.com: could not connect to host
|
||||
|
@ -2387,7 +2369,7 @@ hepteract.us: could not connect to host
|
|||
heritagedentistry.ca: did not receive HSTS header
|
||||
herrenfahrt.com: did not receive HSTS header
|
||||
herzbotschaft.de: did not receive HSTS header
|
||||
heutger.net: could not connect to host
|
||||
heutger.net: did not receive HSTS header
|
||||
heywoodtown.co.uk: could not connect to host
|
||||
hfi.me: could not connect to host
|
||||
hibilog.com: could not connect to host
|
||||
|
@ -2536,7 +2518,6 @@ ifastuniversity.com: did not receive HSTS header
|
|||
ifleurs.com: could not connect to host
|
||||
ifx.ee: could not connect to host
|
||||
ignatisd.gr: did not receive HSTS header
|
||||
igotoffer.com: did not receive HSTS header
|
||||
igule.net: could not connect to host
|
||||
ihrlotto.de: could not connect to host
|
||||
ihrnationalrat.ch: could not connect to host
|
||||
|
@ -2624,6 +2605,7 @@ instantdev.io: could not connect to host
|
|||
instinctiveads.com: did not receive HSTS header
|
||||
institutoflordelavida.com: could not connect to host
|
||||
instruktor.io: could not connect to host
|
||||
integrationinc.com: could not connect to host
|
||||
intel.li: did not receive HSTS header
|
||||
intelevo.com: max-age too low: 0
|
||||
interference.io: could not connect to host
|
||||
|
@ -2631,7 +2613,6 @@ interhosts.co.za: could not connect to host
|
|||
interim-cto.de: could not connect to host
|
||||
interleucina.org: did not receive HSTS header
|
||||
interlun.com: could not connect to host
|
||||
internect.co.za: did not receive HSTS header
|
||||
internetcasinos.de: could not connect to host
|
||||
internetcensus.org: could not connect to host
|
||||
interserved.com: did not receive HSTS header
|
||||
|
@ -2666,6 +2647,7 @@ iprody.com: could not connect to host
|
|||
iptel.by: max-age too low: 0
|
||||
iptel.ro: could not connect to host
|
||||
ipuservicedesign.com: could not connect to host
|
||||
ipv6-adresse.dk: could not connect to host
|
||||
ipv6cloud.club: could not connect to host
|
||||
ipv6only.network: could not connect to host
|
||||
iqcn.co: could not connect to host
|
||||
|
@ -2763,6 +2745,7 @@ jasonroe.me: did not receive HSTS header
|
|||
jasonsansone.com: max-age too low: 0
|
||||
jastoria.pl: could not connect to host
|
||||
jav-collective.com: could not connect to host
|
||||
java-board.com: could not connect to host
|
||||
javelinsms.com: could not connect to host
|
||||
jayblock.com: did not receive HSTS header
|
||||
jayharris.ca: max-age too low: 86400
|
||||
|
@ -2820,7 +2803,6 @@ johannes-sprink.de: could not connect to host
|
|||
johnbrownphotography.ch: did not receive HSTS header
|
||||
johners.me: could not connect to host
|
||||
johnhgaunt.com: did not receive HSTS header
|
||||
johnkastler.net: could not connect to host
|
||||
johnrom.com: did not receive HSTS header
|
||||
jointoweb.com: could not connect to host
|
||||
jonas-keidel.de: did not receive HSTS header
|
||||
|
@ -2856,7 +2838,6 @@ jumbox.xyz: could not connect to host
|
|||
jumping-duck.com: could not connect to host
|
||||
junaos.xyz: did not receive HSTS header
|
||||
junge-selbsthilfe.info: could not connect to host
|
||||
juniwalk.cz: could not connect to host
|
||||
junjung.me: max-age too low: 0
|
||||
junqtion.com: could not connect to host
|
||||
jupp0r.de: did not receive HSTS header
|
||||
|
@ -2889,6 +2870,7 @@ kamikano.com: could not connect to host
|
|||
kanar.nl: could not connect to host
|
||||
kanehusky.com: could not connect to host
|
||||
kaneo-gmbh.de: did not receive HSTS header
|
||||
kaniklani.co.za: could not connect to host
|
||||
kaohub.com: could not connect to host
|
||||
kaplatz.is: could not connect to host
|
||||
kapucini.si: max-age too low: 0
|
||||
|
@ -2896,7 +2878,6 @@ kaputt.com: could not connect to host
|
|||
karaoketonight.com: could not connect to host
|
||||
karhukamera.com: could not connect to host
|
||||
karlis-kavacis.id.lv: did not receive HSTS header
|
||||
karmabaker.com: did not receive HSTS header
|
||||
karpanhellas.com: did not receive HSTS header
|
||||
kasilag.me: did not receive HSTS header
|
||||
katiaetdavid.fr: could not connect to host
|
||||
|
@ -2934,6 +2915,7 @@ kialo.com: did not receive HSTS header
|
|||
kickass.al: could not connect to host
|
||||
kid-dachau.de: did not receive HSTS header
|
||||
kiel-media.de: did not receive HSTS header
|
||||
kieranjones.uk: could not connect to host
|
||||
killerit.in: could not connect to host
|
||||
kimberg.co.uk: could not connect to host
|
||||
kimpost.org: could not connect to host
|
||||
|
@ -2959,7 +2941,6 @@ kisstyle.ru: did not receive HSTS header
|
|||
kitakemon.com: could not connect to host
|
||||
kitchen-profi.ru: max-age too low: 2592000
|
||||
kitchenchaos.de: could not connect to host
|
||||
kitchenpunx.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no]
|
||||
kitk.at: could not connect to host
|
||||
kitsostech.com: could not connect to host
|
||||
kitsta.com: could not connect to host
|
||||
|
@ -2976,6 +2957,7 @@ klicktojob.de: could not connect to host
|
|||
kmartin.io: did not receive HSTS header
|
||||
knccloud.com: could not connect to host
|
||||
knightsbridgegroup.org: could not connect to host
|
||||
knowdebt.org: did not receive HSTS header
|
||||
knowledgesnap.com: could not connect to host
|
||||
knowledgesnapsites.com: could not connect to host
|
||||
kodexplorer.ml: could not connect to host
|
||||
|
@ -3003,7 +2985,6 @@ kori.ml: did not receive HSTS header
|
|||
korni22.org: did not receive HSTS header
|
||||
korsanparti.org: could not connect to host
|
||||
kostuumstore.nl: could not connect to host
|
||||
kostya.net: could not connect to host
|
||||
kotois.com: could not connect to host
|
||||
kotonehoko.net: could not connect to host
|
||||
kotovstyle.ru: could not connect to host
|
||||
|
@ -3018,6 +2999,7 @@ kreb.io: could not connect to host
|
|||
kredite.sale: could not connect to host
|
||||
krestanskydarek.cz: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no]
|
||||
kriegt.es: did not receive HSTS header
|
||||
kristikala.nl: could not connect to host
|
||||
kristofferkoch.com: could not connect to host
|
||||
krizevackapajdasija.hr: could not connect to host
|
||||
krizevci.info: did not receive HSTS header
|
||||
|
@ -3057,7 +3039,6 @@ kz.search.yahoo.com: did not receive HSTS header
|
|||
kzjnet.com: could not connect to host
|
||||
la-cave-a-nodo.fr: did not receive HSTS header
|
||||
la-flora-negra.de: could not connect to host
|
||||
la-grande-jaugue.fr: did not receive HSTS header
|
||||
labaia.info: could not connect to host
|
||||
labina.com.tr: did not receive HSTS header
|
||||
laboiteapc.fr: did not receive HSTS header
|
||||
|
@ -3066,7 +3047,6 @@ laborie.io: could not connect to host
|
|||
labrador-retrievers.com.au: did not receive HSTS header
|
||||
labs.directory: could not connect to host
|
||||
labs.moscow: did not receive HSTS header
|
||||
lacasa.fr: could not connect to host
|
||||
lacaverne.nl: could not connect to host
|
||||
lachlankidson.net: did not receive HSTS header
|
||||
lacledeslan.ninja: could not connect to host
|
||||
|
@ -3164,6 +3144,7 @@ lianye3.cc: could not connect to host
|
|||
lianye4.cc: could not connect to host
|
||||
lianye5.cc: could not connect to host
|
||||
lianye6.cc: could not connect to host
|
||||
lianyexiuchang.in: could not connect to host
|
||||
liaoshuma.com: could not connect to host
|
||||
libanco.com: could not connect to host
|
||||
libertyrp.org: could not connect to host
|
||||
|
@ -3223,7 +3204,6 @@ livedemo.io: could not connect to host
|
|||
livej.am: could not connect to host
|
||||
livi.co: did not receive HSTS header
|
||||
lixiang.one: could not connect to host
|
||||
lmerza.com: could not connect to host
|
||||
loacg.com: did not receive HSTS header
|
||||
loadingdeck.com: max-age too low: 0
|
||||
loadso.me: could not connect to host
|
||||
|
@ -3440,7 +3420,6 @@ mclist.it: could not connect to host
|
|||
mdfnet.se: did not receive HSTS header
|
||||
mdscomp.net: did not receive HSTS header
|
||||
meamod.com: max-age too low: 0
|
||||
mecenat-cassous.com: did not receive HSTS header
|
||||
mechmk1.me: did not receive HSTS header
|
||||
medallia.io: could not connect to host
|
||||
mediacru.sh: did not receive HSTS header
|
||||
|
@ -3467,6 +3446,7 @@ mein-gesundheitsmanager.com: max-age too low: 0
|
|||
meincloudspeicher.de: could not connect to host
|
||||
meinebo.it: could not connect to host
|
||||
melangebrasil.com: could not connect to host
|
||||
melpomene.me: could not connect to host
|
||||
melted.pw: could not connect to host
|
||||
melvinlammerts.nl: did not receive HSTS header
|
||||
memberpress.com: max-age too low: 86400
|
||||
|
@ -3483,7 +3463,6 @@ meritz.rocks: could not connect to host
|
|||
mersinunivercity.com: did not receive HSTS header
|
||||
merson.me: could not connect to host
|
||||
meshlab.co: could not connect to host
|
||||
meshok.ru: did not receive HSTS header
|
||||
mesmoque.com: did not receive HSTS header
|
||||
metagrader.com: could not connect to host
|
||||
metebalci.com: did not receive HSTS header
|
||||
|
@ -3578,6 +3557,7 @@ mlcdn.co: could not connect to host
|
|||
mlp.ee: could not connect to host
|
||||
mlpepilepsy.org: could not connect to host
|
||||
mmgazhomeloans.com: did not receive HSTS header
|
||||
mnd.sc: could not connect to host
|
||||
mnec.io: could not connect to host
|
||||
mnemotiv.com: could not connect to host
|
||||
mnetworkingsolutions.co.uk: could not connect to host
|
||||
|
@ -3669,7 +3649,6 @@ mrning.com: did not receive HSTS header
|
|||
mrnonz.com: max-age too low: 0
|
||||
mrpopat.in: did not receive HSTS header
|
||||
mrs-shop.com: did not receive HSTS header
|
||||
mrsk.me: could not connect to host
|
||||
msc-seereisen.net: could not connect to host
|
||||
msno.no: did not receive HSTS header
|
||||
mszaki.com: did not receive HSTS header
|
||||
|
@ -3798,7 +3777,6 @@ neofelhz.space: did not receive HSTS header
|
|||
neonisi.com: could not connect to host
|
||||
neonnuke.tech: did not receive HSTS header
|
||||
neosolution.ca: did not receive HSTS header
|
||||
neoxcrf.com: could not connect to host
|
||||
nephos.xyz: did not receive HSTS header
|
||||
nepustil.net: did not receive HSTS header
|
||||
nestedquotes.ca: could not connect to host
|
||||
|
@ -3819,7 +3797,6 @@ netzzwerg4u.de: could not connect to host
|
|||
neueonlinecasino2016.com: could not connect to host
|
||||
neuralgic.net: could not connect to host
|
||||
neuro-plus-100.com: could not connect to host
|
||||
neuroethics.com: could not connect to host
|
||||
neuronfactor.com: max-age too low: 1000
|
||||
never-afk.de: did not receive HSTS header
|
||||
neveta.com: could not connect to host
|
||||
|
@ -3866,7 +3843,6 @@ niklaslindblad.se: did not receive HSTS header
|
|||
nikomo.fi: did not receive HSTS header
|
||||
ninchisho-online.com: did not receive HSTS header
|
||||
ninhs.org: could not connect to host
|
||||
ninux.ch: could not connect to host
|
||||
nippler.org: did not receive HSTS header
|
||||
nippombashi.net: did not receive HSTS header
|
||||
nipponcareers.com: did not receive HSTS header
|
||||
|
@ -3883,6 +3859,7 @@ no17sifangjie.cc: could not connect to host
|
|||
nocallaghan.com: could not connect to host
|
||||
noclegi-online.pl: did not receive HSTS header
|
||||
noctinus.tk: could not connect to host
|
||||
nodari.com.ar: could not connect to host
|
||||
nodebrewery.com: could not connect to host
|
||||
nodetemple.com: could not connect to host
|
||||
nodi.at: did not receive HSTS header
|
||||
|
@ -3912,6 +3889,7 @@ noworrywp.com: could not connect to host
|
|||
nozoe.jp: could not connect to host
|
||||
np.search.yahoo.com: did not receive HSTS header
|
||||
npol.de: could not connect to host
|
||||
npw.net: did not receive HSTS header
|
||||
nqesh.com: could not connect to host
|
||||
nrechn.de: could not connect to host
|
||||
nrizzio.me: could not connect to host
|
||||
|
@ -3962,7 +3940,6 @@ obermeiers.eu: could not connect to host
|
|||
oblast45.ru: did not receive HSTS header
|
||||
obsydian.org: could not connect to host
|
||||
occentus.net: did not receive HSTS header
|
||||
occupymedia.org: did not receive HSTS header
|
||||
ochaken.cf: could not connect to host
|
||||
octocat.ninja: could not connect to host
|
||||
odin.xxx: could not connect to host
|
||||
|
@ -4032,8 +4009,10 @@ onyxwall.com: could not connect to host
|
|||
onyxwall.link: could not connect to host
|
||||
onyxwall.net: could not connect to host
|
||||
ookjesprookje.nl: could not connect to host
|
||||
ooooush.co.uk: did not receive HSTS header
|
||||
oopsmycase.com: could not connect to host
|
||||
oost.io: could not connect to host
|
||||
open-desk.org: could not connect to host
|
||||
open-mx.de: could not connect to host
|
||||
open-to-repair.fr: did not receive HSTS header
|
||||
openas.org: could not connect to host
|
||||
|
@ -4195,14 +4174,13 @@ pdf.yt: could not connect to host
|
|||
peakapp.nl: could not connect to host
|
||||
peerherrmann.de: could not connect to host
|
||||
peetah.com: max-age too low: 0
|
||||
peissen.com: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no]
|
||||
peissen.com: could not connect to host
|
||||
pekkapikkarainen.fi: did not receive HSTS header
|
||||
pekkarik.ru: could not connect to host
|
||||
peliculasaudiolatinoonline.com: could not connect to host
|
||||
pengui.uk: could not connect to host
|
||||
penguinclientsystem.com: did not receive HSTS header
|
||||
pentano.net: could not connect to host
|
||||
peperiot.com: did not receive HSTS header
|
||||
pepperhead.com: did not receive HSTS header
|
||||
pepperworldhotshop.de: did not receive HSTS header
|
||||
perfect-radiant-wrinkles.com: could not connect to host
|
||||
|
@ -4235,12 +4213,14 @@ phalconist.com: did not receive HSTS header
|
|||
pharmgkb.org: could not connect to host
|
||||
phillprice.com: could not connect to host
|
||||
phoebe.co.nz: did not receive HSTS header
|
||||
phoenix.dj: could not connect to host
|
||||
phonenumberinfo.co.uk: could not connect to host
|
||||
phongmay24h.com: could not connect to host
|
||||
photoancestry.com: did not receive HSTS header
|
||||
photoblogverona.com: could not connect to host
|
||||
php-bach.org: could not connect to host
|
||||
phus.lu: did not receive HSTS header
|
||||
physicaltherapist.com: did not receive HSTS header
|
||||
picardiascr.com: did not receive HSTS header
|
||||
pickr.co: could not connect to host
|
||||
picotronic.biz: could not connect to host
|
||||
|
@ -4284,6 +4264,7 @@ platomania.eu: did not receive HSTS header
|
|||
play.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
playflick.com: did not receive HSTS header
|
||||
playmaker.io: could not connect to host
|
||||
playmyplay.com: did not receive HSTS header
|
||||
playnation.io: could not connect to host
|
||||
playsharp.com: could not connect to host
|
||||
pleier-it.de: did not receive HSTS header
|
||||
|
@ -4360,6 +4341,7 @@ prelist.org: did not receive HSTS header
|
|||
presidentials2016.com: could not connect to host
|
||||
press-anime-nenkan.com: did not receive HSTS header
|
||||
pressfreedomfoundation.org: did not receive HSTS header
|
||||
pretty.hu: could not connect to host
|
||||
pretzlaff.info: did not receive HSTS header
|
||||
preworkout.me: could not connect to host
|
||||
prezola.com: did not receive HSTS header
|
||||
|
@ -4416,7 +4398,6 @@ psw.academy: did not receive HSTS header
|
|||
psw.consulting: did not receive HSTS header
|
||||
ptn.moscow: could not connect to host
|
||||
pubkey.is: could not connect to host
|
||||
pubreviews.com: did not receive HSTS header
|
||||
pugliese.fr: could not connect to host
|
||||
puiterwijk.org: could not connect to host
|
||||
pumpgames.net: could not connect to host
|
||||
|
@ -4440,6 +4421,7 @@ pzme.me: could not connect to host
|
|||
q2.si: did not receive HSTS header
|
||||
qbik.de: did not receive HSTS header
|
||||
qccqld.org.au: could not connect to host
|
||||
qewc.com: could not connect to host
|
||||
qingpat.com: could not connect to host
|
||||
qingxuan.info: max-age too low: 864000
|
||||
qinxi1992.com: could not connect to host
|
||||
|
@ -4454,7 +4436,7 @@ qrara.net: did not receive HSTS header
|
|||
qrlending.com: did not receive HSTS header
|
||||
quail.solutions: could not connect to host
|
||||
quality1.com.br: did not receive HSTS header
|
||||
quanglepro.com: did not receive HSTS header
|
||||
quanglepro.com: could not connect to host
|
||||
quantacloud.ch: could not connect to host
|
||||
quantenteranik.eu: could not connect to host
|
||||
quantum-cloud.xyz: could not connect to host
|
||||
|
@ -4503,7 +4485,6 @@ rastreador.com.es: did not receive HSTS header
|
|||
ratajczak.fr: could not connect to host
|
||||
rate-esport.de: could not connect to host
|
||||
rathorian.fr: could not connect to host
|
||||
rationalism.com: could not connect to host
|
||||
ratuseks.com: could not connect to host
|
||||
ratuseks.net: could not connect to host
|
||||
ratuseks.us: could not connect to host
|
||||
|
@ -4550,7 +4531,7 @@ redlatam.org: did not receive HSTS header
|
|||
redmbk.com: did not receive HSTS header
|
||||
redports.org: could not connect to host
|
||||
redy.host: did not receive HSTS header
|
||||
refitplanner.com: could not connect to host
|
||||
refitplanner.com: did not receive HSTS header
|
||||
reg.ru: did not receive HSTS header
|
||||
regaloaks.com: did not receive HSTS header
|
||||
regalpalms.com: did not receive HSTS header
|
||||
|
@ -4583,6 +4564,7 @@ rentacarcluj.xyz: could not connect to host
|
|||
rentbrowsertrain.me: could not connect to host
|
||||
rentcarassist.com: could not connect to host
|
||||
renteater.com: could not connect to host
|
||||
renuo.ch: did not receive HSTS header
|
||||
replacemychina.com: could not connect to host
|
||||
reprolife.co.uk: could not connect to host
|
||||
res-rheingau.de: did not receive HSTS header
|
||||
|
@ -4660,6 +4642,7 @@ roesemann.email: could not connect to host
|
|||
roguelikecenter.fr: did not receive HSTS header
|
||||
rolandreed.cn: did not receive HSTS header
|
||||
rolemaster.net: could not connect to host
|
||||
roleplayhome.com: could not connect to host
|
||||
rolroer.co.za: could not connect to host
|
||||
romab.com: did not receive HSTS header
|
||||
romans-place.me.uk: could not connect to host
|
||||
|
@ -4718,7 +4701,6 @@ rxprep.com: did not receive HSTS header
|
|||
rxv.cc: could not connect to host
|
||||
ryanteck.uk: did not receive HSTS header
|
||||
rylin.net: did not receive HSTS header
|
||||
rzegroup.com: did not receive HSTS header
|
||||
s.how: did not receive HSTS header
|
||||
safelist.eu: did not receive HSTS header
|
||||
safematix.com: could not connect to host
|
||||
|
@ -4731,13 +4713,13 @@ sail-nyc.com: did not receive HSTS header
|
|||
sakaki.anime.my: max-age too low: 5184000
|
||||
sakaserver.com: did not receive HSTS header
|
||||
sakurabuff.com: did not receive HSTS header
|
||||
salmonvision.com.tw: did not receive HSTS header
|
||||
salserocafe.com: did not receive HSTS header
|
||||
salserototal.com: could not connect to host
|
||||
saltedskies.com: could not connect to host
|
||||
salud.top: did not receive HSTS header
|
||||
salzamt.tk: could not connect to host
|
||||
sametovymesic.cz: could not connect to host
|
||||
samirnassar.com: could not connect to host
|
||||
saml2.com: could not connect to host
|
||||
sampcup.com: could not connect to host
|
||||
sampoznay.ru: did not receive HSTS header
|
||||
|
@ -4782,14 +4764,12 @@ schooltrends.co.uk: did not receive HSTS header
|
|||
schopenhauer-institut.de: did not receive HSTS header
|
||||
schreiber-netzwerk.eu: did not receive HSTS header
|
||||
schrodinger.io: could not connect to host
|
||||
schtiehve.duckdns.org: could not connect to host
|
||||
schulterglatzen-altenwalde.de: could not connect to host
|
||||
schultzflorists.com: could not connect to host
|
||||
schwarzkopfforyou.de: did not receive HSTS header
|
||||
schweizerbolzonello.net: could not connect to host
|
||||
scicasts.com: max-age too low: 7776000
|
||||
scienceathome.org: did not receive HSTS header
|
||||
sciencemonster.co.uk: could not connect to host
|
||||
scivillage.com: did not receive HSTS header
|
||||
sclgroup.cc: did not receive HSTS header
|
||||
scooshonline.co.uk: did not receive HSTS header
|
||||
|
@ -4797,7 +4777,6 @@ scotbirchfield.com: did not receive HSTS header
|
|||
scottdial.com: did not receive HSTS header
|
||||
scottferguson.com.au: did not receive HSTS header
|
||||
scottgthomas.com: could not connect to host
|
||||
scottnicol.co.uk: could not connect to host
|
||||
scottynordstrom.org: did not receive HSTS header
|
||||
scourt.info: did not receive HSTS header
|
||||
scourt.org.ua: did not receive HSTS header
|
||||
|
@ -4849,6 +4828,7 @@ seefunk.net: did not receive HSTS header
|
|||
seele.ca: could not connect to host
|
||||
segulink.com: could not connect to host
|
||||
sehenderson.com: did not receive HSTS header
|
||||
seida.at: could not connect to host
|
||||
seiko-dojo.com: could not connect to host
|
||||
selecadm.name: could not connect to host
|
||||
selectruckscalltrackingreports.com: could not connect to host
|
||||
|
@ -4906,6 +4886,7 @@ sharepass.pw: could not connect to host
|
|||
sharevari.com: did not receive HSTS header
|
||||
shauncrowley.co.uk: could not connect to host
|
||||
shaunwheelhou.se: could not connect to host
|
||||
shawnh.net: could not connect to host
|
||||
shellj.me: max-age too low: 86400
|
||||
shellsec.pw: did not receive HSTS header
|
||||
shereallyheals.com: could not connect to host
|
||||
|
@ -4936,6 +4917,7 @@ siammedia.co: could not connect to host
|
|||
siamsnus.com: did not receive HSTS header
|
||||
sichere-kartenakzeptanz.de: did not receive HSTS header
|
||||
siciliadigitale.pro: could not connect to host
|
||||
sicken.eu: could not connect to host
|
||||
siddhant.me: max-age too low: 0
|
||||
siebens.net: could not connect to host
|
||||
sifls.com: could not connect to host
|
||||
|
@ -4984,6 +4966,7 @@ skidstresser.com: did not receive HSTS header
|
|||
skile.ru: could not connect to host
|
||||
skk.io: could not connect to host
|
||||
skoda-clever-lead.de: could not connect to host
|
||||
skolem.de: could not connect to host
|
||||
skotty.io: did not receive HSTS header
|
||||
skullhouse.nyc: did not receive HSTS header
|
||||
skyflix.me: could not connect to host
|
||||
|
@ -5110,11 +5093,9 @@ spilsbury.io: could not connect to host
|
|||
spirit-dev.net: max-age too low: 0
|
||||
spititout.it: could not connect to host
|
||||
spittersberger.recipes: did not receive HSTS header
|
||||
spodelime.com: did not receive HSTS header
|
||||
sponsortobias.com: could not connect to host
|
||||
sportchirp-internal.azurewebsites.net: did not receive HSTS header
|
||||
sporthit.ru: did not receive HSTS header
|
||||
sporttrampen.de: could not connect to host
|
||||
sportwette.eu: did not receive HSTS header
|
||||
spot-events.com: could not connect to host
|
||||
spotifyripper.tk: could not connect to host
|
||||
|
@ -5125,7 +5106,7 @@ sproutconnections.com: did not receive HSTS header
|
|||
sprutech.de: did not receive HSTS header
|
||||
sprybear.com: max-age too low: 0
|
||||
square.gs: could not connect to host
|
||||
squatldf.org: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no]
|
||||
squatldf.org: did not receive HSTS header
|
||||
sqzryang.com: did not receive HSTS header
|
||||
srevilak.net: did not receive HSTS header
|
||||
srmaximo.com: could not connect to host
|
||||
|
@ -5202,7 +5183,6 @@ str0.at: did not receive HSTS header
|
|||
strasweb.fr: did not receive HSTS header
|
||||
strbt.de: could not connect to host
|
||||
strchr.com: did not receive HSTS header
|
||||
stream.pub: did not receive HSTS header
|
||||
streamingeverywhere.com: could not connect to host
|
||||
streamingmagazin.de: could not connect to host
|
||||
streampanel.net: did not receive HSTS header
|
||||
|
@ -5253,7 +5233,6 @@ super-ripped-power.com: could not connect to host
|
|||
super-slim-coffee.com: could not connect to host
|
||||
superbabysitting.ch: could not connect to host
|
||||
superbike.tw: could not connect to host
|
||||
supercentenarian.com: could not connect to host
|
||||
supereight.net: did not receive HSTS header
|
||||
superiorfloridavacation.com: did not receive HSTS header
|
||||
supersalescontest.nl: did not receive HSTS header
|
||||
|
@ -5319,6 +5298,7 @@ tageau.com: could not connect to host
|
|||
taglondon.org: did not receive HSTS header
|
||||
tailify.com: did not receive HSTS header
|
||||
tails.com.ar: did not receive HSTS header
|
||||
talado.gr: could not connect to host
|
||||
tales-of-interia.de: could not connect to host
|
||||
talk.google.com: did not receive HSTS header (error ignored - included regardless)
|
||||
talktwincities.com: could not connect to host
|
||||
|
@ -5441,14 +5421,14 @@ thecharlestonwaldorf.com: did not receive HSTS header
|
|||
theclementinebutchers.com: could not connect to host
|
||||
theclubjersey.com: did not receive HSTS header
|
||||
thecoffeehouse.xyz: could not connect to host
|
||||
thedisc.nl: could not connect to host
|
||||
theelitebuzz.com: did not receive HSTS header
|
||||
theendofzion.com: did not receive HSTS header
|
||||
theescapistswiki.com: could not connect to host
|
||||
theeyeopener.com: did not receive HSTS header
|
||||
thefarbeyond.com: could not connect to host
|
||||
theflowerbasketonline.com: could not connect to host
|
||||
thefootballanalyst.com: did not receive HSTS header
|
||||
thefox.com.fr: max-age too low: 0
|
||||
thefox.com.fr: did not receive HSTS header
|
||||
thefrozenfire.com: did not receive HSTS header
|
||||
thefutureharrills.com: could not connect to host
|
||||
thegcccoin.com: did not receive HSTS header
|
||||
|
@ -5498,11 +5478,12 @@ thomaskliszowski.fr: did not receive HSTS header
|
|||
thomasmeester.nl: did not receive HSTS header
|
||||
thomasschweizer.net: could not connect to host
|
||||
thorncreek.net: did not receive HSTS header
|
||||
thorstenschaefer.name: could not connect to host
|
||||
thriveapproach.co.uk: did not receive HSTS header
|
||||
throughtheglass.photo: could not connect to host
|
||||
thumbtack.com: did not receive HSTS header
|
||||
thusoy.com: did not receive HSTS header
|
||||
ti.blog.br: could not connect to host
|
||||
tianeptine.com: could not connect to host
|
||||
tickettoaster.de: max-age too low: 0
|
||||
tickopa.co.uk: could not connect to host
|
||||
tickreport.com: did not receive HSTS header
|
||||
|
@ -5534,7 +5515,6 @@ timotrans.de: did not receive HSTS header
|
|||
timotrans.eu: did not receive HSTS header
|
||||
timowi.de: could not connect to host
|
||||
timowi.net: could not connect to host
|
||||
timvivian.ca: could not connect to host
|
||||
timwittenberg.com: could not connect to host
|
||||
tipsyk.ru: could not connect to host
|
||||
tirex.media: did not receive HSTS header
|
||||
|
@ -5569,7 +5549,6 @@ tofu.im: could not connect to host
|
|||
togelonlinecommunity.com: did not receive HSTS header
|
||||
tokenloan.com: could not connect to host
|
||||
tokoone.com: did not receive HSTS header
|
||||
tokotamz.net: max-age too low: 0
|
||||
tollmanz.com: did not receive HSTS header
|
||||
tolud.com: could not connect to host
|
||||
tomeara.net: could not connect to host
|
||||
|
@ -5767,6 +5746,7 @@ uprotect.it: could not connect to host
|
|||
upstats.eu: could not connect to host
|
||||
ur-lauber.de: did not receive HSTS header
|
||||
urandom.eu.org: did not receive HSTS header
|
||||
urbanstylestaging.com: could not connect to host
|
||||
urbpic.com: could not connect to host
|
||||
urlchomp.com: did not receive HSTS header
|
||||
urown.net: could not connect to host
|
||||
|
@ -5782,8 +5762,6 @@ usercare.com: did not receive HSTS header
|
|||
userify.com: did not receive HSTS header
|
||||
uslab.io: could not connect to host
|
||||
ustr.gov: max-age too low: 86400
|
||||
utilitarian.com: could not connect to host
|
||||
utilitarianism.com: could not connect to host
|
||||
utilitarianism.net: max-age too low: 0
|
||||
utleieplassen.no: could not connect to host
|
||||
utopiagalaxy.space: could not connect to host
|
||||
|
@ -5806,6 +5784,7 @@ vaddder.com: could not connect to host
|
|||
vadik.me: could not connect to host
|
||||
vaelma.fi: max-age too low: 600
|
||||
valethound.com: could not connect to host
|
||||
valhallamovement.com: could not connect to host
|
||||
valis.sx: could not connect to host
|
||||
valkyrja.xyz: did not receive HSTS header
|
||||
valleyridgepta.org: could not connect to host
|
||||
|
@ -5888,6 +5867,7 @@ vjeff.com: could not connect to host
|
|||
vlastimilburian.cz: did not receive HSTS header
|
||||
vlora.city: could not connect to host
|
||||
vm0.eu: did not receive HSTS header
|
||||
vmgirls.com: did not receive HSTS header
|
||||
vmrdev.com: could not connect to host
|
||||
vmug.pl: could not connect to host
|
||||
voceinveste.com: did not receive HSTS header
|
||||
|
@ -5920,7 +5900,6 @@ w4a.fr: did not receive HSTS header
|
|||
w4xzr.top: could not connect to host
|
||||
w4xzr.xyz: could not connect to host
|
||||
wachtwoordencheck.nl: could not connect to host
|
||||
wafairhaven.com.au: did not receive HSTS header
|
||||
wahhoi.net: could not connect to host
|
||||
waixingrenfuli7.vip: could not connect to host
|
||||
wakapp.de: could not connect to host
|
||||
|
@ -5957,6 +5936,7 @@ web-industry.fr: could not connect to host
|
|||
web-insider.net: did not receive HSTS header
|
||||
web-torrent.com: max-age too low: 0
|
||||
web-vision.de: did not receive HSTS header
|
||||
web-wave.jp: could not connect to host
|
||||
web4all.fr: did not receive HSTS header
|
||||
web4pro.fr: could not connect to host
|
||||
webandwords.com.au: could not connect to host
|
||||
|
@ -5999,7 +5979,7 @@ weme.eu: could not connect to host
|
|||
wendalyncheng.com: did not receive HSTS header
|
||||
werdeeintimo.de: did not receive HSTS header
|
||||
werkenbijkfc.nl: did not receive HSTS header
|
||||
werkplaatsoost.nl: [Exception... "Component returned failure code: 0x80004005 (NS_ERROR_FAILURE) [nsISiteSecurityService.processHeader]" nsresult: "0x80004005 (NS_ERROR_FAILURE)" location: "JS frame :: /builds/slave/m-cen-l64-periodicupdate-00000/getHSTSPreloadList.js :: processStsHeader :: line 118" data: no]
|
||||
werkplaatsoost.nl: did not receive HSTS header
|
||||
werkruimtebottendaal.nl: did not receive HSTS header
|
||||
wesleyharris.ca: did not receive HSTS header
|
||||
westendzone.com: max-age too low: 0
|
||||
|
@ -6076,6 +6056,7 @@ wolfesden.com: could not connect to host
|
|||
womosale.de: could not connect to host
|
||||
wonderfall.xyz: could not connect to host
|
||||
wonderhost.info: could not connect to host
|
||||
wondy.com: could not connect to host
|
||||
woodmafia.com.au: max-age too low: 0
|
||||
woording.com: could not connect to host
|
||||
wootton95.com: could not connect to host
|
||||
|
@ -6098,6 +6079,7 @@ wphostingspot.com: did not receive HSTS header
|
|||
wpmetadatastandardsproject.org: did not receive HSTS header
|
||||
writeapp.me: did not receive HSTS header
|
||||
wrldevelopment.com: did not receive HSTS header
|
||||
wsb-immo.at: could not connect to host
|
||||
wsscompany.com.ve: could not connect to host
|
||||
wubthecaptain.eu: could not connect to host
|
||||
wufu.org: did not receive HSTS header
|
||||
|
@ -6140,6 +6122,7 @@ xandocs.com: could not connect to host
|
|||
xatr0z.org: could not connect to host
|
||||
xavierbarroso.com: could not connect to host
|
||||
xbt.co: could not connect to host
|
||||
xclirion-support.de: could not connect to host
|
||||
xcoop.me: could not connect to host
|
||||
xehoivn.vn: did not receive HSTS header
|
||||
xellos.ga: could not connect to host
|
||||
|
@ -6261,6 +6244,7 @@ ytcuber.xyz: could not connect to host
|
|||
yu.gg: did not receive HSTS header
|
||||
yu7.jp: did not receive HSTS header
|
||||
yuan.ga: did not receive HSTS header
|
||||
yude.ml: could not connect to host
|
||||
yuhen.ru: could not connect to host
|
||||
yuko.moe: could not connect to host
|
||||
yunzhu.li: did not receive HSTS header
|
||||
|
@ -6284,6 +6268,7 @@ zanthra.com: could not connect to host
|
|||
zao.fi: could not connect to host
|
||||
zap.yt: could not connect to host
|
||||
zarooba.com: could not connect to host
|
||||
zary.me: did not receive HSTS header
|
||||
zbigniewgalucki.eu: did not receive HSTS header
|
||||
zcon.nl: could not connect to host
|
||||
zdravotnickainformatika.cz: did not receive HSTS header
|
||||
|
@ -6295,7 +6280,6 @@ zefu.ca: could not connect to host
|
|||
zehntner.ch: could not connect to host
|
||||
zelfstandigemakelaars.net: could not connect to host
|
||||
zenghx.tk: could not connect to host
|
||||
zenhaiku.com: could not connect to host
|
||||
zenpayroll.com: did not receive HSTS header
|
||||
zentraler-kreditausschuss.de: did not receive HSTS header
|
||||
zentralwolke.de: did not receive HSTS header
|
||||
|
@ -6306,6 +6290,7 @@ zerudi.com: did not receive HSTS header
|
|||
zett4.me: could not connect to host
|
||||
zeytin.pro: could not connect to host
|
||||
zh.search.yahoo.com: did not receive HSTS header
|
||||
zhangfangzhou.com: could not connect to host
|
||||
zhangzifan.com: did not receive HSTS header
|
||||
zhaojin97.cn: did not receive HSTS header
|
||||
zhendingresources.com: max-age too low: 0
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -223,20 +223,10 @@ function* testFileAccess() {
|
|||
// for tests that run in a web content process
|
||||
let webBrowser = gBrowser.selectedBrowser;
|
||||
|
||||
// For now, we'll only test file access from the file content process if
|
||||
// the file content process is enabled. Once the file content process is
|
||||
// ready to ride the trains, this test should be changed to always test
|
||||
// file content process access. We use todo() to cause failures
|
||||
// if the file process is enabled on a non-Nightly release so that we'll
|
||||
// know to update this test to always run the tests. i.e., we'll want to
|
||||
// catch bugs that accidentally disable file content process.
|
||||
// Ensure that the file content process is enabled.
|
||||
let fileContentProcessEnabled =
|
||||
prefs.getBoolPref("browser.tabs.remote.separateFileUriProcess");
|
||||
if (isNightly()) {
|
||||
ok(fileContentProcessEnabled, "separate file content process is enabled");
|
||||
} else {
|
||||
todo(fileContentProcessEnabled, "separate file content process is enabled");
|
||||
}
|
||||
ok(fileContentProcessEnabled, "separate file content process is enabled");
|
||||
|
||||
// for tests that run in a file content process
|
||||
let fileBrowser = undefined;
|
||||
|
|
|
@ -1740,7 +1740,6 @@ name = "msg"
|
|||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"bitflags 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cssparser 0.13.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"heapsize_derive 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"serde 0.9.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
|
|
|
@ -2853,8 +2853,8 @@ impl ServoComputedValuesCursorUtility for ServoComputedValues {
|
|||
fn get_cursor(&self, default_cursor: Cursor) -> Option<Cursor> {
|
||||
match (self.get_pointing().pointer_events, self.get_pointing().cursor) {
|
||||
(pointer_events::T::none, _) => None,
|
||||
(pointer_events::T::auto, cursor::Keyword::AutoCursor) => Some(default_cursor),
|
||||
(pointer_events::T::auto, cursor::Keyword::SpecifiedCursor(cursor)) => Some(cursor),
|
||||
(pointer_events::T::auto, cursor::Keyword::Auto) => Some(default_cursor),
|
||||
(pointer_events::T::auto, cursor::Keyword::Cursor(cursor)) => Some(cursor),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,7 +11,6 @@ path = "lib.rs"
|
|||
|
||||
[dependencies]
|
||||
bitflags = "0.7"
|
||||
cssparser = "0.13.3"
|
||||
heapsize = "0.4"
|
||||
heapsize_derive = "0.1"
|
||||
serde = "0.9"
|
||||
|
|
Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше
Загрузка…
Ссылка в новой задаче