forked from mirrors/gecko-dev
		
	Merge m-c to autoland, a=merge
MozReview-Commit-ID: D76dMYwFRUQ
This commit is contained in:
		
						commit
						30d9ef4d29
					
				
					 366 changed files with 19441 additions and 19005 deletions
				
			
		|  | @ -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,<html><style>* { outline: none; -moz-appearance: none; } %23elem:focus { outline: 2px solid red; } %23elem:-moz-focusring { outline: 1px solid blue; }</style><div id='container'></html>"/> | ||||
| <iframe id="child" src="data:text/html,<html><style>* { outline: none; -moz-appearance: none; min-width:10px; min-height:10px; } %23elem:focus { outline: 2px solid red; } %23elem:-moz-focusring { outline: 1px solid blue; }</style><div id='container'></html>"/> | ||||
| 
 | ||||
| <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 | ||||
| { | ||||
|  |  | |||
							
								
								
									
										104
									
								
								js/src/gc/Zone.h
									
									
									
									
									
								
							
							
						
						
									
										104
									
								
								js/src/gc/Zone.h
									
									
									
									
									
								
							|  | @ -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(); | ||||
| } | ||||
|  |  | |||
Some files were not shown because too many files have changed in this diff Show more
		Loading…
	
		Reference in a new issue
	
	 Wes Kocher
						Wes Kocher