зеркало из https://github.com/mozilla/gecko-dev.git
Merge m-c to autoland
This commit is contained in:
Коммит
77227d0c91
Двоичный файл не отображается.
|
@ -77,6 +77,7 @@ support-files =
|
|||
[browser_perf-recording-notices-01.js]
|
||||
[browser_perf-recording-notices-02.js]
|
||||
[browser_perf-recording-notices-03.js]
|
||||
skip-if = debug && (bits == 32) # bug 1273374
|
||||
[browser_perf-recording-notices-04.js]
|
||||
[browser_perf-recording-notices-05.js]
|
||||
[browser_perf-recording-selected-01.js]
|
||||
|
|
|
@ -66,7 +66,6 @@ EXPORTS += [
|
|||
'nsDocumentWarningList.h',
|
||||
'nsDOMAttributeMap.h',
|
||||
'nsDOMCID.h',
|
||||
'nsDOMClassInfoClasses.h',
|
||||
'nsDOMClassInfoID.h',
|
||||
'nsDOMJSUtils.h',
|
||||
'nsDOMNavigationTiming.h',
|
||||
|
|
|
@ -1,57 +0,0 @@
|
|||
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
||||
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
||||
/* 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/. */
|
||||
// IWYU pragma: private, include "nsDOMClassInfoID.h"
|
||||
|
||||
DOMCI_CLASS(DOMPrototype)
|
||||
DOMCI_CLASS(DOMConstructor)
|
||||
|
||||
// CSS classes
|
||||
DOMCI_CLASS(CSSStyleRule)
|
||||
DOMCI_CLASS(CSSImportRule)
|
||||
DOMCI_CLASS(CSSMediaRule)
|
||||
DOMCI_CLASS(CSSNameSpaceRule)
|
||||
|
||||
// XUL classes
|
||||
#ifdef MOZ_XUL
|
||||
DOMCI_CLASS(XULCommandDispatcher)
|
||||
#endif
|
||||
DOMCI_CLASS(XULControllers)
|
||||
#ifdef MOZ_XUL
|
||||
DOMCI_CLASS(TreeSelection)
|
||||
DOMCI_CLASS(TreeContentView)
|
||||
#endif
|
||||
|
||||
#ifdef MOZ_XUL
|
||||
DOMCI_CLASS(XULTemplateBuilder)
|
||||
DOMCI_CLASS(XULTreeBuilder)
|
||||
#endif
|
||||
|
||||
DOMCI_CLASS(CSSMozDocumentRule)
|
||||
DOMCI_CLASS(CSSSupportsRule)
|
||||
|
||||
// @font-face in CSS
|
||||
DOMCI_CLASS(CSSFontFaceRule)
|
||||
|
||||
DOMCI_CLASS(ContentFrameMessageManager)
|
||||
DOMCI_CLASS(ContentProcessMessageManager)
|
||||
DOMCI_CLASS(ChromeMessageBroadcaster)
|
||||
DOMCI_CLASS(ChromeMessageSender)
|
||||
|
||||
DOMCI_CLASS(CSSKeyframeRule)
|
||||
DOMCI_CLASS(CSSKeyframesRule)
|
||||
|
||||
// @counter-style in CSS
|
||||
DOMCI_CLASS(CSSCounterStyleRule)
|
||||
|
||||
DOMCI_CLASS(CSSPageRule)
|
||||
|
||||
DOMCI_CLASS(CSSFontFeatureValuesRule)
|
||||
|
||||
DOMCI_CLASS(XULControlElement)
|
||||
DOMCI_CLASS(XULLabeledControlElement)
|
||||
DOMCI_CLASS(XULButtonElement)
|
||||
DOMCI_CLASS(XULCheckboxElement)
|
||||
DOMCI_CLASS(XULPopupElement)
|
|
@ -14,19 +14,63 @@
|
|||
|
||||
#include "nsIXPCScriptable.h"
|
||||
|
||||
#define DOMCI_CLASS(_dom_class) \
|
||||
eDOMClassInfo_##_dom_class##_id,
|
||||
enum nsDOMClassInfoID
|
||||
{
|
||||
eDOMClassInfo_DOMPrototype_id,
|
||||
eDOMClassInfo_DOMConstructor_id,
|
||||
|
||||
enum nsDOMClassInfoID {
|
||||
// CSS classes
|
||||
eDOMClassInfo_CSSStyleRule_id,
|
||||
eDOMClassInfo_CSSImportRule_id,
|
||||
eDOMClassInfo_CSSMediaRule_id,
|
||||
eDOMClassInfo_CSSNameSpaceRule_id,
|
||||
|
||||
#include "nsDOMClassInfoClasses.h"
|
||||
// XUL classes
|
||||
#ifdef MOZ_XUL
|
||||
eDOMClassInfo_XULCommandDispatcher_id,
|
||||
#endif
|
||||
eDOMClassInfo_XULControllers_id,
|
||||
#ifdef MOZ_XUL
|
||||
eDOMClassInfo_TreeSelection_id,
|
||||
eDOMClassInfo_TreeContentView_id,
|
||||
#endif
|
||||
|
||||
#ifdef MOZ_XUL
|
||||
eDOMClassInfo_XULTemplateBuilder_id,
|
||||
eDOMClassInfo_XULTreeBuilder_id,
|
||||
#endif
|
||||
|
||||
eDOMClassInfo_CSSMozDocumentRule_id,
|
||||
eDOMClassInfo_CSSSupportsRule_id,
|
||||
|
||||
// @font-face in CSS
|
||||
eDOMClassInfo_CSSFontFaceRule_id,
|
||||
|
||||
eDOMClassInfo_ContentFrameMessageManager_id,
|
||||
eDOMClassInfo_ContentProcessMessageManager_id,
|
||||
eDOMClassInfo_ChromeMessageBroadcaster_id,
|
||||
eDOMClassInfo_ChromeMessageSender_id,
|
||||
|
||||
eDOMClassInfo_CSSKeyframeRule_id,
|
||||
eDOMClassInfo_CSSKeyframesRule_id,
|
||||
|
||||
// @counter-style in CSS
|
||||
eDOMClassInfo_CSSCounterStyleRule_id,
|
||||
|
||||
eDOMClassInfo_CSSPageRule_id,
|
||||
|
||||
eDOMClassInfo_CSSFontFeatureValuesRule_id,
|
||||
|
||||
eDOMClassInfo_XULControlElement_id,
|
||||
eDOMClassInfo_XULLabeledControlElement_id,
|
||||
eDOMClassInfo_XULButtonElement_id,
|
||||
eDOMClassInfo_XULCheckboxElement_id,
|
||||
eDOMClassInfo_XULPopupElement_id,
|
||||
|
||||
// This one better be the last one in this list
|
||||
eDOMClassInfoIDCount
|
||||
};
|
||||
|
||||
#undef DOMCI_CLASS
|
||||
|
||||
/**
|
||||
* nsIClassInfo helper macros
|
||||
*/
|
||||
|
|
|
@ -137,7 +137,7 @@ skip-if = os == 'android' # bug 1043403
|
|||
tags=capturestream
|
||||
skip-if = android_version == '18' # android(Bug 1189784, timeouts on 4.3 emulator)
|
||||
[test_peerConnection_captureStream_canvas_2d.html]
|
||||
skip-if = (android_version == '18' && debug) # android(Bug 1189784, timeouts on 4.3 emulator)
|
||||
skip-if = android_version == '18' # android(Bug 1319019, timeouts on 4.3 emulator)
|
||||
[test_peerConnection_multiple_captureStream_canvas_2d.html]
|
||||
skip-if = (android_version == '18' && debug) # android(Bug 1189784, timeouts on 4.3 emulator)
|
||||
[test_peerConnection_captureStream_canvas_webgl.html]
|
||||
|
|
|
@ -81,6 +81,7 @@ var testObserver = {
|
|||
// Check and cleanup CrashManager.
|
||||
Task.spawn(function* () {
|
||||
let cm = Services.crashmanager;
|
||||
yield cm.ensureCrashIsPresent(crashID);
|
||||
let store = yield cm._getStore();
|
||||
is(store.crashesCount, 1, "Store should have only 1 item");
|
||||
|
||||
|
|
|
@ -89,6 +89,7 @@ var testObserver = {
|
|||
// Check and cleanup CrashManager.
|
||||
Task.spawn(function* () {
|
||||
let cm = Services.crashmanager;
|
||||
yield cm.ensureCrashIsPresent(crashID);
|
||||
let store = yield cm._getStore();
|
||||
is(store.crashesCount, 1, "Store should have only 1 item");
|
||||
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
Path: 44
|
||||
URL: https://ssl.icu-project.org/repos/icu/data/trunk/tzdata/icunew/2016i/44
|
||||
Relative URL: ^/data/trunk/tzdata/icunew/2016i/44
|
||||
URL: https://ssl.icu-project.org/repos/icu/data/trunk/tzdata/icunew/2016j/44
|
||||
Relative URL: ^/data/trunk/tzdata/icunew/2016j/44
|
||||
Repository Root: https://ssl.icu-project.org/repos/icu
|
||||
Repository UUID: 251d0590-4201-4cf1-90de-194747b24ca1
|
||||
Node Kind: directory
|
||||
Last Changed Author: yoshito
|
||||
Last Changed Rev: 39498
|
||||
Last Changed Date: 2016-11-03 18:10:26 +0000 (Thu, 03 Nov 2016)
|
||||
Last Changed Rev: 39512
|
||||
Last Changed Date: 2016-11-29 08:30:43 +0000 (Di, 29 Nov 2016)
|
||||
|
||||
|
|
Двоичные данные
intl/tzdata/source/be/metaZones.res
Двоичные данные
intl/tzdata/source/be/metaZones.res
Двоичный файл не отображается.
Двоичные данные
intl/tzdata/source/be/timezoneTypes.res
Двоичные данные
intl/tzdata/source/be/timezoneTypes.res
Двоичный файл не отображается.
Двоичные данные
intl/tzdata/source/be/windowsZones.res
Двоичные данные
intl/tzdata/source/be/windowsZones.res
Двоичный файл не отображается.
Двоичные данные
intl/tzdata/source/be/zoneinfo64.res
Двоичные данные
intl/tzdata/source/be/zoneinfo64.res
Двоичный файл не отображается.
Двоичные данные
intl/tzdata/source/ee/metaZones.res
Двоичные данные
intl/tzdata/source/ee/metaZones.res
Двоичный файл не отображается.
Двоичные данные
intl/tzdata/source/ee/timezoneTypes.res
Двоичные данные
intl/tzdata/source/ee/timezoneTypes.res
Двоичный файл не отображается.
Двоичные данные
intl/tzdata/source/ee/windowsZones.res
Двоичные данные
intl/tzdata/source/ee/windowsZones.res
Двоичный файл не отображается.
Двоичные данные
intl/tzdata/source/ee/zoneinfo64.res
Двоичные данные
intl/tzdata/source/ee/zoneinfo64.res
Двоичный файл не отображается.
Двоичные данные
intl/tzdata/source/le/metaZones.res
Двоичные данные
intl/tzdata/source/le/metaZones.res
Двоичный файл не отображается.
Двоичные данные
intl/tzdata/source/le/timezoneTypes.res
Двоичные данные
intl/tzdata/source/le/timezoneTypes.res
Двоичный файл не отображается.
Двоичные данные
intl/tzdata/source/le/windowsZones.res
Двоичные данные
intl/tzdata/source/le/windowsZones.res
Двоичный файл не отображается.
Двоичные данные
intl/tzdata/source/le/zoneinfo64.res
Двоичные данные
intl/tzdata/source/le/zoneinfo64.res
Двоичный файл не отображается.
|
@ -2689,6 +2689,13 @@ metaZones:table(nofallback){
|
|||
"9999-12-31 23:59",
|
||||
}
|
||||
}
|
||||
"Asia:Atyrau"{
|
||||
{
|
||||
"Kazakhstan_Western",
|
||||
"2004-10-30 22:00",
|
||||
"9999-12-31 23:59",
|
||||
}
|
||||
}
|
||||
"Asia:Baghdad"{
|
||||
{
|
||||
"Arabian",
|
||||
|
@ -3807,6 +3814,13 @@ metaZones:table(nofallback){
|
|||
"Europe_Central",
|
||||
}
|
||||
}
|
||||
"Europe:Saratov"{
|
||||
{
|
||||
"Moscow",
|
||||
"1992-03-28 22:00",
|
||||
"2016-12-03 23:00",
|
||||
}
|
||||
}
|
||||
"Europe:Simferopol"{
|
||||
{
|
||||
"Moscow",
|
||||
|
|
|
@ -366,6 +366,7 @@ timezoneTypes:table(nofallback){
|
|||
"Asia:Aqtau"{"kzaau"}
|
||||
"Asia:Aqtobe"{"kzakx"}
|
||||
"Asia:Ashgabat"{"tmasb"}
|
||||
"Asia:Atyrau"{"kzguw"}
|
||||
"Asia:Baghdad"{"iqbgw"}
|
||||
"Asia:Bahrain"{"bhbah"}
|
||||
"Asia:Baku"{"azbak"}
|
||||
|
@ -532,6 +533,7 @@ timezoneTypes:table(nofallback){
|
|||
"Europe:Samara"{"rukuf"}
|
||||
"Europe:San_Marino"{"smsai"}
|
||||
"Europe:Sarajevo"{"basjj"}
|
||||
"Europe:Saratov"{"rurtw"}
|
||||
"Europe:Simferopol"{"uasip"}
|
||||
"Europe:Skopje"{"mkskp"}
|
||||
"Europe:Sofia"{"bgsof"}
|
||||
|
|
|
@ -58,7 +58,7 @@ windowsZones:table(nofallback){
|
|||
}
|
||||
"Astrakhan Standard Time"{
|
||||
001{"Europe/Astrakhan"}
|
||||
RU{"Europe/Astrakhan Europe/Ulyanovsk"}
|
||||
RU{"Europe/Astrakhan Europe/Saratov Europe/Ulyanovsk"}
|
||||
}
|
||||
"Atlantic Standard Time"{
|
||||
001{"America/Halifax"}
|
||||
|
@ -717,7 +717,6 @@ windowsZones:table(nofallback){
|
|||
}
|
||||
"W. Australia Standard Time"{
|
||||
001{"Australia/Perth"}
|
||||
AQ{"Antarctica/Casey"}
|
||||
AU{"Australia/Perth"}
|
||||
}
|
||||
"W. Central Africa Standard Time"{
|
||||
|
@ -763,7 +762,7 @@ windowsZones:table(nofallback){
|
|||
"West Asia Standard Time"{
|
||||
001{"Asia/Tashkent"}
|
||||
AQ{"Antarctica/Mawson"}
|
||||
KZ{"Asia/Oral Asia/Aqtau Asia/Aqtobe"}
|
||||
KZ{"Asia/Oral Asia/Aqtau Asia/Aqtobe Asia/Atyrau"}
|
||||
MV{"Indian/Maldives"}
|
||||
TF{"Indian/Kerguelen"}
|
||||
TJ{"Asia/Dushanbe"}
|
||||
|
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -21,6 +21,7 @@
|
|||
#include "jsatom.h"
|
||||
#include "jscntxt.h"
|
||||
#include "jsobj.h"
|
||||
#include "jsstr.h"
|
||||
|
||||
#include "builtin/IntlTimeZoneData.h"
|
||||
#if ENABLE_INTL_API
|
||||
|
@ -1117,10 +1118,10 @@ NewUCollator(JSContext* cx, HandleObject collator)
|
|||
|
||||
if (!GetProperty(cx, internals, internals, cx->names().usage, &value))
|
||||
return nullptr;
|
||||
JSAutoByteString usage(cx, value.toString());
|
||||
JSLinearString* usage = value.toString()->ensureLinear(cx);
|
||||
if (!usage)
|
||||
return nullptr;
|
||||
if (equal(usage, "search")) {
|
||||
if (StringEqualsAscii(usage, "search")) {
|
||||
// ICU expects search as a Unicode locale extension on locale.
|
||||
// Unicode locale extensions must occur before private use extensions.
|
||||
const char* oldLocale = locale.ptr();
|
||||
|
@ -1148,6 +1149,8 @@ NewUCollator(JSContext* cx, HandleObject collator)
|
|||
memcpy(newLocale + index + insertLen, oldLocale + index, localeLen - index + 1); // '\0'
|
||||
locale.clear();
|
||||
locale.initBytes(newLocale);
|
||||
} else {
|
||||
MOZ_ASSERT(StringEqualsAscii(usage, "sort"));
|
||||
}
|
||||
|
||||
// We don't need to look at the collation property - it can only be set
|
||||
|
@ -1156,18 +1159,18 @@ NewUCollator(JSContext* cx, HandleObject collator)
|
|||
|
||||
if (!GetProperty(cx, internals, internals, cx->names().sensitivity, &value))
|
||||
return nullptr;
|
||||
JSAutoByteString sensitivity(cx, value.toString());
|
||||
JSLinearString* sensitivity = value.toString()->ensureLinear(cx);
|
||||
if (!sensitivity)
|
||||
return nullptr;
|
||||
if (equal(sensitivity, "base")) {
|
||||
if (StringEqualsAscii(sensitivity, "base")) {
|
||||
uStrength = UCOL_PRIMARY;
|
||||
} else if (equal(sensitivity, "accent")) {
|
||||
} else if (StringEqualsAscii(sensitivity, "accent")) {
|
||||
uStrength = UCOL_SECONDARY;
|
||||
} else if (equal(sensitivity, "case")) {
|
||||
} else if (StringEqualsAscii(sensitivity, "case")) {
|
||||
uStrength = UCOL_PRIMARY;
|
||||
uCaseLevel = UCOL_ON;
|
||||
} else {
|
||||
MOZ_ASSERT(equal(sensitivity, "variant"));
|
||||
MOZ_ASSERT(StringEqualsAscii(sensitivity, "variant"));
|
||||
uStrength = UCOL_TERTIARY;
|
||||
}
|
||||
|
||||
|
@ -1189,15 +1192,15 @@ NewUCollator(JSContext* cx, HandleObject collator)
|
|||
if (!GetProperty(cx, internals, internals, cx->names().caseFirst, &value))
|
||||
return nullptr;
|
||||
if (!value.isUndefined()) {
|
||||
JSAutoByteString caseFirst(cx, value.toString());
|
||||
JSLinearString* caseFirst = value.toString()->ensureLinear(cx);
|
||||
if (!caseFirst)
|
||||
return nullptr;
|
||||
if (equal(caseFirst, "upper"))
|
||||
if (StringEqualsAscii(caseFirst, "upper"))
|
||||
uCaseFirst = UCOL_UPPER_FIRST;
|
||||
else if (equal(caseFirst, "lower"))
|
||||
else if (StringEqualsAscii(caseFirst, "lower"))
|
||||
uCaseFirst = UCOL_LOWER_FIRST;
|
||||
else
|
||||
MOZ_ASSERT(equal(caseFirst, "false"));
|
||||
MOZ_ASSERT(StringEqualsAscii(caseFirst, "false"));
|
||||
}
|
||||
|
||||
UErrorCode status = U_ZERO_ERROR;
|
||||
|
@ -1599,11 +1602,11 @@ NewUNumberFormat(JSContext* cx, HandleObject numberFormat)
|
|||
|
||||
if (!GetProperty(cx, internals, internals, cx->names().style, &value))
|
||||
return nullptr;
|
||||
JSAutoByteString style(cx, value.toString());
|
||||
JSLinearString* style = value.toString()->ensureLinear(cx);
|
||||
if (!style)
|
||||
return nullptr;
|
||||
|
||||
if (equal(style, "currency")) {
|
||||
if (StringEqualsAscii(style, "currency")) {
|
||||
if (!GetProperty(cx, internals, internals, cx->names().currency, &value))
|
||||
return nullptr;
|
||||
currency = value.toString();
|
||||
|
@ -1616,21 +1619,21 @@ NewUNumberFormat(JSContext* cx, HandleObject numberFormat)
|
|||
|
||||
if (!GetProperty(cx, internals, internals, cx->names().currencyDisplay, &value))
|
||||
return nullptr;
|
||||
JSAutoByteString currencyDisplay(cx, value.toString());
|
||||
JSLinearString* currencyDisplay = value.toString()->ensureLinear(cx);
|
||||
if (!currencyDisplay)
|
||||
return nullptr;
|
||||
if (equal(currencyDisplay, "code")) {
|
||||
if (StringEqualsAscii(currencyDisplay, "code")) {
|
||||
uStyle = UNUM_CURRENCY_ISO;
|
||||
} else if (equal(currencyDisplay, "symbol")) {
|
||||
} else if (StringEqualsAscii(currencyDisplay, "symbol")) {
|
||||
uStyle = UNUM_CURRENCY;
|
||||
} else {
|
||||
MOZ_ASSERT(equal(currencyDisplay, "name"));
|
||||
MOZ_ASSERT(StringEqualsAscii(currencyDisplay, "name"));
|
||||
uStyle = UNUM_CURRENCY_PLURAL;
|
||||
}
|
||||
} else if (equal(style, "percent")) {
|
||||
} else if (StringEqualsAscii(style, "percent")) {
|
||||
uStyle = UNUM_PERCENT;
|
||||
} else {
|
||||
MOZ_ASSERT(equal(style, "decimal"));
|
||||
MOZ_ASSERT(StringEqualsAscii(style, "decimal"));
|
||||
uStyle = UNUM_DECIMAL;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
// Generated by make_intl_data.py. DO NOT EDIT.
|
||||
// tzdata version = 2016i
|
||||
// tzdata version = 2016j
|
||||
|
||||
#ifndef builtin_IntlTimeZoneData_h
|
||||
#define builtin_IntlTimeZoneData_h
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// |reftest| skip-if(!this.hasOwnProperty("Intl"))
|
||||
|
||||
// Generated by make_intl_data.py. DO NOT EDIT.
|
||||
// tzdata version = 2016i
|
||||
// tzdata version = 2016j
|
||||
|
||||
const tzMapper = [
|
||||
x => x,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// |reftest| skip-if(!this.hasOwnProperty("Intl"))
|
||||
|
||||
// Generated by make_intl_data.py. DO NOT EDIT.
|
||||
// tzdata version = 2016i
|
||||
// tzdata version = 2016j
|
||||
|
||||
const tzMapper = [
|
||||
x => x,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// |reftest| skip-if(!this.hasOwnProperty("Intl"))
|
||||
|
||||
// Generated by make_intl_data.py. DO NOT EDIT.
|
||||
// tzdata version = 2016i
|
||||
// tzdata version = 2016j
|
||||
|
||||
const tzMapper = [
|
||||
x => x,
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
// |reftest| skip-if(!this.hasOwnProperty("Intl"))
|
||||
|
||||
// Generated by make_intl_data.py. DO NOT EDIT.
|
||||
// tzdata version = 2016i
|
||||
// tzdata version = 2016j
|
||||
|
||||
const tzMapper = [
|
||||
x => x,
|
||||
|
|
|
@ -7,15 +7,15 @@
|
|||
const {classes: Cc, interfaces: Ci, utils: Cu} = Components;
|
||||
const myScope = this;
|
||||
|
||||
Cu.import("resource://gre/modules/KeyValueParser.jsm");
|
||||
Cu.import("resource://gre/modules/Log.jsm", this);
|
||||
Cu.import("resource://gre/modules/osfile.jsm", this);
|
||||
Cu.import("resource://gre/modules/Promise.jsm", this);
|
||||
Cu.import("resource://gre/modules/PromiseUtils.jsm");
|
||||
Cu.import("resource://gre/modules/Services.jsm", this);
|
||||
Cu.import("resource://gre/modules/Task.jsm", this);
|
||||
Cu.import("resource://gre/modules/TelemetryController.jsm");
|
||||
Cu.import("resource://gre/modules/Timer.jsm", this);
|
||||
Cu.import("resource://gre/modules/XPCOMUtils.jsm", this);
|
||||
Cu.import("resource://gre/modules/TelemetryController.jsm");
|
||||
Cu.import("resource://gre/modules/KeyValueParser.jsm");
|
||||
|
||||
this.EXPORTED_SYMBOLS = [
|
||||
"CrashManager",
|
||||
|
@ -111,6 +111,9 @@ this.CrashManager = function(options) {
|
|||
// object so it can be returned for in-progress operations.
|
||||
this._aggregatePromise = null;
|
||||
|
||||
// Map of crash ID / promise tuples used to track adding new crashes.
|
||||
this._crashPromises = new Map();
|
||||
|
||||
// The CrashStore currently attached to this object.
|
||||
this._store = null;
|
||||
|
||||
|
@ -345,7 +348,7 @@ this.CrashManager.prototype = Object.freeze({
|
|||
* (integer) Delay in milliseconds when maintenance should occur.
|
||||
*/
|
||||
scheduleMaintenance: function(delay) {
|
||||
let deferred = Promise.defer();
|
||||
let deferred = PromiseUtils.defer();
|
||||
|
||||
setTimeout(() => {
|
||||
this.runMaintenanceTasks().then(deferred.resolve, deferred.reject);
|
||||
|
@ -369,14 +372,45 @@ this.CrashManager.prototype = Object.freeze({
|
|||
* @return promise<null> Resolved when the store has been saved.
|
||||
*/
|
||||
addCrash: function(processType, crashType, id, date, metadata) {
|
||||
return Task.spawn(function* () {
|
||||
let promise = Task.spawn(function* () {
|
||||
let store = yield this._getStore();
|
||||
if (store.addCrash(processType, crashType, id, date, metadata)) {
|
||||
yield store.save();
|
||||
}
|
||||
|
||||
let deferred = this._crashPromises.get(id);
|
||||
|
||||
if (deferred) {
|
||||
this._crashPromises.delete(id);
|
||||
deferred.resolve();
|
||||
}
|
||||
}.bind(this));
|
||||
|
||||
return promise;
|
||||
},
|
||||
|
||||
/**
|
||||
* Returns a promise that is resolved only the crash with the specified id
|
||||
* has been fully recorded.
|
||||
*
|
||||
* @param id (string) Crash ID. Likely a UUID.
|
||||
*
|
||||
* @return promise<null> Resolved when the crash is present.
|
||||
*/
|
||||
ensureCrashIsPresent: Task.async(function* (id) {
|
||||
let store = yield this._getStore();
|
||||
let crash = store.getCrash(id);
|
||||
|
||||
if (crash) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
let deferred = PromiseUtils.defer();
|
||||
|
||||
this._crashPromises.set(id, deferred);
|
||||
return deferred.promise;
|
||||
}),
|
||||
|
||||
/**
|
||||
* Record the remote ID for a crash.
|
||||
*
|
||||
|
|
|
@ -474,6 +474,36 @@ add_task(function* test_addSubmissionAttemptAndResult() {
|
|||
Assert.equal(submission.result, m.SUBMISSION_RESULT_OK);
|
||||
});
|
||||
|
||||
add_task(function* test_addSubmissionAttemptEarlyCall() {
|
||||
let m = yield getManager();
|
||||
|
||||
let crashes = yield m.getCrashes();
|
||||
Assert.equal(crashes.length, 0);
|
||||
|
||||
let p = m.ensureCrashIsPresent("main-crash").then(() => {
|
||||
return m.addSubmissionAttempt("main-crash", "submission", DUMMY_DATE);
|
||||
}).then(() => {
|
||||
return m.addSubmissionResult("main-crash", "submission", DUMMY_DATE_2,
|
||||
m.SUBMISSION_RESULT_OK);
|
||||
});
|
||||
|
||||
yield m.addCrash(m.PROCESS_TYPE_MAIN, m.CRASH_TYPE_CRASH,
|
||||
"main-crash", DUMMY_DATE);
|
||||
|
||||
crashes = yield m.getCrashes();
|
||||
Assert.equal(crashes.length, 1);
|
||||
|
||||
yield p;
|
||||
let submissions = crashes[0].submissions;
|
||||
Assert.ok(!!submissions);
|
||||
|
||||
let submission = submissions.get("submission");
|
||||
Assert.ok(!!submission);
|
||||
Assert.equal(submission.requestDate.getTime(), DUMMY_DATE.getTime());
|
||||
Assert.equal(submission.responseDate.getTime(), DUMMY_DATE_2.getTime());
|
||||
Assert.equal(submission.result, m.SUBMISSION_RESULT_OK);
|
||||
});
|
||||
|
||||
add_task(function* test_setCrashClassifications() {
|
||||
let m = yield getManager();
|
||||
|
||||
|
|
|
@ -308,31 +308,38 @@ Submitter.prototype = {
|
|||
let ret =
|
||||
xhr.status == 200 ? parseKeyValuePairs(xhr.responseText) : {};
|
||||
let submitted = !!ret.CrashID;
|
||||
let p = Promise.resolve();
|
||||
|
||||
if (this.recordSubmission) {
|
||||
let result = submitted ? manager.SUBMISSION_RESULT_OK :
|
||||
manager.SUBMISSION_RESULT_FAILED;
|
||||
manager.addSubmissionResult(this.id, submissionID, new Date(),
|
||||
p = manager.addSubmissionResult(this.id, submissionID, new Date(),
|
||||
result);
|
||||
if (submitted) {
|
||||
manager.setRemoteCrashID(this.id, ret.CrashID);
|
||||
}
|
||||
}
|
||||
|
||||
p.then(() => {
|
||||
if (submitted) {
|
||||
this.submitSuccess(ret);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
this.notifyStatus(FAILED);
|
||||
this.cleanup();
|
||||
}
|
||||
});
|
||||
}
|
||||
}, false);
|
||||
|
||||
let p = Promise.resolve();
|
||||
let id = this.id;
|
||||
|
||||
if (this.recordSubmission) {
|
||||
manager.addSubmissionAttempt(this.id, submissionID, new Date());
|
||||
p = manager.ensureCrashIsPresent(id).then(() => {
|
||||
return manager.addSubmissionAttempt(id, submissionID, new Date());
|
||||
});
|
||||
}
|
||||
xhr.send(formData);
|
||||
p.then(() => { xhr.send(formData); });
|
||||
return true;
|
||||
},
|
||||
|
||||
|
|
Загрузка…
Ссылка в новой задаче