Merge m-c to autoland, a=merge

MozReview-Commit-ID: D76dMYwFRUQ
This commit is contained in:
Wes Kocher 2017-02-09 17:06:59 -08:00
Родитель 491c27f9ae d3307f19d5
Коммит 30d9ef4d29
366 изменённых файлов: 19441 добавлений и 19005 удалений

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

@ -569,25 +569,12 @@ var Output = {
}
},
get androidBridge() {
delete this.androidBridge;
if (Utils.MozBuildApp === 'mobile/android') {
this.androidBridge = Services.androidBridge;
} else {
this.androidBridge = null;
}
return this.androidBridge;
},
Android: function Android(aDetails, aBrowser) {
const ANDROID_VIEW_TEXT_CHANGED = 0x10;
const ANDROID_VIEW_TEXT_SELECTION_CHANGED = 0x2000;
if (!this.androidBridge) {
return;
}
for (let androidEvent of aDetails) {
androidEvent.type = 'Accessibility:Event';
if (androidEvent.bounds) {
androidEvent.bounds = AccessFu.adjustContentBounds(
androidEvent.bounds, aBrowser);
@ -607,9 +594,8 @@ var Output = {
androidEvent.brailleOutput);
break;
}
let win = Utils.win;
let view = win && win.QueryInterface(Ci.nsIAndroidView);
view.dispatch('Accessibility:Event', androidEvent);
Utils.win.WindowEventDispatcher.sendRequest(androidEvent);
}
},
@ -805,9 +791,7 @@ var Input = {
if (Utils.MozBuildApp == 'mobile/android') {
// Return focus to native Android browser chrome.
let win = Utils.win;
let view = win && win.QueryInterface(Ci.nsIAndroidView);
view.dispatch('ToggleChrome:Focus');
Utils.win.WindowEventDispatcher.dispatch('ToggleChrome:Focus');
}
break;
case aEvent.DOM_VK_RETURN:

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

@ -315,7 +315,7 @@ AndroidPresenter.prototype.actionInvoked =
// Checkable objects use TalkBack's text derived from the event state,
// so we don't populate the text here.
let text = '';
let text = null;
if (!state.contains(States.CHECKABLE)) {
text = Utils.localize(UtteranceGenerator.genForAction(aObject,
aActionName));

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

@ -492,7 +492,6 @@
@RESPATH@/components/nsWebHandlerApp.js
@RESPATH@/components/satchel.manifest
@RESPATH@/components/nsFormAutoComplete.js
@RESPATH@/components/nsFormHistory.js
@RESPATH@/components/FormHistoryStartup.js
@RESPATH@/components/nsInputListAutoComplete.js
@RESPATH@/components/formautofill.manifest

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

@ -2143,12 +2143,16 @@
<versionRange maxVersion="13.0.0.302" minVersion="13.0.0.302" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
<pluginItem blockID="p1495" os="Linux">
<match exp="" name="name"/>
<match exp="libflashplayer\.so" name="filename"/>
<match exp="" name="description"/>
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="24.0.0.186" minVersion="23.0.0.207" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
<pluginItem blockID="p1420">
<pluginItem blockID="p1420" os="">
<match exp="" name="name"/>
<match exp="(NPSWF32.*\.dll)|(NPSWF64.*\.dll)|(Flash\ Player\.plugin)" name="filename"/>
<match exp="" name="description"/>
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="23.0.0.205" minVersion="23.0.0.185" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
@ -2202,7 +2206,9 @@
<versionRange maxVersion="*" minVersion="0"/>
</pluginItem>
<pluginItem blockID="p1419" os="Linux">
<match exp="" name="name"/>
<match exp="libflashplayer\.so" name="filename"/>
<match exp="" name="description"/>
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="11.2.202.643" minVersion="11.2.202.637" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
@ -2459,8 +2465,10 @@
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="18.0.0.232" minVersion="18.0.0.204" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
<pluginItem blockID="p1274">
<pluginItem blockID="p1274" os="">
<match exp="" name="name"/>
<match exp="(NPSWF32.*\.dll)|(NPSWF64.*\.dll)|(Flash\ Player\.plugin)" name="filename"/>
<match exp="" name="description"/>
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="22.0.0.211" minVersion="22.0.0.192" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
@ -2571,8 +2579,10 @@
</targetApplication>
</versionRange>
</pluginItem>
<pluginItem blockID="p1494">
<pluginItem blockID="p1494" os="">
<match exp="" name="name"/>
<match exp="(NPSWF32.*\.dll)|(NPSWF64.*\.dll)|(Flash\ Player\.plugin)" name="filename"/>
<match exp="" name="description"/>
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="24.0.0.186" minVersion="23.0.0.207" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
@ -2640,8 +2650,10 @@
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="18.0.0.352" minVersion="18.0.0.343" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
<pluginItem blockID="p160">
<pluginItem blockID="p160" os="">
<match exp="" name="name"/>
<match exp="NPSWF32\.dll" name="filename"/>
<match exp="" name="description"/>
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="10.2.9999" minVersion="0" severity="0" vulnerabilitystatus="1">
<targetApplication id="{ec8030f7-c20a-464f-9b0e-13a3a9e97384}">
@ -2810,7 +2822,9 @@
<match exp="NPFFAddOn.dll" name="filename"/>
</pluginItem>
<pluginItem blockID="p1421" os="Linux">
<match exp="" name="name"/>
<match exp="libflashplayer\.so" name="filename"/>
<match exp="" name="description"/>
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="23.0.0.207" minVersion="11.2.202.643" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
@ -3006,8 +3020,10 @@
<infoURL>https://get.adobe.com/reader</infoURL>
<versionRange maxVersion="15.006.30174" minVersion="15.006.30174" severity="0" vulnerabilitystatus="1"/>
</pluginItem>
<pluginItem blockID="p1422">
<pluginItem blockID="p1422" os="">
<match exp="" name="name"/>
<match exp="(NPSWF32.*\.dll)|(NPSWF64.*\.dll)|(Flash\ Player\.plugin)" name="filename"/>
<match exp="" name="description"/>
<infoURL>https://get.adobe.com/flashplayer/</infoURL>
<versionRange maxVersion="23.0.0.207" minVersion="23.0.0.205" severity="0" vulnerabilitystatus="1"/>
</pluginItem>

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

@ -1,9 +1,8 @@
/* Any copyright is dedicated to the Public Domain.
http://creativecommons.org/publicdomain/zero/1.0/ */
// This test checks that a <select> with an <optgroup> opens and can be navigated
// in a child process. This is different than single-process as a <menulist> is used
// to implement the dropdown list.
// This test tests <select> in a child process. This is different than
// single-process as a <menulist> is used to implement the dropdown list.
requestLongerTimeout(2);
@ -851,3 +850,35 @@ add_task(function* test_colors_applied_to_popup() {
yield hideSelectPopup(selectPopup, "escape");
yield BrowserTestUtils.removeTab(tab);
});
// This test checks that the popup is closed when the select element is blurred.
add_task(function* test_blur_hides_popup() {
const pageUrl = "data:text/html," + escape(PAGECONTENT_SMALL);
let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, pageUrl);
yield ContentTask.spawn(tab.linkedBrowser, null, function*() {
content.addEventListener("blur", function(event) {
event.preventDefault();
event.stopPropagation();
}, true);
content.document.getElementById("one").focus();
});
let menulist = document.getElementById("ContentSelectDropdown");
let selectPopup = menulist.menupopup;
yield openSelectPopup(selectPopup);
let popupHiddenPromise = BrowserTestUtils.waitForEvent(selectPopup, "popuphidden");
yield ContentTask.spawn(tab.linkedBrowser, null, function*() {
content.document.getElementById("one").blur();
});
yield popupHiddenPromise;
ok(true, "Blur closed popup");
yield BrowserTestUtils.removeTab(tab);
});

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

@ -33,9 +33,10 @@
"size": 1020700
},
{
"size": 57060,
"version": "https://github.com/andreas56/libdmg-hfsplus rev 81dd75fd1549b24bf8af9736ac25518b367e6b63",
"size": 62032,
"visibility": "public",
"digest": "9649ca595f4cf088d118da26201f92cc94cda7af49c7c48112ee31cd13c83b2935b3e145de9dd78060cff2480b4c2e7ff5fb24235876956fed13c87852071998",
"digest": "9073c41034784eb8823ec817aed42bbc65c8da63ad3fac572726fa48b36320ee302ca8f51b23576e7fdbeec6ab300610d0c58bbd9c52024577dfdb13d95aa2ec",
"algorithm": "sha512",
"unpack": true,
"filename": "dmg.tar.xz"

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

@ -465,7 +465,6 @@
@RESPATH@/components/nsWebHandlerApp.js
@RESPATH@/components/satchel.manifest
@RESPATH@/components/nsFormAutoComplete.js
@RESPATH@/components/nsFormHistory.js
@RESPATH@/components/FormHistoryStartup.js
@RESPATH@/components/nsInputListAutoComplete.js
@RESPATH@/components/formautofill.manifest

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

@ -10,6 +10,8 @@
"use strict";
const EventEmitter = require("devtools/shared/event-emitter");
const {colorUtils} = require("devtools/shared/css/color");
const XHTML_NS = "http://www.w3.org/1999/xhtml";
/**
@ -63,8 +65,35 @@ function ColorWidget(parentEl, rgb) {
<div class="colorwidget-alpha-handle colorwidget-slider-control"></div>
</div>
</div>
<div class="colorwidget-value">
<select class="colorwidget-select">
<option value="hex">Hex</option>
<option value="rgba">RGBA</option>
<option value="hsla">HSLA</option>
</select>
<div class="colorwidget-hex">
<input class="colorwidget-hex-input"/>
</div>
<div class="colorwidget-rgba colorwidget-hidden">
<input class="colorwidget-rgba-r" data-id="r" />
<input class="colorwidget-rgba-g" data-id="g" />
<input class="colorwidget-rgba-b" data-id="b" />
<input class="colorwidget-rgba-a" data-id="a" />
</div>
<div class="colorwidget-hsla colorwidget-hidden">
<input class="colorwidget-hsla-h" data-id="h" />
<input class="colorwidget-hsla-s" data-id="s" />
<input class="colorwidget-hsla-l" data-id="l" />
<input class="colorwidget-hsla-a" data-id="a" />
</div>
</div>
`;
this.onSelectValueChange = this.onSelectValueChange.bind(this);
this.onHexInputChange = this.onHexInputChange.bind(this);
this.onRgbaInputChange = this.onRgbaInputChange.bind(this);
this.onHslaInputChange = this.onHslaInputChange.bind(this);
this.onElementClick = this.onElementClick.bind(this);
this.element.addEventListener("click", this.onElementClick);
@ -83,6 +112,31 @@ function ColorWidget(parentEl, rgb) {
this.alphaSliderHelper = this.element.querySelector(".colorwidget-alpha-handle");
ColorWidget.draggable(this.alphaSliderInner, this.onAlphaSliderMove.bind(this));
this.colorSelect = this.element.querySelector(".colorwidget-select");
this.colorSelect.addEventListener("change", this.onSelectValueChange);
this.hexValue = this.element.querySelector(".colorwidget-hex");
this.hexValueInput = this.element.querySelector(".colorwidget-hex-input");
this.hexValueInput.addEventListener("input", this.onHexInputChange);
this.rgbaValue = this.element.querySelector(".colorwidget-rgba");
this.rgbaValueInputs = {
r: this.element.querySelector(".colorwidget-rgba-r"),
g: this.element.querySelector(".colorwidget-rgba-g"),
b: this.element.querySelector(".colorwidget-rgba-b"),
a: this.element.querySelector(".colorwidget-rgba-a"),
};
this.rgbaValue.addEventListener("input", this.onRgbaInputChange);
this.hslaValue = this.element.querySelector(".colorwidget-hsla");
this.hslaValueInputs = {
h: this.element.querySelector(".colorwidget-hsla-h"),
s: this.element.querySelector(".colorwidget-hsla-s"),
l: this.element.querySelector(".colorwidget-hsla-l"),
a: this.element.querySelector(".colorwidget-hsla-a"),
};
this.hslaValue.addEventListener("input", this.onHslaInputChange);
if (rgb) {
this.rgb = rgb;
this.updateUI();
@ -137,6 +191,10 @@ ColorWidget.rgbToHsv = function (r, g, b, a) {
return [h, s, v, a];
};
ColorWidget.hslToCssString = function (h, s, l, a) {
return `hsla(${h}, ${s}%, ${l}%, ${a})`;
};
ColorWidget.draggable = function (element, onmove, onstart, onstop) {
onmove = onmove || function () {};
onstart = onstart || function () {};
@ -210,6 +268,9 @@ ColorWidget.draggable = function (element, onmove, onstart, onstop) {
ColorWidget.prototype = {
set rgb(color) {
this.hsv = ColorWidget.rgbToHsv(color[0], color[1], color[2], color[3]);
let { h, s, l } = new colorUtils.CssColor(this.rgbCssString)._getHSLATuple();
this.hsl = [h, s, l, color[3]];
},
get rgb() {
@ -250,6 +311,7 @@ ColorWidget.prototype = {
onSliderMove: function (dragX, dragY) {
this.hsv[0] = (dragY / this.slideHeight);
this.hsl[0] = (dragY / this.slideHeight) * 360;
this.updateUI();
this.onChange();
},
@ -257,12 +319,130 @@ ColorWidget.prototype = {
onDraggerMove: function (dragX, dragY) {
this.hsv[1] = dragX / this.dragWidth;
this.hsv[2] = (this.dragHeight - dragY) / this.dragHeight;
this.hsl[2] = ((2 - this.hsv[1]) * this.hsv[2] / 2);
if (this.hsl[2] && this.hsl[2] < 1) {
this.hsl[1] = this.hsv[1] * this.hsv[2] /
(this.hsl[2] < 0.5 ? this.hsl[2] * 2 : 2 - this.hsl[2] * 2);
this.hsl[1] = this.hsl[1] * 100;
}
this.hsl[2] = this.hsl[2] * 100;
this.updateUI();
this.onChange();
},
onAlphaSliderMove: function (dragX, dragY) {
this.hsv[3] = dragX / this.alphaSliderWidth;
this.hsl[3] = dragX / this.alphaSliderWidth;
this.updateUI();
this.onChange();
},
onSelectValueChange: function (event) {
const selection = event.target.value;
this.colorSelect.classList.remove("colorwidget-select-spacing");
this.hexValue.classList.add("colorwidget-hidden");
this.rgbaValue.classList.add("colorwidget-hidden");
this.hslaValue.classList.add("colorwidget-hidden");
switch (selection) {
case "hex":
this.hexValue.classList.remove("colorwidget-hidden");
break;
case "rgba":
this.colorSelect.classList.add("colorwidget-select-spacing");
this.rgbaValue.classList.remove("colorwidget-hidden");
break;
case "hsla":
this.colorSelect.classList.add("colorwidget-select-spacing");
this.hslaValue.classList.remove("colorwidget-hidden");
break;
}
},
onHexInputChange: function (event) {
const hex = event.target.value;
const color = new colorUtils.CssColor(hex, true);
if (!color.rgba) {
return;
}
const { r, g, b, a } = color._getRGBATuple();
this.rgb = [r, g, b, a];
this.updateUI();
this.onChange();
},
onRgbaInputChange: function (event) {
const field = event.target.dataset.id;
const value = event.target.value.toString();
if (!value || isNaN(value) || value.endsWith(".")) {
return;
}
let rgb = this.rgb;
switch (field) {
case "r":
rgb[0] = value;
break;
case "g":
rgb[1] = value;
break;
case "b":
rgb[2] = value;
break;
case "a":
rgb[3] = Math.min(value, 1);
break;
}
this.rgb = rgb;
this.updateUI();
this.onChange();
},
onHslaInputChange: function (event) {
const field = event.target.dataset.id;
let value = event.target.value.toString();
if ((field === "s" || field === "l") && !value.endsWith("%")) {
return;
}
if (value.endsWith("%")) {
value = value.substring(0, value.length - 1);
}
if (!value || isNaN(value) || value.endsWith(".")) {
return;
}
const hsl = this.hsl;
switch (field) {
case "h":
hsl[0] = value;
break;
case "s":
hsl[1] = value;
break;
case "l":
hsl[2] = value;
break;
case "a":
hsl[3] = Math.min(value, 1);
break;
}
const cssString = ColorWidget.hslToCssString(hsl[0], hsl[1], hsl[2], hsl[3]);
const { r, g, b, a } = new colorUtils.CssColor(cssString)._getRGBATuple();
this.rgb = [r, g, b, a];
this.hsl = hsl;
this.updateUI();
this.onChange();
},
@ -307,6 +487,24 @@ ColorWidget.prototype = {
let alphaSliderX = (this.hsv[3] * this.alphaSliderWidth) -
(this.alphaSliderHelperWidth / 2);
this.alphaSliderHelper.style.left = alphaSliderX + "px";
const color = new colorUtils.CssColor(this.rgbCssString);
// Updating the hex field
this.hexValueInput.value = color.hex;
// Updating the RGBA fields
const rgb = this.rgb;
this.rgbaValueInputs.r.value = rgb[0];
this.rgbaValueInputs.g.value = rgb[1];
this.rgbaValueInputs.b.value = rgb[2];
this.rgbaValueInputs.a.value = parseFloat(rgb[3].toFixed(1));
// Updating the HSLA fields
this.hslaValueInputs.h.value = this.hsl[0];
this.hslaValueInputs.s.value = this.hsl[1] + "%";
this.hslaValueInputs.l.value = this.hsl[2] + "%";
this.hslaValueInputs.a.value = parseFloat(this.hsl[3].toFixed(1));
},
updateUI: function () {

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

@ -153,3 +153,59 @@ http://www.briangrinstead.com/blog/keep-aspect-ratio-with-html-and-css */
left: -3px;
right: -3px;
}
/**
* Color Widget Editor
*/
.colorwidget-value {
position: relative;
margin-top: 8px;
}
/**
* Color Widget Select
*/
.colorwidget-select {
width: 100%;
}
.colorwidget-select-spacing {
letter-spacing: 40px;
}
.colorwidget-select-spacing option {
letter-spacing: initial;
}
/**
* Color Widget Inputs
*/
.colorwidget-hidden {
display: none;
}
.colorwidget-hex,
.colorwidget-rgba,
.colorwidget-hsla {
width: 200px;
font-size: 0;
}
.colorwidget-hex-input {
width: 192px;
}
.colorwidget-rgba-r,
.colorwidget-rgba-g,
.colorwidget-rgba-b,
.colorwidget-rgba-a,
.colorwidget-hsla-h,
.colorwidget-hsla-s,
.colorwidget-hsla-l,
.colorwidget-hsla-a {
width: 42px;
margin: 0;
}

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

