MozReview-Commit-ID: LZOwJMXpznP
This commit is contained in:
Wes Kocher 2017-06-09 15:58:08 -07:00
Родитель faf8512e63 b66d50d0ca
Коммит 7462f47787
172 изменённых файлов: 26772 добавлений и 25431 удалений

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

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

169
browser/locales/l10n.toml Normal file
Просмотреть файл

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

1
servo/Cargo.lock сгенерированный
Просмотреть файл

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

Некоторые файлы не были показаны из-за слишком большого количества измененных файлов Показать больше