@ -74,13 +74,13 @@ SwatchColorPickerTooltip.prototype = Heritage.extend(SwatchBasedEditorTooltip.pr
eyedropper.style.pointerEvents = "auto";
container.appendChild(eyedropper);
this.tooltip.setContent(container, { width: 218, height: 224 });
let spectrum;
if (NEW_COLOR_WIDGET) {
this.tooltip.setContent(container, { width: 218, height: 271 });
const {ColorWidget} = require("devtools/client/shared/widgets/ColorWidget");
spectrum = new ColorWidget(spectrumNode, color);
} else {
this.tooltip.setContent(container, { width: 218, height: 224 });
spectrum = new Spectrum(spectrumNode, color);
}

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

@ -408,6 +408,23 @@ CssColor.prototype = {
return tuple;
},
/**
* Returns a HSLA 4-Tuple representation of a color or transparent as
* appropriate.
*/
_getHSLATuple: function () {
let {r, g, b, a} = colorToRGBA(this.authored, this.cssColor4);
let [h, s, l] = rgbToHsl([r, g, b]);
return {
h,
s,
l,
a: parseFloat(a.toFixed(1))
};
},
_hsl: function (maybeAlpha) {
if (this.lowerCased.startsWith("hsl(") && maybeAlpha === undefined) {
// We can use it as-is.

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

@ -12607,7 +12607,7 @@ nsDocShell::LoadHistoryEntry(nsISHEntry* aEntry, uint32_t aLoadType)
MOZ_ASSERT(triggeringPrincipal,
"need a valid triggeringPrincipal to load from history");
if (!triggeringPrincipal) {
return NS_ERROR_FAILURE;
triggeringPrincipal = nsContentUtils::GetSystemPrincipal();
}
// Passing nullptr as aSourceDocShell gives the same behaviour as before

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

@ -13,6 +13,8 @@
#include "nsGlobalWindow.h"
#include "nsString.h"
#include "xpcpublic.h" // For xpc::NativeGlobal
#include "mozilla/EffectSet.h"
#include "mozilla/dom/KeyframeEffectReadOnly.h"
#include "mozilla/Preferences.h"
namespace mozilla {
@ -83,4 +85,17 @@ AnimationUtils::IsCoreAPIEnabledForCaller(dom::CallerType aCallerType)
return IsCoreAPIEnabled() || aCallerType == dom::CallerType::System;
}
/* static */ bool
AnimationUtils::EffectSetContainsAnimatedScale(EffectSet& aEffects,
const nsIFrame* aFrame)
{
for (const dom::KeyframeEffectReadOnly* effect : aEffects) {
if (effect->ContainsAnimatedScale(aFrame)) {
return true;
}
}
return false;
}
} // namespace mozilla

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

@ -14,11 +14,13 @@
class nsIContent;
class nsIDocument;
class nsIFrame;
struct JSContext;
namespace mozilla {
class ComputedTimingFunction;
class EffectSet;
class AnimationUtils
{
@ -73,6 +75,13 @@ public:
* true or the caller is chrome.
*/
static bool IsCoreAPIEnabledForCaller(dom::CallerType aCallerType);
/**
* Returns true if the given EffectSet contains a current effect that animates
* scale. |aFrame| is used for calculation of scale values.
*/
static bool EffectSetContainsAnimatedScale(EffectSet& aEffects,
const nsIFrame* aFrame);
};
} // namespace mozilla

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

@ -1763,5 +1763,54 @@ KeyframeEffectReadOnly::NeedsBaseStyle(nsCSSPropertyID aProperty) const
return false;
}
bool
KeyframeEffectReadOnly::ContainsAnimatedScale(const nsIFrame* aFrame) const
{
if (!IsCurrent()) {
return false;
}
for (const AnimationProperty& prop : mProperties) {
if (prop.mProperty != eCSSProperty_transform) {
continue;
}
if (NeedsBaseStyle(prop.mProperty)) {
StyleAnimationValue baseStyle =
EffectCompositor::GetBaseStyle(prop.mProperty, aFrame);
MOZ_ASSERT(!baseStyle.IsNull(), "The base value should be set");
if (baseStyle.IsNull()) {
// If we failed to get the base style, we consider it has scale value
// here for the safety.
return true;
}
gfxSize size = baseStyle.GetScaleValue(aFrame);
if (size != gfxSize(1.0f, 1.0f)) {
return true;
}
}
// This is actually overestimate because there are some cases that combining
// the base value and from/to value produces 1:1 scale. But it doesn't
// really matter.
for (const AnimationPropertySegment& segment : prop.mSegments) {
if (!segment.mFromValue.IsNull()) {
gfxSize from = segment.mFromValue.GetScaleValue(aFrame);
if (from != gfxSize(1.0f, 1.0f)) {
return true;
}
}
if (!segment.mToValue.IsNull()) {
gfxSize to = segment.mToValue.GetScaleValue(aFrame);
if (to != gfxSize(1.0f, 1.0f)) {
return true;
}
}
}
}
return false;
}
} // namespace dom
} // namespace mozilla

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

@ -288,6 +288,10 @@ public:
// needs a base style to composite with.
bool NeedsBaseStyle(nsCSSPropertyID aProperty) const;
// Returns true if the effect is current state and has scale animation.
// |aFrame| is used for calculation of scale values.
bool ContainsAnimatedScale(const nsIFrame* aFrame) const;
protected:
KeyframeEffectReadOnly(nsIDocument* aDocument,
const Maybe<OwningAnimationTarget>& aTarget,

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

@ -44,6 +44,7 @@
class nsIFrame;
class nsIDOMMozNamedAttrMap;
class nsIMozBrowserFrame;
class nsIURI;
class nsIScrollableFrame;
class nsAttrValueOrString;
@ -339,6 +340,16 @@ public:
*/
virtual bool IsInteractiveHTMLContent(bool aIgnoreTabindex) const;
/**
* Returns |this| as an nsIMozBrowserFrame* if the element is a frame or
* iframe element.
*
* We have this method, rather than using QI, so that we can use it during
* the servo traversal, where we can't QI DOM nodes because of non-thread-safe
* refcounts.
*/
virtual nsIMozBrowserFrame* GetAsMozBrowserFrame() { return nullptr; }
/**
* Is the attribute named stored in the mapped attributes?
*

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

@ -33,6 +33,7 @@
#include "nsCycleCollectionParticipant.h"
#include "nsNullPrincipal.h"
#include "ScriptSettings.h"
#include "mozilla/Unused.h"
#include "mozilla/dom/LocationBinding.h"
namespace mozilla {
@ -699,9 +700,17 @@ Location::SetProtocol(const nsAString& aProtocol)
return rv;
}
rv = uri->SetScheme(NS_ConvertUTF16toUTF8(aProtocol));
nsAString::const_iterator start, end;
aProtocol.BeginReading(start);
aProtocol.EndReading(end);
nsAString::const_iterator iter(start);
Unused << FindCharInReadable(':', iter, end);
rv = uri->SetScheme(NS_ConvertUTF16toUTF8(Substring(start, iter)));
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
// Oh, I wish nsStandardURL returned NS_ERROR_MALFORMED_URI for _all_ the
// malformed cases, not just some of them!
return NS_ERROR_DOM_SYNTAX_ERR;
}
nsAutoCString newSpec;
rv = uri->GetSpec(newSpec);
@ -711,9 +720,29 @@ Location::SetProtocol(const nsAString& aProtocol)
// We may want a new URI class for the new URI, so recreate it:
rv = NS_NewURI(getter_AddRefs(uri), newSpec);
if (NS_FAILED(rv)) {
if (rv == NS_ERROR_MALFORMED_URI) {
rv = NS_ERROR_DOM_SYNTAX_ERR;
}
return rv;
}
bool isHttp;
rv = uri->SchemeIs("http", &isHttp);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
bool isHttps;
rv = uri->SchemeIs("https", &isHttps);
if (NS_WARN_IF(NS_FAILED(rv))) {
return rv;
}
if (!isHttp && !isHttps) {
// No-op, per spec.
return NS_OK;
}
return SetURI(uri);
}

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

@ -1229,7 +1229,7 @@ BeaconStreamListener::OnDataAvailable(nsIRequest *aRequest,
bool
Navigator::SendBeacon(const nsAString& aUrl,
const Nullable<ArrayBufferOrArrayBufferViewOrBlobOrFormDataOrUSVStringOrURLSearchParams>& aData,
const Nullable<fetch::BodyInit>& aData,
ErrorResult& aRv)
{
if (aData.IsNull()) {

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

@ -9,6 +9,7 @@
#include "mozilla/MemoryReporting.h"
#include "mozilla/dom/BindingDeclarations.h"
#include "mozilla/dom/Fetch.h"
#include "mozilla/dom/Nullable.h"
#include "mozilla/ErrorResult.h"
#include "nsIDOMNavigator.h"
@ -226,7 +227,7 @@ public:
Presentation* GetPresentation(ErrorResult& aRv);
bool SendBeacon(const nsAString& aUrl,
const Nullable<ArrayBufferOrArrayBufferViewOrBlobOrFormDataOrUSVStringOrURLSearchParams>& aData,
const Nullable<fetch::BodyInit>& aData,
ErrorResult& aRv);
void MozGetUserMedia(const MediaStreamConstraints& aConstraints,

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

@ -18,6 +18,7 @@
#include "nsUnicharUtils.h"
#include "mozilla/MemoryReporting.h"
#include "mozilla/ServoBindingTypes.h"
#include "mozilla/ServoStyleSet.h"
#include "mozilla/DeclarationBlockInlines.h"
#include "nsContentUtils.h"
#include "nsReadableUtils.h"
@ -647,7 +648,15 @@ nsAttrValue::ToString(nsAString& aResult) const
if (DeclarationBlock* decl = container->mValue.mCSSDeclaration) {
decl->ToString(aResult);
}
const_cast<nsAttrValue*>(this)->SetMiscAtomOrString(&aResult);
// We can reach this during parallel style traversal. If that happens,
// don't cache the string. The TLS overhead should't hurt us here, since
// main thread consumers will subsequently use the cache, and
// off-main-thread consumers only reach this in the rare case of selector
// matching on the "style" attribute.
if (!ServoStyleSet::IsInServoTraversal()) {
const_cast<nsAttrValue*>(this)->SetMiscAtomOrString(&aResult);
}
break;
}

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

@ -4037,6 +4037,10 @@ nsIDocument::GetRootElement() const
Element*
nsDocument::GetRootElementInternal() const
{
// We invoke GetRootElement() immediately before the servo traversal, so we
// should always have a cache hit from Servo.
MOZ_ASSERT(NS_IsMainThread());
// Loop backwards because any non-elements, such as doctypes and PIs
// are likely to appear before the root element.
uint32_t i;

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

@ -88,6 +88,7 @@
#include "mozilla/Telemetry.h"
#include "mozilla/dom/HTMLObjectElementBinding.h"
#include "mozilla/dom/HTMLSharedObjectElement.h"
#include "mozilla/dom/HTMLObjectElement.h"
#include "nsChannelClassifier.h"
#ifdef XP_WIN
@ -97,13 +98,6 @@
#endif
#endif // XP_WIN
#ifdef XP_MACOSX
// HandlePluginCrashed() and HandlePluginInstantiated() needed from here to
// fix bug 1147521. Should later be replaced by proper interface methods,
// maybe on nsIObjectLoadingContext.
#include "mozilla/dom/HTMLObjectElement.h"
#endif
static NS_DEFINE_CID(kAppShellCID, NS_APPSHELL_CID);
static const char *kPrefJavaMIME = "plugin.java.mime";
@ -3018,7 +3012,7 @@ nsObjectLoadingContent::LoadFallback(FallbackType aType, bool aNotify) {
// Fixup mFallbackType
//
nsCOMPtr<nsIContent> thisContent =
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
NS_ASSERTION(thisContent, "must be a content");
if (!thisContent->IsHTMLElement() || mContentType.IsEmpty()) {
@ -3031,8 +3025,10 @@ nsObjectLoadingContent::LoadFallback(FallbackType aType, bool aNotify) {
// child embeds as we find them in the upcoming loop.
mType = eType_Null;
// Do a breadth-first traverse of node tree with the current element as root,
// looking for the first embed we can find.
bool thisIsObject = thisContent->IsHTMLElement(nsGkAtoms::object);
// Do a depth-first traverse of node tree with the current element as root,
// looking for <embed> or <object> elements that might now need to load.
nsTArray<nsINodeList*> childNodes;
if ((thisContent->IsHTMLElement(nsGkAtoms::object) ||
thisContent->IsHTMLElement(nsGkAtoms::applet)) &&
@ -3048,10 +3044,11 @@ nsObjectLoadingContent::LoadFallback(FallbackType aType, bool aNotify) {
nsStyleUtil::IsSignificantChild(child, true, false)) {
aType = eFallbackAlternate;
}
if (child->IsHTMLElement(nsGkAtoms::embed) &&
thisContent->IsHTMLElement(nsGkAtoms::object)) {
HTMLSharedObjectElement* object = static_cast<HTMLSharedObjectElement*>(child);
if (object) {
if (thisIsObject) {
if (child->IsHTMLElement(nsGkAtoms::embed)) {
HTMLSharedObjectElement* embed = static_cast<HTMLSharedObjectElement*>(child);
embed->StartObjectLoad(true, true);
} else if (auto object = HTMLObjectElement::FromContent(child)) {
object->StartObjectLoad(true, true);
}
}
@ -3817,6 +3814,38 @@ nsObjectLoadingContent::MaybeFireErrorEvent()
}
}
bool
nsObjectLoadingContent::BlockEmbedOrObjectContentLoading()
{
nsCOMPtr<nsIContent> thisContent =
do_QueryInterface(static_cast<nsIImageLoadingContent*>(this));
if (!thisContent->IsHTMLElement(nsGkAtoms::embed) &&
!thisContent->IsHTMLElement(nsGkAtoms::object)) {
// Doesn't apply to other elements (i.e. <applet>)
return false;
}
// Traverse up the node tree to see if we have any ancestors that may block us
// from loading
for (nsIContent* parent = thisContent->GetParent();
parent;
parent = parent->GetParent()) {
if (parent->IsAnyOfHTMLElements(nsGkAtoms::video, nsGkAtoms::audio)) {
return true;
}
// If we have an ancestor that is an object with a source, it'll have an
// associated displayed type. If that type is not null, don't load content
// for the embed.
if (HTMLObjectElement* object = HTMLObjectElement::FromContent(parent)) {
uint32_t type = object->DisplayedType();
if (type != eType_Null) {
return true;
}
}
}
return false;
}
// SetupProtoChainRunner implementation
nsObjectLoadingContent::SetupProtoChainRunner::SetupProtoChainRunner(
nsObjectLoadingContent* aContent)

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

@ -334,6 +334,21 @@ class nsObjectLoadingContent : public nsImageLoadingContent
*/
virtual nsContentPolicyType GetContentPolicyType() const = 0;
/**
* Decides whether we should load <embed>/<object> node content.
*
* If this is an <embed> or <object> node there are cases in which we should
* not try to load the content:
*
* - If the node is the child of a media element
* - If the node is the child of an <object> node that already has
* content being loaded.
*
* In these cases, this function will return false, which will cause
* us to skip calling LoadObject.
*/
bool BlockEmbedOrObjectContentLoading();
private:
// Object parameter changes returned by UpdateObjectParameters

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

@ -1,12 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/REC-html401-19991224/strict.dtd">
<html>
<head>
<title>Bug 1263696 - iframe that should not be loaded</title>
</head>
<body>
<script>
parent.SimpleTest.ok(false, "this iframe should not load");
</script>
</body>
</html>

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

@ -1,13 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/REC-html401-19991224/strict.dtd">
<html>
<head>
<title>Bug 1263696 - iframe that should be loaded</title>
</head>
<body>
<script>
parent.index = parent.index + 1;
parent.SimpleTest.ok(true, "this iframe should load");
</script>
</body>
</html>

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

@ -125,8 +125,6 @@ support-files =
file_bug902350_frame.html
file_bug907892.html
file_bug945152.jar
file_bug1263696_frame_pass.html
file_bug1263696_frame_fail.html
file_bug1274806.html
file_general_document.html
file_htmlserializer_1.html
@ -587,7 +585,6 @@ skip-if = toolkit == 'android'
[test_bug1238440.html]
[test_bug1250148.html]
[test_bug1259588.html]
[test_bug1263696.html]
[test_bug1268962.html]
[test_bug1274806.html]
[test_bug1281963.html]

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

@ -1,53 +0,0 @@
<!DOCTYPE html>
<html>
<head>
<meta><charset="utf-8"/>
<title>Test Embed/Object Node Conflicts</title>
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="application/javascript" src="plugin-utils.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
<script type="application/javascript">
SimpleTest.waitForExplicitFinish();
var index = 0;
function startTest() {
is(index, 12, "Should have loaded all passing frames.");
SimpleTest.finish();
}
</script>
</head>
<body onload="startTest()">
<object data="file_bug1263696_frame_pass.html" style="width: 100px; height: 100px">
<embed type="text/html" src="file_bug1263696_frame_fail.html" />
</object>
<object style="width: 100px; height: 100px" data="data:application/x-does-not-exist,test">
<embed type="text/html" src="file_bug1263696_frame_pass.html" />
</object>
<object style="width: 100px; height: 100px" data="data:application/x-does-not-exist,test">
<div></div>
<embed type="text/html" src="file_bug1263696_frame_pass.html" />
</object>
<object style="width: 100px; height: 100px" data="data:application/x-does-not-exist,test">
<div>
<embed type="text/html" src="file_bug1263696_frame_pass.html" />
</div>
</object>
<object style="width: 100px; height: 100px" data="data:application/x-does-not-exist,test">
<embed type="text/html" src="file_bug1263696_frame_pass.html" />
<embed type="text/html" src="file_bug1263696_frame_pass.html" />
<object data="file_bug1263696_frame_pass.html">
<embed type="text/html" src="file_bug1263696_frame_fail.html" />
</object>
<object data="data:application/x-does-not-exist,test">
<embed type="text/html" src="file_bug1263696_frame_pass.html" />
</object>
</object>
<div>
<object data="file_bug1263696_frame_pass.html" style="width: 100px; height: 100px"></object>
<embed type="text/html" src="file_bug1263696_frame_pass.html" />
</div>
<div>
<embed type="text/html" src="file_bug1263696_frame_pass.html" />
<object data="file_bug1263696_frame_pass.html" style="width: 100px; height: 100px"></object>
</div>
</body>
</html>

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

@ -480,7 +480,7 @@ WorkerFetchResolver::FlushConsoleReport()
}
nsresult
ExtractByteStreamFromBody(const OwningArrayBufferOrArrayBufferViewOrBlobOrFormDataOrUSVStringOrURLSearchParams& aBodyInit,
ExtractByteStreamFromBody(const fetch::OwningBodyInit& aBodyInit,
nsIInputStream** aStream,
nsCString& aContentTypeWithCharset,
uint64_t& aContentLength)
@ -533,7 +533,7 @@ ExtractByteStreamFromBody(const OwningArrayBufferOrArrayBufferViewOrBlobOrFormDa
}
nsresult
ExtractByteStreamFromBody(const ArrayBufferOrArrayBufferViewOrBlobOrFormDataOrUSVStringOrURLSearchParams& aBodyInit,
ExtractByteStreamFromBody(const fetch::BodyInit& aBodyInit,
nsIInputStream** aStream,
nsCString& aContentTypeWithCharset,
uint64_t& aContentLength)

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

@ -27,10 +27,10 @@ class nsIGlobalObject;
namespace mozilla {
namespace dom {
class ArrayBufferOrArrayBufferViewOrBlobOrFormDataOrUSVStringOrURLSearchParams;
class BlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString;
class BlobImpl;
class InternalRequest;
class OwningArrayBufferOrArrayBufferViewOrBlobOrFormDataOrUSVStringOrURLSearchParams;
class OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString;
class RequestOrUSVString;
enum class CallerType : uint32_t;
@ -46,13 +46,18 @@ FetchRequest(nsIGlobalObject* aGlobal, const RequestOrUSVString& aInput,
nsresult
UpdateRequestReferrer(nsIGlobalObject* aGlobal, InternalRequest* aRequest);
namespace fetch {
typedef BlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString BodyInit;
typedef OwningBlobOrArrayBufferViewOrArrayBufferOrFormDataOrURLSearchParamsOrUSVString OwningBodyInit;
};
/*
* Creates an nsIInputStream based on the fetch specifications 'extract a byte
* stream algorithm' - http://fetch.spec.whatwg.org/#concept-bodyinit-extract.
* Stores content type in out param aContentType.
*/
nsresult
ExtractByteStreamFromBody(const OwningArrayBufferOrArrayBufferViewOrBlobOrFormDataOrUSVStringOrURLSearchParams& aBodyInit,
ExtractByteStreamFromBody(const fetch::OwningBodyInit& aBodyInit,
nsIInputStream** aStream,
nsCString& aContentType,
uint64_t& aContentLength);
@ -61,7 +66,7 @@ ExtractByteStreamFromBody(const OwningArrayBufferOrArrayBufferViewOrBlobOrFormDa
* Non-owning version.
*/
nsresult
ExtractByteStreamFromBody(const ArrayBufferOrArrayBufferViewOrBlobOrFormDataOrUSVStringOrURLSearchParams& aBodyInit,
ExtractByteStreamFromBody(const fetch::BodyInit& aBodyInit,
nsIInputStream** aStream,
nsCString& aContentType,
uint64_t& aContentLength);

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

@ -547,11 +547,9 @@ Request::Constructor(const GlobalObject& aGlobal,
}
if (aInit.mBody.WasPassed()) {
const Nullable<OwningArrayBufferOrArrayBufferViewOrBlobOrFormDataOrUSVStringOrURLSearchParams>& bodyInitNullable =
aInit.mBody.Value();
const Nullable<fetch::OwningBodyInit>& bodyInitNullable = aInit.mBody.Value();
if (!bodyInitNullable.IsNull()) {
const OwningArrayBufferOrArrayBufferViewOrBlobOrFormDataOrUSVStringOrURLSearchParams& bodyInit =
bodyInitNullable.Value();
const fetch::OwningBodyInit& bodyInit = bodyInitNullable.Value();
nsCOMPtr<nsIInputStream> stream;
nsAutoCString contentTypeWithCharset;
uint64_t contentLengthUnused;

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

@ -104,7 +104,7 @@ Response::Redirect(const GlobalObject& aGlobal, const nsAString& aUrl,
return nullptr;
}
Optional<ArrayBufferOrArrayBufferViewOrBlobOrFormDataOrUSVStringOrURLSearchParams> body;
Optional<fetch::BodyInit> body;
ResponseInit init;
init.mStatus = aStatus;
RefPtr<Response> r = Response::Constructor(aGlobal, body, init, aRv);
@ -125,7 +125,7 @@ Response::Redirect(const GlobalObject& aGlobal, const nsAString& aUrl,
/*static*/ already_AddRefed<Response>
Response::Constructor(const GlobalObject& aGlobal,
const Optional<ArrayBufferOrArrayBufferViewOrBlobOrFormDataOrUSVStringOrURLSearchParams>& aBody,
const Optional<fetch::BodyInit>& aBody,
const ResponseInit& aInit, ErrorResult& aRv)
{
nsCOMPtr<nsIGlobalObject> global = do_QueryInterface(aGlobal.GetAsSupports());

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

@ -114,7 +114,7 @@ public:
static already_AddRefed<Response>
Constructor(const GlobalObject& aGlobal,
const Optional<ArrayBufferOrArrayBufferViewOrBlobOrFormDataOrUSVStringOrURLSearchParams>& aBody,
const Optional<fetch::BodyInit>& aBody,
const ResponseInit& aInit, ErrorResult& rv);
nsIGlobalObject* GetParentObject() const

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

@ -42,7 +42,7 @@ struct ChromeFilePropertyBag;
struct FilePropertyBag;
class BlobImpl;
class File;
class OwningArrayBufferOrArrayBufferViewOrBlobOrUSVString;
class OwningArrayBufferViewOrArrayBufferOrBlobOrUSVString;
class Promise;
class Blob : public nsIDOMBlob
@ -59,7 +59,7 @@ public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(Blob, nsIDOMBlob)
typedef OwningArrayBufferOrArrayBufferViewOrBlobOrUSVString BlobPart;
typedef OwningArrayBufferViewOrArrayBufferOrBlobOrUSVString BlobPart;
// This creates a Blob or a File based on the type of BlobImpl.
static Blob*

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

@ -99,6 +99,10 @@ FileCreatorHelper::FileCreatorHelper(Promise* aPromise,
MOZ_ASSERT(aPromise);
}
FileCreatorHelper::~FileCreatorHelper()
{
}
void
FileCreatorHelper::SendRequest(nsIFile* aFile,
const ChromeFilePropertyBag& aBag,

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

@ -72,7 +72,7 @@ private:
BlobImpl** aBlobImpl);
FileCreatorHelper(Promise* aPromise, nsPIDOMWindowInner* aWindow);
~FileCreatorHelper() = default;
~FileCreatorHelper();
void
SendRequest(nsIFile* aFile, const ChromeFilePropertyBag& aBag,

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

@ -2433,11 +2433,8 @@ HTMLInputElement::GetMaximum() const
Decimal
HTMLInputElement::GetStepBase() const
{
MOZ_ASSERT(mType == NS_FORM_INPUT_NUMBER ||
mType == NS_FORM_INPUT_DATE ||
mType == NS_FORM_INPUT_TIME ||
mType == NS_FORM_INPUT_MONTH ||
mType == NS_FORM_INPUT_WEEK ||
MOZ_ASSERT(IsDateTimeInputType(mType) ||
mType == NS_FORM_INPUT_NUMBER ||
mType == NS_FORM_INPUT_RANGE,
"Check that kDefaultStepBase is correct for this new type");
@ -8671,6 +8668,7 @@ HTMLInputElement::GetStepScaleFactor() const
case NS_FORM_INPUT_RANGE:
return kStepScaleFactorNumberRange;
case NS_FORM_INPUT_TIME:
case NS_FORM_INPUT_DATETIME_LOCAL:
return kStepScaleFactorTime;
case NS_FORM_INPUT_MONTH:
return kStepScaleFactorMonth;
@ -8695,6 +8693,7 @@ HTMLInputElement::GetDefaultStep() const
case NS_FORM_INPUT_RANGE:
return kDefaultStep;
case NS_FORM_INPUT_TIME:
case NS_FORM_INPUT_DATETIME_LOCAL:
return kDefaultStepTime;
default:
MOZ_ASSERT(false, "Unrecognized input type");

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

@ -1070,11 +1070,7 @@ protected:
/**
* Returns if the step attribute apply for the current type.
*/
bool DoesStepApply() const
{
// TODO: this is temporary until bug 888331 is fixed.
return DoesMinMaxApply() && mType != NS_FORM_INPUT_DATETIME_LOCAL;
}
bool DoesStepApply() const { return DoesMinMaxApply(); }
/**
* Returns if stepDown and stepUp methods apply for the current type.

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

@ -79,7 +79,7 @@ HTMLObjectElement::DoneAddingChildren(bool aHaveNotified)
// If we're already in a document, we need to trigger the load
// Otherwise, BindToTree takes care of that.
if (IsInComposedDoc()) {
StartObjectLoad(aHaveNotified);
StartObjectLoad(aHaveNotified, false);
}
}
@ -310,7 +310,8 @@ HTMLObjectElement::SetAttr(int32_t aNameSpaceID, nsIAtom *aName,
// a document, just in case that the caller wants to set additional
// attributes before inserting the node into the document.
if (aNotify && IsInComposedDoc() && mIsDoneAddingChildren &&
aNameSpaceID == kNameSpaceID_None && aName == nsGkAtoms::data) {
aNameSpaceID == kNameSpaceID_None && aName == nsGkAtoms::data &&
!BlockEmbedOrObjectContentLoading()) {
return LoadObject(aNotify, true);
}
@ -327,7 +328,8 @@ HTMLObjectElement::UnsetAttr(int32_t aNameSpaceID, nsIAtom* aAttribute,
// See comment in SetAttr
if (aNotify && IsInComposedDoc() && mIsDoneAddingChildren &&
aNameSpaceID == kNameSpaceID_None && aAttribute == nsGkAtoms::data) {
aNameSpaceID == kNameSpaceID_None && aAttribute == nsGkAtoms::data &&
!BlockEmbedOrObjectContentLoading()) {
return LoadObject(aNotify, true);
}
@ -535,15 +537,16 @@ HTMLObjectElement::GetAttributeMappingFunction() const
}
void
HTMLObjectElement::StartObjectLoad(bool aNotify)
HTMLObjectElement::StartObjectLoad(bool aNotify, bool aForce)
{
// BindToTree can call us asynchronously, and we may be removed from the tree
// in the interim
if (!IsInComposedDoc() || !OwnerDoc()->IsActive()) {
if (!IsInComposedDoc() || !OwnerDoc()->IsActive() ||
BlockEmbedOrObjectContentLoading()) {
return;
}
LoadObject(aNotify);
LoadObject(aNotify, aForce);
SetIsNetworkCreated(false);
}

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

@ -98,7 +98,7 @@ public:
nsresult CopyInnerTo(Element* aDest);
void StartObjectLoad() { StartObjectLoad(true); }
void StartObjectLoad() { StartObjectLoad(true, false); }
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(HTMLObjectElement,
nsGenericHTMLFormElement)
@ -247,12 +247,12 @@ public:
return GetContentDocument(aSubjectPrincipal);
}
private:
/**
* Calls LoadObject with the correct arguments to start the plugin load.
*/
void StartObjectLoad(bool aNotify);
void StartObjectLoad(bool aNotify, bool aForceLoad);
private:
/**
* Returns if the element is currently focusable regardless of it's tabindex
* value. This is used to know the default tabindex value.

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

@ -180,7 +180,7 @@ HTMLSharedObjectElement::SetAttr(int32_t aNameSpaceID, nsIAtom *aName,
// attributes before inserting the node into the document.
if (aNotify && IsInComposedDoc() && mIsDoneAddingChildren &&
aNameSpaceID == kNameSpaceID_None && aName == URIAttrName()
&& !BlockEmbedContentLoading()) {
&& !BlockEmbedOrObjectContentLoading()) {
return LoadObject(aNotify, true);
}
@ -313,7 +313,7 @@ HTMLSharedObjectElement::StartObjectLoad(bool aNotify, bool aForceLoad)
// BindToTree can call us asynchronously, and we may be removed from the tree
// in the interim
if (!IsInComposedDoc() || !OwnerDoc()->IsActive() ||
BlockEmbedContentLoading()) {
BlockEmbedOrObjectContentLoading()) {
return;
}
@ -389,31 +389,5 @@ HTMLSharedObjectElement::GetContentPolicyType() const
}
}
bool
HTMLSharedObjectElement::BlockEmbedContentLoading()
{
// Only check on embed elements
if (!IsHTMLElement(nsGkAtoms::embed)) {
return false;
}
// Traverse up the node tree to see if we have any ancestors that may block us
// from loading
for (nsIContent* parent = GetParent(); parent; parent = parent->GetParent()) {
if (parent->IsAnyOfHTMLElements(nsGkAtoms::video, nsGkAtoms::audio)) {
return true;
}
// If we have an ancestor that is an object with a source, it'll have an
// associated displayed type. If that type is not null, don't load content
// for the embed.
if (HTMLObjectElement* object = HTMLObjectElement::FromContent(parent)) {
uint32_t type = object->DisplayedType();
if (type != eType_Null) {
return true;
}
}
}
return false;
}
} // namespace dom
} // namespace mozilla

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

@ -220,21 +220,6 @@ private:
static void MapAttributesIntoRule(const nsMappedAttributes* aAttributes,
GenericSpecifiedValues* aGenericData);
/**
* Decides whether we should load embed node content.
*
* If this is an embed node there are cases in which we should not try to load
* the content:
*
* - If the embed node is the child of a media element
* - If the embed node is the child of an object node that already has
* content being loaded.
*
* In these cases, this function will return false, which will cause
* us to skip calling LoadObject.
*/
bool BlockEmbedContentLoading();
};
} // namespace dom

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

@ -453,18 +453,28 @@ nsGenericHTMLFrameElement::IsHTMLFocusable(bool aWithMouse,
return false;
}
static bool sMozBrowserFramesEnabled = false;
#ifdef DEBUG
static bool sBoolVarCacheInitialized = false;
#endif
void
nsGenericHTMLFrameElement::InitStatics()
{
MOZ_ASSERT(!sBoolVarCacheInitialized);
MOZ_ASSERT(NS_IsMainThread());
Preferences::AddBoolVarCache(&sMozBrowserFramesEnabled,
"dom.mozBrowserFramesEnabled");
#ifdef DEBUG
sBoolVarCacheInitialized = true;
#endif
}
bool
nsGenericHTMLFrameElement::BrowserFramesEnabled()
{
static bool sMozBrowserFramesEnabled = false;
static bool sBoolVarCacheInitialized = false;
if (!sBoolVarCacheInitialized) {
sBoolVarCacheInitialized = true;
Preferences::AddBoolVarCache(&sMozBrowserFramesEnabled,
"dom.mozBrowserFramesEnabled");
}
MOZ_ASSERT(sBoolVarCacheInitialized);
return sMozBrowserFramesEnabled;
}

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

@ -71,6 +71,8 @@ public:
virtual int32_t TabIndexDefault() override;
virtual nsIMozBrowserFrame* GetAsMozBrowserFrame() override { return this; }
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(nsGenericHTMLFrameElement,
nsGenericHTMLElement)
@ -86,6 +88,7 @@ public:
void PresetOpenerWindow(mozIDOMWindowProxy* aOpenerWindow,
mozilla::ErrorResult& aRv);
static void InitStatics();
static bool BrowserFramesEnabled();
/**

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

@ -31,8 +31,7 @@ var data = [
{ type: 'month', apply: true },
{ type: 'week', apply: true },
{ type: 'time', apply: true },
// TODO: temporary set to false until bug 888331 is fixed.
{ type: 'datetime-local', apply: false },
{ type: 'datetime-local', apply: true },
{ type: 'number', apply: true },
{ type: 'range', apply: true },
{ type: 'color', apply: false },
@ -950,7 +949,104 @@ for (var test of data) {
break;
case 'datetime-local':
// TODO: this is temporary until bug 888331 is fixed.
// When step is invalid, every datetime is valid
input.step = 0;
input.value = '2017-02-06T12:00';
checkValidity(input, true, apply);
input.step = 'foo';
input.value = '1970-01-01T00:00';
checkValidity(input, true, apply);
input.step = '-1';
input.value = '1969-12-12 00:10';
checkValidity(input, true, apply);
input.removeAttribute('step');
input.value = '1500-01-01T12:00';
checkValidity(input, true, apply);
input.step = 'any';
input.value = '1966-12-12T12:00';
checkValidity(input, true, apply);
input.step = 'ANY';
input.value = '2017-01-01 12:00';
checkValidity(input, true, apply);
// When min is set to a valid datetime, there is a step base.
input.min = '2017-01-01T00:00:00';
input.step = '2';
input.value = '2017-01-01T00:00:02';
checkValidity(input, true, apply);
input.value = '2017-01-01T00:00:03';
checkValidity(input, false, apply,
{ low: "2017-01-01T00:00:02", high: "2017-01-01T00:00:04" });
input.min = '2017-01-01T00:00:05';
input.value = '2017-01-01T00:00:08';
checkValidity(input, false, apply,
{ low: "2017-01-01T00:00:07", high: "2017-01-01T00:00:09" });
input.min = '2000-01-01T00:00';
input.step = '120';
input.value = '2000-01-01T00:02';
checkValidity(input, true, apply);
// Without any step attribute the datetime is valid
input.removeAttribute('step');
checkValidity(input, true, apply);
input.min = '1950-01-01T00:00';
input.step = '129600'; // 1.5 day
input.value = '1950-01-02T00:00';
checkValidity(input, false, apply,
{ low: "1950-01-01T00:00", high: "1950-01-02T12:00" });
input.step = '259200'; // 3 days
input.value = '1950-01-04T12:00';
checkValidity(input, false, apply,
{ low: "1950-01-04T00:00", high: "1950-01-07T00:00" });
input.value = '1950-01-10T00:00';
checkValidity(input, true, apply);
input.step = '0.5'; // half a second
input.value = '1950-01-01T00:00:00.123';
checkValidity(input, false, apply,
{ low: "1950-01-01T00:00", high: "1950-01-01T00:00:00.500" });
input.value = '2000-01-01T12:30:30.600';
checkValidity(input, false, apply,
{ low: "2000-01-01T12:30:30.500", high: "2000-01-01T12:30:31" });
input.value = '1950-01-05T00:00:00.500';
checkValidity(input, true, apply);
input.step = '2.1';
input.min = '1991-01-01T12:00';
input.value = '1991-01-01T12:00';
checkValidity(input, true, apply);
input.value = '1991-01-01T12:00:03';
checkValidity(input, false, apply,
{ low: "1991-01-01T12:00:02.100", high: "1991-01-01T12:00:04.200" });
input.value = '1991-01-01T12:00:06.3';
checkValidity(input, true, apply);
input.step = '2.1';
input.min = '1969-12-20T10:00:05';
input.value = '1969-12-20T10:00:05';
checkValidity(input, true, apply);
input.value = '1969-12-20T10:00:08';
checkValidity(input, false, apply,
{ low: "1969-12-20T10:00:07.100", high: "1969-12-20T10:00:09.200" });
input.value = '1969-12-20T10:00:09.200';
checkValidity(input, true, apply);
break;
default:

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

@ -52,13 +52,8 @@ function checkAvailability()
["time", true],
["month", true],
["week", true],
["color", false],
];
var todoList =
[
["datetime", true],
["datetime-local", true],
["color", false],
];
var element = document.createElement("input");
@ -82,27 +77,6 @@ function checkAvailability()
}
is(exceptionCaught, !data[1], "stepUp() availability is not correct");
}
for (data of todoList) {
var exceptionCaught = false;
element.type = data[0];
try {
element.stepDown();
} catch (e) {
exceptionCaught = true;
}
todo_is(exceptionCaught, !data[1],
"stepDown() availability is not correct");
exceptionCaught = false;
try {
element.stepUp();
} catch (e) {
exceptionCaught = true;
}
todo_is(exceptionCaught, !data[1],
"stepUp() availability is not correct");
}
}
function checkStepDown()
@ -509,6 +483,80 @@ function checkStepDown()
[ '2016-W01', 'AnY', null, null, 1, null, true ],
[ '2016-W01', 'aNy', null, null, 1, null, true ],
]},
{ type: 'datetime-local', data: [
// Regular case.
[ '2017-02-07T09:30', null, null, null, null, '2017-02-07T09:29', false ],
// Argument testing.
[ '2017-02-07T09:30', null, null, null, 1, '2017-02-07T09:29', false ],
[ '2017-02-07T09:30', null, null, null, 5, '2017-02-07T09:25', false ],
[ '2017-02-07T09:30', null, null, null, -1, '2017-02-07T09:31', false ],
[ '2017-02-07T09:30', null, null, null, 0, '2017-02-07T09:30', false ],
// hour/minutes/seconds wrapping.
[ '2000-01-01T05:00', null, null, null, null, '2000-01-01T04:59', false ],
[ '2000-01-01T05:00:00', 1, null, null, null, '2000-01-01T04:59:59', false ],
[ '2000-01-01T05:00:00', 0.1, null, null, null, '2000-01-01T04:59:59.900', false ],
[ '2000-01-01T05:00:00', 0.01, null, null, null, '2000-01-01T04:59:59.990', false ],
[ '2000-01-01T05:00:00', 0.001, null, null, null, '2000-01-01T04:59:59.999', false ],
// month/year wrapping.
[ '2012-08-01T12:00', null, null, null, 1440, '2012-07-31T12:00', false ],
[ '1969-01-02T12:00', null, null, null, 5760, '1968-12-29T12:00', false ],
[ '1969-12-31T00:00', null, null, null, -1440, '1970-01-01T00:00', false ],
[ '2012-02-29T00:00', null, null, null, -1440, '2012-03-01T00:00', false ],
// stepDown() on '00:00' gives '23:59'.
[ '2017-02-07T00:00', null, null, null, 1, '2017-02-06T23:59', false ],
[ '2017-02-07T00:00', null, null, null, 3, '2017-02-06T23:57', false ],
// Some random step values..
[ '2017-02-07T16:07', '0.5', null, null, null, '2017-02-07T16:06:59.500', false ],
[ '2017-02-07T16:07', '2', null, null, null, '2017-02-07T16:06:58', false ],
[ '2017-02-07T16:07', '0.25', null, null, 4, '2017-02-07T16:06:59', false ],
[ '2017-02-07T16:07', '1.1', '2017-02-07T16:00', null, 1, '2017-02-07T16:06:59.100', false ],
[ '2017-02-07T16:07', '1.1', '2017-02-07T16:00', null, 2, '2017-02-07T16:06:58', false ],
[ '2017-02-07T16:07', '1.1', '2017-02-07T16:00', null, 10, '2017-02-07T16:06:49.200', false ],
[ '2017-02-07T16:07', '129600', '2017-02-01T00:00', null, 2, '2017-02-05T12:00', false ],
// step = 0 isn't allowed (-> step = 1).
[ '2017-02-07T10:15', '0', null, null, null, '2017-02-07T10:14', false ],
// step < 0 isn't allowed (-> step = 1).
[ '2017-02-07T10:15', '-1', null, null, null, '2017-02-07T10:14', false ],
// step = NaN isn't allowed (-> step = 1).
[ '2017-02-07T10:15', 'foo', null, null, null, '2017-02-07T10:14', false ],
// Min values testing.
[ '2012-02-02T17:02', '60', 'foo', null, 2, '2012-02-02T17:00', false ],
[ '2012-02-02T17:10', '60', '2012-02-02T17:09', null, null, '2012-02-02T17:09', false ],
[ '2012-02-02T17:10', '60', '2012-02-02T17:10', null, null, '2012-02-02T17:10', false ],
[ '2012-02-02T17:10', '60', '2012-02-02T17:30', null, 1, '2012-02-02T17:10', false ],
[ '2012-02-02T17:10', '180', '2012-02-02T17:05', null, null, '2012-02-02T17:08', false ],
[ '2012-02-03T20:05', '86400', '2012-02-02T17:05', null, null, '2012-02-03T17:05', false ],
[ '2012-02-03T18:00', '129600', '2012-02-01T00:00', null, null, '2012-02-02T12:00', false ],
// Max values testing.
[ '2012-02-02T17:15', '60', null, 'foo', null, '2012-02-02T17:14', false ],
[ '2012-02-02T17:15', null, null, '2012-02-02T17:20', null, '2012-02-02T17:14', false ],
[ '2012-02-02T17:15', null, null, '2012-02-02T17:15', null, '2012-02-02T17:14', false ],
[ '2012-02-02T17:15', null, null, '2012-02-02T17:13', 4, '2012-02-02T17:11', false ],
[ '2012-02-02T17:15', '120', null, '2012-02-02T17:13', 3, '2012-02-02T17:09', false ],
[ '2012-02-03T20:05', '86400', null, '2012-02-03T20:05', null, '2012-02-02T20:05', false ],
[ '2012-02-03T18:00', '129600', null, '2012-02-03T20:00', null, '2012-02-02T06:00', false ],
// Step mismatch.
[ '2017-02-07T17:19', '120', '2017-02-07T17:10', null, null, '2017-02-07T17:18', false ],
[ '2017-02-07T17:19', '120', '2017-02-07T17:10', null, 2, '2017-02-07T17:16', false ],
[ '2017-02-07T17:19', '120', '2017-02-07T17:18', '2017-02-07T17:25', null, '2017-02-07T17:18', false ],
[ '2017-02-07T17:19', '120', null, null, null, '2017-02-07T17:17', false ],
[ '2017-02-07T17:19', '180', null, null, null, '2017-02-07T17:16', false ],
[ '2017-02-07T17:19', '172800', '2017-02-02T17:19', '2017-02-10T17:19', null, '2017-02-06T17:19', false ],
// Clamping.
[ '2017-02-07T17:22', null, null, '2017-02-07T17:11', null, '2017-02-07T17:11', false ],
[ '2017-02-07T17:22', '120', '2017-02-07T17:20', '2017-02-07T17:22', null, '2017-02-07T17:20', false ],
[ '2017-02-07T17:22', '300', '2017-02-07T17:12', '2017-02-07T17:20', 10, '2017-02-07T17:12', false ],
[ '2017-02-07T17:22', '300', '2017-02-07T17:18', '2017-02-07T17:20', 2, '2017-02-07T17:18', false ],
[ '2017-02-07T17:22', '600', '2017-02-02T17:00', '2017-02-07T17:00', 15, '2017-02-07T15:00', false ],
[ '2017-02-07T17:22', '600', '2017-02-02T17:00', '2017-02-07T17:00', 2, '2017-02-07T17:00', false ],
// value = "" (NaN).
[ '', null, null, null, null, '1969-12-31T23:59', false ],
// With step = 'any'.
[ '2017-02-07T15:20', 'any', null, null, 1, null, true ],
[ '2017-02-07T15:20', 'ANY', null, null, 1, null, true ],
[ '2017-02-07T15:20', 'AnY', null, null, 1, null, true ],
[ '2017-02-07T15:20', 'aNy', null, null, 1, null, true ],
]},
];
for (var test of testData) {
@ -958,6 +1006,78 @@ function checkStepUp()
[ '2016-W01', 'AnY', null, null, 1, null, true ],
[ '2016-W01', 'aNy', null, null, 1, null, true ],
]},
{ type: 'datetime-local', data: [
// Regular case.
[ '2017-02-07T17:09', null, null, null, null, '2017-02-07T17:10', false ],
// Argument testing.
[ '2017-02-07T17:10', null, null, null, 1, '2017-02-07T17:11', false ],
[ '2017-02-07T17:10', null, null, null, 5, '2017-02-07T17:15', false ],
[ '2017-02-07T17:10', null, null, null, -1, '2017-02-07T17:09', false ],
[ '2017-02-07T17:10', null, null, null, 0, '2017-02-07T17:10', false ],
// hour/minutes/seconds wrapping.
[ '2000-01-01T04:59', null, null, null, null, '2000-01-01T05:00', false ],
[ '2000-01-01T04:59:59', 1, null, null, null, '2000-01-01T05:00', false ],
[ '2000-01-01T04:59:59.900', 0.1, null, null, null, '2000-01-01T05:00', false ],
[ '2000-01-01T04:59:59.990', 0.01, null, null, null, '2000-01-01T05:00', false ],
[ '2000-01-01T04:59:59.999', 0.001, null, null, null, '2000-01-01T05:00', false ],
// month/year wrapping.
[ '2012-07-31T12:00', null, null, null, 1440, '2012-08-01T12:00', false ],
[ '1968-12-29T12:00', null, null, null, 5760, '1969-01-02T12:00', false ],
[ '1970-01-01T00:00', null, null, null, -1440, '1969-12-31T00:00', false ],
[ '2012-03-01T00:00', null, null, null, -1440, '2012-02-29T00:00', false ],
// stepUp() on '23:59' gives '00:00'.
[ '2017-02-07T23:59', null, null, null, 1, '2017-02-08T00:00', false ],
[ '2017-02-07T23:59', null, null, null, 3, '2017-02-08T00:02', false ],
// Some random step values..
[ '2017-02-07T17:40', '0.5', null, null, null, '2017-02-07T17:40:00.500', false ],
[ '2017-02-07T17:40', '2', null, null, null, '2017-02-07T17:40:02', false ],
[ '2017-02-07T17:40', '0.25', null, null, 4, '2017-02-07T17:40:01', false ],
[ '2017-02-07T17:40', '1.1', '2017-02-07T17:00', null, 1, '2017-02-07T17:40:00.200', false ],
[ '2017-02-07T17:40', '1.1', '2017-02-07T17:00', null, 2, '2017-02-07T17:40:01.300', false ],
[ '2017-02-07T17:40', '1.1', '2017-02-07T17:00', null, 10, '2017-02-07T17:40:10.100', false ],
[ '2017-02-07T17:40', '129600', '2017-02-01T00:00', null, 2, '2017-02-10T00:00', false ],
// step = 0 isn't allowed (-> step = 1).
[ '2017-02-07T17:39', '0', null, null, null, '2017-02-07T17:40', false ],
// step < 0 isn't allowed (-> step = 1).
[ '2017-02-07T17:39', '-1', null, null, null, '2017-02-07T17:40', false ],
// step = NaN isn't allowed (-> step = 1).
[ '2017-02-07T17:39', 'foo', null, null, null, '2017-02-07T17:40', false ],
// Min values testing.
[ '2012-02-02T17:00', '60', 'foo', null, 2, '2012-02-02T17:02', false ],
[ '2012-02-02T17:10', '60', '2012-02-02T17:10', null, null, '2012-02-02T17:11', false ],
[ '2012-02-02T17:10', '60', '2012-02-02T17:30', null, 1, '2012-02-02T17:30', false ],
[ '2012-02-02T17:10', '180', '2012-02-02T17:05', null, null, '2012-02-02T17:11', false ],
[ '2012-02-02T17:10', '86400', '2012-02-02T17:05', null, null, '2012-02-03T17:05', false ],
[ '2012-02-02T17:10', '129600', '2012-02-01T00:00', null, null, '2012-02-04T00:00', false ],
// Max values testing.
[ '2012-02-02T17:15', '60', null, 'foo', null, '2012-02-02T17:16', false ],
[ '2012-02-02T17:15', null, null, '2012-02-02T17:20', null, '2012-02-02T17:16', false ],
[ '2012-02-02T17:15', null, null, '2012-02-02T17:15', null, '2012-02-02T17:15', false ],
[ '2012-02-02T17:15', null, null, '2012-02-02T17:13', 4, '2012-02-02T17:15', false ],
[ '2012-02-02T20:05', '86400', null, '2012-02-03T20:05', null, '2012-02-03T20:05', false ],
[ '2012-02-02T18:00', '129600', null, '2012-02-04T20:00', null, '2012-02-04T06:00', false ],
// Step mismatch.
[ '2017-02-07T17:19', '120', '2017-02-07T17:10', null, null, '2017-02-07T17:20', false ],
[ '2017-02-07T17:19', '120', '2017-02-07T17:10', null, 2, '2017-02-07T17:22', false ],
[ '2017-02-07T17:19', '120', '2017-02-07T17:18', '2017-02-07T17:25', null, '2017-02-07T17:20', false ],
[ '2017-02-07T17:19', '120', null, null, null, '2017-02-07T17:21', false ],
[ '2017-02-07T17:19', '180', null, null, null, '2017-02-07T17:22', false ],
[ '2017-02-03T17:19', '172800', '2017-02-02T17:19', '2017-02-10T17:19', null, '2017-02-04T17:19', false ],
// Clamping.
[ '2017-02-07T17:22', null, null, '2017-02-07T17:11', null, '2017-02-07T17:22', false ],
[ '2017-02-07T17:22', '120', '2017-02-07T17:20', '2017-02-07T17:22', null, '2017-02-07T17:22', false ],
[ '2017-02-07T17:22', '300', '2017-02-07T17:12', '2017-02-07T17:20', 10, '2017-02-07T17:22', false ],
[ '2017-02-07T17:22', '300', '2017-02-07T17:18', '2017-02-07T17:20', 2, '2017-02-07T17:22', false ],
[ '2017-02-06T17:22', '600', '2017-02-02T17:00', '2017-02-07T17:20', 15, '2017-02-06T19:50', false ],
[ '2017-02-06T17:22', '600', '2017-02-02T17:10', '2017-02-07T17:20', 2, '2017-02-06T17:40', false ],
// value = "" (NaN).
[ '', null, null, null, null, '1970-01-01T00:01', false ],
// With step = 'any'.
[ '2017-02-07T17:30', 'any', null, null, 1, null, true ],
[ '2017-02-07T17:30', 'ANY', null, null, 1, null, true ],
[ '2017-02-07T17:30', 'AnY', null, null, 1, null, true ],
[ '2017-02-07T17:30', 'aNy', null, null, 1, null, true ],
]},
];
for (var test of testData) {

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

@ -42,6 +42,7 @@ const char* mozilla::dom::ContentPrefs::gInitPrefs[] = {
"dom.ipc.processPriorityManager.backgroundPerceivableGracePeriodMS",
"dom.max_chrome_script_run_time",
"dom.max_script_run_time",
"dom.mozBrowserFramesEnabled",
"dom.performance.enable_notify_performance_timing",
"dom.performance.enable_user_timing_logging",
"dom.storage.testing",

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

@ -160,7 +160,7 @@ parent:
async ReturnSitesWithData(nsCString[] aSites, uint64_t aCallbackId);
sync GetKeyState(int32_t aVirtKey)
intr GetKeyState(int32_t aVirtKey)
returns (int16_t aState);
intr NPN_SetValue_NPPVpluginRequiresAudioDeviceChanges(bool shouldRegister)

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

@ -2118,7 +2118,7 @@ PMCGetKeyState(int aVirtKey)
PluginModuleChild* chromeInstance = PluginModuleChild::GetChrome();
if (chromeInstance) {
int16_t ret = 0;
if (chromeInstance->SendGetKeyState(aVirtKey, &ret)) {
if (chromeInstance->CallGetKeyState(aVirtKey, &ret)) {
return ret;
}
}

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

@ -3403,19 +3403,19 @@ PluginModuleChromeParent::RecvProfile(const nsCString& aProfile)
}
mozilla::ipc::IPCResult
PluginModuleParent::RecvGetKeyState(const int32_t& aVirtKey, int16_t* aRet)
PluginModuleParent::AnswerGetKeyState(const int32_t& aVirtKey, int16_t* aRet)
{
return IPC_FAIL_NO_REASON(this);
}
mozilla::ipc::IPCResult
PluginModuleChromeParent::RecvGetKeyState(const int32_t& aVirtKey,
PluginModuleChromeParent::AnswerGetKeyState(const int32_t& aVirtKey,
int16_t* aRet)
{
#if defined(XP_WIN)
*aRet = ::GetKeyState(aVirtKey);
return IPC_OK();
#else
return PluginModuleParent::RecvGetKeyState(aVirtKey, aRet);
return PluginModuleParent::AnswerGetKeyState(aVirtKey, aRet);
#endif
}

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

@ -213,7 +213,7 @@ protected:
virtual mozilla::ipc::IPCResult RecvProfile(const nsCString& aProfile) override { return IPC_OK(); }
virtual mozilla::ipc::IPCResult RecvGetKeyState(const int32_t& aVirtKey, int16_t* aRet) override;
virtual mozilla::ipc::IPCResult AnswerGetKeyState(const int32_t& aVirtKey, int16_t* aRet) override;
virtual mozilla::ipc::IPCResult RecvReturnClearSiteData(const NPError& aRv,
const uint64_t& aCallbackId) override;
@ -507,7 +507,7 @@ class PluginModuleChromeParent
RecvProfile(const nsCString& aProfile) override;
virtual mozilla::ipc::IPCResult
RecvGetKeyState(const int32_t& aVirtKey, int16_t* aRet) override;
AnswerGetKeyState(const int32_t& aVirtKey, int16_t* aRet) override;
private:
virtual void

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

@ -124,7 +124,9 @@ skip-if = true # Bug 596491
[test_pluginstream_asfileonly.html]
[test_pluginstream_err.html]
[test_pluginstream_geturl.html]
skip-if = true # Bug 1267432
[test_pluginstream_geturlnotify.html]
skip-if = true # Bug 1267432
[test_pluginstream_newstream.html]
[test_pluginstream_post.html]
[test_pluginstream_poststream.html]

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

@ -170,16 +170,16 @@ function finishTests() {
</a>
<p id="display"></p>
<div id="content">
<object data="http://mochi.test:8888/tests/dom/tests/mochitest/general/res0.resource"> <!-- same origin, no header -->
<object data="http://test1.example.com/tests/dom/tests/mochitest/general/res0.resource"> <!-- cross origin, no header -->
<object data="http://test1.example.com/tests/dom/tests/mochitest/general/res1.resource"> <!-- cross origin, Timing-Allow-Origin: * header -->
<object data="http://test1.example.com/tests/dom/tests/mochitest/general/res2.resource"> <!-- cross origin redirect to test2.example.com, no header -->
<object data="http://test1.example.com/tests/dom/tests/mochitest/general/res3.resource"> <!-- cross origin, Timing-Allow-Origin: http://mochi.test:8888 header -->
<object data="http://test1.example.com/tests/dom/tests/mochitest/general/res4.resource"> <!-- cross origin redirect to mochi.test:8888/.../res1.resource, Timing-Allow-Origin: * -->
<object data="http://test1.example.com/tests/dom/tests/mochitest/general/res5.resource"> <!-- cross origin, Timing-Allow-Origin: http://mochi.test:8889 -->
<object data="http://test1.example.com/tests/dom/tests/mochitest/general/res6.resource"> <!-- cross origin, Timing-Allow-Origin: "" (empty string) -->
<object data="http://test1.example.com/tests/dom/tests/mochitest/general/res7.resource"> <!-- cross origin, Timing-Allow-Origin: http://mochi.test:8888 http://test1.com header -->
<object data="http://test1.example.com/tests/dom/tests/mochitest/general/res8.resource"> <!-- double cross origin redirect -->
<object data="http://mochi.test:8888/tests/dom/tests/mochitest/general/res0.resource"></object> <!-- same origin, no header -->
<object data="http://test1.example.com/tests/dom/tests/mochitest/general/res0.resource"></object> <!-- cross origin, no header -->
<object data="http://test1.example.com/tests/dom/tests/mochitest/general/res1.resource"></object> <!-- cross origin, Timing-Allow-Origin: * header -->
<object data="http://test1.example.com/tests/dom/tests/mochitest/general/res2.resource"></object> <!-- cross origin redirect to test2.example.com, no header -->
<object data="http://test1.example.com/tests/dom/tests/mochitest/general/res3.resource"></object> <!-- cross origin, Timing-Allow-Origin: http://mochi.test:8888 header -->
<object data="http://test1.example.com/tests/dom/tests/mochitest/general/res4.resource"></object> <!-- cross origin redirect to mochi.test:8888/.../res1.resource, Timing-Allow-Origin: * -->
<object data="http://test1.example.com/tests/dom/tests/mochitest/general/res5.resource"></object> <!-- cross origin, Timing-Allow-Origin: http://mochi.test:8889 -->
<object data="http://test1.example.com/tests/dom/tests/mochitest/general/res6.resource"></object> <!-- cross origin, Timing-Allow-Origin: "" (empty string) -->
<object data="http://test1.example.com/tests/dom/tests/mochitest/general/res7.resource"></object> <!-- cross origin, Timing-Allow-Origin: http://mochi.test:8888 http://test1.com header -->
<object data="http://test1.example.com/tests/dom/tests/mochitest/general/res8.resource"></object> <!-- double cross origin redirect -->
<script type="text/javascript" src="http://mochi.test:8888/tests/dom/tests/mochitest/general/resource_timing.js"></script> <!-- same origin script -->
</div>
</body>

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

@ -168,7 +168,7 @@ SimpleTest.waitForFocus(runTest);
<button id="b2" label="Button"/>
<button id="b3" label="Button"/>
<iframe id="child" src="data:text/html,&lt;html&gt;&lt;style&gt;* { outline: none; -moz-appearance: none; } %23elem:focus { outline: 2px solid red; } %23elem:-moz-focusring { outline: 1px solid blue; }&lt;/style&gt;&lt;div id='container'&gt;&lt;/html&gt;"/>
<iframe id="child" src="data:text/html,&lt;html&gt;&lt;style&gt;* { outline: none; -moz-appearance: none; min-width:10px; min-height:10px; } %23elem:focus { outline: 2px solid red; } %23elem:-moz-focusring { outline: 1px solid blue; }&lt;/style&gt;&lt;div id='container'&gt;&lt;/html&gt;"/>
<body xmlns="http://www.w3.org/1999/xhtml" style="height: 300px; overflow: auto;"/>

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

@ -151,6 +151,12 @@ public:
GetHref(aRetval, aRv);
}
void
ToJSON(nsAString& aResult, ErrorResult& aRv) const
{
GetHref(aResult, aRv);
}
// URLSearchParamsObserver
void
URLSearchParamsUpdated(URLSearchParams* aSearchParams) override;

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

@ -450,5 +450,11 @@
url = new URL("data:text/html,<a href=\"http://example.org/?q\">Link</a>");
is(url.href, "data:text/html,<a%20href=\"http://example.org/?q\">Link</a>");
</script>
<script>
var u = new URL('http://www.example.org');
ok(u.toJSON(), 'http://www.example.org', "URL.toJSON()");
is(JSON.stringify(u), "\"http://www.example.org/\"", "JSON.stringify(u) works");
</script>
</body>
</html>

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

@ -4,13 +4,13 @@
* You can obtain one at http://mozilla.org/MPL/2.0/.
*
* The origin of this IDL file is
* http://dev.w3.org/2006/webapi/FileAPI/#blob
* https://w3c.github.io/FileAPI/#blob
*
* Copyright © 2012 W3C® (MIT, ERCIM, Keio), All Rights Reserved. W3C
* liability, trademark and document use rules apply.
*/
typedef (ArrayBuffer or ArrayBufferView or Blob or USVString) BlobPart;
typedef (BufferSource or Blob or USVString) BlobPart;
[Constructor(optional sequence<BlobPart> blobParts,
optional BlobPropertyBag options),

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

@ -8,7 +8,7 @@
*/
typedef object JSON;
typedef (ArrayBuffer or ArrayBufferView or Blob or FormData or USVString or URLSearchParams) BodyInit;
typedef (Blob or BufferSource or FormData or URLSearchParams or USVString) BodyInit;
[NoInterfaceObject, Exposed=(Window,Worker)]
interface Body {

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

@ -25,5 +25,5 @@ interface MediaKeys {
MediaKeySession createSession(optional MediaKeySessionType sessionType = "temporary");
[NewObject]
Promise<void> setServerCertificate((ArrayBufferView or ArrayBuffer) serverCertificate);
Promise<void> setServerCertificate(BufferSource serverCertificate);
};

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

@ -44,9 +44,12 @@ interface URL {
attribute USVString pathname;
[Throws]
attribute USVString search;
readonly attribute URLSearchParams searchParams;
[SameObject] readonly attribute URLSearchParams searchParams;
[Throws]
attribute USVString hash;
[Throws]
USVString toJSON();
};
partial interface URL {

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

@ -1864,7 +1864,11 @@ XMLHttpRequestMainThread::OnDataAvailable(nsIRequest *request,
NS_ENSURE_SUCCESS(rv, rv);
ChangeState(State::loading);
return request->Cancel(NS_OK);
// Cancel() must be called with an error. We use
// NS_ERROR_FILE_ALREADY_EXISTS to know that we've aborted the operation
// just because we can retrieve the File from the channel directly.
return request->Cancel(NS_ERROR_FILE_ALREADY_EXISTS);
}
}
@ -2194,7 +2198,10 @@ XMLHttpRequestMainThread::OnStopRequest(nsIRequest *request, nsISupports *ctxt,
bool waitingForBlobCreation = false;
if (NS_SUCCEEDED(status) &&
// If we have this error, we have to deal with a file: URL + responseType =
// blob. We have this error because we canceled the channel. The status will
// be set to NS_OK.
if (status == NS_ERROR_FILE_ALREADY_EXISTS &&
(mResponseType == XMLHttpRequestResponseType::Blob ||
mResponseType == XMLHttpRequestResponseType::Moz_blob)) {
nsCOMPtr<nsIFile> file;
@ -2224,41 +2231,48 @@ XMLHttpRequestMainThread::OnStopRequest(nsIRequest *request, nsISupports *ctxt,
FileCreationHandler::Create(promise, this);
waitingForBlobCreation = true;
status = NS_OK;
NS_ASSERTION(mResponseBody.IsEmpty(), "mResponseBody should be empty");
NS_ASSERTION(mResponseText.IsEmpty(), "mResponseText should be empty");
}
}
if (NS_SUCCEEDED(status) &&
(mResponseType == XMLHttpRequestResponseType::Blob ||
mResponseType == XMLHttpRequestResponseType::Moz_blob) &&
!waitingForBlobCreation) {
// Smaller files may be written in cache map instead of separate files.
// Also, no-store response cannot be written in persistent cache.
nsAutoCString contentType;
mChannel->GetContentType(contentType);
if (mResponseType == XMLHttpRequestResponseType::Blob) {
// mBlobStorage can be null if the channel is non-file non-cacheable
// and if the response length is zero.
MaybeCreateBlobStorage();
mBlobStorage->GetBlobWhenReady(GetOwner(), contentType, this);
waitingForBlobCreation = true;
} else {
// No local file.
// Smaller files may be written in cache map instead of separate files.
// Also, no-store response cannot be written in persistent cache.
nsAutoCString contentType;
mChannel->GetContentType(contentType);
if (mResponseType == XMLHttpRequestResponseType::Blob) {
// mBlobStorage can be null if the channel is non-file non-cacheable
// and if the response length is zero.
MaybeCreateBlobStorage();
mBlobStorage->GetBlobWhenReady(GetOwner(), contentType, this);
waitingForBlobCreation = true;
} else {
// mBlobSet can be null if the channel is non-file non-cacheable
// and if the response length is zero.
if (!mBlobSet) {
mBlobSet = new BlobSet();
}
ErrorResult error;
nsTArray<RefPtr<BlobImpl>> subImpls(mBlobSet->GetBlobImpls());
RefPtr<BlobImpl> blobImpl =
MultipartBlobImpl::Create(Move(subImpls),
NS_ConvertASCIItoUTF16(contentType),
error);
mBlobSet = nullptr;
if (NS_WARN_IF(error.Failed())) {
return error.StealNSResult();
}
mResponseBlob = Blob::Create(GetOwner(), blobImpl);
// mBlobSet can be null if the channel is non-file non-cacheable
// and if the response length is zero.
if (!mBlobSet) {
mBlobSet = new BlobSet();
}
ErrorResult error;
nsTArray<RefPtr<BlobImpl>> subImpls(mBlobSet->GetBlobImpls());
RefPtr<BlobImpl> blobImpl =
MultipartBlobImpl::Create(Move(subImpls),
NS_ConvertASCIItoUTF16(contentType),
error);
mBlobSet = nullptr;
if (NS_WARN_IF(error.Failed())) {
return error.StealNSResult();
}
mResponseBlob = Blob::Create(GetOwner(), blobImpl);
}
NS_ASSERTION(mResponseBody.IsEmpty(), "mResponseBody should be empty");

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

@ -1315,12 +1315,6 @@ EventRunnable::WorkerRun(JSContext* aCx, WorkerPrivate* aWorkerPrivate)
return true;
}
JS::Rooted<JSString*> type(aCx,
JS_NewUCStringCopyN(aCx, mType.get(), mType.Length()));
if (!type) {
return false;
}
XMLHttpRequestEventTarget* target;
if (mUploadEvent) {
target = xhr->GetUploadObjectNoCreate();

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

@ -674,13 +674,10 @@ EditorBase::DoTransaction(nsITransaction* aTxn)
{
if (mPlaceHolderBatch && !mPlaceHolderTxn) {
nsCOMPtr<nsIAbsorbingTransaction> placeholderTransaction =
new PlaceholderTransaction();
new PlaceholderTransaction(*this, mPlaceHolderName, Move(mSelState));
// Save off weak reference to placeholder transaction
mPlaceHolderTxn = do_GetWeakReference(placeholderTransaction);
placeholderTransaction->Init(mPlaceHolderName, mSelState, this);
// placeholder txn took ownership of this pointer
mSelState = nullptr;
// QI to an nsITransaction since that's what DoTransaction() expects
nsCOMPtr<nsITransaction> transaction =
@ -925,7 +922,7 @@ EditorBase::BeginPlaceHolderTransaction(nsIAtom* aName)
mPlaceHolderName = aName;
RefPtr<Selection> selection = GetSelection();
if (selection) {
mSelState = new SelectionState();
mSelState = MakeUnique<SelectionState>();
mSelState->SaveSelection(selection);
// Composition transaction can modify multiple nodes and it merges text
// node for ime into single text node.
@ -989,7 +986,6 @@ EditorBase::EndPlaceHolderTransaction()
if (mPlaceHolderName == nsGkAtoms::IMETxnName) {
mRangeUpdater.DropSelectionState(*mSelState);
}
delete mSelState;
mSelState = nullptr;
}
// We might have never made a placeholder if no action took place.

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

@ -11,6 +11,7 @@
#include "mozilla/OwningNonNull.h" // for OwningNonNull
#include "mozilla/SelectionState.h" // for RangeUpdater, etc.
#include "mozilla/StyleSheet.h" // for StyleSheet
#include "mozilla/UniquePtr.h"
#include "mozilla/dom/Text.h"
#include "nsCOMPtr.h" // for already_AddRefed, nsCOMPtr
#include "nsCycleCollectionParticipant.h"
@ -996,7 +997,7 @@ protected:
// Name of placeholder transaction.
nsIAtom* mPlaceHolderName;
// Saved selection state for placeholder transaction batching.
SelectionState* mSelState;
mozilla::UniquePtr<SelectionState> mSelState;
nsString* mPhonetic;
// IME composition this is not null between compositionstart and
// compositionend.

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

@ -16,13 +16,14 @@
#include "mozilla/EditorUtils.h"
#include "mozilla/HTMLEditor.h"
#include "mozilla/MathAlgorithms.h"
#include "mozilla/Move.h"
#include "mozilla/Preferences.h"
#include "mozilla/UniquePtr.h"
#include "mozilla/Unused.h"
#include "mozilla/dom/Selection.h"
#include "mozilla/dom/Element.h"
#include "mozilla/OwningNonNull.h"
#include "mozilla/mozalloc.h"
#include "nsAutoPtr.h"
#include "nsAString.h"
#include "nsAlgorithm.h"
#include "nsCRT.h"
@ -4508,20 +4509,21 @@ HTMLEditRules::CreateStyleForInsertText(Selection& aSelection,
NS_ENSURE_STATE(rootElement);
// process clearing any styles first
nsAutoPtr<PropItem> item(mHTMLEditor->mTypeInState->TakeClearProperty());
UniquePtr<PropItem> item =
Move(mHTMLEditor->mTypeInState->TakeClearProperty());
while (item && node != rootElement) {
NS_ENSURE_STATE(mHTMLEditor);
nsresult rv =
mHTMLEditor->ClearStyle(address_of(node), &offset,
item->tag, &item->attr);
NS_ENSURE_SUCCESS(rv, rv);
item = mHTMLEditor->mTypeInState->TakeClearProperty();
item = Move(mHTMLEditor->mTypeInState->TakeClearProperty());
weDidSomething = true;
}
// then process setting any styles
int32_t relFontSize = mHTMLEditor->mTypeInState->TakeRelativeFontSize();
item = mHTMLEditor->mTypeInState->TakeSetProperty();
item = Move(mHTMLEditor->mTypeInState->TakeSetProperty());
if (item || relFontSize) {
// we have at least one style to add; make a new text node to insert style

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

@ -280,7 +280,7 @@ HTMLEditor::Init(nsIDOMDocument* aDoc,
}
// Init the HTML-CSS utils
mCSSEditUtils = new CSSEditUtils(this);
mCSSEditUtils = MakeUnique<CSSEditUtils>(this);
// disable links
nsCOMPtr<nsIPresShell> presShell = GetPresShell();

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

@ -10,11 +10,11 @@
#include "mozilla/CSSEditUtils.h"
#include "mozilla/StyleSheet.h"
#include "mozilla/TextEditor.h"
#include "mozilla/UniquePtr.h"
#include "mozilla/dom/Element.h"
#include "mozilla/dom/File.h"
#include "nsAttrName.h"
#include "nsAutoPtr.h"
#include "nsCOMPtr.h"
#include "nsIContentFilter.h"
#include "nsICSSLoaderObserver.h"
@ -822,7 +822,7 @@ protected:
bool mCRInParagraphCreatesParagraph;
bool mCSSAware;
nsAutoPtr<CSSEditUtils> mCSSEditUtils;
UniquePtr<CSSEditUtils> mCSSEditUtils;
// Used by GetFirstSelectedCell and GetNextSelectedCell
int32_t mSelectedCellIndex;

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

@ -8,6 +8,7 @@
#include "CompositionTransaction.h"
#include "mozilla/EditorBase.h"
#include "mozilla/dom/Selection.h"
#include "mozilla/Move.h"
#include "nsGkAtoms.h"
#include "nsQueryObject.h"
@ -15,13 +16,18 @@ namespace mozilla {
using namespace dom;
PlaceholderTransaction::PlaceholderTransaction()
PlaceholderTransaction::PlaceholderTransaction(
EditorBase& aEditorBase,
nsIAtom* aName,
UniquePtr<SelectionState> aSelState)
: mAbsorb(true)
, mForwarding(nullptr)
, mCompositionTransaction(nullptr)
, mCommitted(false)
, mEditorBase(nullptr)
, mStartSel(Move(aSelState))
, mEditorBase(aEditorBase)
{
mName = aName;
}
PlaceholderTransaction::~PlaceholderTransaction()
@ -54,19 +60,6 @@ NS_INTERFACE_MAP_END_INHERITING(EditAggregateTransaction)
NS_IMPL_ADDREF_INHERITED(PlaceholderTransaction, EditAggregateTransaction)
NS_IMPL_RELEASE_INHERITED(PlaceholderTransaction, EditAggregateTransaction)
NS_IMETHODIMP
PlaceholderTransaction::Init(nsIAtom* aName,
SelectionState* aSelState,
EditorBase* aEditorBase)
{
NS_ENSURE_TRUE(aEditorBase && aSelState, NS_ERROR_NULL_POINTER);
mName = aName;
mStartSel = aSelState;
mEditorBase = aEditorBase;
return NS_OK;
}
NS_IMETHODIMP
PlaceholderTransaction::DoTransaction()
{
@ -83,7 +76,7 @@ PlaceholderTransaction::UndoTransaction()
NS_ENSURE_TRUE(mStartSel, NS_ERROR_NULL_POINTER);
// now restore selection
RefPtr<Selection> selection = mEditorBase->GetSelection();
RefPtr<Selection> selection = mEditorBase.GetSelection();
NS_ENSURE_TRUE(selection, NS_ERROR_NULL_POINTER);
return mStartSel->RestoreSelection(selection);
}
@ -96,7 +89,7 @@ PlaceholderTransaction::RedoTransaction()
NS_ENSURE_SUCCESS(rv, rv);
// now restore selection
RefPtr<Selection> selection = mEditorBase->GetSelection();
RefPtr<Selection> selection = mEditorBase.GetSelection();
NS_ENSURE_TRUE(selection, NS_ERROR_NULL_POINTER);
return mEndSel.RestoreSelection(selection);
}
@ -261,7 +254,7 @@ PlaceholderTransaction::Commit()
nsresult
PlaceholderTransaction::RememberEndingSelection()
{
RefPtr<Selection> selection = mEditorBase->GetSelection();
RefPtr<Selection> selection = mEditorBase.GetSelection();
NS_ENSURE_TRUE(selection, NS_ERROR_NULL_POINTER);
mEndSel.SaveSelection(selection);
return NS_OK;

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

@ -8,12 +8,12 @@
#include "EditAggregateTransaction.h"
#include "mozilla/EditorUtils.h"
#include "mozilla/UniquePtr.h"
#include "nsIAbsorbingTransaction.h"
#include "nsIDOMNode.h"
#include "nsCOMPtr.h"
#include "nsWeakPtr.h"
#include "nsWeakReference.h"
#include "nsAutoPtr.h"
namespace mozilla {
@ -33,7 +33,8 @@ class PlaceholderTransaction final : public EditAggregateTransaction,
public:
NS_DECL_ISUPPORTS_INHERITED
PlaceholderTransaction();
PlaceholderTransaction(EditorBase& aEditorBase, nsIAtom* aName,
UniquePtr<SelectionState> aSelState);
NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(PlaceholderTransaction,
EditAggregateTransaction)
@ -46,9 +47,6 @@ public:
// ------------ nsIAbsorbingTransaction -----------------------
NS_IMETHOD Init(nsIAtom* aName, SelectionState* aSelState,
EditorBase* aEditorBase) override;
NS_IMETHOD GetTxnName(nsIAtom** aName) override;
NS_IMETHOD StartSelectionEquals(SelectionState* aSelState,
@ -80,11 +78,11 @@ protected:
// restore the selection properly.
// Use a pointer because this is constructed before we exist.
nsAutoPtr<SelectionState> mStartSel;
UniquePtr<SelectionState> mStartSel;
SelectionState mEndSel;
// The editor for this transaction.
EditorBase* mEditorBase;
EditorBase& mEditorBase;
};
} // namespace mozilla

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

@ -193,7 +193,7 @@ TypeInState::ClearProp(nsIAtom* aProp,
* TakeClearProperty() hands back next property item on the clear list.
* Caller assumes ownership of PropItem and must delete it.
*/
PropItem*
UniquePtr<PropItem>
TypeInState::TakeClearProperty()
{
size_t count = mClearedArray.Length();
@ -204,14 +204,14 @@ TypeInState::TakeClearProperty()
--count; // indices are zero based
PropItem* propItem = mClearedArray[count];
mClearedArray.RemoveElementAt(count);
return propItem;
return UniquePtr<PropItem>(propItem);
}
/**
* TakeSetProperty() hands back next poroperty item on the set list.
* Caller assumes ownership of PropItem and must delete it.
*/
PropItem*
UniquePtr<PropItem>
TypeInState::TakeSetProperty()
{
size_t count = mSetArray.Length();
@ -221,7 +221,7 @@ TypeInState::TakeSetProperty()
count--; // indices are zero based
PropItem* propItem = mSetArray[count];
mSetArray.RemoveElementAt(count);
return propItem;
return UniquePtr<PropItem>(propItem);
}
/**

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

@ -6,6 +6,7 @@
#ifndef TypeInState_h
#define TypeInState_h
#include "mozilla/UniquePtr.h"
#include "nsCOMPtr.h"
#include "nsCycleCollectionParticipant.h"
#include "nsISelectionListener.h"
@ -63,13 +64,13 @@ public:
* TakeClearProperty() hands back next property item on the clear list.
* Caller assumes ownership of PropItem and must delete it.
*/
PropItem* TakeClearProperty();
UniquePtr<PropItem> TakeClearProperty();
/**
* TakeSetProperty() hands back next property item on the set list.
* Caller assumes ownership of PropItem and must delete it.
*/
PropItem* TakeSetProperty();
UniquePtr<PropItem> TakeSetProperty();
/**
* TakeRelativeFontSize() hands back relative font value, which is then

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

@ -35,9 +35,6 @@ public:
NS_DECLARE_STATIC_IID_ACCESSOR(NS_IABSORBINGTRANSACTION_IID)
NS_IMETHOD Init(nsIAtom* aName, mozilla::SelectionState* aSelState,
mozilla::EditorBase* aEditorBase) = 0;
NS_IMETHOD EndPlaceHolderBatch()=0;
NS_IMETHOD GetTxnName(nsIAtom **aName)=0;

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

@ -88,7 +88,7 @@ fails == 642800.html 642800.html
fails == selection_visibility_after_reframe.html selection_visibility_after_reframe.html
fails == selection_visibility_after_reframe-2.html selection_visibility_after_reframe-2.html
fails == selection_visibility_after_reframe-3.html selection_visibility_after_reframe-3.html
fails == 672709.html 672709.html
== 672709.html 672709.html
fails == 338427-1.html 338427-1.html
fails == 674212-spellcheck.html 674212-spellcheck.html
fails == 338427-2.html 338427-2.html

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

@ -2427,6 +2427,13 @@ public:
Mutated();
}
virtual void SetStyles(const BorderStyles& aBorderStyles)
{
MOZ_LAYERS_LOG_IF_SHADOWABLE(this, ("Layer::Mutated(%p) Widths", this));
PodCopy(&mBorderStyles[0], &aBorderStyles[0], 4);
Mutated();
}
MOZ_LAYER_DECL_NAME("BorderLayer", TYPE_BORDER)
virtual void ComputeEffectiveTransforms(const gfx::Matrix4x4& aTransformToSurface) override
@ -2454,6 +2461,7 @@ protected:
LayerRect mRect;
BorderCorners mCorners;
BorderWidths mWidths;
BorderStyles mBorderStyles;
};
/**

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

@ -249,6 +249,7 @@ typedef gfx::Matrix4x4Typed<CSSTransformedLayerPixel, ParentLayerPixel> AsyncTra
typedef Array<gfx::Color, 4> BorderColors;
typedef Array<LayerSize, 4> BorderCorners;
typedef Array<LayerCoord, 4> BorderWidths;
typedef Array<uint8_t, 4> BorderStyles;
// This is used to communicate Layers across IPC channels. The Handle is valid
// for layers in the same PLayerTransaction. Handles are created by ClientLayerManager,

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

@ -311,14 +311,14 @@ void Axis::EndTouch(uint32_t aTimestampMs) {
mAxisLocked = false;
mVelocity = 0;
int count = 0;
while (!mVelocityQueue.IsEmpty()) {
uint32_t timeDelta = (aTimestampMs - mVelocityQueue[0].first);
for (const auto& e : mVelocityQueue) {
uint32_t timeDelta = (aTimestampMs - e.first);
if (timeDelta < gfxPrefs::APZVelocityRelevanceTime()) {
count++;
mVelocity += mVelocityQueue[0].second;
mVelocity += e.second;
}
mVelocityQueue.RemoveElementAt(0);
}
mVelocityQueue.Clear();
if (count > 1) {
mVelocity /= count;
}
@ -333,9 +333,7 @@ void Axis::CancelGesture() {
AXIS_LOG("%p|%s cancelling touch, clearing velocity queue\n",
mAsyncPanZoomController, Name());
mVelocity = 0.0f;
while (!mVelocityQueue.IsEmpty()) {
mVelocityQueue.RemoveElementAt(0);
}
mVelocityQueue.Clear();
}
bool Axis::CanScroll() const {

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

@ -107,9 +107,9 @@ asserts-if(stylo,1) load 766452-1.html # bug 1324700
load 766452-2.html
load 768079-1.html
asserts-if(stylo,2) load 783041-1.html # bug 1324661
load 783041-2.html
asserts-if(stylo,1) load 783041-3.html # bug 1324671
load 783041-4.html
asserts-if(stylo,2) load 783041-2.html # bug 1324661
asserts-if(stylo,3) load 783041-3.html # bug 1324671
asserts-if(stylo,2) load 783041-4.html # bug 1324661
load 798853.html # bug 868792
load 805760-1.html
skip-if(Android) load 815489.html # bug 1216304

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

@ -230,11 +230,17 @@ nsIconChannel::AsyncOpen(nsIStreamListener* aListener,
nsCOMPtr<nsIInputStream> inStream;
nsresult rv = MakeInputStream(getter_AddRefs(inStream), true);
NS_ENSURE_SUCCESS(rv, rv);
if (NS_FAILED(rv)) {
mCallbacks = nullptr;
return rv;
}
// Init our stream pump
rv = mPump->Init(inStream, int64_t(-1), int64_t(-1), 0, 0, false);
NS_ENSURE_SUCCESS(rv, rv);
if (NS_FAILED(rv)) {
mCallbacks = nullptr;
return rv;
}
rv = mPump->AsyncRead(this, ctxt);
if (NS_SUCCEEDED(rv)) {
@ -244,6 +250,8 @@ nsIconChannel::AsyncOpen(nsIStreamListener* aListener,
if (mLoadGroup) {
mLoadGroup->AddRequest(this, nullptr);
}
} else {
mCallbacks = nullptr;
}
return rv;
@ -254,7 +262,10 @@ nsIconChannel::AsyncOpen2(nsIStreamListener* aListener)
{
nsCOMPtr<nsIStreamListener> listener = aListener;
nsresult rv = nsContentSecurityManager::doContentSecurityCheck(this, listener);
NS_ENSURE_SUCCESS(rv, rv);
if (NS_FAILED(rv)) {
mCallbacks = nullptr;
return rv;
}
return AsyncOpen(listener, nullptr);
}

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

@ -245,12 +245,14 @@ nsIconChannel::AsyncOpen(nsIStreamListener* aListener,
nsCOMPtr<nsIInputStream> inStream;
nsresult rv = MakeInputStream(getter_AddRefs(inStream), true);
if (NS_FAILED(rv)) {
mCallbacks = nullptr;
return rv;
}
// Init our streampump
rv = mPump->Init(inStream, int64_t(-1), int64_t(-1), 0, 0, false);
if (NS_FAILED(rv)) {
mCallbacks = nullptr;
return rv;
}
@ -262,7 +264,10 @@ nsIconChannel::AsyncOpen(nsIStreamListener* aListener,
if (mLoadGroup) {
mLoadGroup->AddRequest(this, nullptr);
}
} else {
mCallbacks = nullptr;
}
return rv;
}
@ -271,7 +276,10 @@ nsIconChannel::AsyncOpen2(nsIStreamListener* aListener)
{
nsCOMPtr<nsIStreamListener> listener = aListener;
nsresult rv = nsContentSecurityManager::doContentSecurityCheck(this, listener);
NS_ENSURE_SUCCESS(rv, rv);
if (NS_FAILED(rv)) {
mCallbacks = nullptr;
return rv;
}
return AsyncOpen(listener, nullptr);
}

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

@ -60,15 +60,6 @@ LocaleService::GetAppLocales(nsTArray<nsCString>& aRetVal)
aRetVal = mAppLocales;
}
void
LocaleService::GetAppLocale(nsACString& aRetVal)
{
if (mAppLocales.IsEmpty()) {
ReadAppLocales(mAppLocales);
}
aRetVal = mAppLocales[0];
}
void
LocaleService::Refresh()
{
@ -111,8 +102,11 @@ LocaleService::GetAppLocales(JSContext* aCtx, JS::MutableHandleValue aRetVal)
}
NS_IMETHODIMP
LocaleService::GetAppLocale(JSContext* aCtx, nsACString& aRetVal)
LocaleService::GetAppLocale(nsACString& aRetVal)
{
GetAppLocale(aRetVal);
if (mAppLocales.IsEmpty()) {
ReadAppLocales(mAppLocales);
}
aRetVal = mAppLocales[0];
return NS_OK;
}

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

@ -57,30 +57,13 @@ public:
* Example: ["en-US", "de", "pl", "sr-Cyrl", "zh-Hans-HK"]
*
* Usage:
* nsTArray<nsCString> appLocales;
* LocaleService::GetInstance()->GetAppLocales(appLocales);
* nsTArray<nsCString> appLocales;
* LocaleService::GetInstance()->GetAppLocales(appLocales);
*
* (See mozILocaleService.idl for a JS-callable version of this.)
*/
void GetAppLocales(nsTArray<nsCString>& aRetVal);
/**
* Returns the best locale that the application should be localized to.
*
* The result is a valid locale IDs and it should be
* used for all APIs that do not handle language negotiation.
*
* Where possible, GetAppLocales should be preferred over this API and
* all callsites should handle some form of "best effort" language
* negotiation to respect user preferences in case the use case does
* not have data for the first locale in the list.
*
* Example: "zh-Hans-HK"
*
* Usage:
* nsAutoCString appLocale;
* LocaleService::GetInstance()->GetAppLocale(appLocale);
*/
void GetAppLocale(nsACString& aRetVal);
/**
* Triggers a refresh of the language negotiation process.
*

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

@ -8,6 +8,9 @@ XPCSHELL_TESTS_MANIFESTS += ['tests/unit/xpcshell.ini']
if CONFIG['ENABLE_INTL_API']:
SOURCES += ['OSPreferences.cpp']
EXPORTS.mozilla.intl += [
'OSPreferences.h',
]
toolkit = CONFIG['MOZ_WIDGET_TOOLKIT']
@ -40,7 +43,7 @@ EXPORTS += [
]
EXPORTS.mozilla.intl += [
'LocaleService.h'
'LocaleService.h',
]
UNIFIED_SOURCES += [

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

@ -16,6 +16,32 @@
[scriptable, uuid(C27F8983-B48B-4D1A-92D7-FEB8106F212D)]
interface mozILocaleService : nsISupports
{
/**
* Returns a list of locales that the application should be localized to.
*
* The result is a sorted list of valid locale IDs and it should be
* used for all APIs that accept list of locales, like ECMA402 and L10n APIs.
*
* This API always returns at least one locale.
*
* Example: ["en-US", "de", "pl", "sr-Cyrl", "zh-Hans-HK"]
*
* (See LocaleService.h for a more C++-friendly version of this.)
*/
[implicit_jscontext] jsval getAppLocales();
[implicit_jscontext] ACString getAppLocale();
/**
* Returns the best locale that the application should be localized to.
*
* The result is a valid locale ID and it should be
* used for all APIs that do not handle language negotiation.
*
* Where possible, getAppLocales() should be preferred over this API and
* all callsites should handle some form of "best effort" language
* negotiation to respect user preferences in case the use case does
* not have data for the first locale in the list.
*
* Example: "zh-Hans-HK"
*/
ACString getAppLocale();
};

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

@ -4,7 +4,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "gtest/gtest.h"
#include "LocaleService.h"
#include "mozilla/intl/LocaleService.h"
#include "mozilla/Services.h"
#include "nsIToolkitChromeRegistry.h"

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

@ -4,7 +4,7 @@
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "gtest/gtest.h"
#include "OSPreferences.h"
#include "mozilla/intl/OSPreferences.h"
using namespace mozilla::intl;

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

@ -14,8 +14,4 @@ if CONFIG['ENABLE_INTL_API']:
'TestOSPreferences.cpp',
]
LOCAL_INCLUDES += [
'/intl/locale',
]
FINAL_LIBRARY = 'xul-gtest'

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

@ -46,7 +46,7 @@ struct ForEachTrackedOptimizationTypeInfoOp;
// contents to become out of date.
class JS_PUBLIC_API(ProfilingFrameIterator)
{
JSRuntime* rt_;
JSContext* cx_;
uint32_t sampleBufferGen_;
js::Activation* activation_;

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

@ -142,8 +142,6 @@ FOR_EACH_PUBLIC_TAGGED_GC_POINTER_TYPE(DECLARE_IS_HEAP_CONSTRUCTIBLE_TYPE)
template <typename T, typename Wrapper>
class PersistentRootedBase : public MutableWrappedPtrOperations<T, Wrapper> {};
static void* const ConstNullValue = nullptr;
namespace gc {
struct Cell;
template<typename T>
@ -471,7 +469,8 @@ class MOZ_NONHEAP_CLASS Handle : public js::HandleBase<T, Handle<T>>
MOZ_IMPLICIT Handle(decltype(nullptr)) {
static_assert(mozilla::IsPointer<T>::value,
"nullptr_t overload not valid for non-pointer types");
ptr = reinterpret_cast<const T*>(&js::ConstNullValue);
static void* const ConstNullValue = nullptr;
ptr = reinterpret_cast<const T*>(&ConstNullValue);
}
MOZ_IMPLICIT Handle(MutableHandle<T> handle) {

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

@ -2155,7 +2155,7 @@ SetJitCompilerOption(JSContext* cx, unsigned argc, Value* vp)
if ((opt == JSJITCOMPILER_BASELINE_ENABLE || opt == JSJITCOMPILER_ION_ENABLE) &&
number == 0)
{
js::jit::JitActivationIterator iter(cx->runtime());
js::jit::JitActivationIterator iter(cx);
if (!iter.done()) {
JS_ReportErrorASCII(cx, "Can't turn off JITs with JIT code on the stack.");
return false;

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

@ -7932,18 +7932,11 @@ Parser<ParseHandler>::unaryExpr(YieldHandling yieldHandling, TripledotHandling t
return null();
}
TokenKind nextSameLine = TOK_EOF;
if (!tokenStream.peekTokenSameLine(&nextSameLine, TokenStream::Operand))
Node kid = unaryExpr(yieldHandling, tripledotHandling, possibleError, invoked);
if (!kid)
return null();
if (nextSameLine != TOK_EOL) {
Node kid = unaryExpr(yieldHandling, tripledotHandling, possibleError, invoked);
if (!kid)
return null();
pc->lastAwaitOffset = begin;
return newAwaitExpression(begin, kid);
}
error(JSMSG_LINE_BREAK_AFTER_AWAIT);
return null();
pc->lastAwaitOffset = begin;
return newAwaitExpression(begin, kid);
}
default: {

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

@ -47,6 +47,7 @@ class MOZ_RAII AutoTraceSession
JS::HeapState prevState;
AutoGeckoProfilerEntry pseudoFrame;
JSRuntime::AutoProhibitActiveContextChange prohibitActiveContextChange;
};
class MOZ_RAII AutoPrepareForTracing

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

@ -985,7 +985,7 @@ class GCRuntime
UnprotectedData<JS::Zone*> systemZone;
// List of all zone groups (protected by the GC lock).
ActiveThreadData<ZoneGroupVector> groups;
ActiveThreadOrGCTaskData<ZoneGroupVector> groups;
// The unique atoms zone, which has no zone group.
WriteOnceData<Zone*> atomsZone;

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

@ -546,7 +546,7 @@ void
js::Nursery::collect(JS::gcreason::Reason reason)
{
MOZ_ASSERT(!TlsContext.get()->suppressGC);
MOZ_RELEASE_ASSERT(TlsContext.get() == zoneGroup()->context);
MOZ_RELEASE_ASSERT(zoneGroup()->ownedByCurrentThread());
if (!isEnabled() || isEmpty()) {
// Our barriers are not always exact, and there may be entries in the
@ -727,7 +727,7 @@ js::Nursery::doCollection(JS::gcreason::Reason reason,
// Update any slot or element pointers whose destination has been tenured.
maybeStartProfile(ProfileKey::UpdateJitActivations);
js::jit::UpdateJitActivationsForMinorGC(rt, &mover);
js::jit::UpdateJitActivationsForMinorGC(zoneGroup(), &mover);
forwardedBuffers.finish();
maybeEndProfile(ProfileKey::UpdateJitActivations);

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

@ -325,9 +325,12 @@ js::gc::GCRuntime::traceRuntimeCommon(JSTracer* trc, TraceOrMarkRuntime traceOrM
{
gcstats::AutoPhase ap(stats(), gcstats::PHASE_MARK_STACK);
// Trace active interpreter and JIT stack roots.
TraceInterpreterActivations(rt, trc);
jit::TraceJitActivations(rt, trc);
JSContext* cx = TlsContext.get();
for (const CooperatingContext& target : rt->cooperatingContexts()) {
// Trace active interpreter and JIT stack roots.
TraceInterpreterActivations(cx, target, trc);
jit::TraceJitActivations(cx, target, trc);
}
// Trace legacy C stack roots.
AutoGCRooter::traceAll(trc);

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

@ -358,12 +358,6 @@ Zone::notifyObservingDebuggers()
}
}
bool
js::ZonesIter::atAtomsZone(JSRuntime* rt)
{
return rt->isAtomsZone(*it);
}
bool
Zone::isOnList() const
{

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

@ -602,6 +602,39 @@ struct Zone : public JS::shadow::Zone,
namespace js {
// Iterate over all zone groups except those which may be in use by parse
// threads. Pretty soon this will exclude zone groups in use by parse threads
// (as for ZonesIter), i.e. the zone groups in use by cooperating threads,
// except that right now parse threads use zones in the same zone group as
// cooperating threads (bug 1323066).
class ZoneGroupsIter
{
gc::AutoEnterIteration iterMarker;
ZoneGroup** it;
ZoneGroup** end;
public:
explicit ZoneGroupsIter(JSRuntime* rt) : iterMarker(&rt->gc) {
it = rt->gc.groups.ref().begin();
end = rt->gc.groups.ref().end();
}
bool done() const { return it == end; }
void next() {
MOZ_ASSERT(!done());
it++;
}
ZoneGroup* get() const {
MOZ_ASSERT(!done());
return *it;
}
operator ZoneGroup*() const { return get(); }
ZoneGroup* operator->() const { return get(); }
};
// Using the atoms zone without holding the exclusive access lock is dangerous
// because worker threads may be using it simultaneously. Therefore, it's
// better to skip the atoms zone when iterating over zones. If you need to
@ -611,34 +644,24 @@ enum ZoneSelector {
SkipAtoms
};
class ZonesIter
// Iterate over all zones in one zone group.
class ZonesInGroupIter
{
gc::AutoEnterIteration iterMarker;
JSRuntime* rt;
JS::Zone** it;
JS::Zone** end;
public:
ZonesIter(JSRuntime* rt, ZoneSelector selector) : iterMarker(&rt->gc), rt(rt) {
if (selector == WithAtoms && rt->gc.atomsZone)
it = const_cast<JS::Zone**>(&rt->gc.atomsZone.ref());
else
it = rt->zoneGroupFromAnyThread()->zones().begin();
end = rt->zoneGroupFromAnyThread()->zones().end();
explicit ZonesInGroupIter(ZoneGroup* group) : iterMarker(&group->runtime->gc) {
it = group->zones().begin();
end = group->zones().end();
}
bool atAtomsZone(JSRuntime* rt);
bool done() const { return it == end; }
void next() {
MOZ_ASSERT(!done());
do {
if (it == &rt->gc.atomsZone.ref())
it = rt->zoneGroupFromAnyThread()->zones().begin();
else
it++;
} while (!done() && (*it)->usedByExclusiveThread);
it++;
}
JS::Zone* get() const {
@ -650,6 +673,55 @@ class ZonesIter
JS::Zone* operator->() const { return get(); }
};
// Iterate over all zones in the runtime, except those which may be in use by
// parse threads.
class ZonesIter
{
ZoneGroupsIter group;
Maybe<ZonesInGroupIter> zone;
JS::Zone* atomsZone;
public:
ZonesIter(JSRuntime* rt, ZoneSelector selector)
: group(rt), atomsZone(selector == WithAtoms ? rt->gc.atomsZone.ref() : nullptr)
{
if (!atomsZone && !done())
next();
}
bool atAtomsZone(JSRuntime* rt) const {
return !!atomsZone;
}
bool done() const { return !atomsZone && group.done(); }
void next() {
MOZ_ASSERT(!done());
if (atomsZone)
atomsZone = nullptr;
while (!group.done()) {
if (zone.isSome())
zone.ref().next();
else
zone.emplace(group);
if (zone.ref().done()) {
zone.reset();
group.next();
} else if (!zone.ref().get()->usedByExclusiveThread) {
break;
}
}
}
JS::Zone* get() const {
MOZ_ASSERT(!done());
return atomsZone ? atomsZone : zone.ref().get();
}
operator JS::Zone*() const { return get(); }
JS::Zone* operator->() const { return get(); }
};
struct CompartmentsInZoneIter
{
explicit CompartmentsInZoneIter(JS::Zone* zone) : zone(zone) {

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

@ -14,7 +14,7 @@ namespace js {
ZoneGroup::ZoneGroup(JSRuntime* runtime)
: runtime(runtime),
context(TlsContext.get()),
ownerContext_(TlsContext.get()),
enterCount(this, 1),
zones_(),
nursery_(this, this),
@ -25,9 +25,7 @@ ZoneGroup::ZoneGroup(JSRuntime* runtime)
ionBailAfter_(this, 0),
#endif
jitZoneGroup(this, nullptr),
debuggerList_(this),
profilingScripts(this, false),
scriptAndCountsVector(this, nullptr)
debuggerList_(this)
{}
bool
@ -56,12 +54,12 @@ void
ZoneGroup::enter()
{
JSContext* cx = TlsContext.get();
if (context == cx) {
if (ownerContext().context() == cx) {
MOZ_ASSERT(enterCount);
} else {
JSContext* old = context.exchange(cx);
MOZ_RELEASE_ASSERT(old == nullptr);
MOZ_ASSERT(ownerContext().context() == nullptr);
MOZ_ASSERT(enterCount == 0);
ownerContext_ = CooperatingContext(cx);
}
enterCount++;
}
@ -72,13 +70,14 @@ ZoneGroup::leave()
MOZ_ASSERT(ownedByCurrentThread());
MOZ_ASSERT(enterCount);
if (--enterCount == 0)
context = nullptr;
ownerContext_ = CooperatingContext(nullptr);
}
bool
ZoneGroup::ownedByCurrentThread()
{
return context == TlsContext.get();
MOZ_ASSERT(TlsContext.get());
return ownerContext().context() == TlsContext.get();
}
} // namespace js

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

@ -11,6 +11,7 @@
#include "gc/Statistics.h"
#include "vm/Caches.h"
#include "vm/Stack.h"
namespace js {
@ -20,8 +21,6 @@ class AutoKeepAtoms;
typedef Vector<JS::Zone*, 4, SystemAllocPolicy> ZoneVector;
using ScriptAndCountsVector = GCVector<ScriptAndCounts, 0, SystemAllocPolicy>;
// Zone groups encapsulate data about a group of zones that are logically
// related in some way. Currently, each runtime has a single zone group, and
// all zones except the atoms zone (which has no group) are in that group.
@ -42,12 +41,17 @@ class ZoneGroup
public:
JSRuntime* const runtime;
private:
// The context with exclusive access to this zone group.
mozilla::Atomic<JSContext*, mozilla::ReleaseAcquire> context;
UnprotectedData<CooperatingContext> ownerContext_;
// The number of times the context has entered this zone group.
ZoneGroupData<size_t> enterCount;
public:
CooperatingContext& ownerContext() { return ownerContext_.ref(); }
void* addressOfOwnerContext() { return &ownerContext_.ref().cx; }
void enter();
void leave();
bool ownedByCurrentThread();
@ -124,12 +128,6 @@ class ZoneGroup
ZoneGroupData<mozilla::LinkedList<js::Debugger>> debuggerList_;
public:
mozilla::LinkedList<js::Debugger>& debuggerList() { return debuggerList_.ref(); }
/* If true, new scripts must be created with PC counter information. */
ZoneGroupOrIonCompileData<bool> profilingScripts;
/* Strong references on scripts held for PCCount profiling API. */
ZoneGroupData<JS::PersistentRooted<ScriptAndCountsVector>*> scriptAndCountsVector;
};
class MOZ_RAII AutoAccessZoneGroup

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

@ -157,7 +157,7 @@ NativeRegExpMacroAssembler::GenerateCode(JSContext* cx, bool match_only)
// avoid failing repeatedly when the regex code is called from Ion JIT code,
// see bug 1208819.
Label stack_ok;
void* context_addr = &cx->zone()->group()->context;
void* context_addr = cx->zone()->group()->addressOfOwnerContext();
masm.loadPtr(AbsoluteAddress(context_addr), temp0);
Address limit_addr(temp0, offsetof(JSContext, jitStackLimitNoInterrupt));
masm.branchStackPtrRhs(Assembler::Below, limit_addr, &stack_ok);
@ -466,7 +466,7 @@ NativeRegExpMacroAssembler::GenerateCode(JSContext* cx, bool match_only)
Address backtrackStackBaseAddress(temp2, offsetof(FrameData, backtrackStackBase));
masm.subPtr(backtrackStackBaseAddress, backtrack_stack_pointer);
void* context_addr = &cx->zone()->group()->context;
void* context_addr = cx->zone()->group()->addressOfOwnerContext();
size_t baseOffset = offsetof(JSContext, regexpStack) + RegExpStack::offsetOfBase();
masm.loadPtr(AbsoluteAddress(context_addr), temp1);
masm.loadPtr(Address(temp1, baseOffset), temp1);
@ -548,7 +548,7 @@ NativeRegExpMacroAssembler::Backtrack()
// Check for an interrupt.
Label noInterrupt;
void* contextAddr = &cx->zone()->group()->context;
void* contextAddr = cx->zone()->group()->addressOfOwnerContext();
masm.loadPtr(AbsoluteAddress(contextAddr), temp0);
masm.branch32(Assembler::Equal, Address(temp0, offsetof(JSContext, interrupt_)), Imm32(0),
&noInterrupt);
@ -1109,7 +1109,7 @@ NativeRegExpMacroAssembler::CheckBacktrackStackLimit()
JitSpew(SPEW_PREFIX "CheckBacktrackStackLimit");
Label no_stack_overflow;
void* context_addr = &cx->zone()->group()->context;
void* context_addr = cx->zone()->group()->addressOfOwnerContext();
size_t limitOffset = offsetof(JSContext, regexpStack) + RegExpStack::offsetOfLimit();
masm.loadPtr(AbsoluteAddress(context_addr), temp1);
masm.branchPtr(Assembler::AboveOrEqual, Address(temp1, limitOffset),

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

@ -3,4 +3,6 @@
if (this.Intl) {
addIntlExtras(Intl);
addIntlExtras(Intl);
} else {
throw new Error();
}

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