Merge m-c to fx-team. a=merge
Merge m-c to fx-team. a=merge
--- a/accessible/jsat/EventManager.jsm
+++ b/accessible/jsat/EventManager.jsm
@@ -261,17 +261,18 @@ this.EventManager.prototype = {
if (this.inTest) {
this.sendMsgFunc("AccessFu:Focused");
}
break;
}
case Events.DOCUMENT_LOAD_COMPLETE:
{
let position = this.contentControl.vc.position;
- if (position && Utils.isInSubtree(position, aEvent.accessible)) {
+ if (aEvent.accessible === aEvent.accessibleDocument ||
+ (position && Utils.isInSubtree(position, aEvent.accessible))) {
// Do not automove into the document if the virtual cursor is already
// positioned inside it.
break;
}
this.contentControl.autoMove(
aEvent.accessible, { delay: 500 });
break;
}
--- a/browser/base/content/tabbrowser.xml
+++ b/browser/base/content/tabbrowser.xml
@@ -4829,17 +4829,18 @@
class="tab-background-middle"/>
<xul:hbox xbl:inherits="pinned,selected,titlechanged"
class="tab-background-end"/>
</xul:hbox>
<xul:hbox xbl:inherits="pinned,selected,titlechanged"
class="tab-content" align="center">
<xul:image xbl:inherits="fadein,pinned,busy,progress,selected"
class="tab-throbber"
- role="presentation"/>
+ role="presentation"
+ layer="true" />
<xul:image xbl:inherits="src=image,fadein,pinned,selected"
anonid="tab-icon-image"
class="tab-icon-image"
validate="never"
role="presentation"/>
<xul:label flex="1"
anonid="tab-label"
xbl:inherits="value=visibleLabel,crop,accesskey,fadein,pinned,selected"
--- a/browser/components/loop/MozLoopAPI.jsm
+++ b/browser/components/loop/MozLoopAPI.jsm
@@ -469,16 +469,23 @@ function injectLoopAPI(targetWindow) {
LOOP_SESSION_TYPE: {
enumerable: true,
get: function() {
return Cu.cloneInto(LOOP_SESSION_TYPE, targetWindow);
}
},
+ fxAEnabled: {
+ enumerable: true,
+ get: function() {
+ return MozLoopService.fxAEnabled;
+ },
+ },
+
logInToFxA: {
enumerable: true,
writable: true,
value: function() {
return MozLoopService.logInToFxA();
}
},
--- a/browser/components/loop/MozLoopService.jsm
+++ b/browser/components/loop/MozLoopService.jsm
@@ -80,16 +80,17 @@ XPCOMUtils.defineLazyGetter(this, "log",
// The current deferred for the registration process. This is set if in progress
// or the registration was successful. This is null if a registration attempt was
// unsuccessful.
let gRegisteredDeferred = null;
let gPushHandler = null;
let gHawkClient = null;
let gLocalizedStrings = null;
let gInitializeTimer = null;
+let gFxAEnabled = true;
let gFxAOAuthClientPromise = null;
let gFxAOAuthClient = null;
let gFxAOAuthTokenData = null;
let gFxAOAuthProfile = null;
let gErrors = new Map();
/**
* Attempts to open a websocket.
@@ -1068,16 +1069,23 @@ this.MozLoopService = {
Object.freeze(this);
// Don't do anything if loop is not enabled.
if (!Services.prefs.getBoolPref("loop.enabled") ||
Services.prefs.getBoolPref("loop.throttled")) {
return;
}
+ if (Services.prefs.getPrefType("loop.fxa.enabled") == Services.prefs.PREF_BOOL) {
+ gFxAEnabled = Services.prefs.getBoolPref("loop.fxa.enabled");
+ if (!gFxAEnabled) {
+ this.logOutFromFxA();
+ }
+ }
+
// If expiresTime is in the future then kick-off registration.
if (MozLoopServiceInternal.urlExpiryTimeIsInFuture()) {
gInitializeTimerFunc();
}
},
/**
* If we're operating the service in "soft start" mode, and this browser
@@ -1255,16 +1263,20 @@ this.MozLoopService = {
* Sets MozLoopService "do not disturb" value.
*
* @param {Boolean} aFlag
*/
set doNotDisturb(aFlag) {
MozLoopServiceInternal.doNotDisturb = aFlag;
},
+ get fxAEnabled() {
+ return gFxAEnabled;
+ },
+
get userProfile() {
return gFxAOAuthProfile;
},
get errors() {
return MozLoopServiceInternal.errors;
},
--- a/browser/components/loop/content/js/panel.js
+++ b/browser/components/loop/content/js/panel.js
@@ -225,16 +225,22 @@ loop.panel = (function(_, mozL10n) {
},
_isSignedIn: function() {
return !!navigator.mozLoop.userProfile;
},
render: function() {
var cx = React.addons.classSet;
+
+ // For now all of the menu entries require FxA so hide the whole gear if FxA is disabled.
+ if (!navigator.mozLoop.fxAEnabled) {
+ return null;
+ }
+
return (
React.DOM.div({className: "settings-menu dropdown"},
React.DOM.a({className: "button-settings", onClick: this.showDropdownMenu,
title: __("settings_menu_button_tooltip")}),
React.DOM.ul({className: cx({"dropdown-menu": true, hide: !this.state.showMenu}),
onMouseLeave: this.hideDropdownMenu},
SettingsDropdownEntry({label: __("settings_menu_item_settings"),
onClick: this.handleClickSettingsEntry,
@@ -243,16 +249,17 @@ loop.panel = (function(_, mozL10n) {
SettingsDropdownEntry({label: __("settings_menu_item_account"),
onClick: this.handleClickAccountEntry,
icon: "account",
displayed: this._isSignedIn()}),
SettingsDropdownEntry({label: this._isSignedIn() ?
__("settings_menu_item_signout") :
__("settings_menu_item_signin"),
onClick: this.handleClickAuthEntry,
+ displayed: navigator.mozLoop.fxAEnabled,
icon: this._isSignedIn() ? "signout" : "signin"})
)
)
);
}
});
/**
@@ -400,17 +407,17 @@ loop.panel = (function(_, mozL10n) {
* FxA sign in/up link component.
*/
var AuthLink = React.createClass({displayName: 'AuthLink',
handleSignUpLinkClick: function() {
navigator.mozLoop.logInToFxA();
},
render: function() {
- if (navigator.mozLoop.userProfile) {
+ if (!navigator.mozLoop.fxAEnabled || navigator.mozLoop.userProfile) {
return null;
}
return (
React.DOM.p({className: "signin-link"},
React.DOM.a({href: "#", onClick: this.handleSignUpLinkClick},
__("panel_footer_signin_or_signup_link")
)
)
@@ -577,16 +584,17 @@ loop.panel = (function(_, mozL10n) {
var evtObject = document.createEvent('Event');
evtObject.initEvent('loopPanelInitialized', true, false);
window.dispatchEvent(evtObject);
}
return {
init: init,
UserIdentity: UserIdentity,
+ AuthLink: AuthLink,
AvailabilityDropdown: AvailabilityDropdown,
CallUrlResult: CallUrlResult,
PanelView: PanelView,
SettingsDropdown: SettingsDropdown,
ToSView: ToSView
};
})(_, document.mozL10n);
--- a/browser/components/loop/content/js/panel.jsx
+++ b/browser/components/loop/content/js/panel.jsx
@@ -225,16 +225,22 @@ loop.panel = (function(_, mozL10n) {
},
_isSignedIn: function() {
return !!navigator.mozLoop.userProfile;
},
render: function() {
var cx = React.addons.classSet;
+
+ // For now all of the menu entries require FxA so hide the whole gear if FxA is disabled.
+ if (!navigator.mozLoop.fxAEnabled) {
+ return null;
+ }
+
return (
<div className="settings-menu dropdown">
<a className="button-settings" onClick={this.showDropdownMenu}
title={__("settings_menu_button_tooltip")} />
<ul className={cx({"dropdown-menu": true, hide: !this.state.showMenu})}
onMouseLeave={this.hideDropdownMenu}>
<SettingsDropdownEntry label={__("settings_menu_item_settings")}
onClick={this.handleClickSettingsEntry}
@@ -243,16 +249,17 @@ loop.panel = (function(_, mozL10n) {
<SettingsDropdownEntry label={__("settings_menu_item_account")}
onClick={this.handleClickAccountEntry}
icon="account"
displayed={this._isSignedIn()} />
<SettingsDropdownEntry label={this._isSignedIn() ?
__("settings_menu_item_signout") :
__("settings_menu_item_signin")}
onClick={this.handleClickAuthEntry}
+ displayed={navigator.mozLoop.fxAEnabled}
icon={this._isSignedIn() ? "signout" : "signin"} />
</ul>
</div>
);
}
});
/**
@@ -400,17 +407,17 @@ loop.panel = (function(_, mozL10n) {
* FxA sign in/up link component.
*/
var AuthLink = React.createClass({
handleSignUpLinkClick: function() {
navigator.mozLoop.logInToFxA();
},
render: function() {
- if (navigator.mozLoop.userProfile) {
+ if (!navigator.mozLoop.fxAEnabled || navigator.mozLoop.userProfile) {
return null;
}
return (
<p className="signin-link">
<a href="#" onClick={this.handleSignUpLinkClick}>
{__("panel_footer_signin_or_signup_link")}
</a>
</p>
@@ -577,16 +584,17 @@ loop.panel = (function(_, mozL10n) {
var evtObject = document.createEvent('Event');
evtObject.initEvent('loopPanelInitialized', true, false);
window.dispatchEvent(evtObject);
}
return {
init: init,
UserIdentity: UserIdentity,
+ AuthLink: AuthLink,
AvailabilityDropdown: AvailabilityDropdown,
CallUrlResult: CallUrlResult,
PanelView: PanelView,
SettingsDropdown: SettingsDropdown,
ToSView: ToSView
};
})(_, document.mozL10n);
--- a/browser/components/loop/test/desktop-local/panel_test.js
+++ b/browser/components/loop/test/desktop-local/panel_test.js
@@ -20,16 +20,17 @@ describe("loop.panel", function() {
// https://github.com/cjohansen/Sinon.JS/issues/393
fakeXHR.xhr.onCreate = function (xhr) {
requests.push(xhr);
};
notifications = new loop.shared.models.NotificationCollection();
navigator.mozLoop = {
doNotDisturb: true,
+ fxAEnabled: true,
getStrings: function() {
return JSON.stringify({textContent: "fakeText"});
},
get locale() {
return "en-US";
},
setLoopCharPref: sandbox.stub(),
getLoopCharPref: sandbox.stub().returns("unseen"),
@@ -172,27 +173,49 @@ describe("loop.panel", function() {
navigator.mozLoop.loggedInToFxA = false;
navigator.mozLoop.logInToFxA = sandbox.stub();
TestUtils.Simulate.click(
view.getDOMNode().querySelector(".signin-link a"));
sinon.assert.calledOnce(navigator.mozLoop.logInToFxA);
});
+
+ it("should be hidden if FxA is not enabled",
+ function() {
+ navigator.mozLoop.fxAEnabled = false;
+ var view = TestUtils.renderIntoDocument(loop.panel.AuthLink());
+ expect(view.getDOMNode()).to.be.null;
});
+ afterEach(function() {
+ navigator.mozLoop.fxAEnabled = true;
+ });
+ });
+
describe("SettingsDropdown", function() {
var view;
beforeEach(function() {
navigator.mozLoop.logInToFxA = sandbox.stub();
navigator.mozLoop.logOutFromFxA = sandbox.stub();
navigator.mozLoop.openFxASettings = sandbox.stub();
});
+ afterEach(function() {
+ navigator.mozLoop.fxAEnabled = true;
+ });
+
+ it("should be hidden if FxA is not enabled",
+ function() {
+ navigator.mozLoop.fxAEnabled = false;
+ var view = TestUtils.renderIntoDocument(loop.panel.SettingsDropdown());
+ expect(view.getDOMNode()).to.be.null;
+ });
+
it("should show a signin entry when user is not authenticated",
function() {
navigator.mozLoop.loggedInToFxA = false;
var view = TestUtils.renderIntoDocument(loop.panel.SettingsDropdown());
expect(view.getDOMNode().querySelectorAll(".icon-signout"))
.to.have.length.of(0);
--- a/browser/devtools/debugger/test/browser.ini
+++ b/browser/devtools/debugger/test/browser.ini
@@ -134,16 +134,17 @@ skip-if = os == "mac" || e10s # Bug 8954
[browser_dbg_breakpoints-contextmenu.js]
[browser_dbg_breakpoints-disabled-reload.js]
[browser_dbg_breakpoints-editor.js]
[browser_dbg_breakpoints-highlight.js]
[browser_dbg_breakpoints-new-script.js]
[browser_dbg_breakpoints-other-tabs.js]
[browser_dbg_breakpoints-pane.js]
[browser_dbg_breakpoints-reload.js]
+skip-if = (os == "linux") && debug # Bug 1076830
[browser_dbg_chrome-create.js]
[browser_dbg_chrome-debugging.js]
[browser_dbg_clean-exit-window.js]
skip-if = true # Bug 933950 (leaky test)
[browser_dbg_clean-exit.js]
[browser_dbg_closure-inspection.js]
[browser_dbg_cmd-blackbox.js]
[browser_dbg_cmd-break.js]
index 33075734e9ed322bad65b401a278c75cac78a3d3..e564fb5708f3d9da4c623bb3bdfccb960566e327
GIT binary patch
literal 8540
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
index a59c531602b84c60a2157a6148cae994b110f8f7..a2f9b797098e4b9c3170c341d5623ccd711e6cc5
GIT binary patch
literal 13906
zc${_Hbx>Pdz%Kkia4GIC#fumB;!s=)#ogWAT?(|gTXA=Hm*Vd3?ty%q`<{EJ-^_b5
zv$HaLl1cvfJ<nQuXYX(YISFJ0d;|ahfGi~`s`Ngh{<Fcsyg!rNfc4)8IDJDE+4m9s
zeFG#|LtVcQ_$L3e5Ac6K0QkQT8sH%SfFnw4_x>8sN$i`GvaN}etG<IVK-kFEz?f9Z
zTHn-I$yndW-G11Z4*-DdkrEYF!Nv3L7B>6tOxSgGaRCN*CM6}6Ni7!~S$)d4(Kf|3
z<3;TbpuwgNBM*z<cf+|o)OWkh4;V|!ra9C=A%+s3^@ml&t^1W&Bhq+e)@t=Nt!{kO
z6P!g`pPTC=aQ*hmLJH?w0%Rg^lZ}$4Ku36vq}zb^BJDwd3(fR(LkNY;r3vtV^8eGp
zqUb_h8aMjOk&1b~Nv&kYRf(;(Va>a~ex*JCvcj&9mNWums*wuTQT{WXzLl7=B1=G{
zn^u1~67nuLn+t1WTSi-LlY^z4_dWX$+~=}5brXr5rJKMUgk`nL4H_SvU$iPGZeS!&
z&y5wGo~LJizN<e=+?Ko6&!_zs%=bc{J<iq*Q1h0%Ur-u9fYQ`$ALg-B+wYI%Y+Wrk
zDt9xyv~H!09GWE}cAO1%n7m$Zjt}npr&d>kHTfvWi%ph({W`mCC*f>emiskJUo1j>
zS9VdzMZcj||I$Q|g-gQo*`R`{(!?YeGxM{!N72S2&t=x9^)vTp6|B85(y%TOw&7II
zb{VH-$%29A=b;3X{LP54C5a`?mYLS#5<+EFhk3ndJyEW@Kc_l#(FBq|P2ETZj}54a
zMDI~G%lqiTf25RRu)Ykg^);H=XpMF}9(J@HaE3a3iNYILWK@9Uc#3>lf*BNOuj$K?
zQ}H0X9+rW{OZrMJh2x(HrLPixN=XU|eSgPIEi%2LR{VjEE+_TK!uWtsLy15u)xdK~
z^>t8K)HS%!ucuo*%S$RtV@1lf#^yROm!LpI#r@W)eygk)0>YQN3r`QS3At?MKr`Ib
znp%V3n%5w*;3&>P|8xm9(tg2_Eep{Wg189KD}-hSDF~4%;8~4d)qGJL#Exjx8G-1*
z2q!0+Q_6K<(M6jLY1GA91!V*hX3UD@=FmVeLxPz{5av=DO{4k1RRdf1gwqKO;l@w@
zPPMfAS1=&{_h3YE_U6BvA2cx%R(anC$u;Voz-z0eiW%JLJ<;rFdY(}|cymi36c5o)
z5g^h9XGJSUDnd#riZLx}PQJ&aFg-OT1c8N)77zlXDTJmV<ey9WvoAcik2PE(a4<EB
zpJ`)|8}kac%1`ywqO!g~-f|Rn8~}K-RDqhH>!(d8{IZ%(>PiSAwZm)jwka4EWrYX)
z><SLBo!~5N*X&o<U&q*ZP;uey-ykep*JNUCw|^$PoLHeBKfHhtkJR#LNc23B?3ShP
z9@O~s1A|OO8dkcr%!qY;EkmVZ{X)CC*!%4C+901eBat)dpjSOc&QrPyMLX3i*b%2Y
z11gp41;+fjoQqn19EaP{YpV|1okXZp=dMJiwmW$6H>;S|vg5qYI&L9}_DTe?)=A&g
znGT;#?5T&|>;bfK#`WvWlV*lc>p|y}^O=mdO}DO2DsmPEnX?pVZQKUbKPM+D=)%>-
zgZnY&&L@C$V?nmX;5Zb&Kw6``a!r1=8V}4eMdv*KwvJz@Ug5gq-80|p-4bAzM=(X)
zchS7{p+(F1Dtx)L1U<Pd3_oC{tu~{ME4yqSSJ4a&v&Vw-O==r1fcCgxTOZ5K!%vAq
z^vucC+KX8al^SUqDo%p`C~BsSm6$Gx`W9<Mqme8ZW+a)i8uJn5E)NQV@8cw@oG^#z
zw%gjRYo2ETvsJ_a?A;#~&DSPQmJGqWTc0jdL7m?uANjZwkXPH&7DI^|z7yz{jw`lo
zP46a}?IeCskA-x9lVBpUU9B&YUsZeAnP>J^7vPUO7|Y2{O`+|i8Nhsr({7(Tf4vtm
zw0ZDThd|atI|K*<<vO)kjXvk)$~8JMCSS9qJbM*0)04vt0cN@g?a-5<m%Et!GT7q;
z#S<Mu6eq+{oPLl*PWQL(J@Gq2;{rMT=E9#yHi|^K6z|Ps@oEqy77gQI(e(gPZ_&e9
zy%fmn4s-TYf58X-@9_0=P`|!=AO06U6xXPA!l-4sD(-;q#f!Gd{^)9ooDv={yi{pI
zw`QP7IiA>5Flj&l%rXcVK-%P#w>__l2DK0%(;ZzA;HKg3PdZg%zI;n%9zSfvx+B{$
z%B}4baI^_TIk56Une=3IXhvf$428<X*`ihTCY0&^=J{pQ6s-f$Ob020gAZsL6oPdt
zKzFm9bzC?4nD^B7+q~c819@u|o9u+GQ=ThN=sw%#7gDGnioiitZOvo^oeI-6^l!Sd
zxk8$x)a35=pXqat?&J<DY*0F@2N>JkbI|Dgez*ML`Q>fGbHS^(!V%NKKG0@auHCnc
zJ+JeV>q)qLN`lV(q1oe273=A-NZ8JX?qxp3;khn4&znF(ckP&3P=`0HnO9P>SV@k4
zyk^p9(~GhLoS86w{Ja*p`+NMAI(<RDaDQ^)S{{LLnOW<poXESig<v|C0RZ#J*<f{#
zt~GU0LaUidKk-w>y}i9Y>2L`nMQYF<J*wHgl%(=)DSW^d8ci5_{=Ub^(`<bZH(ex-
zO}QVZo^|Ufmj}>VKNY>QV>hCzg{1=JSMTx|sTm0aUDBUjh&OqZ$0Jm?0{@kjm^loc
zu$d$q&NGxMuOn7&HyKW;0^hJvEW`h~n6mm26zicM1%PX!JE&6$CXE%J3b}{vUCC{!
z^lABq+%}6=w`x(dY9Zi;E%Y(X=esGfSb0I~ip~^o`(qcrqnOr$cY{V{co;Ek?0q{k
zj9W2_-~)az-TwZ@Dblw5oj6lWp3MP@Xd~ZbT6-Orug7f}$sdQ(quGd*-|{XOdOq6S
zI^dIpP}4$RR~?$x{8=h$=_lVldl?~XBNR!9;M%)m+Rf@>hl(??UZSP7=jW00%|MZ2
z+|fO8zX&^f`!};ObG;9evA+%>)4KNO?oM1>Y@RzexB?&;?5uZBhsgdsfnGj4@>#o_
zzj>hG=OQj!3j(D7q7VHaoo{Kt`A)y>U-~dyqlU@(!~K3C!G4RDEsVBnPDGi(Gj;B2
zUuX7GSi~ZEfnf!H$y?f~w1gCvM(Jh!*0nt<RVP8UkJI0E(9^OWrO(|@>3vQ^LKmAU
z?t9d+@vn7&_zJwLk!e_K0P*bT^WSUvExJ&{6W(Z~?U&72k08?y1Ny9|FdNTvdLK}5
z)?;*%&vvXFR~TPfPH(MEDhDU*s$cOkpC+f5afwdI(1Re#4-1d|Pv|gx7D8h%JxpGr
zUv-`%<b3v+t}dN_%&rjV7?7A8UCa96b=ePS(>)s}EA2#*rg&w;yw=79Akjy=`@=W}
zURf9lgdk4zAXUEhIc&g4clZ*}-MmIc9-`>s9x*epZ~k(}%ZY!W(`rUN)Y@5710DL0
z01&vc6YxGPBCxjI;ppB7Xq`X2(DVzAMnC;#O?OF{^(89Ld|_2#K{aC&O#B9639}3{
zpsp=Ov>`$F_L7|c3NCByBMN~PMxd%RtXI+vq5D?BylpJHz^9yq16|39vH65r00Jvl
z^n<C%B0BMOM2imF!WW{wv2t<|o#-eyaK`3#43o<T5eIH=pB6hP%|Kwy^J}nj`m=3F
zQd~*AZ32?W2Ib)qFk=L21`0tRm!JsVYKSl!!tw4Yy<=bV6}*o52sW%c28MY0urgdI
zMXzlXq;h55D;kN&8PmWBAum~cs(F%-m<5x3A_Hf=NXZ&<nNa|g%8>dxgvw$@0Yzk3
z@-lpH;PjLSu&4hW_=YjJg}FaU$jaXcjshFFuRH$m2=+8z184DHfjdJaUHvi8<D;#F
ztl&TQ!H22(e?t#KX&!CWx<LhlJ#CJ_y2`a+-$*4sw|R}9$ZLRPnV;D(k3E+sm>A%T
zEeCbqpkWZ0m~Q5w>w5rRX38HVp#d);284dEuJmC5yWdtoByI!`zzD{pD}|Ej=`ZcD
z|55a>)$8xtJO9-V_y4qW`+xHdVYKB#b^W@qm%*bE*@{P#$gGhdV^o8U(~J4ZCdAde
zP%o-14nC}2O%v{b(Dm18(;hwBfmrrf4Gx6T$%UKDDc=@ljjun%26ndol@M@o3Ry3;
zc(BxW>O04Sago8ws9tmC0fbWdq<4R7)=R`V<g}&kqZFafF}3}DcE+DzyyaCky%0a-
z<eX6oZ_aPDd#XXwdy%9|b*Ag&E<y~zJ|v+rV4vosw<wR!V?>t67PZeyMB30A9uMCf
zGjOrunU<?PMs3m^uLKoAg~4|~@rQme8q?xs3eT$E{YO)>5FCNrC8pQD^S0|GH<vNR
z$0>Geo6jM^&wO6*9LaSC%?9`%Fw_^#hhvG0kgEK6jp&CiN93)}Pe_X!D<KO67+7{s
z^qPpXY3`_mnGg;k5wpinzZpQ6xtDNo0{@7Ij53n%+d_U6Y(xC@<T4`l2-!QzMfB7-
z9MUbMPV*_0hX7B0VN1B%Quc{^16u0UgM{qiB`3B|J;b$`DqiUHfumm%-3YM-;vF}x
z$;lP#*etX@aR|3ZTl&QpW3YFWI{1M@^d6Ch(cOO$C+xGHJz~!g%-CEYE-Rwhke0X3
zORW7dSkM^%4Hn-Hxv(2AOxr&htrS9t57uHx+_Ae?7t#97ceoY={`1|7bqw&ah`!Da
z58y1;pP(`W-Z%lh`ASW_`pj#H;+p`5Oe`rYnS0s4Alqr`G1NRMm5hT){xPlE^y*8(
zum&k7Dfwn1#@YuRraJjpTr|nK>FLHk^$b2KeggZB(}BQww2$B<=B0XSBC*9k$bQYD
z@c6_XgYB558&J}(VE)Ea@P!66*mw6k7>rN8=Fs~EDUM(Y$?pX`xOE4KV(3)h6Es@!
zjK=7D>{;a0->6_7J|maA2?#ER21pjUPGvy2<NXC5{y*wH#xLL<eCxm95&j?eCI4@Z
zsT{EfR^A;9q>O1fqiIl>wGak6$u0jvM+@ucTnh8ly;G*~#4Y=C&nnsh7OPr~`YtdX
ziNYQ6NyDtK5l}=$7`F5WSx?J|fyR+S@*~JNUvsO}Zf_e$m=$mG_2W(Ei_|RS5$z-}
ze;#l|BtazFAiuD0lUxSP0%ZmGlfoyT%MR2Tv?%C6Qoi=wrzm+C`!0$b#_g935%$ZE
z>$SP^aUaJAeUPy=oG`0!JOhQz?@F<*VIobmy=Y+yKZZ0KCnFeF4fh`_TQJ`N23hu)
zMsDYywo%x3FJ%P7M+Z-XC*-EK)eOI7Pxd}?^e?_z*W|z|#G7{31AvKs#>q&1tz}TS
zI*(x!Ztr<IDad+U`xw$zpY68^ZP4jjJYZo;1dV5J{y$9~{8i^kX4Myq<_XjkcnR?X
z0$u17v4Djg_!<$Qo_1;9c8}xxM)mD^jh|^M6c?t8dCafb!wZSc*&VO&<kIhoL7TXN
z(?6bMBV@$K`-tfYW*_<o1l?ik!O@LB@;|-KVFdFBKx+NUsItG%D%r1F38ZA|wsL|o
zP$xC<#{*19S#>dJhml!+eQNZQoqc{FlRMi0GELDk1Ak^$C`eQj4Zk<^nQJaP*mvYJ
z7%U+DG-)oO|0x;by`iB$iz3_b_5pI<110Ae4TYi|!3F}?kGz5xtZKm*KuW4W40NR~
z7GO2}(2pGfY3>{3N8L(0#i!1XeUIQc$`vrv_uMz%i>POC`PdP7khvLXn*P4>MgnlZ
zfWcrSl9E7`d#*4hP;&MS_~G~-+?h1{3jW-<3!YpL0_)zC`S^T@GjBel9e|&dJ<R#g
zW1238)fqaH{-|O0KA98_gDY9+k~*MdzCPkoest|oggX4J)6@@;A#;ZC<*5k%3p?U}
zv^%b{<vaF{f3YL|KkOQQ->iyLs;<zL^)JMz0`wh`p+WuzR6=7Y$`6d=m{C)o9ZBw#
zs#=J0v0u2f>Nnk+9QJM$3JN_T9QaLF3!c?d;XljIZ@WO381^vhRhAMyBz)6O;=F3H
zuQX)O(+Qz_ZiD*??}bMC3(!}<6ktRJan-Xku^m}>biLb!1d-<O=ZpW**NE!56{FtG
zg=$TcNw2=XO!vr301E~x8?c%kHI(lmAsL3<s@K@H+F2+ms2dqz@R9W1GtHn3s50a+
z|K8;VEKI#B);7#A)xris+(`#M+od{>GUvQjOm)y^VNjB66sWC$YK*Y<m53||nXUj9
z$@At|$t6VJ@Ls0Zk1<St4y2&)x?umA$YBt1QN<VdG$JGQBd|Gp-Koi5aXPjobf2ZP
z1dOPgpz^;#TKGY601F{MlkLn6c$HOx`k3BljV8yHFSkf)K)rv&vW!jb7$@iS_A(QN
z{f6iT4()p&&w_X)uW6YTDs$cRc@!XO_L~)eCdcGRDdmHPH&hDOdn>3%oJ^oTl<ssS
z6wzc8BcRC<Ig*CyK<Bo0(b$128Ee+LXE+C|6~{rK7{w6Q@ldKh%veZ^K_R339kOrp
z#)YA(Pdj4bo6D+>Bz$6pu%fxUfWjxoxVSF+YzP_uRPBS~D;6NK9t{2_k4&uXD6Q`t
zIExkeeezI!d0`YXppsUCaaiQ|9(nE^uXhP{*Bt<}L3e-`VDUk^XXSTbp{6ZxsQU+S
zXCn72INjzF{3UEGyjHF!-43WX(Q!me{7j+o0KRxK2KzF-7rmw26*x<I8Vo*+cmlUC
zpMaAvGr%OkkEZKam^(qHRLLf&>(-yfF8Ni&uijhyrBO0Ca$_c1z-N*fbop8M<oZCb
z_+DN(KH?x<40j*07s}*)37+bRz1+*_@|Sny|0wrqGPHN^oBw+Mz%}X}_wQlr!C1;u
zM>AzY%5YtZ?4UXC*EB>*y23C8JBo4zd*fgwY4zg~v4wLG?5d`y7L*oE1c9&}8Pd9S
z>8E0<=%hs|b0wY>*@HLlgEkuz_NB*jVmC&n$vlh7PmonA+9q}gmo>$1RC^ML^HMc)
zXRaq_I>?JKsb97W*c_8zH|L*YGU<$B=;Jg#aS)*$gxC8}!(n)?DZFY}E?k^7_&Sht
zLcoGd0m)C-Ibx#M+hxwLZ>cADT}z52pSNCGoQi(%*;8VD^6i{TMk;?HtTNeH`Rz|A
zT^<y@=DcE~+4Ujbf#!30-a2BxO1@p;PagHxRt?yaFM+H-fNK7~VC!Kz&tYa?Vmh!s
zP?N{TL?>6qQWliT-YTtg1|Oxn>KC_o$(XLcLS(bjm||tC6j#ku-<AWa)*8GT*LGY!
zH8JX6MutUZ;z#nwF+Yp7zdRqIkwUBjgTT#m9$jjKKBei-Xyr<5ON+U9VR#d@wsL?v
zCD_a5%rzRSes%Kjwo3VAVSm8&6sPNlAIdC&SY%ECVWg0r-Z(U3_>`FuN68SHz&FXs
zk$VL=QdSV;Dyf8?nt6uUQF73EwN446Aj~qa=h>2?pyrdhS2k)e<WKVWD{}Svc|&R1
zO2ai|WV_dg^2g}<Xn73ratL+f!>SDtf3@TCr#4?XJPdWY)!vvF%4=zsm^izwg5R;a
z$*mxm;UHI+lec*`MkG$?d4Kjx22I~fBNp%K^hg3odPby;Q4;?9Y6waESG<gS_497s
zNp<Y~VOhD%&X=3<n+HypKa7+ZvG#OXKdXzd%p3cbH%A5WyH}JkP~F{o^6<jO@n7^E
zZqAF?Eh58Ln=%=&lNm|&jqKBvIAUT|8x(QO8`hVsmN<RA7Ei{1T^Bvzh{p-f$VYq1
z78usjRBS$(UTw3{U^%Z%*jCIuiv(HH-@Rq5#6CmGx!pD6y+LgCN$E%fNHzXS1j>KR
z0HW8A?}-@yHxa0~c){J1wh8~7xqmo#nmaIWb)ok@OvheC$m#B9h|#BH8;EpMlyjIi
zGw2bM*J*pg=@JyG!I%n!wT0=K!j1lMD15+iSQlQ?{9CB;Tw>*5@S%4=woi2D<YO%3
z<dtp1i+%Az>>!6L?D@d_x?Oo|JM67rP-olC$PE`L0gxb+ci1XCRl9bTn`Ws3>1&$%
zbM53*^bEHB*Vv)0U(Mu}EeA7fkdW?X#c=$$ou=KQ;uw!<t`}MR7J+R!@0D{O64NCV
zKYK39u1F!cI=|MydKVbDP{_XLwfn#%OZVR_zHMGxC-;Q_*Hd|uEaMIMY=|;Q89$x^
zmJX16#@_hPB3pC`w{Jh|n8@z}Oy!|sqBg#@b(+~1K_K}VXF42#@X+%_U!yKKLKs{U
zurN??=5QZGmw45#%QRqdA+Ci=*DQ`WPrkg3DskqVYS26LO7*+Y{T6S>L!_}YJCVbr
z2k$KC;O7iTe9bxjuKeL;zLi%$H6_4urHMnHCL19Ie_B>i$iIBCPY7==`%u&UU_Z9>
zCMGplzYrL#v59kE9FR+hD$_*+%UVE7jzy|aXQ`@X!lc7BxpJX<J$SvYim4*3sNyaH
zKttUOvu%fU5LIz(t=6dN>FS8VKb4M7+MjICxh&2lRLCR`fFsE)ezc8HfJ$(N*-w1+
zm^(=yYx#^vJGn=lNnv|p>ASj-tXKea@)O!h@A`Gb?B?n)JDOuLn|!j9psYLGgZOcR
z_%1L(e=B4z-CgxsEcXyXX0+6)g*TaUKAz&}h=rOTf3bSF2EyFsWZmRhxOPeMG_s!1
z_kO1C_{#llN>eJqtpe9gji14h2gyv$J0?jBAyFiiDt}*dc2b~YEj;1KBkWb}Q)tQb
zx*Xd=d|KYod4M}^KhGlK*m^}}udohmZ<gftB=fUkX_A*cZ$xwnt2e_gOC_9)8;PK4
z>R<fP{&)V-Vq)*lkSG80N9P)Kj<=Ll*2nb|%s2~OSxr4}%9EH;DI0fB!Pn_c$N1{%
z)H1E6q4V<5UppHqB7j{asBMp9)J7Cnic~lZPxCci0fS|j1n>NKHa$sef8nA0Q{rxH
z=*<D&r29q^5ZeO1`$H8P)P5vSgr{jICq}mr0Ozs&EFP8|DlS-oE9Zc|K-yb_onIuh
z-&LAxH3PC0l~#@xgG?NXQH5GzKH}RE$XqI?KvqjY15+nAaxWy$FO*`F!JRxlgB2UE
zqDo*AWyd%>_-)@1tvPWguAWUS=U1wkT(T!1w!BKMU#4M0gkC@J0G^PUYG()4oCiIZ
zBPm3ic$i9_JPG-{{}FI7;bt{(VstJj;UKuIM>qK;i%C*E&LfX*SJM@V7rQME78YeF
z5T8orC7)}*N84$N+`!)+FN+x)CX=oBp1pJOQZ<nJs%`SMxC2#i4agguDa|blJkzyh
z_%JPdfR5u=K&5Y8+X$~&vZJpag@OaolI!jFA?KH!kOU?{T`p5AB#{C3O!j4`wTe=#
z=}kC+UICTOzNtLLs+meJto<r`DDJrZP{xE10m7za<Pbq!qz0N<z>8V*x@~B<OqWo?
znai5H*}`mh(r`zwq)F3mtK<L#B{wA8q^Z(`sv*SFh=S1l*Wo8R=2S7sd8QE#&N^qi
z^HZ`gDziTzYQNuR7_}u-wa|eymlHx5Od->5n1@ok5NQz>+MODZzU=B<@_Vq^9ElGN
z$~}c~45E*DeuU61p=^(ag*|@u6rVuZlNc&IK9p@25-EP>^lQ9Tnpr^gO8PCUGvUQ7
zf|ffPDLvohA>DJC2R8XV_=B<jS@neYbmo0T8|2>?_s;}f>RA(H$)jRMrR7>s>c`Vt
z4%XB2(<#Zik-y0o$_jEe4pe^*mmwvy(?U^S>V_{oV+gfwXE@Wa#~;Ba{>(R%qP5aw
zKp@oSl3psO8{w!#!mat!hZPtAcP78p{NWf51as2p=3>!+MEqAcF#h*&=*=WTyoY1^
z-*8~MEgLC+mB&!TY`++HI)ufP=_mgsDUF31Hf5%Qi6Iqbzctt+ievL}D#KFk4S?Ok
z+`>wA8h*;$XJ#kHj*5(+@<mJ`zhJ|-W4-MpW7=SjmpdgX#dCu9p^fjpXaS|Zg?|>-
zd5;1L4k1UDCVG+qv{1@nVPULT6ZB#b1PtQJL3?A|nb*4*8ATbkO^LTz5V+<MbN!tV
z<~D{!MG1Ek#NERR2<XZ7ZQ|saUEZ~<XfB4+5}X_7dksu7!_$xYSZ4M7xf}<61Ku*|
zqvBAzuzsZl;WCV2x#?$B_*Shw&F_Is%_+W3ao>*l7nfK*v)pVcH{_4*-LdyAKd8B+
zcr?PL8uAE~rkfIflH8rZt~}02m#=WFxzi&hZYQ|rqQIy$S$iV0hP1NcRj5swCUSe3
z2?{Q2|Adf&<q#0(=R#9-#o<%dx+6V#M_{)-YajNgO4OZ^h+Y=*JqvVD_O*vRw4p#*
zy@>iW_Da%mlN6svuNf|;FIGWSNTe&Tr?dVihL}Tk?$3^@SP50ZyKF_6XE?lG+Tn<v
z7(mOg<37R#f)(EM7iugcnpc5fXfB(igrWq$c>v@V(l&`h^dQ~}mckL{>I^xo4^_d0
z<59Ueg9#utmF!eq!j-BkLehJVT?83KxYGvASBWfaA5d;_+Xj7e?y}b-o%e}5%;Wt4
zIR5-?&)+gsWPS8D51vTB5a~$~&*m!MAe9J0jQhy;7BXqOr!v4j^{{j{xpX}^PqbrZ
z;kX?i(ZbV=D*;NUZm?y&)Lo`0smxvQ!^vw|^ByQpk|OAHQ`2QF*H0EvytpJ0<cM`F
zmHszB3p8%no|HFD)C6xuhkK{&a1ltZjq|&+8#=?oDRCN)@abw=8f9sAb4p;ovPgKE
z6Xec@%(gqoPD||~AdRDE4CRab?wO}v3b5$J&}_+(hA^RKNl#=<$t+gt)P$TVbKFL=
zCUM*r0tR4&;HnXKWNP_WCb0fv!ob`0e9y$lznQ?s#k21IDyyZ6>$mm5doZDO!3ENU
zsf*6e{webMMTCNdB~=^)r^WtYIUiBo=4;vaBr2)_G4(RpSq}T(#fTi`;wQOz*pP{I
z!riPuwqBxh{sS*a3jg3q3iZtMeMvS)Lid+`Dd6o?HE<Uc8-_8`AI51qDB-8CdWMF!
z_YHvo=nAnX7!o5Y%J`6!5ZnHV4-r$$2)YRx1jR7L0<E=Z(SUe^sQLjH8sQ2^GA=9c
z!~Bi)V!f%I6<#Y#w`ko4RDDfd1p|Wdf@OdNwij%l7FXnV2>{d6GBTUkeXc%drg;P~
zu8x;-Ubx+Bx28D+*jB!F6fx>zBY$CvQX4qHDVcY|8Rw<Iz)(9$3%c{vJ#V>0etG|y
z!1u3>SuN%r=UBKXcC65<GWCooB+MYH(3%~}EsZRjpOK&c{vqhgo`EQv;~0|)H!1mT
zKb2?xYK4@Fn?vrj^Kv>Jb*$ww`RayVb>b_bLI9mGR^^CP$p}+DAIg$W(8I70Ej}yC
z@(;^p(ZIZh17%DVGMc7rTr{~7<8E}XBpBU@Xez3WHSL)?F=m+GJVXF7_!1hT9v1pr
zGS(ve_|3IU^E38N<Y*pIXphKy)*@u-P`Xf2u4$YV)4s*QOPy5n26GN2aLP){#hhm*
z&)O^cQ0S?03_K}eDuFMJyO?Tg;OI%(S(TCQIg?csmA;T@ro2Jq9P^DjTc_V~L=VRg
zhyzi#6R(2X0ZIAQ(2zC0(aH=wBJJn~w#jLixAo*YampASqKnvi!3M`U-{maZ`d63p
zFNRf^1$ph&Bn(ShpJ(UxHo%&rHsk3KPfjIKVa%ME)F?@(FW(%c`ngocRn0BoKK;Nn
zD+-C;e8uto{dRo0m~5Km-L53+U!Uk0H+1*5=vA=JsbHP`O~lL+PB3@t1hwba9+B%#
z=(yITAWxUSFT@?SWf^-7UdvzhasFdIh~<obw_p9Qecb<J-)zMgFnD!w1G<@xs-rUh
z(#lg}S!*?O{F825AtWk-S)n^Evn`yM51zPT=Q5Y`ips6X4L!)8n2#%r87d<zlChzM
zyKYTphQU1ES10q}36Iv8;N-wifS;p#4T)FBd;b#Z2MpA$zxDkOp;KnjF4!*5Vo|5z
zP&=L)4m$~gCIqc5MtBGqB}LY|JH*O%FNcP2o6qW5OcfQJni3ym=L0A$WwDci*#735
z)OtgbkU=c_c}Y4N0vgE~WS}Q{<&?u(MD@mwm#Y!yu_1y<esVoz8lbTr{3FB<EWZ2G
zggw{mV8R?1H1JCQjBh=RZ3C>o6<v4OB3U*}8Kjt=Pk~bZ{`Ay$lu5xL{IsU}W6sXm
z7gHvyTU1`kYNg_u(RzGe(tgPs2~&qSe)a_3g3YLnrh(4#x6q_x@1P$+O$*WmBlQH%
zyCIyIpuX<n)BFr#d4Zy)FJ_!i?JSQ1Z~<M2TBxmRbgFNS^G?_86-f_AETvLuid}=&
zAiM1E)$;y7M1Ne8=^;HV9>eZxsdby8U*i$1UfT9+QyOg^k)o1@lb&PrafQ6P31Wu;
zZ5w&p9gq8a=yqrBt;H$Hs(%|$(cu}QjPSOug`c?Ooe139FATfuGDfx29BGU9WfJ>3
z@px*{;K00=-^FZ1$?YaYf7wxl8Jl)nhGCXpJ8eR@LtKO+*Xzcu1@+0^_pJht%!8|l
zVA^kBv9USO&-AlhJlzV@cf!a$L1tveH|DKvE}m5?7f&#M7|vyGrJL(gmXn+ia)@DG
zvn->x_6%$F1T@AB{0|;}4@RUMdPjL{4+S0t9*v+PVi1_o1v$I>o|~M~I~G8*pl8rg
zp<T)kw*LHla6^0ZQAvjN12lDUPIgJ#3wAJ*TH3k8lU=wr7y?$sB^+txkIrAj@&2RU
zK`;~V#OMDdj{iTz)Bfi|wyfXoE7M7{Cf}8n)2uQWTNL#t#+{2`Q36PLAFA@;bov5o
zN<($}5~#1#Ty97`6wnkAa^)1$%Rf!4EhpE1woWW_kLR1b0fS|~!QSlM#63)!9AX3s
z`0v0ih`KGYne1#Ig)d036)*Q}D@jhSTBX3c6DnZ}uTOmas>7t)(j`gNdlqY>wP;;u
z6K$f@xNkCgHq?TZ-2>#qMBN_fv*Eirol*Z?C=&+vJXnbd3(K*f4f-PFFEW-)?GL{x
zL7G3P+=c7-`ZQ`<naRaLZu82ynst&TiP>=y`n)HfwsQK(R?*F@%3-fM6tRnTlXjCp
zh(8$A+;d1U2$Ntyf6{bT-dIv@_V&O_#%mpEC%@U~r3W1bA-0L8*DK?Gy?^^Cx%`=6
zaV3oeT!S-KISYJ_f_t!jN&GS@^nnJFU|*K;HK6H7k<QGB@Z-d_kDsyv^zRXG$6DhL
zv{lgg{!zmp$A6wU{mCvZy}R^O6;rh@`SzO-3e6iaQs&m%!x7qf9#&K}*26q-&Ss@)
zs6}%y*Kay6LitT!-#$DUjU8^gZzoec&UCg})fu16$=|UgqGTKMCm2f|XRnHb*ctR^
z75UVZ(LtLU{lnlmeM$BRe+lS2<JlfsiW))lfX^ByZ^x@p2EW4G=9JZTM33byO*Uw7
zSJuZ3=J%J1m5Q?lYwCNg`4xKNJJtX`A0r{BuAw9CjZCFFggQUeWPr(pJW_@rOESZz
z6`RG{t4-Ut63^%g!*aawq!0u5sAhJ4^oJVSi){;jnmJ%24!89#TX@yauO3UYLPZ=U
z%PuGTniOS;gTm{)j!=f1*H@wj40xVcEKK@+enDZ6VOMBZ{+)I%qru$^yw<IJ?$`Nw
z)c4!p2vv&+zomr@H}=9mAvk|^URGr9Yxb_6n#2#zDy`Km`<!=-Qm>Fj6E*d~37hH~
z6k+1d`d1DJ{-f$G=BWR=u#NDa(?T+4TE>I}TN_~BBq<XIUMZ?#j{IhJYbjnV`e~8&
z_<+p{IP&e0Up87zrSwb$SX$0=?b+w$^w5f!OpCcJ(TFQh-<6l8Os!biQn(!_9(Y)s
z$W*+DTNUt(lBx%z%s1<+6u!~LP!8rPDf*UIdWXB=JqBiqr(R9(NGxFm0KWXOy?pMQ
zedCN#{csn1o>n*g2X0=lYv4Bt)2m1O{lt+n^*XT+xVH2FM`qO!hYon#XOF7oRmAFQ
zqW=uhLld9|Y|$>Ohpr!AhUw>&h~IMFq_V>sI)eXbXF|efZ*(ooeH8ee^KhP{(_!Gd
zNyBNB1$AiLl|C>A!6XjB<o;8(LY12VxT|!hA8w9wk6`6Ob>(gKmu6CV1@(9^MD!dM
z1pQ<NpVg~97jO(<xutNblR^}cVau7XcCc-Gciz0G3Co=B&$dHsTKLAL1$__U*p<r5
zh0Y&5>98SpBbc_-D!6g92_1jAO%ly+xDXlpX*vPIQV0zfY4BzBXMRQ7LuvhOJf%xG
zakw1Sd0uy>5*KPqAx_BQJdX}~7{3UJ<e<GG?xi8WP(kbzO=MeF0OS!I+tF+=gi`(c
zC{^PvIKQFFi@}BI4@FR)_gCz^__nO>7dhuw&E7SOCwWS1{{qCkU}X{0k8h)kd5#Gv
zJFi6-g#?YR4gtRt4kthgi=oZI-HY5~A5_0<K+gK{C;;M_?GWWBl43s=^g!f$Xjba@
z*tswwCyG;ScQJlsQ8wYwVHCd-rOk|Q-YGta>+UFWAf+Yd=FT7_{v-~6?OJ=*x}ja(
zXo<1MatbmC@7laIB4d1LJs5|cM1}HCx#6-*X{MT}XI>#6^_k@56<oF1<19p(h|Jtv
zatMN2`0h^3`|>gT%+afZ?85bjE&ZhJGrP9h@|%vv!|(bttD8X!Y2%i$icSa{9~p%g
zk%Y{@;1m7F1d#n(`>*vqG1q8tLaVKoDr#sa_rYp=>%vQzYi;X9@9=U=dxI<k8Jr~F
zE~J0Z&j6Sb$()FvV7~~~k0OP_vzU?!=*sy}`Iuon2q<4L5%W-Y?i|}ISKA+uf)^Aq
z{U1|PXgf^yIj@f#-2tKiC_U*-@d}kTivT?()aaG7adx~4$SioPwi|~8jPy(=X>n0O
zMs;b<G-cDG1xwL>a+flp^x-Uvhj;u<EzjL=6YHK`Nz|$BnxlZ-vigm-SzO--={#xf
zI-?fY<X-KuEn>W{w3s(q()UMB&wCyPx6nTzxd8NDb$ocA77*m>y@gm0H?ZTdD6WYh
zTkZ}l1KMKaj+!0!D*bT$TK#xbv9q#<v@1=%mc05)c|ULERdhOc@*A1{Fc2*|Sj{+6
zvZHng0WE>}m=R?mP_$@&o<tk`c$^J<(A`*xw0*4+6a}DlM_d;rRn5s9_Q5YqWa_GO
z9kh2EMZ4=2%5>95e3*M#@0GhAp7dlXiGVB_q{q(2payuooyl{^O?Q^DkSRFT|4Ebr
z38|8RU6|W=9WsaPkKI!(E19Ue-pr!37=LsikV#j5mIMZGU8!QJX8v-=&Ku#O1B$gk
zI!0{Y`R;8O-JeE_yYQWy8Y2yFtWh3)xbu7qt{=y?O#3tdX*d#WX8to!cU+CBz5KWl
zi_I#rm%b|v#3`I7Ab=7DLEyK%r(D6NU8NJ1G8#I;ZOLf$5D&)%6(cS&#A_*StDC7c
zWE_Bpwj>wx;XH-;_kDCtFP=uFQ33gYTB+iX6q=yVC#PaqD-7aWvb8!*m)rd#24rd6
z(Z_N;hi{iJy=q$g+QMqs<WX>yaz?WJ2kYnuiTy1KWp`mmku2U(N0CDn9=?KSbqkv9
z`Ujw~F?(?}?A$3{M43ImrFa6^{XQ5|X7mV29HW)NKtaE?=sZe|<Sg%+pS}Q5OCor&
z@C%N=?34UQ>2o;Mz1yGu*FGsOo^$uO<@>R1*VcyTM6;{Sxhz$}*sd}G!3^cRLOh(3
z8Lg&5WK%IBj>!BgkgiD;)%94U+OxU|3r#!u>t}^aAT39VngP8M{z~E3gfVrK^VJ&<
z!+<8UED6RjY$2h?$*3-Fg2fp|oKLuh7+H1dt!ERi0bW!JVw-n6Y^V0w*#QVST`#Xs
zo8?E<5O@qYcr<r8_O?|7`v<P*8Q|B(<EJ|UUvGpqWT&B_;3dA4Ke#tft9DK<g{y{N
zQSnv#@ghazl9ix6&CqGp9zDG?_G}XwosaL>Ok*dVqUdnrT;*c!(o@b6mA<x^YnJ-T
z=UpjjR;q#mk*_!_JEvcdrqw-OVB}@_dl4mIbnC>|Nq78Gnx*Tw2v;iPy(1p7RyXc0
zbXKGnZ9LIY^4uHQwWX5=DzyYE)fs)cXdVsoypdTelG!T1-fGUiVC(ocb^K~;tXYCU
zL(&s%T9IvDu&}So@VQ-806FtAej;StvoIP{hIWO_$<uK?=V&F-T070x5pLgJqK1S7
zIs6{RS>RZhCViks1-9EzHbDPK%&jj)Nhnc&D==!CR-FXTVaOK_bS#R-aEKtzos~DB
zs9?RXq7+q$g;US^?7QHvf0K)eYKr5+mhcU17i+L0+*VcU<7eDTWXDwB9*mh28(z&a
zz(R3B)%mq7E#7V9z9r)B#3BzUcir&y^zW%MGFHZOLt^>~4lQDMSMV!V@y@plXQoHy
zc15pQQtJG|{{xAnM;$7&ReFP=OwNkT2T&VYOd9<Vyz&Jt=i7qrL}>Gr0Ux@=Rzfo~
zF5V|Bn1g{)!x@SK4NGh2xUZY0q#t*N%B)>ya)@vCm|GiVQ5kO~wz`A})%zCt<{SE!
z6XAG|XDpVB)|~o%CLx|4&Bll+dbGGVk95>A^(6zeG|IyJTBt@c>NHjW%a$wJ+V07h
z`@^P7Hz<bVMAeXA45R+a0NMYZftcyZf9_(L`!@sR|L6ZOOG0DZ_XB{N30^kd7mC*J
zYhPLNt8I3cgUqTiw{sGu73n+_Q11RDfQ4*5rUEy=_Q^b>xS>L!An14~nC0-B1#(oO
z`3Ci|&ljdSahliE^77sYRH)>H%}z=%PGG(VA(FI*{W6hdUu<%ucHm}(ysY4A(=rHp
z^MP|eYn!BoSy>2x=C#=_J)y&;1>bXJphrS0VRCp-K(f0u9Hh(95c-|KR}0Gh;O@z!
zCyZeX6PHD8cgOJVay8B(nT_1vj~a%a12vo+6sVkAfY8{$qt#mTIBv(x^|I{6#u61~
zx7FwNID+vpt=O?zW~P!|X7Y#0XPDQLQ>RHIK_+jqHC|ac!C{%o4!dPs0fRozW^7ra
z(%=h0f&I{IcsaqgwbAvCb-8(4tB+T)Yg>A?N#)O(UTW)|rG*MS8G@|z#wRhlEiJdr
zuIJU4;}~~`O=$MVs|9MNkKG2mIZ3n#G=F4%rFqiAC7swG;3;Qu@g&}l*;*1jSmm9P
zV3FA$yVyKT%WGzk^@J&3LJ6ZnKxnSO&oTQv{Q1Q+iLhH(+Dvkq7pJZk*Fl$&)nYEA
zs(3!C1Wkz2;$msr%*x44J-{cZF|6AFZTTG52f0?>apV6pbnz=8hwdqawRlulYS=9*
z+htH7NKjr?X0_4wA^!G78kN0I)05P6pTl#B4(#x@%Yb56!n2h=kfo!&&UV((TEW;#
zJ3uftANf@;B-AoOvK#m54m7NBC#Pz?O5+Z^I&~w%!Hmqw+E|r`k^2mzB$PP6!pE=r
z;77%bYy~+QwYb(-UBd>dP^7xa?Qsl6**&SR1{J%cSLD;Vjs&l^Ytkb4!;?Zb_=^eQ
zRY$EZ61Q{>ZBxDwVTg|#;LgcBUH-tWWX$A5HAE+c(d?qj292|Bt2{Mim<i7O8c424
z^QpAzp|S1J(gQK~A8S{?F@m?`XZk31Fh6?!bD;#r|L<NdX?;5zQ&I;O7H;ap+J9~m
O14xO<iB^c{1^j=RAMjxS
index 33075734e9ed322bad65b401a278c75cac78a3d3..e564fb5708f3d9da4c623bb3bdfccb960566e327
GIT binary patch
literal 8540
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
index 439cfc39a5b8d0c116983c14c87ff072da296d7e..97e2b2eb67ecc58e98dd839187143ab6870699e5
GIT binary patch
literal 30143
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
F{{wruD^UOd
index 30bce927b44693a8c2e437c08e88461ab9f9ca0a..b886c73eff9239196fbe3db01116c220f726469b
GIT binary patch
literal 12585
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
index cf2ceb08bcf7d123e86e35348f685c6e83305aab..ac928c585372bd72707d895c37c9e11931b327bd
GIT binary patch
literal 40165
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
FzW@#|vGM=_
--- a/browser/themes/shared/tabs.inc.css
+++ b/browser/themes/shared/tabs.inc.css
@@ -71,40 +71,22 @@
height: 16px;
width: 16px;
}
.tab-icon-image {
list-style-image: url("chrome://mozapps/skin/places/defaultFavicon.png");
}
-@keyframes throbber-loading {
- to {
- transform: rotate(360deg);
- }
-}
-
-@keyframes throbber-connecting {
- from {
- transform: rotate(360deg);
- }
-}
-
.tab-throbber[busy] {
list-style-image: url("chrome://browser/skin/tabbrowser/connecting.png");
- animation-duration: 960ms;
- animation-iteration-count: infinite;
- animation-name: throbber-connecting;
- animation-timing-function: linear;
}
.tab-throbber[progress] {
list-style-image: url("chrome://browser/skin/tabbrowser/loading.png");
- animation-duration: 800ms;
- animation-name: throbber-loading;
}
.tab-throbber:not([pinned]),
.tab-icon-image:not([pinned]) {
-moz-margin-end: 6px;
}
.tab-label {
index b9e04449a161465d4a14a135f9c991adc0e3c58a..e564fb5708f3d9da4c623bb3bdfccb960566e327
GIT binary patch
literal 8540
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
index 5e36ba32a18c1461153a734e5ea7acda7856ea74..ba54836e9834f2c495bcfb05738b56481b2dbed0
GIT binary patch
literal 10727
zc${_Gbx>5_|37e=rP-xnsb%Tz6j|5>mTn0_mhM(TKpJ-G?(R}4ky42zq)SRgx)l%=
z6p=6Q-`CG?{LXydcjnx4=ghtT+<DCNob#H4G0@YXAY~@S!NH+GYQl|fdg^}~favDV
zes+zz=>RBu6P=qLbklG$JPE$sbj(iwJBIV04{-i-@!{{`;4r}XeQuta0ubf_#@<c=
z4^e)OI4}oqJ4X(rC(7B;$Pwib<om`^2?qy{772%$$c-hX>uYA97<<FsEtZf}7+__7
zps}NB4?t;<k^TiF{{aY2#2t7@9pFm$?gjr~qUCV<Y!vJXb64nNE0<QRs?PMY1dr}{
z&hCo^gg|-CK(_Y8(FvGs_53`z_&mr49(_BCLz>{!UM#-PnVg<PG6qIPbid)Vs5ZGC
zP2UbKJEnO}j5Q%QWN~9<swK{GBfjeuXlFwJ7gvUQOX1}b^o{+O2xy7sml){B!T~+s
zl#ap6S;5uZJ8dGuh+JK682U`f4lltXeOwIAt_J3e$RT(Ob@k7mY>sE3GrDad`h3bg
z#>*=KK&?_!Qd7w^3?1NL75vya{}lN``Kk7qPV1iU6*202KZRa84~#hh_SBbQH$U>y
zCBG`^(xc?Uqr@jeaeB&8Jt!8zj(>EQ%qATxw<Pre`f2$=U5HU$jNAtYM%!G#t&Rmc
z`0@eMnWpnAV<p!qi1|g(;4Pu2)OKf&@PH9g@<sr9c`;Y#NItH+5cu0Lk{uV@ctD0n
z+_2OMbCm4eZF*wB+68apv;kOs#>m`W)QWLaXzt>TPb|kzg~(fcmWK10%0`hNda9xx
z-sKoD>{?O}PZCrij<-exve!3#?njAI3LP}bBa;0c<R`&N;}sRPB4)QtqR%U|zHEQ0
z;v23`I|thr(+EwQMOzxSl`frjf4N5p!Sj_O@=dD&BTU8LyH9K}B+#C*T?iMb{zVP<
zzf((;9jLrfMCarHGr1YVV`Pfyd#P>e3m!f_KYuv+sqk`7T-wk}AgeM;Rd{Ba8b*tH
zE=4CCajmLm<TAZ5Kf5)(!a)ek<Y=3powtMBa$fC1FCKndS1!~iB_!GjeW?RdT()*6
ze!3<X<C~c)V#{_)x|ud4HB8Ba@svSPcId^s2l$0cxq=9w0M8G2Sy`p%DQ2qh0%qeZ
zVIGnKG4>S0pB*}i!su{Dsx+)7OLltAw7*Ti=ufjNlOn@L|E{Wf`vTuI+{tN-nvn4(
ziMTBFFm+VA$h7T>L-vs#h(e=g;z-#l(N{sPpV9iOfn$+CigY>u1Ju-~2O{H1FJe4}
zLhrd{?r04pr=q%$_L+63MqK$Dw*zcw8VVXj(;ugY=&y1)%%|;gC{r+pRAI?=v4W>B
zwVtbLEWt8UCKW6Jrxsj047Y#4BnfR6O}KJK(mZs(%i{?IHf|a^B{5H!j6j883sW0-
zaa>NgC8V79?OLQZ8Am^lrJqX7vwRa(77VG(fVEV*RI&0k=SbBp&k7ADL1K*7>+E9)
zWrFm><=$`>G?52)j>bJ|SMFRg57Eq1<RJ-mV*TnL8IGoK%G)jyam`@$SO)trGUCMd
zvLMot{X7$Uj<>JCywJEQ(&Q->CLa~%Jwnw|oF3CkA}bwG*m4^o`HY$hJN1`mrnYPs
z)tVbr8CWlmWeF9cT6{W$r8C28+_;MI757rE&wnw(|L=@YWz@R===sBlKyEB%?zW5d
zea4~FspE%}x6a@5$iJkJp(_a2%$OYvn?@p{75FTDQzPZ%0g=WUbz%9GkPdmk=M6qN
zv^gy?Au;QFxMmp<cQelm*V(%TtHCzB-z+W9db@9Z6zv(vfb=`e`gIZOYw8Ioae(K4
z5`Ns=4CFHVJ$G%Dnr$56{PpFUh=z{qyjz)bZF|L+?*6A#+`F51kFK~h$Lb6e>}QOf
zSV00@77at>`I&Q4Zg(=xLfJeEG5*atuzl2dFt$+DeQui9OMyjyxWY2U^(Euxh5E=&
zW)Oc#b`SBJAY$-&eNaMdJ9#Mc)X)pBjIS152DF2R_f2<aR$M|hXOrSuk`ZK1;wLqt
z#{^N*-YM@+7eBmz3-%<v^~~X1zFb14#cfUFIwMeisQo1!@aKnDt23*09%fZi^Oomv
zx|fa<R6ta9q2YwdnZ>8B<g#S<2TA92M+f)gldI=y59-G)?*x$RvXH%f6?xP*@C~I~
zBQDXE>G{*tbqp377jV8gR`=yO%>)S$)g*l(@UH1ob;-QeRGvPA(JPw5RiwTM*edYx
zQ$=S-=NMLYG~m_r^UuC4dMt8YrD#BgbLmN%>{x=MQ0NQVw}S^)=-j1#?>fI;<hUK$
z)Pt)cr8`OI$1?w-r}?>85AA?d=TLw&_xl9<TJIlg%p#k9U$0|kpZFK2>e@30cQ9YM
zcrRX(-N~Gni*q)3@RuaQe+eXaJJ}ma)PE!q{S!#KnlwJ(;q|HG*Vj9%cNLyP$etLu
zs&0&NHW_QOYKh(_Eq}@ysX)N`WtvhTV2^sH+5WuL3kKJujy9`FO~o2Gw@k?AOoYCp
zhV`$U<wC!=v~fpBN{L0wA!7hT%#Kds49tsE-^Gyg<}2jGV#pymO+`Zx0j5be6NFkI
zX->4y*zL_6`c@#25nVL_@GYk0lFFz|bWR|pD@UuBGHFOsKTiw_T?`hu`?f=?n0bmn
zmJym<GXg=p;&2KNa!Z^u=}5LulwlU~*!^m1-0QiCi~89)4(wXCO#*vM)mwZ=iGIqK
z*WLsOa@iMiY9yK^&qStiPbnt3Wrs~8Ze@R6$vgX<dJgZ{-z$%yE+1Et->Kyt&Ireg
zK&KG=LWT9sXr*#+V?lyjb-V+_yM=?1;=gb|uA_}0aEurs>HHlBK}G=R+!t>hhjLh7
zHB)m#Eb$R`8O{f@ZvvJfhDn)Jw=grKV)uVUzn%jg_ZHN27=~<1l}q66_`vsT60Vy_
zx^oV6t=-&R>|Omyz9`*4x*&20_ZqWIah$kF&|PVL_50PEhzk6zc0VCndbWdn<>2~x
zsKtUZUX+ULw3mey4(YtkoHnoQBfYOpUC&1YoPG+Ay{{RCHjlM9_4=05pqm>KH)&`x
zk(_MJlh)QVGNwG3EAs`A3cljwI%LrIQ{vX?Zo%p9=ZSv_BL0^wx@um%5ybRI5a4EU
zG<UN&@@4EjJw6V7%V-9DF!BUN?!k#BrXqylH&pbEh$%S4?WKR9&_9;>Fv|gnOowo%
zlIuLWAN(;dPoBG3wVSU?X^Rt*x~LXb+glSg*`Bq(-uWxAc<MNaEsz@6f{)KY^cL%~
z#rz50shcZC#2~hGdFQcNSuBkEp=)^w<5b5m->t-H{X%F;AdEOF+69VD2IJr-F}{U%
z_S1Um_!RB7+0DQr^@M(ErbGIyx^g-Di^yAu;HM|?2|E5+;vy(N@{B789*?4U9Tut{
z$uBhfwM8?R9*9dG&sddhk)OLo&a?f)->Xfr*Kwm~c!SGY2)Mz~)><ItoVTkaLo6e>
zszTKHOz3$d$SsD_PAs{Ads2K1$oAV}vRZ{I4%1rh@lE%B1Cx1Wp?)Dxl6Qk0FoLDS
zMD=Puw(Z^l<|pY`X7f0|vT?g`DMgOge#2ALV!hY?y<QXp<$XEu3J*0On@IL-PL)wA
zU#@j<fL!tb5<G7f-c@I`O7g73*sCnXimCU-Dq=e<%)4sYKDhGWepY5;W=IW-K9PYO
zcp@<}s`!q%6{8@yHqeqY;vw#-{!c`Ld)j*|AHH!_y)}bA#>eF$C+9z_9(UP9`orpi
zjJX~e9dF_y<W<agUwsRmN6kfIq{d}6eMI<HeV^IV{MeP=(b!Fyyd|{elsmkVDifnC
zDRcSd>@j}7*3Z~{EThj~lt}(1jFQ76|Dr@HH<oonY0j7NW_7f9)kFbyA!U*1ml03e
z+j5OD2hx?@2bN_J7$)*TPI$gH2vZOaDg};(aiB;%uikrmMRv`zrn|r}hCtQ_2EW$J
z)IiFtJ6MZm1*II(soif%Q|k%nrWe!l;d-o`BGYQ&Y%BX40t&n{zP}e<^VUxLijN|k
zT%9B0gl5JBi7?`$a`s;(qV)t727_=E;vXwjx^PdhW_ON(Wzqf#jI3BD+gN9)7!#LP
zYOp+%EWo%wSfq7S+GZ}X&$mC5W=I4=J*1s`m<vZYj}T}pt+k_5i(d7Mzw(WtDun3#
z_^tSGk;0!O3d(cLh|0U1@8zO(FXS2sD$o2S+>-!jgpLXrhm;pkHu<!`BoF7sVg&$+
z#wmRabf!$wjZS_2NeCMH&#EY3gw2sonql>dLB_%1H9jm}e95Hxr(X28BNB_!pX?Dd
zGIQ-!y6#q^2Kz@9gG@q`c4c$~KLhs*eZ3Sx$)3fMsrWsLR$zXym#s&Lyp9a7X8m_z
z64)7VY17FuhjdUGH8F{=<>CB}Ag^GRjH%$~pcl3$a@V5fOHH-I<ro6leY+>+uT^{W
zdyHfac`53MPG6rUc+c?W*G)(ya#4+BdC%RM01Q;kRe>(RsqHDAvn{ibByX0%jIY1=
z;^_&4@+q!?)Ii1!F>xbPGSiKGe+<`WO`0mID7DMrFx*1w^GFhFIMH8}$o?gj7>(U;
zC{g{PM1Dgl!}?~+MmrofwZQDOXZuBBoa{qP1c5aza>LYv<EwZ%Hwb#4DPTqy7Vxd!
zxO@aHmZU<@TxE3n`Ow<lU($^~l#!lXs*9Ag;sw=SdF@<Gemn4Buv76h`}JAj83&|M
zC_tvPVrGi+X>(3P+pIQDQPG}B_E(0!?MjyoCXJvz{$l@ZeuWX=G(gT?MTXw5y(KLI
zIR7q%^6IQ!1eZ=riV!i<Kasp9Z;e#GKhY<{OHTwzzXp}raoxBTm+QzNE=4Y5Z#&SN
z+(!=~2vT8Z`s|<59WdP`)O7L%gFoI%fv<5|7-r0TA;!dsh!ryoP_iv+IzcrPlYP4#
z7_&u=WJ`xm1tmuz2<b1IYwuCe0~wtZec4bF0~~6$>lU<u3(&nmSf(pzTzqKm8(G&9
zJW<}U{vkZ@<!_*>R71zlQk`#xh_~2T`i0-<oX#id2L%#u?+i`nEOw;Y9SWRI$!iqd
zF5=&%$};%KgzbhJm>=zk^LD5dd&QEh^G1g@|EkwU2zr^K6?cDIXA4{+5+lO&m+iO~
zk?y{_c*eM{iBejhk}T^!Kg-T9W3JO*OpraMd$=I{VD5Lcm}6DRK4qNsriiOx8}ibl
zn}7`F8uS)2F*h+Qw#@OgP21!yg;*C(4ggM|b0D_wTL~6zXfeIl=KIOtvDz<|;1;${
z@bfkPRn6Iz76rKBFF+Lkl0~zez#BkZe*jVb14vsl6Ga<aaxA+Gp{bxu<^e>^hIePu
zOO}CzLArg2X&zFNl@2#U;mDseOfLOWT9vv^>d^{h&VF9EE7Vly202jBCQSkc*vLl#
zfqcCLrZak{gjTu2GiA}^;fK^f83qMXR+a(q8jvD!7HgecYMhX4Km0qJCwWNVe&h5T
zjmeYZGojf5cM<UcNA(UB(WE^WMV#ED0qhuaQAl|achC6dwmk2MPxhU=+ylD(1SfM5
zdNb@eJft-2Jgm8aftVz*!RRx+Xy4P!iptJO@Htv6x}<s{JnC@c6VnSg`5d|r$F=w*
zRdG*l5qDTzJ{Ge=!2zLO2lJ~!^B}#hV$1h@o?Ygc!)?i_#CgOt#kFqdn$Y8z2IG;h
z+2#X~64AMM8TELje)>4K&8macBVWMLS7Fi0lr-E88*Ui>Az3!@n^j5e2h;c3z!!|h
zB+u(N++vVVw}?6QKv0d_s^JOU9ruiB4qCJ47feiqCHu>Mt;y5~%+k%azUNXN;B7Az
zjx5Pmb>a<eb9wB!px|_6<3Stt7PP_u`RWx?i4scAv~Le>w(hzepuJcia;g)Ey|tD7
zrOeOw!$XYX=ijE;B4f+s?_}vrGn9H;zR?dgQ#&^~J>7A3Z#P|O@tp0M7NR(#*a%ur
zJLq(4X88`DBM3^odbY?1p{^*FgEgS6eX0v@YdLFGK`p){^F_hyKEAqUF$(z_@Pibx
z_ZKRve@P|ymx~)zkUyxX8JUv$UTe?)v;E(_d>r&zDa_F=%|Vv7FeX4MTHTm0CU}~9
zhIaY(GzV<jK#Fh!1bhCR09Zb~kd81&{orVqE^qF8Cuj9V_wo6eR$4FT^Wg#Lsc5?`
zlUCbF5nsYDrwG%v8g)}=nhfkcGa39x;X=s-%7#kJCun0%+ib@jK9JZmLyR;J=Du0G
zm=C!NaXlI#FkhR>Y0H3Wxp24`6?hg1OIl>kN@yAyb?P-NWxW7|7$o2Ydkw`Bpp@tO
zee>U>JEyvm2fC&=wR|F`#P@ewAh&AbeUM7-jGmcb$j(D4VPl2Xa0%PXP;_-ClqG!K
z`#gHe4vy{w>Aetrpd!B^c0faF25}Fd*}NV%i9Fh38N0yxR=RAdpzoix8AAuJ&8vu{
z)-|cQnbwu@FWwIhw>oDpnocya`T{EGH1IU|;khBlDxy(pQKy;$eg#F9aw#*hF1?$f
zXelaiax$E_^VR#*4^4*cwu_%yJ~g8_lJt8;t93v!uJ%_&S2-(op0qop<FATBg#w7h
zDWZWI)OS2eib~1WYeyG5V(*VZQB=afL$vOer9bann$)&YUX{MKiMHv%Q<25Bkj3qg
z*?AoOSJmb_<s!9S>E_NULh4+yiWx;*d4W7fh4zE@%9u^Ie-t+~un|1Br4v_=aaU+i
zaMuA9EJuGLR8ODT;^$qY;d8k^`I6+W7|HuNSGuJwsspQEPKQdGu78;V{&!PJ2*loB
zra=F@gUi6ZF?D>s{JrVD#Mrh#9wjpoepV$VY&s!_^1;5j>>*^eo4|(jWe}-CP(4Q%
zTr=>*h!zL~LJcousF5$Q&IbVn!NvEI$dxJ|EAwEk#iuq@@b3o+DA|*pNJC4kbwJm-
z&O~kaOl#El`)h%AG$n-eK~ssJ>qjUv;6*|7xRdx3DkSDaN_dG9!X9(#NfnJvZxofA
z`x;{_#lmu(DSaqih<3t{-O{HhSzd6L3#C`a$uWueU|s-nrIESLuB92w^4wpuZY^~b
zRmKQ*R9e_Zi1zqg2;ye~&XTT#TCt)#%R?^fQic-AFWY2n=ElIq`CF}2AJWY2vq6q)
zfF}+EI+DmlN~aDOm9yN4zEU!fTQyPLvdH0%gtU)mxWk>6f!I#~;$=KI4K78rOF*P%
zlR1e%C5<a!<_!$4sE${{h+CjnW}Yi#LJBP>Y3x(?SW-Re`&^)wSRe;I#WW4J4Jf2k
z_we5X?R)%$oP@vpHaFy0n&w&Gc-996<^ygWDX-pQq|kUXu|0A<^7<4%jP?{rT~5}4
zh;J>#gJV30=4-?=qHoD8>UPo81s>G1Jg^Xa+MI7?T4i2`6cDVI;H?E!#4Z`=J{$4Z
zzpBrJ9vpRcf}Ny34-s#A6}lOiE{hVsEw%iH|2m#;v$b4>>tK%NK`!(`E6Et%3)VuL
z#Kua}jn+yeUhzTK&hoY_YyM@Q0?V1vU#4jOyD8hbY}~)<OSE!hF&Puuw7%fDlH>8u
zTM8BKjoxc!E*M7Eauq<mmFm#Sty(qWy5BK+gz60XhVU2t#t{TC&ijA^T7sD3uEuB6
z2@(~Gt)i`xuf20Pke=)p@7apqX_#caOjYp<CtFgfv}XRi|A}0a1CKVsKKwkzinn?k
zJoZSfpc@Z_rYKb3*Qmv9P$A%3D+luoa@!RIDIaEf;g;5~ac!<&5GZqpsQ-YQnJ&w}
zT5Ia(H|yw!(7dlHtq06)`Q(+cbQ=gLE$zKGcVOSjYLmn=QVuj4?QpRR34Q)bAMCwC
z5$tw0<CJz?%KfATo~NJ{fm+#n@hCP}D}$GpNnRX}b>0P`qM}K$%@IXzp|>gzssd&?
z5t5S$<KM0|;8IhiOu^M|)yjlJc_IW*V=D0MOg*EOH*1z}E4yf`Ig>wyuj`D3BW}}&
zLfbM7S|gvV6|rA#6)CklfAnJVkx!W51W80UTELZTs21m{UDMge@1?pf%R(M*OW@yy
z@0Y@&NXg3U9abIK9t3}Q;W0KOdbwimHO?Y^Ztx0^#0R_%LJaZw;W!p3v|7%}8=7wA
z$(f~mTW~*{WRYg}9^|n}I0PXp%Q;1)e`@YQhN!8}((ftF9OnPJ>i2)ME^hzsd#1Ua
zQHD&!P{~_UY4{K1sF1S$xB7f*Z-UfC3DUbXTi|}fweI@I11D_TG1&q3HP<YBKk%xT
zU7j2NC5i4|(urv+_(l@PA4&B8q|^VO@%(r9@BH#*Fp0d~)ngzYSz1<xCthCn&T>WY
zh}}h;Z-AMZ8_mO7{>G=Sj9p5Ogi@xBF%sbXBdYuCammNya~p0#q>C~e4<^cd6`Z>E
zB68!4d^pnX_Lvn&4iTjX-gqX^gx4q_avF#1FV2tKR34UJDD?V$H)TP)_aO%rz=ik`
z4%L!V27+S5IR$DrWoKO1nOQz(C_W%34@pmrhC*S<0C}P}=}rk_J*7y{Wbu;E7Y{#=
zukZOjICqszMsAS)h}$5|bIxNHj1KUPffY2N2R8NUMd_AnJyYu(R`=SKeE=U)FZ!9K
z@swguT>LSsSZU|v?F|W-OyHzp%TbG3ayS8gK(~uk+iP&<@>8z?9&PY8u`;6kA~0Zj
zJJNhDryqoiYf|f%NeT>EIdvUe@9eral^G>LNlYQ)L(3Jh3B_fTK6q;MG(_l#9<5$J
zJ*rmF2DqLZ3d)yDN-?w@Gu&`&Pp7~q#6Gg;>gA$D(LBH?Kb<X&A`OZUkwh*j7Pw)a
zzt2Ga?z-pQD5H#<(R=5X!5g-BVq&Vd8TQLa(yDsfW-X<VONoQ;No3uD-K(X|+8Bky
zOp{s4a!p>-E&yf|KS-d5cR=uisZ08j{j-UR4Btd?e|j8c0~&$NT0DfR%xPZLNTC=1
z7DER1@%IIy@PZu=O(PH|7SyB?6;$<nNclEy*9n<rp09i4U!oZPC7V)Y({Dtv{1L_Y
zf9Jc9ymtY7mUYn<kwkRRNX-CE;il+G)pK;IF||pKYWMt;&uof}(cd4`s{yT{kc50V
zhVPY*?1vqhbEPTKMQ*AEW%dlLjgaGW6*`X6(%jjjKB%FcJw486+(i=c0d6lKcJ~?i
ziMIHa14Bl1l7%CpX=AXrF5<V3S}sPEhI*U)R>-i196UTqg`$a6N3a^A2-X6#eJ%d{
z>6v$<v&=0r)R1(oY`kllh7f<X#hNrVF>{2McHZeQ->@aG)m2#@=l#$<(6bJH5~QXo
z=pTfdv&eK*IygI84Lznip$l!N!5W|DDAXAKc21U4mJeC^gdr@<-^o8?E1q!PJvCYl
z9sNPRWnQf*{7FiV{&}{CxOP`+tmCTTq<|f3if6qTGgx#l?S5;=D?tepBR%>N8dL!_
zLN$3e*k4{YPV}A%)i#>XCmizDV_kmm$%e`51la)ZINfO7HUO8>uoo309jD7i|330?
z^qa@)qUYTYlERu49~4slq!yoTY=!khQB$7dcn|0X>?0ECrAQL-OQ^X$8F}~D_&nh!
z$fikS>*+-fZo&6X>_u{4XCl?2VP<<g+93NVg)eQk^Xo<qN#yJn8!U=CAnxx=^%y^V
zdjevrIJ_Zxb;>w!Q^YWYuzG3hi8}QE&2-KS<aeRHB=B3Q!xs@_QYSV8mi9Rxf!EjN
zg|8kZ{e_9?U*hQ((c}##)<2k-<;IdS^fl*DjKjB&^^3I41A$J$I$%jL^BTs0)bRoj
z;=a9U?xhKZfL4*_0ONvr*vWLsHs=d~YumSXw{^3%EKHa)jY<t^qp^?SaL(s71COJ_
zT7m-gkI#Pee2m)-r3NmrM=p`fs-flkvF4R*QS}q|!wzNpLX!_EPbVK$9XjSvBSw7K
z@I{F}HEvwggmYxa|Bm;4xL|!0_<{2kqNIbZI~sf(q$)`yLcYSkHqhIu41`3=loICq
z=_00jGzwD+jj|fF(#t#tv|rTrt%c|90Eo2U;mY4v%G-}8{3q;6+R0oWwIAMr_m&Q3
zN@Wv7kuPo^VwF7^vWzg-ebp)`AKEB;2ws+bmbcs4bGxD@dd!Tao~>4)6Df=3U8`0-
zOT?JV>(2hCtR!a3YPjt8YBlx`;zsN5Rhn~ksP&OvT2y6F9jWcR!5ruHs~Wt&uJe<f
z+o3Q6AzK7zOQ=Fvmf1a1OS+D67mGfzq@Hc)7<iYmd!0ulK)EjQXQNjGors^4m7EGb
z)xHD9t9VYGKzkqZhA?0?%_+~Yct$%HN0^{i97c?5iP>~6_V4MPx|)3<LIN?#*b;EH
zNpp;lYfbdY5nJrQQUibHaf}<Qj{7pR$^zRc#^9N5>4n^bv=(1<B>HI2M`-M0S;obB
z@w<>dsm-7sN0x~P%$h#&P)?)7R3`xIZ4%0~C54^aWTuxP@Mmo{e{o{@muzx-%X`BK
z{D%`*ZY(R^`i2v2T*+dR@RNwyScOsG5T5iG$TMgp1ZKwo)HHbbV20Rm1_9?t45e)b
zWp;^~K(qJ~e|n$2Zbl)WAT`re2}p=Y5bT#UCbBDf3@q<J?)QDywnL|m*X4VNfn{xg
zX_fHQZ}Hz^Dn6dhNv~OQYNm5gGz24}H~RFsAB!wd&Oi3nZg*5Hd8oB`D6(&}mwiC|
zwx62o+r2}UMS`_qBi~NQdZCZjnNDllWP7~gC;B_1+}|}Ga85GJ7WVf>_34r8G~iyz
zOz=$d>ec1d1FITb1HMxa7`jLqFt(-ksl`4Z&qU)W=Z{zH(7nsltp}M}@N~8<G(zxf
zXth123OwH6s(#J0t8SF{ngntGs`0^Kn4&@%kLZ8~TyB&_j^#p<dcpE4Y%S8>s3;N%
ztvk2TUy|HSesh(IP}N3>9cMlzhlF6Kx~_>`bSln@0SOl_f-K+5E)u)t`mG=3Isl6Z
zA9Y&N`xH@xlt$?X_z)8gcyNts+x2Y7@b`c(#$>%5lC6b&(J$J>(4)7a<)bFaeVrK9
z2gXQxq;}NIdX`99qT&Jr2Mp;?N?TubVARZ~Pk>x{=>+GU!@6G7<#Eb-l9Rs0e#t?T
z5>qIUhn?7K4B<<0Ar~-gmmWEk=ae~2o?4ybOpv>+#7_xAN!oXwc!&4L#8M=EfXk~V
zl40eMnO81SW!r7qhYY;Zr@!t|iU<CsiS=K?skFxWMicOlCN@T<tiCDj3}0~X>G|&E
zuchyex0G~q`SbZ5(}}6*V6?NGB+c%y90j^7;+ejv++jfXH{yVOVv{A|Za4sDFbzYi
z4;Cg?PFw{{Z7O^2p%_|iL=8>5-rQm$@~ZBcPqdeh0$6%whDD<;m;);xN^3J1nkqQh
z+>Iu-S^J<zRY~#)&&Y=K<LT)s#tk^ep2MG|b?0lcGAc*6U|hSOv2`oCgJI*!SC!<A
zM$p38Ayy~R=2^}w{Lqd~5r<B0L{M3TjBD$@*!#szh0agj?v4$rl5Qfn34mjlvA2G^
z;VesuKJhiZNdD1yqWXUDCi!Uuxs0ugc*9&*FIy#_eXsah0@2Tj)U_@LC<tm-u&eNd
z?AHeYtt50s8<RvKp{l2A5{PPf3PNwyh@#0TzleppntGOc7}>^z?lr1oe@swLtr=;!
z;Ft=?{o=)Mgh+{*0M&oUDl59h5{;=4szndeUZ%dV3&$;`%%tGXb}{UQIE2qh@G>k%
zjbjE#hQgt#Z&gf9=z{p~AblvvP)SM_tED}}en*-cskX7GM@(3rDSfj5RVx`*!r~cy
zq6A4W50Yw^-zQq&wa@YvwQlUmDX@LScr8QEB|+xq-)=QChE$^^k%f$u!a@g2^UZbk
z%`og8zmNrOOH@v+z=y3YFo8N|E)GGiM#pEcqu5lIBV9hmPXB9^e?_)V@-IT{{}M<t
z0c|&gxc?C1_-B6mPZ_*B-~VZ3#3N2vKm0&-uOG^-eoqSyB7iMe!!@U4WM>f5udw-)
z&jbL15U%HM-iMs8do)z0(U=g33ZUWfrCXl_no^2HWU3vj7>FsUcCUjc<$qB@`VV^5
zgxMbH6jkpVh1D%}d43#UoRGZeh)uC}KS;o^NV5I1R2j>n$V3K}->sK?Yn1aOqxubx
zud=_^+Yj}}7kh(oKV)&d#sirQ&fm7kRA2ESv$urovkRqNCzg#L_&R`Rl@^6OpRH7K
z&p{T#rFEUz(uo64>og7$;_IFX)Mw8iEBwRx9sna4<DP6T7z_kNwY~PtA$_U3x6y{i
z@p9`Nj*PFHx_Oat`=G?1{$0`>43D!<UtPYK_+nqh8Mg=l`8pT3e-8&3!8_m7izKJq
z!F?F0lPJ44ewO;-nudXsh>|=R)kGMH#Yo0Yl0D*E<|u8!sf`xng62A8^09dw##{5z
z*I82RaU=5?VLk3iEt3El#w}VTB#{Q%8$*GnBf1oq%e-gD{toRQC8ZX<H;A}W2+!|7
zRy0ebwPWY^lIZh{_1PT6G}uBIm_=m7(J}f*LTDCo1Ho{sT(nQ*Zop}}SFv9VYVu1s
z7x~->ZE(<(VYbU)DM{3XdrBR95+GR9znEV{a*TVYbHsh}G+8pFG%H0e7jbzgP0y~r
zq{T?g&z#$f%zo73!J8Q4^Xk*vQ!=rqC#u;O(vyF&;{5Ndl4qxs{wj_`{$Zu)GG|B|
z_qsqM3f-JZZl_Yf+^ky`0nw@wsk+~ki}djkSKvcOMFmjDV6nEL^W|#^b|j>hGe#M|
zuRYn6r_C-6B54sA%1CDHm&HK_>EXUgb!}u^EBN#I)#sOmQD_580*eVCM4+)a7sAv0
z!1DHrg6C#5hI&YTH-yB6TQij=gmd)a&%EX;j~}BZRdN}6zJqr+I@T_bxgz~0zqmNi
z80ru3H~iM2W?et)1HKJZ7CbhE3Vivl_&wy4`4g#Io*?g8!S>De07E0%qg{b#Gl6kK
z#2a75N7SY2r_JN_5@t<bU#3}wOoh%WtrYV1GXZfU8!L0f18l@cwC#?ru8Ue1SvPz(
z;T0FHkLwl>odKH>_DAZ@k(?4(IeGTGLfZX)4Waec%tI{EB9Q4ZS5RVU+6L*WAKue-
zRIWEU*Ij3p_gfOkS(o=~wAp@mzzBwpH!U<#j?}wg*A17ukdbmi67p>OrtK6Cb>fHn
zTzwX*9i#oY<2tR?9OihT9vf^7ol`+wC&C=o;<{udF5KafZ1tMHXu~dye>hIDMC6L<
zqi-K!@y*3?V246#{0n(4R$O`-6`%^8ia$vYWyLfDaIX(u_*}_}ok=0rfr@`cbCX+*
zLjFL^MYxwmOl-=!nlE0ife|HXe8e#(vf5Gvw#pldgRu}v4{pgvE)U_Dd2O!Y3I@g&
z$eNt7U512xVbP{N6g1J#e)mtY>Hi$C)I#}qIdk}li_7!wwf=K*69<XVgFjWZjr<?M
C)pGv;
--- a/content/base/public/FragmentOrElement.h
+++ b/content/base/public/FragmentOrElement.h
@@ -46,17 +46,16 @@ class Element;
* @see nsIDOMNodeList
*/
class nsChildContentList MOZ_FINAL : public nsINodeList
{
public:
explicit nsChildContentList(nsINode* aNode)
: mNode(aNode)
{
- SetIsDOMBinding();
}
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS(nsChildContentList)
// nsWrapperCache
virtual JSObject* WrapObject(JSContext *cx) MOZ_OVERRIDE;
--- a/content/base/public/nsDOMFile.h
+++ b/content/base/public/nsDOMFile.h
@@ -749,17 +749,16 @@ private:
class nsDOMFileList MOZ_FINAL : public nsIDOMFileList,
public nsWrapperCache
{
~nsDOMFileList() {}
public:
explicit nsDOMFileList(nsISupports *aParent) : mParent(aParent)
{
- SetIsDOMBinding();
}
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(nsDOMFileList)
NS_DECL_NSIDOMFILELIST
virtual JSObject* WrapObject(JSContext *cx) MOZ_OVERRIDE;
--- a/content/base/public/nsINode.h
+++ b/content/base/public/nsINode.h
@@ -315,17 +315,16 @@ public:
mParent(nullptr),
mBoolFlags(0),
mNextSibling(nullptr),
mPreviousSibling(nullptr),
mFirstChild(nullptr),
mSubtreeRoot(MOZ_THIS_IN_INITIALIZER_LIST()),
mSlots(nullptr)
{
- SetIsDOMBinding();
}
#endif
virtual ~nsINode();
/**
* Bit-flags to pass (or'ed together) to IsNodeOfType()
*/
@@ -376,21 +375,17 @@ public:
static bool HasBoxQuadsSupport(JSContext* aCx, JSObject* /* unused */);
protected:
/**
* WrapNode is called from WrapObject to actually wrap this node, WrapObject
* does some additional checks and fix-up that's common to all nodes. WrapNode
* should just call the DOM binding's Wrap function.
*/
- virtual JSObject* WrapNode(JSContext *aCx)
- {
- MOZ_ASSERT(!IsDOMBinding(), "Someone forgot to override WrapNode");
- return nullptr;
- }
+ virtual JSObject* WrapNode(JSContext *aCx) = 0;
// Subclasses that wish to override the parent behavior should return the
// result of GetParentObjectIntenral, which handles the XBL scope stuff.
//
mozilla::dom::ParentObject GetParentObjectInternal(nsINode* aNativeParent) const {
mozilla::dom::ParentObject p(aNativeParent);
// Note that mUseXBLScope is a no-op for chrome, and other places where we
// don't use XBL scopes.
--- a/content/base/src/Attr.cpp
+++ b/content/base/src/Attr.cpp
@@ -49,18 +49,16 @@ Attr::Attr(nsDOMAttributeMap *aAttrMap,
: nsIAttribute(aAttrMap, aNodeInfo, aNsAware), mValue(aValue)
{
NS_ABORT_IF_FALSE(mNodeInfo, "We must get a nodeinfo here!");
NS_ABORT_IF_FALSE(mNodeInfo->NodeType() == nsIDOMNode::ATTRIBUTE_NODE,
"Wrong nodeType");
// We don't add a reference to our content. It will tell us
// to drop our reference when it goes away.
-
- SetIsDOMBinding();
}
NS_IMPL_CYCLE_COLLECTION_CLASS(Attr)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN(Attr)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS
if (!nsINode::Traverse(tmp, cb)) {
@@ -383,15 +381,15 @@ Attr::Initialize()
void
Attr::Shutdown()
{
sInitialized = false;
}
JSObject*
-Attr::WrapObject(JSContext* aCx)
+Attr::WrapNode(JSContext* aCx)
{
return AttrBinding::Wrap(aCx, this);
}
} // namespace dom
} // namespace mozilla
--- a/content/base/src/Attr.h
+++ b/content/base/src/Attr.h
@@ -77,17 +77,17 @@ public:
static void Shutdown();
NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS_AMBIGUOUS(Attr,
nsIAttribute)
virtual nsIDOMNode* AsDOMNode() { return this; }
// WebIDL
- virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
+ virtual JSObject* WrapNode(JSContext* aCx) MOZ_OVERRIDE;
// XPCOM GetName() is OK
// XPCOM GetValue() is OK
void SetValue(const nsAString& aValue, ErrorResult& aRv);
bool Specified() const;
--- a/content/base/src/DOMImplementation.h
+++ b/content/base/src/DOMImplementation.h
@@ -37,17 +37,16 @@ public:
nsIURI* aDocumentURI,
nsIURI* aBaseURI)
: mOwner(aOwner)
, mScriptObject(do_GetWeakReference(aScriptObject))
, mDocumentURI(aDocumentURI)
, mBaseURI(aBaseURI)
{
MOZ_ASSERT(aOwner);
- SetIsDOMBinding();
}
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(DOMImplementation)
nsIDocument* GetParentObject() const
{
return mOwner;
--- a/content/base/src/DOMMatrix.h
+++ b/content/base/src/DOMMatrix.h
@@ -23,29 +23,26 @@ class GlobalObject;
class DOMMatrix;
class DOMMatrixReadOnly : public nsWrapperCache
{
public:
explicit DOMMatrixReadOnly(nsISupports* aParent)
: mParent(aParent), mMatrix2D(new gfx::Matrix())
{
- SetIsDOMBinding();
}
DOMMatrixReadOnly(nsISupports* aParent, const DOMMatrixReadOnly& other)
: mParent(aParent)
{
if (other.mMatrix2D) {
mMatrix2D = new gfx::Matrix(*other.mMatrix2D);
} else {
mMatrix3D = new gfx::Matrix4x4(*other.mMatrix3D);
}
-
- SetIsDOMBinding();
}
#define GetMatrixMember(entry2D, entry3D, default) \
{ \
if (mMatrix3D) { \
return mMatrix3D->entry3D; \
} \
return mMatrix2D->entry2D; \
--- a/content/base/src/DOMParser.cpp
+++ b/content/base/src/DOMParser.cpp
@@ -20,17 +20,16 @@
#include "mozilla/dom/ScriptSettings.h"
using namespace mozilla;
using namespace mozilla::dom;
DOMParser::DOMParser()
: mAttemptedInit(false)
{
- SetIsDOMBinding();
}
DOMParser::~DOMParser()
{
}
// QueryInterface implementation for DOMParser
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(DOMParser)
--- a/content/base/src/DOMParser.h
+++ b/content/base/src/DOMParser.h
@@ -79,17 +79,16 @@ public:
{
return mozilla::dom::DOMParserBinding::Wrap(aCx, this);
}
private:
explicit DOMParser(nsISupports* aOwner) : mOwner(aOwner), mAttemptedInit(false)
{
MOZ_ASSERT(aOwner);
- SetIsDOMBinding();
}
nsresult InitInternal(nsISupports* aOwner, nsIPrincipal* prin,
nsIURI* documentURI, nsIURI* baseURI);
nsresult SetUpDocument(DocumentFlavor aFlavor, nsIDOMDocument** aResult);
// Helper for ParseFromString
--- a/content/base/src/DOMPoint.h
+++ b/content/base/src/DOMPoint.h
@@ -26,17 +26,16 @@ public:
DOMPointReadOnly(nsISupports* aParent, double aX, double aY,
double aZ, double aW)
: mParent(aParent)
, mX(aX)
, mY(aY)
, mZ(aZ)
, mW(aW)
{
- SetIsDOMBinding();
}
double X() const { return mX; }
double Y() const { return mY; }
double Z() const { return mZ; }
double W() const { return mW; }
protected:
--- a/content/base/src/DOMQuad.cpp
+++ b/content/base/src/DOMQuad.cpp
@@ -18,26 +18,24 @@ NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(DO
mPoints[1], mPoints[2], mPoints[3])
NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(DOMQuad, AddRef)
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(DOMQuad, Release)
DOMQuad::DOMQuad(nsISupports* aParent, CSSPoint aPoints[4])
: mParent(aParent)
{
- SetIsDOMBinding();
for (uint32_t i = 0; i < 4; ++i) {
mPoints[i] = new DOMPoint(aParent, aPoints[i].x, aPoints[i].y);
}
}
DOMQuad::DOMQuad(nsISupports* aParent)
: mParent(aParent)
{
- SetIsDOMBinding();
}
DOMQuad::~DOMQuad()
{
}
JSObject*
DOMQuad::WrapObject(JSContext* aCx)
--- a/content/base/src/DOMRect.h
+++ b/content/base/src/DOMRect.h
@@ -31,17 +31,16 @@ protected:
public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(DOMRectReadOnly)
explicit DOMRectReadOnly(nsISupports* aParent)
: mParent(aParent)
{
- SetIsDOMBinding();
}
nsISupports* GetParentObject() const
{
MOZ_ASSERT(mParent);
return mParent;
}
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
@@ -150,17 +149,16 @@ private:
class DOMRectList MOZ_FINAL : public nsIDOMClientRectList,
public nsWrapperCache
{
~DOMRectList() {}
public:
explicit DOMRectList(nsISupports *aParent) : mParent(aParent)
{
- SetIsDOMBinding();
}
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(DOMRectList)
NS_DECL_NSIDOMCLIENTRECTLIST
virtual JSObject* WrapObject(JSContext *cx) MOZ_OVERRIDE;
--- a/content/base/src/DOMStringList.h
+++ b/content/base/src/DOMStringList.h
@@ -16,21 +16,16 @@ namespace dom {
class DOMStringList : public nsISupports,
public nsWrapperCache
{
protected:
virtual ~DOMStringList();
public:
- DOMStringList()
- {
- SetIsDOMBinding();
- }
-
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(DOMStringList)
virtual JSObject* WrapObject(JSContext* aCx);
nsISupports* GetParentObject()
{
return nullptr;
}
--- a/content/base/src/Element.cpp
+++ b/content/base/src/Element.cpp
@@ -871,18 +871,16 @@ NS_INTERFACE_TABLE_HEAD(DestinationInser
NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTING_ADDREF(DestinationInsertionPointList)
NS_IMPL_CYCLE_COLLECTING_RELEASE(DestinationInsertionPointList)
DestinationInsertionPointList::DestinationInsertionPointList(Element* aElement)
: mParent(aElement)
{
- SetIsDOMBinding();
-
nsTArray<nsIContent*>* destPoints = aElement->GetExistingDestInsertionPoints();
if (destPoints) {
for (uint32_t i = 0; i < destPoints->Length(); i++) {
mDestinationPoints.AppendElement(destPoints->ElementAt(i));
}
}
}
--- a/content/base/src/StyleSheetList.h
+++ b/content/base/src/StyleSheetList.h
@@ -15,21 +15,16 @@ namespace mozilla {
class CSSStyleSheet;
namespace dom {
class StyleSheetList : public nsIDOMStyleSheetList
, public nsWrapperCache
{
public:
- StyleSheetList()
- {
- SetIsDOMBinding();
- }
-
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(StyleSheetList)
NS_DECL_NSIDOMSTYLESHEETLIST
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE MOZ_FINAL;
virtual nsINode* GetParentObject() const = 0;
--- a/content/base/src/nsContentList.h
+++ b/content/base/src/nsContentList.h
@@ -34,21 +34,16 @@ namespace dom {
class Element;
}
}
class nsBaseContentList : public nsINodeList
{
public:
- nsBaseContentList()
- {
- SetIsDOMBinding();
- }
-
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
// nsIDOMNodeList
NS_DECL_NSIDOMNODELIST
// nsINodeList
virtual int32_t IndexOf(nsIContent* aContent) MOZ_OVERRIDE;
virtual nsIContent* Item(uint32_t aIndex) MOZ_OVERRIDE;
--- a/content/base/src/nsDOMAttributeMap.cpp
+++ b/content/base/src/nsDOMAttributeMap.cpp
@@ -29,17 +29,16 @@ using namespace mozilla::dom;
//----------------------------------------------------------------------
nsDOMAttributeMap::nsDOMAttributeMap(Element* aContent)
: mContent(aContent)
{
// We don't add a reference to our content. If it goes away,
// we'll be told to drop our reference
- SetIsDOMBinding();
}
/**
* Clear map pointer for attributes.
*/
PLDHashOperator
RemoveMapRef(nsAttrHashKey::KeyType aKey, nsRefPtr<Attr>& aData,
void* aUserArg)
--- a/content/base/src/nsDOMCaretPosition.cpp
+++ b/content/base/src/nsDOMCaretPosition.cpp
@@ -8,17 +8,16 @@
#include "mozilla/dom/DOMRect.h"
#include "nsRange.h"
using namespace mozilla::dom;
nsDOMCaretPosition::nsDOMCaretPosition(nsINode* aNode, uint32_t aOffset)
: mOffset(aOffset), mOffsetNode(aNode), mAnonymousContentNode(nullptr)
{
- SetIsDOMBinding();
}
nsDOMCaretPosition::~nsDOMCaretPosition()
{
}
nsINode* nsDOMCaretPosition::GetOffsetNode() const
{
--- a/content/base/src/nsDOMFileReader.cpp
+++ b/content/base/src/nsDOMFileReader.cpp
@@ -82,17 +82,16 @@ nsDOMFileReader::RootResultArrayBuffer()
//nsDOMFileReader constructors/initializers
nsDOMFileReader::nsDOMFileReader()
: mFileData(nullptr),
mDataLen(0), mDataFormat(FILE_AS_BINARY),
mResultArrayBuffer(nullptr)
{
SetDOMStringToNull(mResult);
- SetIsDOMBinding();
}
nsDOMFileReader::~nsDOMFileReader()
{
FreeFileData();
mResultArrayBuffer = nullptr;
mozilla::DropJSObjects(this);
}
--- a/content/base/src/nsDOMMutationObserver.h
+++ b/content/base/src/nsDOMMutationObserver.h
@@ -32,17 +32,16 @@ class nsDOMMutationRecord : public nsISu
public nsWrapperCache
{
virtual ~nsDOMMutationRecord() {}
public:
nsDOMMutationRecord(nsIAtom* aType, nsISupports* aOwner)
: mType(aType), mAttrNamespace(NullString()), mPrevValue(NullString()), mOwner(aOwner)
{
- SetIsDOMBinding();
}
nsISupports* GetParentObject() const
{
return mOwner;
}
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE
@@ -342,17 +341,16 @@ class nsDOMMutationObserver : public nsI
public nsWrapperCache
{
public:
nsDOMMutationObserver(already_AddRefed<nsPIDOMWindow>&& aOwner,
mozilla::dom::MutationCallback& aCb)
: mOwner(aOwner), mLastPendingMutation(nullptr), mPendingMutationCount(0),
mCallback(&aCb), mWaitingForRun(false), mId(++sCount)
{
- SetIsDOMBinding();
}
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(nsDOMMutationObserver)
NS_DECLARE_STATIC_IID_ACCESSOR(NS_DOM_MUTATION_OBSERVER_IID)
static already_AddRefed<nsDOMMutationObserver>
Constructor(const mozilla::dom::GlobalObject& aGlobal,
mozilla::dom::MutationCallback& aCb,
--- a/content/base/src/nsDOMSerializer.cpp
+++ b/content/base/src/nsDOMSerializer.cpp
@@ -13,17 +13,16 @@
#include "nsContentUtils.h"
#include "nsError.h"
#include "nsINode.h"
using namespace mozilla;
nsDOMSerializer::nsDOMSerializer()
{
- SetIsDOMBinding();
}
nsDOMSerializer::~nsDOMSerializer()
{
}
// QueryInterface implementation for nsDOMSerializer
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsDOMSerializer)
--- a/content/base/src/nsDOMSerializer.h
+++ b/content/base/src/nsDOMSerializer.h
@@ -54,17 +54,16 @@ public:
}
private:
virtual ~nsDOMSerializer();
explicit nsDOMSerializer(nsISupports* aOwner) : mOwner(aOwner)
{
MOZ_ASSERT(aOwner);
- SetIsDOMBinding();
}
nsCOMPtr<nsISupports> mOwner;
};
#endif
--- a/content/base/src/nsDOMTokenList.cpp
+++ b/content/base/src/nsDOMTokenList.cpp
@@ -19,17 +19,16 @@ using namespace mozilla;
using namespace mozilla::dom;
nsDOMTokenList::nsDOMTokenList(Element* aElement, nsIAtom* aAttrAtom)
: mElement(aElement),
mAttrAtom(aAttrAtom)
{
// We don't add a reference to our element. If it goes away,
// we'll be told to drop our reference
- SetIsDOMBinding();
}
nsDOMTokenList::~nsDOMTokenList() { }
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(nsDOMTokenList, mElement)
NS_INTERFACE_MAP_BEGIN(nsDOMTokenList)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
--- a/content/base/src/nsFormData.cpp
+++ b/content/base/src/nsFormData.cpp
@@ -11,17 +11,16 @@
using namespace mozilla;
using namespace mozilla::dom;
nsFormData::nsFormData(nsISupports* aOwner)
: nsFormSubmission(NS_LITERAL_CSTRING("UTF-8"), nullptr)
, mOwner(aOwner)
{
- SetIsDOMBinding();
}
// -------------------------------------------------------------------------
// nsISupports
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(nsFormData, mOwner)
NS_IMPL_CYCLE_COLLECTING_ADDREF(nsFormData)
NS_IMPL_CYCLE_COLLECTING_RELEASE(nsFormData)
--- a/content/base/src/nsINode.cpp
+++ b/content/base/src/nsINode.cpp
@@ -2669,18 +2669,16 @@ nsINode::GetElementById(const nsAString&
}
}
return nullptr;
}
JSObject*
nsINode::WrapObject(JSContext *aCx)
{
- MOZ_ASSERT(IsDOMBinding());
-
// Make sure one of these is true
// (1) our owner document has a script handling object,
// (2) Our owner document has had a script handling object, or has been marked
// to have had one,
// (3) we are running a privileged script.
// Event handling is possible only if (1). If (2) event handling is
// prevented.
// If the document has never had a script handling object, untrusted
--- a/content/base/src/nsInProcessTabChildGlobal.cpp
+++ b/content/base/src/nsInProcessTabChildGlobal.cpp
@@ -98,16 +98,17 @@ nsInProcessTabChildGlobal::DoSendAsyncMe
}
nsInProcessTabChildGlobal::nsInProcessTabChildGlobal(nsIDocShell* aShell,
nsIContent* aOwner,
nsFrameMessageManager* aChrome)
: mDocShell(aShell), mInitialized(false), mLoadingScript(false),
mOwner(aOwner), mChromeMessageManager(aChrome)
{
+ SetIsNotDOMBinding();
mozilla::HoldJSObjects(this);
// If owner corresponds to an <iframe mozbrowser> or <iframe mozapp>, we'll
// have to tweak our PreHandleEvent implementation.
nsCOMPtr<nsIMozBrowserFrame> browserFrame = do_QueryInterface(mOwner);
if (browserFrame) {
mIsBrowserOrAppFrame = browserFrame->GetReallyIsBrowserOrApp();
}
--- a/content/base/src/nsInProcessTabChildGlobal.h
+++ b/content/base/src/nsInProcessTabChildGlobal.h
@@ -149,16 +149,20 @@ public:
virtual JSObject* GetGlobalJSObject() MOZ_OVERRIDE {
if (!mGlobal) {
return nullptr;
}
return mGlobal->GetJSObject();
}
+ virtual JSObject* WrapObject(JSContext* cx) MOZ_OVERRIDE
+ {
+ MOZ_CRASH("nsInProcessTabChildGlobal doesn't use DOM bindings!");
+ }
protected:
virtual ~nsInProcessTabChildGlobal();
nsresult Init();
nsresult InitTabChildGlobal();
nsCOMPtr<nsIContentFrameMessageManager> mMessageManager;
nsCOMPtr<nsIDocShell> mDocShell;
bool mInitialized;
--- a/content/base/src/nsObjectLoadingContent.cpp
+++ b/content/base/src/nsObjectLoadingContent.cpp
@@ -3446,19 +3446,16 @@ nsObjectLoadingContent::LegacyCall(JSCon
Telemetry::Accumulate(Telemetry::PLUGIN_CALLED_DIRECTLY, true);
}
void
nsObjectLoadingContent::SetupProtoChain(JSContext* aCx,
JS::Handle<JSObject*> aObject)
{
- MOZ_ASSERT(nsCOMPtr<nsIContent>(do_QueryInterface(
- static_cast<nsIObjectLoadingContent*>(this)))->IsDOMBinding());
-
if (mType != eType_Plugin) {
return;
}
if (!nsContentUtils::IsSafeToRunScript()) {
nsRefPtr<SetupProtoChainRunner> runner = new SetupProtoChainRunner(this);
nsContentUtils::AddScriptRunner(runner);
return;
--- a/content/base/src/nsRange.h
+++ b/content/base/src/nsRange.h
@@ -52,17 +52,16 @@ public:
, mStartOffsetWasIncremented(false)
, mEndOffsetWasIncremented(false)
, mEnableGravitationOnElementRemoval(true)
#ifdef DEBUG
, mAssertNextInsertOrAppendIndex(-1)
, mAssertNextInsertOrAppendNode(nullptr)
#endif
{
- SetIsDOMBinding();
MOZ_ASSERT(aNode, "range isn't in a document!");
mOwner = aNode->OwnerDoc();
}
static nsresult CreateRange(nsIDOMNode* aStartParent, int32_t aStartOffset,
nsIDOMNode* aEndParent, int32_t aEndOffset,
nsRange** aRange);
static nsresult CreateRange(nsIDOMNode* aStartParent, int32_t aStartOffset,
--- a/content/base/src/nsXMLHttpRequest.cpp
+++ b/content/base/src/nsXMLHttpRequest.cpp
@@ -302,17 +302,16 @@ nsXMLHttpRequest::nsXMLHttpRequest()
mIsAnon(false),
mFirstStartRequestSeen(false),
mInLoadProgressEvent(false),
mResultJSON(JSVAL_VOID),
mResultArrayBuffer(nullptr),
mIsMappedArrayBuffer(false),
mXPCOMifier(nullptr)
{
- SetIsDOMBinding();
#ifdef DEBUG
StaticAssertions();
#endif
}
nsXMLHttpRequest::~nsXMLHttpRequest()
{
mState |= XML_HTTP_REQUEST_DELETED;
--- a/content/base/test/chrome/cpows_child.js
+++ b/content/base/test/chrome/cpows_child.js
@@ -110,16 +110,31 @@ function dom_test()
function xray_test()
{
let element = content.document.createElement("div");
element.wrappedJSObject.foo = "hello";
sendSyncMessage("cpows:xray_test", {}, {element: element});
}
+function symbol_test()
+{
+ let iterator = Symbol.iterator;
+ let named = Symbol.for("cpow-test");
+ // let unique = Symbol();
+
+ let object = {
+ [iterator]: iterator,
+ [named]: named,
+ // [unique]: unique,
+ // "unique": unique
+ };
+ sendSyncMessage("cpows:symbol_test", {}, object);
+}
+
// Parent->Child references should go X->parent.privilegedJunkScope->child.privilegedJunkScope->Y
// Child->Parent references should go X->child.privilegedJunkScope->parent.unprivilegedJunkScope->Y
function compartment_test()
{
// This test primarily checks various compartment invariants for CPOWs, and
// doesn't make sense to run in-process.
if (!is_remote) {
return;
--- a/content/base/test/chrome/cpows_parent.xul
+++ b/content/base/test/chrome/cpows_parent.xul
@@ -200,16 +200,23 @@
is(id, "it_works", "DOM element has expected ID");
}
function recvXrayTest(message) {
let element = message.objects.element;
is(element.foo, undefined, "DOM element does not expose content properties");
}
+ function recvSymbolTest(message) {
+ let object = message.objects;
+ is(object[Symbol.iterator], Symbol.iterator, "Should use Symbol.iterator");
+ is(Symbol.keyFor(object[Symbol.for("cpow-test")]), "cpow-test", "Symbols aren't registered correctly");
+ // is(object.unique, object[object.unique], "Unique symbols as ids and values don't seem to work");
+ }
+
let systemGlobal = this;
function recvCompartmentTest(message) {
let getUnprivilegedObject = message.objects.getUnprivilegedObject;
let testParentObject = message.objects.testParentObject;
// Make sure that parent->child CPOWs live in the parent's privileged junk scope.
let unprivilegedObject = getUnprivilegedObject();
is(Cu.getGlobalForObject(getUnprivilegedObject),
@@ -295,16 +302,17 @@
mm.addMessageListener("cpows:reenter_sync", recvReenterSyncMessage);
mm.addMessageListener("cpows:done", recvDoneMessage);
mm.addMessageListener("cpows:fail", recvFailMessage);
mm.addMessageListener("cpows:parent_test", recvParentTest);
mm.addMessageListener("cpows:error_reporting_test", recvErrorReportingTest);
mm.addMessageListener("cpows:dom_test", recvDomTest);
mm.addMessageListener("cpows:dom_test_after_gc", recvDomTestAfterGC);
mm.addMessageListener("cpows:xray_test", recvXrayTest);
+ mm.addMessageListener("cpows:symbol_test", recvSymbolTest);
mm.addMessageListener("cpows:compartment_test", recvCompartmentTest);
mm.addMessageListener("cpows:regexp_test", recvRegExpTest);
mm.addMessageListener("cpows:lifetime_test_1", recvLifetimeTest1);
mm.addMessageListener("cpows:lifetime_test_2", recvLifetimeTest2);
mm.loadFrameScript("chrome://mochitests/content/chrome/content/base/test/chrome/cpows_child.js", true);
}
function start() {
--- a/content/base/test/chrome/test_bug765993.html
+++ b/content/base/test/chrome/test_bug765993.html
@@ -41,17 +41,17 @@ window.onload = function () {
var dbg = new Debugger(iframe.contentWindow);
ok(dbg, "Should be able to create debugger");
var scripts = dbg.findScripts({
url: "http://mochi.test:8888/tests/content/base/test/chrome/nochrome_bug765993.js"
});
ok(scripts.length > 0, "Should be able to find script");
- is(scripts[0].sourceMapURL, "foo.js.map");
+ is(scripts[0].source.sourceMapURL, "foo.js.map");
SimpleTest.finish();
}
iframe.contentWindow.document.body.appendChild(script);
};
document.body.appendChild(iframe);
};
--- a/content/html/content/src/HTMLCanvasElement.cpp
+++ b/content/html/content/src/HTMLCanvasElement.cpp
@@ -59,17 +59,16 @@ NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(HTM
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(HTMLCanvasPrintState, Release)
HTMLCanvasPrintState::HTMLCanvasPrintState(HTMLCanvasElement* aCanvas,
nsICanvasRenderingContextInternal* aContext,
nsITimerCallback* aCallback)
: mIsDone(false), mPendingNotify(false), mCanvas(aCanvas),
mContext(aContext), mCallback(aCallback)
{
- SetIsDOMBinding();
}
HTMLCanvasPrintState::~HTMLCanvasPrintState()
{
}
/* virtual */ JSObject*
HTMLCanvasPrintState::WrapObject(JSContext* aCx)
--- a/content/html/content/src/HTMLContentElement.cpp
+++ b/content/html/content/src/HTMLContentElement.cpp
@@ -19,17 +19,16 @@
NS_IMPL_NS_NEW_HTML_ELEMENT(Content)
using namespace mozilla::dom;
HTMLContentElement::HTMLContentElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo)
: nsGenericHTMLElement(aNodeInfo), mValidSelector(true), mIsInsertionPoint(false)
{
- SetIsDOMBinding();
}
HTMLContentElement::~HTMLContentElement()
{
}
NS_IMPL_CYCLE_COLLECTION_INHERITED(HTMLContentElement,
nsGenericHTMLElement,
@@ -307,17 +306,16 @@ NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTING_ADDREF(DistributedContentList)
NS_IMPL_CYCLE_COLLECTING_RELEASE(DistributedContentList)
DistributedContentList::DistributedContentList(HTMLContentElement* aHostElement)
: mParent(aHostElement)
{
MOZ_COUNT_CTOR(DistributedContentList);
- SetIsDOMBinding();
if (aHostElement->IsInsertionPoint()) {
if (aHostElement->MatchedNodes().IsEmpty()) {
// Fallback content.
nsINode* contentNode = aHostElement;
for (nsIContent* content = contentNode->GetFirstChild();
content;
content = content->GetNextSibling()) {
--- a/content/html/content/src/HTMLFormControlsCollection.cpp
+++ b/content/html/content/src/HTMLFormControlsCollection.cpp
@@ -71,17 +71,16 @@ HTMLFormControlsCollection::ShouldBeInEl
HTMLFormControlsCollection::HTMLFormControlsCollection(HTMLFormElement* aForm)
: mForm(aForm)
// Initialize the elements list to have an initial capacity
// of 8 to reduce allocations on small forms.
, mElements(8)
, mNameLookupTable(HTMLFormElement::FORM_CONTROL_LIST_HASHTABLE_LENGTH)
{
- SetIsDOMBinding();
}
HTMLFormControlsCollection::~HTMLFormControlsCollection()
{
mForm = nullptr;
Clear();
}
--- a/content/html/content/src/HTMLFormElement.cpp
+++ b/content/html/content/src/HTMLFormElement.cpp
@@ -2062,24 +2062,25 @@ HTMLFormElement::GetNextRadioButton(cons
if (--index < 0) {
index = numRadios -1;
}
}
else if (++index >= (int32_t)numRadios) {
index = 0;
}
radio = HTMLInputElement::FromContentOrNull(radioGroup->Item(index));
- if (!radio)
+ isRadio = radio && radio->GetType() == NS_FORM_INPUT_RADIO;
+ if (!isRadio) {
continue;
+ }
- isRadio = radio->GetType() == NS_FORM_INPUT_RADIO;
- if (!isRadio)
- continue;
-
- } while ((radio->Disabled() && radio != currentRadio) || !isRadio);
+ nsAutoString name;
+ radio->GetName(name);
+ isRadio = aName.Equals(name);
+ } while (!isRadio || (radio->Disabled() && radio != currentRadio));
NS_IF_ADDREF(*aRadioOut = radio);
return NS_OK;
}
NS_IMETHODIMP
HTMLFormElement::WalkRadioGroup(const nsAString& aName,
nsIRadioVisitor* aVisitor,
--- a/content/html/content/src/HTMLOptionsCollection.cpp
+++ b/content/html/content/src/HTMLOptionsCollection.cpp
@@ -30,18 +30,16 @@
#include "nsStyleConsts.h"
#include "jsfriendapi.h"
namespace mozilla {
namespace dom {
HTMLOptionsCollection::HTMLOptionsCollection(HTMLSelectElement* aSelect)
{
- SetIsDOMBinding();
-
// Do not maintain a reference counted reference. When
// the select goes away, it will let us know.
mSelect = aSelect;
}
HTMLOptionsCollection::~HTMLOptionsCollection()
{
DropReference();
--- a/content/html/content/src/HTMLPropertiesCollection.cpp
+++ b/content/html/content/src/HTMLPropertiesCollection.cpp
@@ -41,17 +41,16 @@ NS_IMPL_CYCLE_COLLECTION_TRACE_BEGIN(HTM
NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER
NS_IMPL_CYCLE_COLLECTION_TRACE_END
HTMLPropertiesCollection::HTMLPropertiesCollection(nsGenericHTMLElement* aRoot)
: mRoot(aRoot)
, mDoc(aRoot->GetUncomposedDoc())
, mIsDirty(true)
{
- SetIsDOMBinding();
mNames = new PropertyStringList(this);
if (mDoc) {
mDoc->AddMutationObserver(this);
}
}
HTMLPropertiesCollection::~HTMLPropertiesCollection()
{
@@ -306,17 +305,16 @@ HTMLPropertiesCollection::GetSupportedNa
PropertyNodeList::PropertyNodeList(HTMLPropertiesCollection* aCollection,
nsIContent* aParent, const nsAString& aName)
: mName(aName),
mDoc(aParent->GetUncomposedDoc()),
mCollection(aCollection),
mParent(aParent),
mIsDirty(true)
{
- SetIsDOMBinding();
if (mDoc) {
mDoc->AddMutationObserver(this);
}
}
PropertyNodeList::~PropertyNodeList()
{
if (mDoc) {
--- a/content/html/content/src/HTMLShadowElement.cpp
+++ b/content/html/content/src/HTMLShadowElement.cpp
@@ -12,17 +12,16 @@
NS_IMPL_NS_NEW_HTML_ELEMENT(Shadow)
using namespace mozilla::dom;
HTMLShadowElement::HTMLShadowElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo)
: nsGenericHTMLElement(aNodeInfo), mIsInsertionPoint(false)
{
- SetIsDOMBinding();
}
HTMLShadowElement::~HTMLShadowElement()
{
if (mProjectedShadow) {
mProjectedShadow->RemoveMutationObserver(this);
}
}
--- a/content/html/content/src/HTMLTableElement.cpp
+++ b/content/html/content/src/HTMLTableElement.cpp
@@ -68,17 +68,16 @@ protected:
TableRowsCollection::TableRowsCollection(HTMLTableElement *aParent)
: mParent(aParent)
, mOrphanRows(new nsContentList(mParent,
kNameSpaceID_XHTML,
nsGkAtoms::tr,
nsGkAtoms::tr,
false))
{
- SetIsDOMBinding();
}
TableRowsCollection::~TableRowsCollection()
{
// we do NOT have a ref-counted reference to mParent, so do NOT
// release it! this is to avoid circular references. The
// instantiator who provided mParent is responsible for managing our
// reference for us.
--- a/content/html/content/src/MediaError.cpp
+++ b/content/html/content/src/MediaError.cpp
@@ -20,17 +20,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_INTERFACE_MAP_ENTRY(nsIDOMMediaError)
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMMediaError)
NS_INTERFACE_MAP_END
MediaError::MediaError(HTMLMediaElement* aParent, uint16_t aCode)
: mParent(aParent)
, mCode(aCode)
{
- SetIsDOMBinding();
}
NS_IMETHODIMP MediaError::GetCode(uint16_t* aCode)
{
if (aCode)
*aCode = Code();
return NS_OK;
--- a/content/html/content/src/UndoManager.cpp
+++ b/content/html/content/src/UndoManager.cpp
@@ -836,17 +836,16 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(UndoMan
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(UndoManager)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
UndoManager::UndoManager(nsIContent* aNode)
: mHostNode(aNode), mInTransaction(false), mIsDisconnected(false)
{
- SetIsDOMBinding();
mTxnManager = new nsTransactionManager();
}
UndoManager::~UndoManager() {}
void
UndoManager::Transact(JSContext* aCx, DOMTransaction& aTransaction,
bool aMerge, ErrorResult& aRv)
--- a/content/html/content/src/ValidityState.cpp
+++ b/content/html/content/src/ValidityState.cpp
@@ -19,17 +19,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsIDOMValidityState)
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
ValidityState::ValidityState(nsIConstraintValidation* aConstraintValidation)
: mConstraintValidation(aConstraintValidation)
{
- SetIsDOMBinding();
}
NS_IMETHODIMP
ValidityState::GetValueMissing(bool* aValueMissing)
{
*aValueMissing = ValueMissing();
return NS_OK;
}
--- a/content/html/content/src/nsDOMStringMap.cpp
+++ b/content/html/content/src/nsDOMStringMap.cpp
@@ -50,18 +50,16 @@ NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTING_ADDREF(nsDOMStringMap)
NS_IMPL_CYCLE_COLLECTING_RELEASE(nsDOMStringMap)
nsDOMStringMap::nsDOMStringMap(nsGenericHTMLElement* aElement)
: mElement(aElement),
mRemovingProp(false)
{
- SetIsDOMBinding();
-
mElement->AddMutationObserver(this);
}
nsDOMStringMap::~nsDOMStringMap()
{
// Check if element still exists, may have been unlinked by cycle collector.
if (mElement) {
// Call back to element to null out weak reference to this object.
--- a/content/html/content/src/nsHTMLDNSPrefetch.cpp
+++ b/content/html/content/src/nsHTMLDNSPrefetch.cpp
@@ -89,16 +89,20 @@ nsHTMLDNSPrefetch::Shutdown()
NS_IF_RELEASE(sDNSListener);
return NS_OK;
}
bool
nsHTMLDNSPrefetch::IsAllowed (nsIDocument *aDocument)
{
+ if (NS_IsAppOffline(aDocument->NodePrincipal())) {
+ return false;
+ }
+
// There is no need to do prefetch on non UI scenarios such as XMLHttpRequest.
return aDocument->IsDNSPrefetchAllowed() && aDocument->GetWindow();
}
nsresult
nsHTMLDNSPrefetch::Prefetch(Link *aElement, uint16_t flags)
{
if (!(sInitialized && sPrefetches && sDNSService && sDNSListener))
--- a/content/html/content/test/forms/test_input_radio_radiogroup.html
+++ b/content/html/content/test/forms/test_input_radio_radiogroup.html
@@ -9,35 +9,62 @@ https://bugzilla.mozilla.org/show_bug.cg
<script type="text/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
<script type="text/javascript" src="/tests/SimpleTest/EventUtils.js"></script>
<link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css" />
</head>
<body>
<a target="_blank" href="https://bugzilla.mozilla.org/show_bug.cgi?id=343444">Mozilla Bug 343444</a>
<p id="display"></p>
<form>
- <input type="radio" name="testradio" id="start"></input>
- <input type="text" name="testradio"></input>
- <input type="text" name="testradio"></input>
- <input type="radio" name="testradio"></input>
- <input type="text" name="testradio"></input>
- <input type="radio" name="testradio"></input>
- <input type="text" name="testradio"></input>
- <input type="radio" name="testradio"></input>
- <input type="radio" name="testradio"></input>
- <input type="text" name="testradio"></input>
+ <fieldset id="testradio">
+ <input type="radio" name="testradio" id="start"></input>
+ <input type="text" name="testradio"></input>
+ <input type="text" name="testradio"></input>
+ <input type="radio" name="testradio"></input>
+ <input type="text" name="testradio"></input>
+ <input type="radio" name="testradio"></input>
+ <input type="text" name="testradio"></input>
+ <input type="radio" name="testradio"></input>
+ <input type="radio" name="testradio"></input>
+ <input type="text" name="testradio"></input>
+ </fieldset>
+
+ <fieldset>
+ <input type="radio" name="testtwo" id="start2"></input>
+ <input type="radio" name="testtwo"></input>
+ <input type="radio" name="error" id="testtwo"></input>
+ <input type="radio" name="testtwo" id="end"></input>
+ </fieldset>
+
+ <fieldset>
+ <input type="radio" name="testthree" id="start3"></input>
+ <input type="radio" name="errorthree" id="testthree"></input>
+ </fieldset>
</form>
<script class="testbody" type="text/javascript">
/** Test for Bug 343444 **/
document.getElementById("start").focus();
var count=0;
while (count < 2) {
sendKey("DOWN");
- ok(document.activeElement.type == "radio", "radioGroup should ignore non-radio input fields");
+ is(document.activeElement.type, "radio", "radioGroup should ignore non-radio input fields");
if (document.activeElement.id == "start") {
count++;
}
}
+
+document.getElementById("start2").focus();
+count = 0;
+while (count < 3) {
+ is(document.activeElement.name, "testtwo",
+ "radioGroup should only contain elements with the same @name")
+ sendKey("DOWN");
+ count++;
+}
+
+document.getElementById("start3").focus();
+sendKey("DOWN");
+is(document.activeElement.name, "testthree", "we don't have an infinite-loop");
</script>
</pre>
</body>
</html>
--- a/content/html/document/src/HTMLAllCollection.cpp
+++ b/content/html/document/src/HTMLAllCollection.cpp
@@ -13,17 +13,16 @@
namespace mozilla {
namespace dom {
HTMLAllCollection::HTMLAllCollection(nsHTMLDocument* aDocument)
: mDocument(aDocument)
{
MOZ_ASSERT(mDocument);
- SetIsDOMBinding();
}
HTMLAllCollection::~HTMLAllCollection()
{
}
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(HTMLAllCollection,
mDocument,
--- a/content/media/DOMMediaStream.cpp
+++ b/content/media/DOMMediaStream.cpp
@@ -122,17 +122,16 @@ private:
DOMMediaStream* mStream;
};
DOMMediaStream::DOMMediaStream()
: mLogicalStreamStartTime(0),
mStream(nullptr), mHintContents(0), mTrackTypesAvailable(0),
mNotifiedOfMediaStreamGraphShutdown(false)
{
- SetIsDOMBinding();
}
DOMMediaStream::~DOMMediaStream()
{
Destroy();
}
void
--- a/content/media/MediaStreamTrack.cpp
+++ b/content/media/MediaStreamTrack.cpp
@@ -10,18 +10,16 @@
#include "nsServiceManagerUtils.h"
namespace mozilla {
namespace dom {
MediaStreamTrack::MediaStreamTrack(DOMMediaStream* aStream, TrackID aTrackID)
: mStream(aStream), mTrackID(aTrackID), mEnded(false), mEnabled(true)
{
- SetIsDOMBinding();
-
memset(&mID, 0, sizeof(mID));
nsresult rv;
nsCOMPtr<nsIUUIDGenerator> uuidgen =
do_GetService("@mozilla.org/uuid-generator;1", &rv);
if (uuidgen) {
uuidgen->GenerateUUIDInPlace(&mID);
}
--- a/content/media/MediaTrack.cpp
+++ b/content/media/MediaTrack.cpp
@@ -38,13 +38,12 @@ MediaTrack::SetTrackList(MediaTrackList*
{
mList = aList;
}
void
MediaTrack::Init(nsPIDOMWindow* aOwnerWindow)
{
BindToOwner(aOwnerWindow);
- SetIsDOMBinding();
}
} // namespace dom
} // namespace mozilla
--- a/content/media/TextTrackCueList.cpp
+++ b/content/media/TextTrackCueList.cpp
@@ -30,17 +30,16 @@ NS_IMPL_CYCLE_COLLECTING_ADDREF(TextTrac
NS_IMPL_CYCLE_COLLECTING_RELEASE(TextTrackCueList)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(TextTrackCueList)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
TextTrackCueList::TextTrackCueList(nsISupports* aParent) : mParent(aParent)
{
- SetIsDOMBinding();
}
TextTrackCueList::~TextTrackCueList()
{}
JSObject*
TextTrackCueList::WrapObject(JSContext* aCx)
{
--- a/content/media/TextTrackRegion.cpp
+++ b/content/media/TextTrackRegion.cpp
@@ -41,17 +41,16 @@ TextTrackRegion::TextTrackRegion(nsISupp
: mParent(aGlobal)
, mWidth(100)
, mLines(3)
, mRegionAnchorX(0)
, mRegionAnchorY(100)
, mViewportAnchorX(0)
, mViewportAnchorY(100)
{
- SetIsDOMBinding();
}
void
TextTrackRegion::CopyValues(TextTrackRegion& aRegion)
{
mWidth = aRegion.Width();
mLines = aRegion.Lines();
mRegionAnchorX = aRegion.RegionAnchorX();
--- a/content/media/VideoPlaybackQuality.cpp
+++ b/content/media/VideoPlaybackQuality.cpp
@@ -20,17 +20,16 @@ VideoPlaybackQuality::VideoPlaybackQuali
uint64_t aDroppedFrames,
uint64_t aCorruptedFrames)
: mElement(aElement)
, mCreationTime(aCreationTime)
, mTotalFrames(aTotalFrames)
, mDroppedFrames(aDroppedFrames)
, mCorruptedFrames(aCorruptedFrames)
{
- SetIsDOMBinding();
}
HTMLMediaElement*
VideoPlaybackQuality::GetParentObject() const
{
return mElement;
}
--- a/content/media/eme/MediaKeyError.cpp
+++ b/content/media/eme/MediaKeyError.cpp
@@ -10,17 +10,16 @@
namespace mozilla {
namespace dom {
MediaKeyError::MediaKeyError(EventTarget* aOwner, uint32_t aSystemCode)
: Event(aOwner, nullptr, nullptr)
, mSystemCode(aSystemCode)
{
- SetIsDOMBinding();
InitEvent(NS_LITERAL_STRING("error"), false, false);
}
MediaKeyError::~MediaKeyError()
{
}
uint32_t
--- a/content/media/eme/MediaKeys.cpp
+++ b/content/media/eme/MediaKeys.cpp
@@ -36,17 +36,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
MediaKeys::MediaKeys(nsPIDOMWindow* aParent, const nsAString& aKeySystem)
: mParent(aParent)
, mKeySystem(aKeySystem)
, mCreatePromiseId(0)
{
- SetIsDOMBinding();
}
static PLDHashOperator
RejectPromises(const uint32_t& aKey,
nsRefPtr<dom::Promise>& aPromise,
void* aClosure)
{
aPromise->MaybeReject(NS_ERROR_DOM_INVALID_STATE_ERR);
--- a/content/media/webaudio/AudioBuffer.cpp
+++ b/content/media/webaudio/AudioBuffer.cpp
@@ -43,17 +43,16 @@ NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(A
AudioBuffer::AudioBuffer(AudioContext* aContext, uint32_t aNumberOfChannels,
uint32_t aLength, float aSampleRate)
: mContext(aContext),
mLength(aLength),
mSampleRate(aSampleRate)
{
mJSChannels.SetCapacity(aNumberOfChannels);
- SetIsDOMBinding();
mozilla::HoldJSObjects(this);
}
AudioBuffer::~AudioBuffer()
{
ClearJSChannels();
}
--- a/content/media/webaudio/AudioListener.cpp
+++ b/content/media/webaudio/AudioListener.cpp
@@ -21,17 +21,16 @@ AudioListener::AudioListener(AudioContex
, mPosition()
, mFrontVector(0., 0., -1.)
, mRightVector(1., 0., 0.)
, mVelocity()
, mDopplerFactor(1.)
, mSpeedOfSound(343.3) // meters/second
{
MOZ_ASSERT(aContext);
- SetIsDOMBinding();
}
JSObject*
AudioListener::WrapObject(JSContext* aCx)
{
return AudioListenerBinding::Wrap(aCx, this);
}
--- a/content/media/webaudio/AudioNode.cpp
+++ b/content/media/webaudio/AudioNode.cpp
@@ -67,17 +67,16 @@ AudioNode::AudioNode(AudioContext* aCont
, mId(gId++)
, mPassThrough(false)
#ifdef DEBUG
, mDemiseNotified(false)
#endif
{
MOZ_ASSERT(aContext);
DOMEventTargetHelper::BindToOwner(aContext->GetParentObject());
- SetIsDOMBinding();
aContext->UpdateNodeCount(1);
}
AudioNode::~AudioNode()
{
MOZ_ASSERT(mInputNodes.IsEmpty());
MOZ_ASSERT(mOutputNodes.IsEmpty());
MOZ_ASSERT(mOutputParams.IsEmpty());
--- a/content/media/webaudio/AudioParam.cpp
+++ b/content/media/webaudio/AudioParam.cpp
@@ -46,17 +46,16 @@ NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(A
AudioParam::AudioParam(AudioNode* aNode,
AudioParam::CallbackType aCallback,
float aDefaultValue)
: AudioParamTimeline(aDefaultValue)
, mNode(aNode)
, mCallback(aCallback)
, mDefaultValue(aDefaultValue)
{
- SetIsDOMBinding();
}
AudioParam::~AudioParam()
{
MOZ_ASSERT(mInputNodes.IsEmpty());
}
JSObject*
--- a/content/media/webaudio/AudioProcessingEvent.cpp
+++ b/content/media/webaudio/AudioProcessingEvent.cpp
@@ -23,17 +23,16 @@ NS_IMPL_RELEASE_INHERITED(AudioProcessin
AudioProcessingEvent::AudioProcessingEvent(ScriptProcessorNode* aOwner,
nsPresContext* aPresContext,
WidgetEvent* aEvent)
: Event(aOwner, aPresContext, aEvent)
, mPlaybackTime(0.0)
, mNode(aOwner)
{
- SetIsDOMBinding();
}
AudioProcessingEvent::~AudioProcessingEvent()
{
}
JSObject*
AudioProcessingEvent::WrapObject(JSContext* aCx)
--- a/content/media/webaudio/OfflineAudioCompletionEvent.cpp
+++ b/content/media/webaudio/OfflineAudioCompletionEvent.cpp
@@ -20,17 +20,16 @@ NS_INTERFACE_MAP_END_INHERITING(Event)
NS_IMPL_ADDREF_INHERITED(OfflineAudioCompletionEvent, Event)
NS_IMPL_RELEASE_INHERITED(OfflineAudioCompletionEvent, Event)
OfflineAudioCompletionEvent::OfflineAudioCompletionEvent(AudioContext* aOwner,
nsPresContext* aPresContext,
WidgetEvent* aEvent)
: Event(aOwner, aPresContext, aEvent)
{
- SetIsDOMBinding();
}
OfflineAudioCompletionEvent::~OfflineAudioCompletionEvent()
{
}
JSObject*
OfflineAudioCompletionEvent::WrapObject(JSContext* aCx)
--- a/content/media/webaudio/PeriodicWave.cpp
+++ b/content/media/webaudio/PeriodicWave.cpp
@@ -19,17 +19,16 @@ NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(P
PeriodicWave::PeriodicWave(AudioContext* aContext,
const float* aRealData,
const float* aImagData,
const uint32_t aLength,
ErrorResult& aRv)
: mContext(aContext)
{
MOZ_ASSERT(aContext);
- SetIsDOMBinding();
// Caller should have checked this and thrown.
MOZ_ASSERT(aLength > 0);
MOZ_ASSERT(aLength <= 4096);
mLength = aLength;
// Copy coefficient data. The two arrays share an allocation.
mCoefficients = new ThreadSharedFloatArrayBufferList(2);
--- a/content/media/webspeech/recognition/SpeechGrammar.cpp
+++ b/content/media/webspeech/recognition/SpeechGrammar.cpp
@@ -18,17 +18,16 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(SpeechG
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(SpeechGrammar)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
SpeechGrammar::SpeechGrammar(nsISupports* aParent)
: mParent(aParent)
{
- SetIsDOMBinding();
}
SpeechGrammar::~SpeechGrammar()
{
}
already_AddRefed<SpeechGrammar>
SpeechGrammar::Constructor(const GlobalObject& aGlobal,
--- a/content/media/webspeech/recognition/SpeechGrammarList.cpp
+++ b/content/media/webspeech/recognition/SpeechGrammarList.cpp
@@ -22,17 +22,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
SpeechGrammarList::SpeechGrammarList(nsISupports* aParent, nsISpeechRecognitionService* aRecognitionService)
: mParent(aParent)
{
this->mRecognitionService = aRecognitionService;
- SetIsDOMBinding();
}
SpeechGrammarList::~SpeechGrammarList()
{
}
already_AddRefed<SpeechGrammarList>
SpeechGrammarList::Constructor(const GlobalObject& aGlobal,
--- a/content/media/webspeech/recognition/SpeechRecognitionAlternative.cpp
+++ b/content/media/webspeech/recognition/SpeechRecognitionAlternative.cpp
@@ -21,17 +21,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
SpeechRecognitionAlternative::SpeechRecognitionAlternative(SpeechRecognition* aParent)
: mTranscript(NS_LITERAL_STRING(""))
, mConfidence(0)
, mParent(aParent)
{
- SetIsDOMBinding();
}
SpeechRecognitionAlternative::~SpeechRecognitionAlternative()
{
}
JSObject*
SpeechRecognitionAlternative::WrapObject(JSContext* aCx)
--- a/content/media/webspeech/recognition/SpeechRecognitionResult.cpp
+++ b/content/media/webspeech/recognition/SpeechRecognitionResult.cpp
@@ -18,17 +18,16 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(SpeechR
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(SpeechRecognitionResult)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
SpeechRecognitionResult::SpeechRecognitionResult(SpeechRecognition* aParent)
: mParent(aParent)
{
- SetIsDOMBinding();
}
SpeechRecognitionResult::~SpeechRecognitionResult()
{
}
JSObject*
SpeechRecognitionResult::WrapObject(JSContext* aCx)
--- a/content/media/webspeech/recognition/SpeechRecognitionResultList.cpp
+++ b/content/media/webspeech/recognition/SpeechRecognitionResultList.cpp
@@ -19,17 +19,16 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(SpeechR
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(SpeechRecognitionResultList)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
SpeechRecognitionResultList::SpeechRecognitionResultList(SpeechRecognition* aParent)
: mParent(aParent)
{
- SetIsDOMBinding();
}
SpeechRecognitionResultList::~SpeechRecognitionResultList()
{
}
nsISupports*
SpeechRecognitionResultList::GetParentObject() const
--- a/content/media/webspeech/synth/SpeechSynthesis.cpp
+++ b/content/media/webspeech/synth/SpeechSynthesis.cpp
@@ -72,17 +72,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTING_ADDREF(SpeechSynthesis)
NS_IMPL_CYCLE_COLLECTING_RELEASE(SpeechSynthesis)
SpeechSynthesis::SpeechSynthesis(nsPIDOMWindow* aParent)
: mParent(aParent)
{
- SetIsDOMBinding();
}
SpeechSynthesis::~SpeechSynthesis()
{
}
JSObject*
SpeechSynthesis::WrapObject(JSContext* aCx)
--- a/content/media/webspeech/synth/SpeechSynthesisUtterance.cpp
+++ b/content/media/webspeech/synth/SpeechSynthesisUtterance.cpp
@@ -30,17 +30,16 @@ SpeechSynthesisUtterance::SpeechSynthesi
: DOMEventTargetHelper(aOwnerWindow)
, mText(text)
, mVolume(1)
, mRate(1)
, mPitch(1)
, mState(STATE_NONE)
, mPaused(false)
{
- SetIsDOMBinding();
}
SpeechSynthesisUtterance::~SpeechSynthesisUtterance() {}
JSObject*
SpeechSynthesisUtterance::WrapObject(JSContext* aCx)
{
return SpeechSynthesisUtteranceBinding::Wrap(aCx, this);
--- a/content/media/webspeech/synth/SpeechSynthesisVoice.cpp
+++ b/content/media/webspeech/synth/SpeechSynthesisVoice.cpp
@@ -19,17 +19,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
SpeechSynthesisVoice::SpeechSynthesisVoice(nsISupports* aParent,
const nsAString& aUri)
: mParent(aParent)
, mUri(aUri)
{
- SetIsDOMBinding();
}
SpeechSynthesisVoice::~SpeechSynthesisVoice()
{
}
JSObject*
SpeechSynthesisVoice::WrapObject(JSContext* aCx)
--- a/content/svg/content/src/DOMSVGAnimatedLengthList.h
+++ b/content/svg/content/src/DOMSVGAnimatedLengthList.h
@@ -172,17 +172,16 @@ private:
*/
DOMSVGAnimatedLengthList(nsSVGElement *aElement, uint8_t aAttrEnum, uint8_t aAxis)
: mBaseVal(nullptr)
, mAnimVal(nullptr)
, mElement(aElement)
, mAttrEnum(aAttrEnum)
, mAxis(aAxis)
{
- SetIsDOMBinding();
}
~DOMSVGAnimatedLengthList();
/// Get a reference to this DOM wrapper object's internal counterpart.
SVGAnimatedLengthList& InternalAList();
const SVGAnimatedLengthList& InternalAList() const;
--- a/content/svg/content/src/DOMSVGAnimatedNumberList.h
+++ b/content/svg/content/src/DOMSVGAnimatedNumberList.h
@@ -102,17 +102,16 @@ private:
* type.
*/
DOMSVGAnimatedNumberList(nsSVGElement *aElement, uint8_t aAttrEnum)
: mBaseVal(nullptr)
, mAnimVal(nullptr)
, mElement(aElement)
, mAttrEnum(aAttrEnum)
{
- SetIsDOMBinding();
}
~DOMSVGAnimatedNumberList();
/// Get a reference to this DOM wrapper object's internal counterpart.
SVGAnimatedNumberList& InternalAList();
const SVGAnimatedNumberList& InternalAList() const;
--- a/content/svg/content/src/DOMSVGLength.cpp
+++ b/content/svg/content/src/DOMSVGLength.cpp
@@ -107,44 +107,40 @@ DOMSVGLength::DOMSVGLength(DOMSVGLengthL
, mVal(nullptr)
{
// These shifts are in sync with the members in the header.
NS_ABORT_IF_FALSE(aList &&
aAttrEnum < (1 << 4) &&
aListIndex <= MaxListIndex(), "bad arg");
NS_ABORT_IF_FALSE(IndexIsValid(), "Bad index for DOMSVGNumber!");
-
- SetIsDOMBinding();
}
DOMSVGLength::DOMSVGLength()
: mList(nullptr)
, mListIndex(0)
, mAttrEnum(0)
, mIsAnimValItem(false)
, mUnit(nsIDOMSVGLength::SVG_LENGTHTYPE_NUMBER)
, mValue(0.0f)
, mVal(nullptr)
{
- SetIsDOMBinding();
}
DOMSVGLength::DOMSVGLength(nsSVGLength2* aVal, nsSVGElement* aSVGElement,
bool aAnimVal)
: mList(nullptr)
, mListIndex(0)
, mAttrEnum(0)
, mIsAnimValItem(aAnimVal)
, mUnit(nsIDOMSVGLength::SVG_LENGTHTYPE_NUMBER)
, mValue(0.0f)
, mVal(aVal)
, mSVGElement(aSVGElement)
{
- SetIsDOMBinding();
}
DOMSVGLength::~DOMSVGLength()
{
// Our mList's weak ref to us must be nulled out when we die. If GC has
// unlinked us using the cycle collector code, then that has already
// happened, and mList is null.
if (mList) {
--- a/content/svg/content/src/DOMSVGLengthList.h
+++ b/content/svg/content/src/DOMSVGLengthList.h
@@ -56,18 +56,16 @@ class DOMSVGLengthList MOZ_FINAL : publi
public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(DOMSVGLengthList)
DOMSVGLengthList(DOMSVGAnimatedLengthList *aAList,
const SVGLengthList &aInternalList)
: mAList(aAList)
{
- SetIsDOMBinding();
-
// aInternalList must be passed in explicitly because we can't use
// InternalList() here. (Because it depends on IsAnimValList, which depends
// on this object having been assigned to aAList's mBaseVal or mAnimVal,
// which hasn't happend yet.)
InternalListLengthWillChange(aInternalList.Length()); // Sync mItems
}
--- a/content/svg/content/src/DOMSVGNumber.cpp
+++ b/content/svg/content/src/DOMSVGNumber.cpp
@@ -93,29 +93,26 @@ DOMSVGNumber::DOMSVGNumber(DOMSVGNumberL
, mValue(0.0f)
{
// These shifts are in sync with the members in the header.
NS_ABORT_IF_FALSE(aList &&
aAttrEnum < (1 << 4) &&
aListIndex <= MaxListIndex(), "bad arg");
NS_ABORT_IF_FALSE(IndexIsValid(), "Bad index for DOMSVGNumber!");
-
- SetIsDOMBinding();
}
DOMSVGNumber::DOMSVGNumber(nsISupports* aParent)
: mList(nullptr)
, mParent(aParent)
, mListIndex(0)
, mAttrEnum(0)
, mIsAnimValItem(false)
, mValue(0.0f)
{
- SetIsDOMBinding();
}
/* static */ already_AddRefed<DOMSVGNumber>
DOMSVGNumber::Constructor(const dom::GlobalObject& aGlobal, ErrorResult& aRv)
{
nsCOMPtr<nsPIDOMWindow> window = do_QueryInterface(aGlobal.GetAsSupports());
if (!window) {
aRv.Throw(NS_ERROR_UNEXPECTED);
--- a/content/svg/content/src/DOMSVGNumberList.h
+++ b/content/svg/content/src/DOMSVGNumberList.h
@@ -56,18 +56,16 @@ class DOMSVGNumberList MOZ_FINAL : publi
public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(DOMSVGNumberList)
DOMSVGNumberList(DOMSVGAnimatedNumberList *aAList,
const SVGNumberList &aInternalList)
: mAList(aAList)
{
- SetIsDOMBinding();
-
// aInternalList must be passed in explicitly because we can't use
// InternalList() here. (Because it depends on IsAnimValList, which depends
// on this object having been assigned to aAList's mBaseVal or mAnimVal,
// which hasn't happend yet.)
InternalListLengthWillChange(aInternalList.Length()); // Sync mItems
}
--- a/content/svg/content/src/DOMSVGPathSeg.cpp
+++ b/content/svg/content/src/DOMSVGPathSeg.cpp
@@ -74,30 +74,28 @@ private:
DOMSVGPathSeg::DOMSVGPathSeg(DOMSVGPathSegList *aList,
uint32_t aListIndex,
bool aIsAnimValItem)
: mList(aList)
, mListIndex(aListIndex)
, mIsAnimValItem(aIsAnimValItem)
{
- SetIsDOMBinding();
// These shifts are in sync with the members in the header.
NS_ABORT_IF_FALSE(aList &&
aListIndex <= MaxListIndex(), "bad arg");
NS_ABORT_IF_FALSE(IndexIsValid(), "Bad index for DOMSVGPathSeg!");
}
DOMSVGPathSeg::DOMSVGPathSeg()
: mList(nullptr)
, mListIndex(0)
, mIsAnimValItem(false)
{
- SetIsDOMBinding();
}
void
DOMSVGPathSeg::InsertingIntoList(DOMSVGPathSegList *aList,
uint32_t aListIndex,
bool aIsAnimValItem)
{
NS_ABORT_IF_FALSE(!HasOwner(), "Inserting item that is already in a list");
--- a/content/svg/content/src/DOMSVGPathSegList.h
+++ b/content/svg/content/src/DOMSVGPathSegList.h
@@ -165,18 +165,16 @@ private:
/**
* Only our static GetDOMWrapper() factory method may create objects of our
* type.
*/
DOMSVGPathSegList(nsSVGElement *aElement, bool aIsAnimValList)
: mElement(aElement)
, mIsAnimValList(aIsAnimValList)
{
- SetIsDOMBinding();
-
InternalListWillChangeTo(InternalList()); // Sync mItems
}
~DOMSVGPathSegList();
nsSVGElement* Element() const {
return mElement.get();
}
--- a/content/svg/content/src/DOMSVGPointList.h
+++ b/content/svg/content/src/DOMSVGPointList.h
@@ -167,18 +167,16 @@ private:
/**
* Only our static GetDOMWrapper() factory method may create objects of our
* type.
*/
DOMSVGPointList(nsSVGElement *aElement, bool aIsAnimValList)
: mElement(aElement)
, mIsAnimValList(aIsAnimValList)
{
- SetIsDOMBinding();
-
InternalListWillChangeTo(InternalList()); // Sync mItems
}
~DOMSVGPointList();
nsSVGElement* Element() const {
return mElement.get();
}
--- a/content/svg/content/src/DOMSVGStringList.h
+++ b/content/svg/content/src/DOMSVGStringList.h
@@ -95,17 +95,16 @@ private:
* type.
*/
DOMSVGStringList(nsSVGElement *aElement,
bool aIsConditionalProcessingAttribute, uint8_t aAttrEnum)
: mElement(aElement)
, mAttrEnum(aAttrEnum)
, mIsConditionalProcessingAttribute(aIsConditionalProcessingAttribute)
{
- SetIsDOMBinding();
}
~DOMSVGStringList();
SVGStringList &InternalList() const;
// Strong ref to our element to keep it alive.
nsRefPtr<nsSVGElement> mElement;
--- a/content/svg/content/src/DOMSVGTransformList.h
+++ b/content/svg/content/src/DOMSVGTransformList.h
@@ -51,18 +51,16 @@ class DOMSVGTransformList MOZ_FINAL : pu
public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(DOMSVGTransformList)
DOMSVGTransformList(dom::SVGAnimatedTransformList *aAList,
const SVGTransformList &aInternalList)
: mAList(aAList)
{
- SetIsDOMBinding();
-
// aInternalList must be passed in explicitly because we can't use
// InternalList() here. (Because it depends on IsAnimValList, which depends
// on this object having been assigned to aAList's mBaseVal or mAnimVal,
// which hasn't happend yet.)
InternalListLengthWillChange(aInternalList.Length()); // Sync mItems
}
--- a/content/svg/content/src/SVGAngle.h
+++ b/content/svg/content/src/SVGAngle.h
@@ -25,17 +25,16 @@ public:
} AngleType;
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(SVGAngle)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(SVGAngle)
SVGAngle(nsSVGAngle* aVal, nsSVGElement *aSVGElement, AngleType aType)
: mVal(aVal), mSVGElement(aSVGElement), mType(aType)
{
- SetIsDOMBinding();
}
// WebIDL
nsSVGElement* GetParentObject() { return mSVGElement; }
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
uint16_t UnitType() const;
float Value() const;
void GetValueAsString(nsAString& aValue);
--- a/content/svg/content/src/SVGAnimatedAngle.h
+++ b/content/svg/content/src/SVGAnimatedAngle.h
@@ -21,17 +21,16 @@ class SVGAnimatedAngle MOZ_FINAL : publi
{
public:
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(SVGAnimatedAngle)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(SVGAnimatedAngle)
SVGAnimatedAngle(nsSVGAngle* aVal, nsSVGElement *aSVGElement)
: mVal(aVal), mSVGElement(aSVGElement)
{
- SetIsDOMBinding();
}
// WebIDL
nsSVGElement* GetParentObject() { return mSVGElement; }
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
already_AddRefed<SVGAngle> BaseVal();
already_AddRefed<SVGAngle> AnimVal();
--- a/content/svg/content/src/SVGAnimatedBoolean.h
+++ b/content/svg/content/src/SVGAnimatedBoolean.h
@@ -17,17 +17,16 @@ namespace dom {
class SVGAnimatedBoolean MOZ_FINAL : public nsWrapperCache
{
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(SVGAnimatedBoolean)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(SVGAnimatedBoolean)
SVGAnimatedBoolean(nsSVGBoolean* aVal, nsSVGElement *aSVGElement)
: mVal(aVal), mSVGElement(aSVGElement)
{
- SetIsDOMBinding();
}
// WebIDL
nsSVGElement* GetParentObject() const { return mSVGElement; }
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
bool BaseVal() const { return mVal->GetBaseValue(); }
void SetBaseVal(bool aValue) { mVal->SetBaseValue(aValue, mSVGElement); }
bool AnimVal() const { mSVGElement->FlushAnimations(); return mVal->GetAnimValue(); }
--- a/content/svg/content/src/SVGAnimatedEnumeration.h
+++ b/content/svg/content/src/SVGAnimatedEnumeration.h
@@ -32,17 +32,16 @@ public:
virtual uint16_t BaseVal() = 0;
virtual void SetBaseVal(uint16_t aBaseVal, ErrorResult& aRv) = 0;
virtual uint16_t AnimVal() = 0;
protected:
explicit SVGAnimatedEnumeration(nsSVGElement* aSVGElement)
: mSVGElement(aSVGElement)
{
- SetIsDOMBinding();
}
virtual ~SVGAnimatedEnumeration() {};
nsRefPtr<nsSVGElement> mSVGElement;
};
} // namespace dom
} // namespace mozilla
--- a/content/svg/content/src/SVGAnimatedInteger.h
+++ b/content/svg/content/src/SVGAnimatedInteger.h
@@ -32,17 +32,16 @@ public:
virtual int32_t BaseVal() = 0;
virtual void SetBaseVal(int32_t aBaseVal) = 0;
virtual int32_t AnimVal() = 0;
protected:
explicit SVGAnimatedInteger(nsSVGElement* aSVGElement)
: mSVGElement(aSVGElement)
{
- SetIsDOMBinding();
}
virtual ~SVGAnimatedInteger() {};
nsRefPtr<nsSVGElement> mSVGElement;
};
} // namespace dom
} // namespace mozilla
--- a/content/svg/content/src/SVGAnimatedLength.h
+++ b/content/svg/content/src/SVGAnimatedLength.h
@@ -20,17 +20,18 @@ namespace dom {
class SVGAnimatedLength MOZ_FINAL : public nsWrapperCache
{
public:
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(SVGAnimatedLength)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(SVGAnimatedLength)
SVGAnimatedLength(nsSVGLength2* aVal, nsSVGElement *aSVGElement)
: mVal(aVal), mSVGElement(aSVGElement)
- { SetIsDOMBinding(); }
+ {
+ }
// WebIDL
nsSVGElement* GetParentObject() { return mSVGElement; }
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
already_AddRefed<DOMSVGLength> BaseVal();
already_AddRefed<DOMSVGLength> AnimVal();
protected:
--- a/content/svg/content/src/SVGAnimatedNumber.h
+++ b/content/svg/content/src/SVGAnimatedNumber.h
@@ -33,17 +33,16 @@ public:
virtual float BaseVal() = 0;
virtual void SetBaseVal(float aBaseVal) = 0;
virtual float AnimVal() = 0;
protected:
explicit SVGAnimatedNumber(nsSVGElement* aSVGElement)
: mSVGElement(aSVGElement)
{
- SetIsDOMBinding();
}
virtual ~SVGAnimatedNumber() {};
nsRefPtr<nsSVGElement> mSVGElement;
};
} // namespace dom
} // namespace mozilla
--- a/content/svg/content/src/SVGAnimatedPreserveAspectRatio.h
+++ b/content/svg/content/src/SVGAnimatedPreserveAspectRatio.h
@@ -119,17 +119,16 @@ class DOMSVGAnimatedPreserveAspectRatio
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(DOMSVGAnimatedPreserveAspectRatio)
DOMSVGAnimatedPreserveAspectRatio(SVGAnimatedPreserveAspectRatio* aVal,
nsSVGElement *aSVGElement)
: mVal(aVal), mSVGElement(aSVGElement)
{
- SetIsDOMBinding();
}
// WebIDL
nsSVGElement* GetParentObject() const { return mSVGElement; }
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
// These aren't weak refs because new objects are returned each time
already_AddRefed<DOMSVGPreserveAspectRatio> BaseVal();
--- a/content/svg/content/src/SVGAnimatedRect.cpp
+++ b/content/svg/content/src/SVGAnimatedRect.cpp
@@ -16,17 +16,16 @@ NS_SVG_VAL_IMPL_CYCLE_COLLECTION_WRAPPER
NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(SVGAnimatedRect, AddRef)
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(SVGAnimatedRect, Release)
SVGAnimatedRect::SVGAnimatedRect(nsSVGViewBox* aVal, nsSVGElement* aSVGElement)
: mVal(aVal)
, mSVGElement(aSVGElement)
{
- SetIsDOMBinding();
}
SVGAnimatedRect::~SVGAnimatedRect()
{
nsSVGViewBox::sSVGAnimatedRectTearoffTable.RemoveTearoff(mVal);
}
already_AddRefed<SVGIRect>
--- a/content/svg/content/src/SVGAnimatedString.h
+++ b/content/svg/content/src/SVGAnimatedString.h
@@ -13,17 +13,16 @@ namespace dom {
class SVGAnimatedString : public nsISupports,
public nsWrapperCache
{
public:
explicit SVGAnimatedString(nsSVGElement* aSVGElement)
: mSVGElement(aSVGElement)
{
- SetIsDOMBinding();
}
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
// WebIDL
nsSVGElement* GetParentObject() const
{
return mSVGElement;
--- a/content/svg/content/src/SVGAnimatedTransformList.h
+++ b/content/svg/content/src/SVGAnimatedTransformList.h
@@ -101,17 +101,16 @@ private:
* Only our static GetDOMWrapper() factory method may create objects of our
* type.
*/
explicit SVGAnimatedTransformList(nsSVGElement *aElement)
: mBaseVal(nullptr)
, mAnimVal(nullptr)
, mElement(aElement)
{
- SetIsDOMBinding();
}
~SVGAnimatedTransformList();
/// Get a reference to this DOM wrapper object's internal counterpart.
nsSVGAnimatedTransformList& InternalAList();
const nsSVGAnimatedTransformList& InternalAList() const;
--- a/content/svg/content/src/SVGIRect.h
+++ b/content/svg/content/src/SVGIRect.h
@@ -17,21 +17,16 @@ class nsSVGElement;
namespace mozilla {
namespace dom {
class SVGIRect : public nsISupports,
public nsWrapperCache
{
public:
- SVGIRect()
- {
- SetIsDOMBinding();
- }
-
virtual ~SVGIRect()
{
}
JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE
{
return SVGRectBinding::Wrap(aCx, this);
}
--- a/content/svg/content/src/SVGMatrix.h
+++ b/content/svg/content/src/SVGMatrix.h
@@ -54,31 +54,25 @@ class SVGMatrix MOZ_FINAL : public nsWra
{
public:
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(SVGMatrix)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(SVGMatrix)
/**
* Ctor for SVGMatrix objects that belong to a SVGTransform.
*/
- explicit SVGMatrix(SVGTransform& aTransform) : mTransform(&aTransform) {
- SetIsDOMBinding();
- }
+ explicit SVGMatrix(SVGTransform& aTransform) : mTransform(&aTransform) {}
/**
* Ctors for SVGMatrix objects created independently of a SVGTransform.
*/
// Default ctor for gfxMatrix will produce identity mx
- SVGMatrix() {
- SetIsDOMBinding();
- }
+ SVGMatrix() {}
- explicit SVGMatrix(const gfxMatrix &aMatrix) : mMatrix(aMatrix) {
- SetIsDOMBinding();
- }
+ explicit SVGMatrix(const gfxMatrix &aMatrix) : mMatrix(aMatrix) {}
const gfxMatrix& GetMatrix() const {
return mTransform ? mTransform->Matrixgfx() : mMatrix;
}
// WebIDL
SVGTransform* GetParentObject() const;
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
--- a/content/svg/content/src/SVGPreserveAspectRatio.h
+++ b/content/svg/content/src/SVGPreserveAspectRatio.h
@@ -120,17 +120,16 @@ public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(DOMSVGPreserveAspectRatio)
DOMSVGPreserveAspectRatio(SVGAnimatedPreserveAspectRatio* aVal,
nsSVGElement *aSVGElement,
bool aIsBaseValue)
: mVal(aVal), mSVGElement(aSVGElement), mIsBaseValue(aIsBaseValue)
{
- SetIsDOMBinding();
}
// WebIDL
nsSVGElement* GetParentObject() const { return mSVGElement; }
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
uint16_t Align();
void SetAlign(uint16_t aAlign, ErrorResult& rv);
--- a/content/svg/content/src/SVGTransform.cpp
+++ b/content/svg/content/src/SVGTransform.cpp
@@ -107,51 +107,47 @@ private:
SVGTransform::SVGTransform(DOMSVGTransformList *aList,
uint32_t aListIndex,
bool aIsAnimValItem)
: mList(aList)
, mListIndex(aListIndex)
, mIsAnimValItem(aIsAnimValItem)
, mTransform(nullptr)
{
- SetIsDOMBinding();
// These shifts are in sync with the members in the header.
NS_ABORT_IF_FALSE(aList &&
aListIndex <= MaxListIndex(), "bad arg");
NS_ABORT_IF_FALSE(IndexIsValid(), "Bad index for DOMSVGNumber!");
}
SVGTransform::SVGTransform()
: mList(nullptr)
, mListIndex(0)
, mIsAnimValItem(false)
, mTransform(new nsSVGTransform()) // Default ctor for objects not in a list
// initialises to matrix type with identity
// matrix
{
- SetIsDOMBinding();
}
SVGTransform::SVGTransform(const gfxMatrix &aMatrix)
: mList(nullptr)
, mListIndex(0)
, mIsAnimValItem(false)
, mTransform(new nsSVGTransform(aMatrix))
{
- SetIsDOMBinding();
}
SVGTransform::SVGTransform(const nsSVGTransform &aTransform)
: mList(nullptr)
, mListIndex(0)
, mIsAnimValItem(false)
, mTransform(new nsSVGTransform(aTransform))
{
- SetIsDOMBinding();
}
SVGTransform::~SVGTransform()
{
SVGMatrix* matrix = SVGMatrixTearoffTable().GetTearoff(this);
if (matrix) {
SVGMatrixTearoffTable().RemoveTearoff(this);
NS_RELEASE(matrix);
--- a/content/svg/content/src/nsISVGPoint.h
+++ b/content/svg/content/src/nsISVGPoint.h
@@ -45,27 +45,25 @@ public:
*/
explicit nsISVGPoint()
: mList(nullptr)
, mListIndex(0)
, mIsReadonly(false)
, mIsAnimValItem(false)
, mIsTranslatePoint(false)
{
- SetIsDOMBinding();
}
explicit nsISVGPoint(SVGPoint* aPt, bool aIsTranslatePoint)
: mList(nullptr)
, mListIndex(0)
, mIsReadonly(false)
, mIsAnimValItem(false)
, mIsTranslatePoint(aIsTranslatePoint)
{
- SetIsDOMBinding();
mPt.mX = aPt->GetX();
mPt.mY = aPt->GetY();
}
protected:
virtual ~nsISVGPoint()
{
// Our mList's weak ref to us must be nulled out when we die. If GC has
--- a/dom/activities/Activity.cpp
+++ b/dom/activities/Activity.cpp
@@ -80,11 +80,10 @@ Activity::~Activity()
if (mProxy) {
mProxy->Cleanup();
}
}
Activity::Activity(nsPIDOMWindow* aWindow)
: DOMRequest(aWindow)
{
- MOZ_ASSERT(IsDOMBinding());
}
--- a/dom/animation/Animation.h
+++ b/dom/animation/Animation.h
@@ -138,17 +138,16 @@ public:
, mTarget(aTarget)
, mTiming(aTiming)
, mName(aName)
, mIsFinishedTransition(false)
, mLastNotification(LAST_NOTIFICATION_NONE)
, mPseudoType(aPseudoType)
{
MOZ_ASSERT(aTarget, "null animation target is not yet supported");
- SetIsDOMBinding();
}
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(Animation)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(Animation)
nsIDocument* GetParentObject() const { return mDocument; }
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
--- a/dom/animation/AnimationEffect.h
+++ b/dom/animation/AnimationEffect.h
@@ -16,17 +16,16 @@ namespace mozilla {
namespace dom {
class AnimationEffect MOZ_FINAL : public nsWrapperCache
{
public:
explicit AnimationEffect(Animation* aAnimation)
: mAnimation(aAnimation)
{
- SetIsDOMBinding();
}
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(AnimationEffect)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(AnimationEffect)
Animation* GetParentObject() const { return mAnimation; }
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
--- a/dom/animation/AnimationPlayer.h
+++ b/dom/animation/AnimationPlayer.h
@@ -31,17 +31,16 @@ protected:
virtual ~AnimationPlayer() { }
public:
explicit AnimationPlayer(AnimationTimeline* aTimeline)
: mPlayState(NS_STYLE_ANIMATION_PLAY_STATE_RUNNING)
, mIsRunningOnCompositor(false)
, mTimeline(aTimeline)
{
- SetIsDOMBinding();
}
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(AnimationPlayer)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(AnimationPlayer)
AnimationTimeline* GetParentObject() const { return mTimeline; }
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
--- a/dom/animation/AnimationTimeline.h
+++ b/dom/animation/AnimationTimeline.h
@@ -19,17 +19,16 @@ namespace mozilla {
namespace dom {
class AnimationTimeline MOZ_FINAL : public nsWrapperCache
{
public:
explicit AnimationTimeline(nsIDocument* aDocument)
: mDocument(aDocument)
{
- SetIsDOMBinding();
}
NS_INLINE_DECL_CYCLE_COLLECTING_NATIVE_REFCOUNTING(AnimationTimeline)
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_NATIVE_CLASS(AnimationTimeline)
nsISupports* GetParentObject() const { return mDocument; }
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
--- a/dom/archivereader/ArchiveReader.cpp
+++ b/dom/archivereader/ArchiveReader.cpp
@@ -51,18 +51,16 @@ ArchiveReader::ArchiveReader(nsIDOMBlob*
const nsACString& aEncoding)
: mBlob(aBlob)
, mWindow(aWindow)
, mStatus(NOT_STARTED)
, mEncoding(aEncoding)
{
MOZ_ASSERT(aBlob);
MOZ_ASSERT(aWindow);
-
- SetIsDOMBinding();
}
ArchiveReader::~ArchiveReader()
{
}
/* virtual */ JSObject*
ArchiveReader::WrapObject(JSContext* aCx)
--- a/dom/base/BarProps.cpp
+++ b/dom/base/BarProps.cpp
@@ -16,17 +16,16 @@ namespace dom {
//
// Basic (virtual) BarProp class implementation
//
BarProp::BarProp(nsGlobalWindow* aWindow)
: mDOMWindow(aWindow)
{
MOZ_ASSERT(aWindow->IsInnerWindow());
- SetIsDOMBinding();
}
BarProp::~BarProp()
{
}
nsPIDOMWindow*
BarProp::GetParentObject() const
--- a/dom/base/CompositionStringSynthesizer.cpp
+++ b/dom/base/CompositionStringSynthesizer.cpp
@@ -130,28 +130,28 @@ CompositionStringSynthesizer::DispatchEv
if (mCaret.mEndOffset > mString.Length()) {
NS_WARNING("Caret position is out of the composition string");
ClearInternal();
return NS_ERROR_ILLEGAL_VALUE;
}
mClauses->AppendElement(mCaret);
}
- WidgetTextEvent textEvent(true, NS_TEXT_TEXT, widget);
- textEvent.time = PR_IntervalNow();
- textEvent.theText = mString;
+ WidgetCompositionEvent compChangeEvent(true, NS_COMPOSITION_CHANGE, widget);
+ compChangeEvent.time = PR_IntervalNow();
+ compChangeEvent.mData = mString;
if (!mClauses->IsEmpty()) {
- textEvent.mRanges = mClauses;
+ compChangeEvent.mRanges = mClauses;
}
// XXX How should we set false for this on b2g?
- textEvent.mFlags.mIsSynthesizedForTests = true;
+ compChangeEvent.mFlags.mIsSynthesizedForTests = true;
nsEventStatus status = nsEventStatus_eIgnore;
- nsresult rv = widget->DispatchEvent(&textEvent, status);
+ nsresult rv = widget->DispatchEvent(&compChangeEvent, status);
*aDefaultPrevented = (status == nsEventStatus_eConsumeNoDefault);
ClearInternal();
NS_ENSURE_SUCCESS(rv, rv);
return NS_OK;
}
--- a/dom/base/Console.cpp
+++ b/dom/base/Console.cpp
@@ -555,17 +555,16 @@ Console::Console(nsPIDOMWindow* aWindow)
if (NS_IsMainThread()) {
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
if (obs) {
obs->AddObserver(this, "inner-window-destroyed", false);
}
}
- SetIsDOMBinding();
mozilla::HoldJSObjects(this);
}
Console::~Console()
{
mozilla::DropJSObjects(this);
}
--- a/dom/base/Crypto.cpp
+++ b/dom/base/Crypto.cpp
@@ -27,17 +27,16 @@ NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTING_ADDREF(Crypto)
NS_IMPL_CYCLE_COLLECTING_RELEASE(Crypto)
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(Crypto, mWindow, mSubtle)
Crypto::Crypto()
{
MOZ_COUNT_CTOR(Crypto);
- SetIsDOMBinding();
}
Crypto::~Crypto()
{
MOZ_COUNT_DTOR(Crypto);
}
void
--- a/dom/base/DOMError.cpp
+++ b/dom/base/DOMError.cpp
@@ -19,45 +19,40 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(DOMError)
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
DOMError::DOMError(nsPIDOMWindow* aWindow)
: mWindow(aWindow)
{
- SetIsDOMBinding();
}
DOMError::DOMError(nsPIDOMWindow* aWindow, nsresult aValue)
: mWindow(aWindow)
{
nsCString name, message;
NS_GetNameAndMessageForDOMNSResult(aValue, name, message);
CopyUTF8toUTF16(name, mName);
CopyUTF8toUTF16(message, mMessage);
-
- SetIsDOMBinding();
}
DOMError::DOMError(nsPIDOMWindow* aWindow, const nsAString& aName)
: mWindow(aWindow)
, mName(aName)
{
- SetIsDOMBinding();
}
DOMError::DOMError(nsPIDOMWindow* aWindow, const nsAString& aName,
const nsAString& aMessage)
: mWindow(aWindow)
, mName(aName)
, mMessage(aMessage)
{
- SetIsDOMBinding();
}
DOMError::~DOMError()
{
}
JSObject*
DOMError::WrapObject(JSContext* aCx)
--- a/dom/base/DOMException.cpp
+++ b/dom/base/DOMException.cpp
@@ -195,18 +195,16 @@ Exception::Exception(const nsACString& a
const nsACString& aName,
nsIStackFrame *aLocation,
nsISupports *aData)
: mResult(NS_OK),
mLineNumber(0),
mInitialized(false),
mHoldingJSVal(false)
{
- SetIsDOMBinding();
-
// A little hack... The nsIGenericModule nsIClassInfo scheme relies on there
// having been at least one instance made via the factory. Otherwise, the
// shared factory/classinsance object never gets created and our QI getter
// for our instance's pointer to our nsIClassInfo will always return null.
// This is bad because it means that wrapped exceptions will never have a
// shared prototype. So... We force one to be created via the factory
// *once* and then go about our business.
if (!sEverMadeOneFromFactory) {
@@ -595,17 +593,16 @@ NS_INTERFACE_MAP_END_INHERITING(Exceptio
DOMException::DOMException(nsresult aRv, const nsACString& aMessage,
const nsACString& aName, uint16_t aCode)
: Exception(EmptyCString(), aRv, EmptyCString(), nullptr, nullptr),
mName(aName),
mMessage(aMessage),
mCode(aCode)
{
- SetIsDOMBinding();
}
NS_IMETHODIMP
DOMException::GetCode(uint16_t* aCode)
{
NS_ENSURE_ARG_POINTER(aCode);
*aCode = mCode;
--- a/dom/base/MessageChannel.cpp
+++ b/dom/base/MessageChannel.cpp
@@ -62,17 +62,16 @@ MessageChannel::Enabled(JSContext* aCx,
return isResource;
}
MessageChannel::MessageChannel(nsPIDOMWindow* aWindow)
: mWindow(aWindow)
{
MOZ_COUNT_CTOR(MessageChannel);
- SetIsDOMBinding();
mPort1 = new MessagePort(mWindow);
mPort2 = new MessagePort(mWindow);
mPort1->Entangle(mPort2);
mPort2->Entangle(mPort1);
}
--- a/dom/base/MessagePort.cpp
+++ b/dom/base/MessagePort.cpp
@@ -309,22 +309,20 @@ PostMessageRunnable::Run()
bool status;
mPort->DispatchEvent(static_cast<dom::Event*>(event.get()), &status);
return status ? NS_OK : NS_ERROR_FAILURE;
}
MessagePortBase::MessagePortBase(nsPIDOMWindow* aWindow)
: DOMEventTargetHelper(aWindow)
{
- // SetIsDOMBinding() is called by DOMEventTargetHelper's ctor.
}
MessagePortBase::MessagePortBase()
{
- SetIsDOMBinding();
}
NS_IMPL_CYCLE_COLLECTION_CLASS(MessagePort)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(MessagePort,
DOMEventTargetHelper)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mEntangledPort)
--- a/dom/base/MessagePortList.h
+++ b/dom/base/MessagePortList.h
@@ -27,17 +27,16 @@ public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(MessagePortList)
public:
MessagePortList(nsISupports* aOwner, nsTArray<nsRefPtr<MessagePortBase>>& aPorts)
: mOwner(aOwner)
, mPorts(aPorts)
{
- SetIsDOMBinding();
}
nsISupports*
GetParentObject() const
{
return mOwner;
}
--- a/dom/base/Navigator.cpp
+++ b/dom/base/Navigator.cpp
@@ -134,17 +134,16 @@ Navigator::Init()
Preferences::AddUintVarCache(&sMaxVibrateListLen,
"dom.vibrator.max_vibrate_list_len", 128);
}
Navigator::Navigator(nsPIDOMWindow* aWindow)
: mWindow(aWindow)
{
MOZ_ASSERT(aWindow->IsInnerWindow(), "Navigator must get an inner window!");
- SetIsDOMBinding();
}
Navigator::~Navigator()
{
Invalidate();
}
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(Navigator)
@@ -580,16 +579,21 @@ Navigator::CookieEnabled()
}
return cookieEnabled;
}
bool
Navigator::OnLine()
{
+ if (mWindow && mWindow->GetDoc()) {
+ return !NS_IsOffline() &&
+ !NS_IsAppOffline(mWindow->GetDoc()->NodePrincipal());
+ }
+
return !NS_IsOffline();
}
NS_IMETHODIMP
Navigator::GetBuildID(nsAString& aBuildID)
{
if (!nsContentUtils::IsCallerChrome()) {
const nsAdoptingString& override =
@@ -1716,18 +1720,17 @@ Navigator::GetProperties(nsINetworkPrope
network::Connection*
Navigator::GetConnection(ErrorResult& aRv)
{
if (!mConnection) {
if (!mWindow) {
aRv.Throw(NS_ERROR_UNEXPECTED);
return nullptr;
}
- mConnection = new network::Connection();
- mConnection->Init(mWindow);
+ mConnection = new network::Connection(mWindow);
}
return mConnection;
}
#ifdef MOZ_B2G_BT
bluetooth::BluetoothManager*
Navigator::GetMozBluetooth(ErrorResult& aRv)
--- a/dom/base/PerformanceEntry.cpp
+++ b/dom/base/PerformanceEntry.cpp
@@ -18,17 +18,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
PerformanceEntry::PerformanceEntry(nsPerformance* aPerformance)
: mPerformance(aPerformance)
{
MOZ_ASSERT(aPerformance, "Parent performance object should be provided");
- SetIsDOMBinding();
}
PerformanceEntry::~PerformanceEntry()
{
}
JSObject*
PerformanceEntry::WrapObject(JSContext* aCx)
--- a/dom/base/SubtleCrypto.cpp
+++ b/dom/base/SubtleCrypto.cpp
@@ -21,17 +21,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
SubtleCrypto::SubtleCrypto(nsPIDOMWindow* aWindow)
: mWindow(aWindow)
{
- SetIsDOMBinding();
}
JSObject*
SubtleCrypto::WrapObject(JSContext* aCx)
{
return SubtleCryptoBinding::Wrap(aCx, this);
}
--- a/dom/base/URLSearchParams.cpp
+++ b/dom/base/URLSearchParams.cpp
@@ -16,17 +16,16 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(URLSear
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(URLSearchParams)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
URLSearchParams::URLSearchParams()
{
- SetIsDOMBinding();
}
URLSearchParams::~URLSearchParams()
{
DeleteAll();
}
JSObject*
--- a/dom/base/nsDOMWindowUtils.cpp
+++ b/dom/base/nsDOMWindowUtils.cpp
@@ -2113,31 +2113,31 @@ nsDOMWindowUtils::SendCompositionEvent(c
uint32_t msg;
if (aType.EqualsLiteral("compositionstart")) {
msg = NS_COMPOSITION_START;
} else if (aType.EqualsLiteral("compositionend")) {
msg = NS_COMPOSITION_END;
} else if (aType.EqualsLiteral("compositionupdate")) {
// Now we don't support manually dispatching composition update with this
- // API. compositionupdate is dispatched when text event modifies
+ // API. A compositionupdate is dispatched when a DOM text event modifies
// composition string automatically. For backward compatibility, this
// shouldn't return error in this case.
NS_WARNING("Don't call nsIDOMWindowUtils.sendCompositionEvent() for "
"compositionupdate since it's ignored and the event is "
"fired automatically when it's necessary");
return NS_OK;
} else {
return NS_ERROR_FAILURE;
}
WidgetCompositionEvent compositionEvent(true, msg, widget);
InitEvent(compositionEvent);
if (msg != NS_COMPOSITION_START) {
- compositionEvent.data = aData;
+ compositionEvent.mData = aData;
}
compositionEvent.mFlags.mIsSynthesizedForTests = true;
nsEventStatus status;
nsresult rv = widget->DispatchEvent(&compositionEvent, status);
NS_ENSURE_SUCCESS(rv, rv);
--- a/dom/base/nsGlobalWindow.cpp
+++ b/dom/base/nsGlobalWindow.cpp
@@ -1090,17 +1090,17 @@ nsGlobalWindow::nsGlobalWindow(nsGlobalW
mIsFrozen(false),
mFullScreen(false),
mIsClosed(false),
mInClose(false),
mHavePendingClose(false),
mHadOriginalOpener(false),
mIsPopupSpam(false),
mBlockScriptedClosingFlag(false),
- mFireOfflineStatusChangeEventOnThaw(false),
+ mWasOffline(false),
mNotifyIdleObserversIdleOnThaw(false),
mNotifyIdleObserversActiveOnThaw(false),
mCreatingInnerWindow(false),
mIsChrome(false),
mCleanMessageManager(false),
mNeedsFocus(true),
mHasFocus(false),
#if defined(XP_MACOSX)
@@ -1136,18 +1136,16 @@ nsGlobalWindow::nsGlobalWindow(nsGlobalW
mDialogAbuseCount(0),
mAreDialogsEnabled(true)
{
nsLayoutStatics::AddRef();
// Initialize the PRCList (this).
PR_INIT_CLIST(this);
- SetIsDOMBinding();
-
if (aOuterWindow) {
// |this| is an inner window, add this inner window to the outer
// window list of inners.
PR_INSERT_AFTER(this, aOuterWindow);
mObserver = new nsGlobalWindowObserver(this);
if (mObserver) {
NS_ADDREF(mObserver);
@@ -2456,21 +2454,21 @@ nsGlobalWindow::SetNewDocument(nsIDocume
JS_SetCompartmentPrincipals(compartment,
nsJSPrincipals::get(aDocument->NodePrincipal()));
} else {
if (aState) {
newInnerWindow = wsh->GetInnerWindow();
newInnerGlobal = newInnerWindow->GetWrapperPreserveColor();
} else {
if (thisChrome) {
- newInnerWindow = new nsGlobalChromeWindow(this);
+ newInnerWindow = nsGlobalChromeWindow::Create(this);
} else if (mIsModalContentWindow) {
- newInnerWindow = new nsGlobalModalWindow(this);
+ newInnerWindow = nsGlobalModalWindow::Create(this);
} else {
- newInnerWindow = new nsGlobalWindow(this);
+ newInnerWindow = nsGlobalWindow::Create(this);
}
// Freeze the outer window and null out the inner window so
// that initializing classes on the new inner doesn't end up
// reaching into the old inner window for classes etc.
//
// [This happens with Object.prototype when XPConnect creates
// a temporary global while initializing classes; the reason
@@ -10735,22 +10733,32 @@ void
nsGlobalWindow::GetInterface(JSContext* aCx, nsIJSID* aIID,
JS::MutableHandle<JS::Value> aRetval,
ErrorResult& aError)
{
dom::GetInterface(aCx, this, aIID, aRetval, aError);
}
void
-nsGlobalWindow::FireOfflineStatusEvent()
+nsGlobalWindow::FireOfflineStatusEventIfChanged()
{
if (!IsCurrentInnerWindow())
return;
+
+ bool isOffline = NS_IsOffline() || NS_IsAppOffline(GetPrincipal());
+
+ // Don't fire an event if the status hasn't changed
+ if (mWasOffline == isOffline) {
+ return;
+ }
+
+ mWasOffline = isOffline;
+
nsAutoString name;
- if (NS_IsOffline()) {
+ if (isOffline) {
name.AssignLiteral("offline");
} else {
name.AssignLiteral("online");
}
// The event is fired at the body element, or if there is no body element,
// at the document.
nsCOMPtr<EventTarget> eventTarget = mDoc.get();
nsHTMLDocument* htmlDoc = mDoc->AsHTMLDocument();
@@ -11296,23 +11304,21 @@ nsGlobalWindow::UnregisterIdleObserver(n
return NS_OK;
}
nsresult
nsGlobalWindow::Observe(nsISupports* aSubject, const char* aTopic,
const char16_t* aData)
{
- if (!nsCRT::strcmp(aTopic, NS_IOSERVICE_OFFLINE_STATUS_TOPIC)) {
- if (IsFrozen()) {
- // if an even number of notifications arrive while we're frozen,
- // we don't need to fire.
- mFireOfflineStatusChangeEventOnThaw = !mFireOfflineStatusChangeEventOnThaw;
- } else {
- FireOfflineStatusEvent();
+ if (!nsCRT::strcmp(aTopic, NS_IOSERVICE_OFFLINE_STATUS_TOPIC) ||
+ !nsCRT::strcmp(aTopic, NS_IOSERVICE_APP_OFFLINE_STATUS_TOPIC)) {
+ if (!IsFrozen()) {
+ // Fires an offline status event if the offline status has changed
+ FireOfflineStatusEventIfChanged();
}
return NS_OK;
}
if (!nsCRT::strcmp(aTopic, OBSERVER_TOPIC_IDLE)) {
mCurrentlyIdle = true;
if (IsFrozen()) {
// need to fire only one idle event while the window is frozen.
@@ -11577,20 +11583,18 @@ nsGlobalWindow::FireDelayedDOMEvents()
for (uint32_t i = 0, len = mPendingStorageEvents.Length(); i < len; ++i) {
Observe(mPendingStorageEvents[i], "dom-storage2-changed", nullptr);
}
if (mApplicationCache) {
static_cast<nsDOMOfflineResourceList*>(mApplicationCache.get())->FirePendingEvents();
}
- if (mFireOfflineStatusChangeEventOnThaw) {
- mFireOfflineStatusChangeEventOnThaw = false;
- FireOfflineStatusEvent();
- }
+ // Fires an offline status event if the offline status has changed
+ FireOfflineStatusEventIfChanged();
if (mNotifyIdleObserversIdleOnThaw) {
mNotifyIdleObserversIdleOnThaw = false;
HandleIdleActiveEvent();
}
if (mNotifyIdleObserversActiveOnThaw) {
mNotifyIdleObserversActiveOnThaw = false;
@@ -13358,16 +13362,24 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_END
// QueryInterface implementation for nsGlobalChromeWindow
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(nsGlobalChromeWindow)
NS_INTERFACE_MAP_ENTRY(nsIDOMChromeWindow)
NS_INTERFACE_MAP_END_INHERITING(nsGlobalWindow)
NS_IMPL_ADDREF_INHERITED(nsGlobalChromeWindow, nsGlobalWindow)
NS_IMPL_RELEASE_INHERITED(nsGlobalChromeWindow, nsGlobalWindow)
+/* static */ already_AddRefed<nsGlobalChromeWindow>
+nsGlobalChromeWindow::Create(nsGlobalWindow *aOuterWindow)
+{
+ nsRefPtr<nsGlobalChromeWindow> window = new nsGlobalChromeWindow(aOuterWindow);
+ window->InitWasOffline();
+ return window.forget();
+}
+
NS_IMETHODIMP
nsGlobalChromeWindow::GetWindowState(uint16_t* aWindowState)
{
*aWindowState = WindowState();
return NS_OK;
}
uint16_t
@@ -13782,27 +13794,49 @@ nsGlobalWindow::GetDialogArguments(JSCon
// This does an internal origin check, and returns undefined if the subject
// does not subsumes the origin of the arguments.
JS::Rooted<JSObject*> wrapper(aCx, GetWrapper());
JSAutoCompartment ac(aCx, wrapper);
mDialogArguments->Get(aCx, wrapper, nsContentUtils::SubjectPrincipal(),
aRetval, aError);
}
+/* static */ already_AddRefed<nsGlobalModalWindow>
+nsGlobalModalWindow::Create(nsGlobalWindow *aOuterWindow)
+{
+ nsRefPtr<nsGlobalModalWindow> window = new nsGlobalModalWindow(aOuterWindow);
+ window->InitWasOffline();
+ return window.forget();
+}
+
NS_IMETHODIMP
nsGlobalModalWindow::GetDialogArguments(nsIVariant **aArguments)
{
FORWARD_TO_OUTER_MODAL_CONTENT_WINDOW(GetDialogArguments, (aArguments),
NS_ERROR_NOT_INITIALIZED);
// This does an internal origin check, and returns undefined if the subject
// does not subsumes the origin of the arguments.
return mDialogArguments->Get(nsContentUtils::SubjectPrincipal(), aArguments);
}
+/* static */ already_AddRefed<nsGlobalWindow>
+nsGlobalWindow::Create(nsGlobalWindow *aOuterWindow)
+{
+ nsRefPtr<nsGlobalWindow> window = new nsGlobalWindow(aOuterWindow);
+ window->InitWasOffline();
+ return window.forget();
+}
+
+void
+nsGlobalWindow::InitWasOffline()
+{
+ mWasOffline = NS_IsOffline() || NS_IsAppOffline(GetPrincipal());
+}
+
void
nsGlobalWindow::GetReturnValue(JSContext* aCx,
JS::MutableHandle<JS::Value> aReturnValue,
ErrorResult& aError)
{
FORWARD_TO_OUTER_OR_THROW(GetReturnValue, (aCx, aReturnValue, aError),
aError, );
@@ -13965,17 +13999,16 @@ nsGlobalWindow::GetSidebar(OwningExterna
aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
#endif
}
void
nsGlobalWindow::ClearDocumentDependentSlots(JSContext* aCx)
{
MOZ_ASSERT(IsInnerWindow());
- MOZ_ASSERT(IsDOMBinding());
WindowBinding::ClearCachedDocumentValue(aCx, this);
WindowBinding::ClearCachedPerformanceValue(aCx, this);
}
/* static */
JSObject*
nsGlobalWindow::CreateNamedPropertiesObject(JSContext *aCx,
JS::Handle<JSObject*> aProto)
--- a/dom/base/nsGlobalWindow.h
+++ b/dom/base/nsGlobalWindow.h
@@ -485,17 +485,17 @@ public:
bool DoNewResolve(JSContext* aCx, JS::Handle<JSObject*> aObj,
JS::Handle<jsid> aId,
JS::MutableHandle<JSPropertyDescriptor> aDesc);
void GetOwnPropertyNames(JSContext* aCx, nsTArray<nsString>& aNames,
mozilla::ErrorResult& aRv);
// Object Management
- explicit nsGlobalWindow(nsGlobalWindow *aOuterWindow);
+ static already_AddRefed<nsGlobalWindow> Create(nsGlobalWindow *aOuterWindow);
static nsGlobalWindow *FromSupports(nsISupports *supports)
{
// Make sure this matches the casts we do in QueryInterface().
return (nsGlobalWindow *)(mozilla::dom::EventTarget *)supports;
}
static nsGlobalWindow *FromWrapper(nsIXPConnectWrappedNative *wrapper)
{
@@ -818,17 +818,20 @@ public:
uint32_t Length();
already_AddRefed<nsIDOMWindow> GetTop(mozilla::ErrorResult& aError)
{
nsCOMPtr<nsIDOMWindow> top;
aError = GetScriptableTop(getter_AddRefs(top));
return top.forget();
}
protected:
+ explicit nsGlobalWindow(nsGlobalWindow *aOuterWindow);
nsIDOMWindow* GetOpenerWindow(mozilla::ErrorResult& aError);
+ // Initializes the mWasOffline member variable
+ void InitWasOffline();
public:
void GetOpener(JSContext* aCx, JS::MutableHandle<JS::Value> aRetval,
mozilla::ErrorResult& aError);
void SetOpener(JSContext* aCx, JS::Handle<JS::Value> aOpener,
mozilla::ErrorResult& aError);
using nsIDOMWindow::GetParent;
already_AddRefed<nsIDOMWindow> GetParent(mozilla::ErrorResult& aError);
mozilla::dom::Element* GetFrameElement(mozilla::ErrorResult& aError);
@@ -1241,17 +1244,17 @@ public:
nsresult SecurityCheckURL(const char *aURL);
bool PopupWhitelisted();
PopupControlState RevisePopupAbuseLevel(PopupControlState);
void FireAbuseEvents(bool aBlocked, bool aWindow,
const nsAString &aPopupURL,
const nsAString &aPopupWindowName,
const nsAString &aPopupWindowFeatures);
- void FireOfflineStatusEvent();
+ void FireOfflineStatusEventIfChanged();
// Inner windows only.
nsresult ScheduleNextIdleObserverCallback();
uint32_t GetFuzzTimeMS();
nsresult ScheduleActiveTimerCallback();
uint32_t FindInsertionIndex(IdleObserverHolder* aIdleObserver);
virtual nsresult RegisterIdleObserver(nsIIdleObserver* aIdleObserverPtr);
nsresult FindIndexOfElementToRemove(nsIIdleObserver* aIdleObserver,
@@ -1444,18 +1447,20 @@ protected:
// event posted. If this is set, just ignore window.close() calls.
bool mHavePendingClose : 1;
bool mHadOriginalOpener : 1;
bool mIsPopupSpam : 1;
// Indicates whether scripts are allowed to close this window.
bool mBlockScriptedClosingFlag : 1;
+ // Window offline status. Checked to see if we need to fire offline event
+ bool mWasOffline : 1;
+
// Track what sorts of events we need to fire when thawed
- bool mFireOfflineStatusChangeEventOnThaw : 1;
bool mNotifyIdleObserversIdleOnThaw : 1;
bool mNotifyIdleObserversActiveOnThaw : 1;
// Indicates whether we're in the middle of creating an initializing
// a new inner window object.
bool mCreatingInnerWindow : 1;
// Fast way to tell if this is a chrome window (without having to QI).
@@ -1652,36 +1657,38 @@ class nsGlobalChromeWindow : public nsGl
{
public:
// nsISupports
NS_DECL_ISUPPORTS_INHERITED
// nsIDOMChromeWindow interface
NS_DECL_NSIDOMCHROMEWINDOW
- explicit nsGlobalChromeWindow(nsGlobalWindow *aOuterWindow)
- : nsGlobalWindow(aOuterWindow),
- mGroupMessageManagers(1)
- {
- mIsChrome = true;
- mCleanMessageManager = true;
- }
+ static already_AddRefed<nsGlobalChromeWindow> Create(nsGlobalWindow *aOuterWindow);
static PLDHashOperator
DisconnectGroupMessageManager(const nsAString& aKey,
nsIMessageBroadcaster* aMM,
void* aUserArg)
{
if (aMM) {
static_cast<nsFrameMessageManager*>(aMM)->Disconnect();
}
return PL_DHASH_NEXT;
}
protected:
+ explicit nsGlobalChromeWindow(nsGlobalWindow *aOuterWindow)
+ : nsGlobalWindow(aOuterWindow),
+ mGroupMessageManagers(1)
+ {
+ mIsChrome = true;
+ mCleanMessageManager = true;
+ }
+
~nsGlobalChromeWindow()
{
NS_ABORT_IF_FALSE(mCleanMessageManager,
"chrome windows may always disconnect the msg manager");
mGroupMessageManagers.EnumerateRead(DisconnectGroupMessageManager, nullptr);
mGroupMessageManagers.Clear();
@@ -1719,39 +1726,41 @@ public:
* nsGlobalModalWindow inherits from nsGlobalWindow. It is the global
* object created for a modal content windows only (i.e. not modal
* chrome dialogs).
*/
class nsGlobalModalWindow : public nsGlobalWindow,
public nsIDOMModalContentWindow
{
public:
+ NS_DECL_ISUPPORTS_INHERITED
+ NS_DECL_NSIDOMMODALCONTENTWINDOW
+
+ static already_AddRefed<nsGlobalModalWindow> Create(nsGlobalWindow *aOuterWindow);
+
+protected:
explicit nsGlobalModalWindow(nsGlobalWindow *aOuterWindow)
: nsGlobalWindow(aOuterWindow)
{
mIsModalContentWindow = true;
}
- NS_DECL_ISUPPORTS_INHERITED
- NS_DECL_NSIDOMMODALCONTENTWINDOW
-
-protected:
~nsGlobalModalWindow() {}
};
/* factory function */
inline already_AddRefed<nsGlobalWindow>
NS_NewScriptGlobalObject(bool aIsChrome, bool aIsModalContentWindow)
{
nsRefPtr<nsGlobalWindow> global;
if (aIsChrome) {
- global = new nsGlobalChromeWindow(nullptr);
+ global = nsGlobalChromeWindow::Create(nullptr);
} else if (aIsModalContentWindow) {
- global = new nsGlobalModalWindow(nullptr);
+ global = nsGlobalModalWindow::Create(nullptr);
} else {
- global = new nsGlobalWindow(nullptr);
+ global = nsGlobalWindow::Create(nullptr);
}
return global.forget();
}
#endif /* nsGlobalWindow_h___ */
--- a/dom/base/nsHistory.cpp
+++ b/dom/base/nsHistory.cpp
@@ -41,17 +41,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_ENTRY(nsIDOMHistory) // Empty, needed for extension compat
NS_INTERFACE_MAP_END
nsHistory::nsHistory(nsPIDOMWindow* aInnerWindow)
: mInnerWindow(do_GetWeakReference(aInnerWindow))
{
- SetIsDOMBinding();
}
nsHistory::~nsHistory()
{
}
nsPIDOMWindow*
nsHistory::GetParentObject() const
--- a/dom/base/nsLocation.cpp
+++ b/dom/base/nsLocation.cpp
@@ -50,17 +50,16 @@ GetDocumentCharacterSetForURI(const nsAS
return NS_OK;
}
nsLocation::nsLocation(nsPIDOMWindow* aWindow, nsIDocShell *aDocShell)
: mInnerWindow(aWindow)
{
MOZ_ASSERT(aDocShell);
MOZ_ASSERT(mInnerWindow->IsInnerWindow());
- SetIsDOMBinding();
mDocShell = do_GetWeakReference(aDocShell);
}
nsLocation::~nsLocation()
{
RemoveURLSearchParams();
}
--- a/dom/base/nsMimeTypeArray.cpp
+++ b/dom/base/nsMimeTypeArray.cpp
@@ -28,17 +28,16 @@ NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(nsMimeTypeArray,
mWindow,
mMimeTypes,
mHiddenMimeTypes)
nsMimeTypeArray::nsMimeTypeArray(nsPIDOMWindow* aWindow)
: mWindow(aWindow)
{
- SetIsDOMBinding();
}
nsMimeTypeArray::~nsMimeTypeArray()
{
}
JSObject*
nsMimeTypeArray::WrapObject(JSContext* aCx)
@@ -228,26 +227,24 @@ NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(ns
nsMimeType::nsMimeType(nsPIDOMWindow* aWindow, nsPluginElement* aPluginElement,
uint32_t aPluginTagMimeIndex, const nsAString& aType)
: mWindow(aWindow),
mPluginElement(aPluginElement),
mPluginTagMimeIndex(aPluginTagMimeIndex),
mType(aType)
{
- SetIsDOMBinding();
}
nsMimeType::nsMimeType(nsPIDOMWindow* aWindow, const nsAString& aType)
: mWindow(aWindow),
mPluginElement(nullptr),
mPluginTagMimeIndex(0),
mType(aType)
{
- SetIsDOMBinding();
}
nsMimeType::~nsMimeType()
{
}
nsPIDOMWindow*
nsMimeType::GetParentObject() const
--- a/dom/base/nsPerformance.cpp
+++ b/dom/base/nsPerformance.cpp
@@ -35,17 +35,16 @@ nsPerformanceTiming::nsPerformanceTiming
: mPerformance(aPerformance),
mChannel(aChannel),
mFetchStart(0.0),
mZeroTime(aZeroTime),
mTimingAllowed(true),
mReportCrossOriginRedirect(true)
{
MOZ_ASSERT(aPerformance, "Parent performance object should be provided");
- SetIsDOMBinding();
if (!nsContentUtils::IsPerformanceTimingEnabled()) {
mZeroTime = 0;
}
// The aHttpChannel argument is null if this nsPerformanceTiming object
// is being used for the navigation timing (document) and has a non-null
// value for the resource timing (any resources within the page).
@@ -363,17 +362,16 @@ NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(ns
NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(nsPerformanceNavigation, AddRef)
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(nsPerformanceNavigation, Release)
nsPerformanceNavigation::nsPerformanceNavigation(nsPerformance* aPerformance)
: mPerformance(aPerformance)
{
MOZ_ASSERT(aPerformance, "Parent performance object should be provided");
- SetIsDOMBinding();
}
nsPerformanceNavigation::~nsPerformanceNavigation()
{
}
JSObject*
nsPerformanceNavigation::WrapObject(JSContext *cx)
@@ -396,17 +394,16 @@ nsPerformance::nsPerformance(nsPIDOMWind
: DOMEventTargetHelper(aWindow),
mWindow(aWindow),
mDOMTiming(aDOMTiming),
mChannel(aChannel),
mParentPerformance(aParentPerformance),
mPrimaryBufferSize(kDefaultBufferSize)
{
MOZ_ASSERT(aWindow, "Parent window object should be provided");
- SetIsDOMBinding();
}
nsPerformance::~nsPerformance()
{
}
// QueryInterface implementation for nsPerformance
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(nsPerformance)
--- a/dom/base/nsPluginArray.cpp
+++ b/dom/base/nsPluginArray.cpp
@@ -22,17 +22,16 @@
#include "nsIInterfaceRequestorUtils.h"
using namespace mozilla;
using namespace mozilla::dom;
nsPluginArray::nsPluginArray(nsPIDOMWindow* aWindow)
: mWindow(aWindow)
{
- SetIsDOMBinding();
}
void
nsPluginArray::Init()
{
nsCOMPtr<nsIObserverService> obsService =
mozilla::services::GetObserverService();
if (obsService) {
@@ -381,17 +380,16 @@ NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(nsPluginElement, mWindow, mMimeTypes)
nsPluginElement::nsPluginElement(nsPIDOMWindow* aWindow,
nsPluginTag* aPluginTag)
: mWindow(aWindow),
mPluginTag(aPluginTag)
{
- SetIsDOMBinding();
}
nsPluginElement::~nsPluginElement()
{
}
nsPIDOMWindow*
nsPluginElement::GetParentObject() const
--- a/dom/base/nsWindowRoot.cpp
+++ b/dom/base/nsWindowRoot.cpp
@@ -28,16 +28,17 @@
#endif
using namespace mozilla;
using namespace mozilla::dom;
nsWindowRoot::nsWindowRoot(nsPIDOMWindow* aWindow)
{
mWindow = aWindow;
+ SetIsNotDOMBinding();
}
nsWindowRoot::~nsWindowRoot()
{
if (mListenerManager) {
mListenerManager->Disconnect();
}
}
--- a/dom/base/nsWindowRoot.h
+++ b/dom/base/nsWindowRoot.h
@@ -56,16 +56,21 @@ public:
virtual void SetParentTarget(mozilla::dom::EventTarget* aTarget) MOZ_OVERRIDE
{
mParent = aTarget;
}
virtual mozilla::dom::EventTarget* GetParentTarget() MOZ_OVERRIDE { return mParent; }
virtual nsIDOMWindow* GetOwnerGlobal() MOZ_OVERRIDE;
+ virtual JSObject* WrapObject(JSContext* cx) MOZ_OVERRIDE
+ {
+ MOZ_CRASH("nsWindowRoot doesn't use DOM bindings!");
+ }
+
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS_AMBIGUOUS(nsWindowRoot,
nsIDOMEventTarget)
protected:
virtual ~nsWindowRoot();
// Members
nsCOMPtr<nsPIDOMWindow> mWindow;
--- a/dom/base/nsWrapperCache.h
+++ b/dom/base/nsWrapperCache.h
@@ -9,16 +9,24 @@
#include "nsCycleCollectionParticipant.h"
#include "mozilla/Assertions.h"
#include "js/Class.h"
#include "js/Id.h" // must come before js/RootingAPI.h
#include "js/Value.h" // must come before js/RootingAPI.h
#include "js/RootingAPI.h"
#include "js/TracingAPI.h"
+namespace mozilla {
+namespace dom {
+class TabChildGlobal;
+} // namespace dom
+} // namespace mozilla
+class SandboxPrivate;
+class nsInProcessTabChildGlobal;
+class nsWindowRoot;
class XPCWrappedNativeScope;
#define NS_WRAPPERCACHE_IID \
{ 0x6f3179a1, 0x36f7, 0x4a5c, \
{ 0x8c, 0xf1, 0xad, 0xc8, 0x7c, 0xde, 0x3e, 0x87 } }
/**
* Class to store the wrapper for an object. This can only be used with objects
@@ -32,20 +40,20 @@ class XPCWrappedNativeScope;
*
* The cache can store objects other than wrappers. We allow wrappers to use a
* separate JSObject to store their state (mostly expandos). If the wrapper is
* collected and we want to preserve this state we actually store the state
* object in the cache.
*
* The cache can store 2 types of objects:
*
- * If WRAPPER_IS_DOM_BINDING is not set (IsDOMBinding() returns false):
- * - a slim wrapper or the JSObject of an XPCWrappedNative wrapper
+ * If WRAPPER_IS_NOT_DOM_BINDING is set (IsDOMBinding() returns false):
+ * - the JSObject of an XPCWrappedNative wrapper
*
- * If WRAPPER_IS_DOM_BINDING is set (IsDOMBinding() returns true):
+ * If WRAPPER_IS_NOT_DOM_BINDING is not set (IsDOMBinding() returns true):
* - a DOM binding object (regular JS object or proxy)
*
* The finalizer for the wrapper clears the cache.
*
* A compacting GC can move the wrapper object. Pointers to moved objects are
* usually found and updated by tracing the heap, however non-preserved wrappers
* are weak references and are not traced, so another approach is
* necessary. Instead a class hook (objectMovedOp) is provided that is called
@@ -129,37 +137,26 @@ public:
}
}
bool PreservingWrapper()
{
return HasWrapperFlag(WRAPPER_BIT_PRESERVED);
}
- void SetIsDOMBinding()
- {
- MOZ_ASSERT(!mWrapper && !(GetWrapperFlags() & ~WRAPPER_IS_DOM_BINDING),
- "This flag should be set before creating any wrappers.");
- SetWrapperFlags(WRAPPER_IS_DOM_BINDING);
- }
-
bool IsDOMBinding() const
{
- return HasWrapperFlag(WRAPPER_IS_DOM_BINDING);
+ return !HasWrapperFlag(WRAPPER_IS_NOT_DOM_BINDING);
}
/**
* Wrap the object corresponding to this wrapper cache. If non-null is
* returned, the object has already been stored in the wrapper cache.
*/
- virtual JSObject* WrapObject(JSContext* cx)
- {
- MOZ_ASSERT(!IsDOMBinding(), "Someone forgot to override WrapObject");
- return nullptr;
- }
+ virtual JSObject* WrapObject(JSContext* cx) = 0;
/**
* Returns true if the object has a non-gray wrapper.
*/
bool IsBlack();
/**
* Returns true if the object has a black wrapper,
@@ -260,25 +257,36 @@ protected:
void PoisonWrapper()
{
if (mWrapper) {
mWrapper.setToCrashOnTouch();
}
}
private:
+ friend class mozilla::dom::TabChildGlobal;
+ friend class SandboxPrivate;
+ friend class nsInProcessTabChildGlobal;
+ friend class nsWindowRoot;
+ void SetIsNotDOMBinding()
+ {
+ MOZ_ASSERT(!mWrapper && !(GetWrapperFlags() & ~WRAPPER_IS_NOT_DOM_BINDING),
+ "This flag should be set before creating any wrappers.");
+ SetWrapperFlags(WRAPPER_IS_NOT_DOM_BINDING);
+ }
+
JSObject *GetWrapperJSObject() const
{
return mWrapper;
}
void SetWrapperJSObject(JSObject* aWrapper)
{
mWrapper = aWrapper;
- UnsetWrapperFlags(kWrapperFlagsMask & ~WRAPPER_IS_DOM_BINDING);
+ UnsetWrapperFlags(kWrapperFlagsMask & ~WRAPPER_IS_NOT_DOM_BINDING);
}
void TraceWrapperJSObject(JSTracer* aTrc, const char* aName);
FlagsType GetWrapperFlags() const
{
return mFlags & kWrapperFlagsMask;
}
@@ -318,22 +326,22 @@ private:
* traces/traverses/unlinks the cached JS object (see
* NS_IMPL_CYCLE_COLLECTION_TRACE_PRESERVED_WRAPPER,
* NS_IMPL_CYCLE_COLLECTION_TRAVERSE_SCRIPT_OBJECTS and
* NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER).
*/
enum { WRAPPER_BIT_PRESERVED = 1 << 0 };
/**
- * If this bit is set then the wrapper for the native object is a DOM binding
- * (regular JS object or proxy).
+ * If this bit is set then the wrapper for the native object is not a DOM
+ * binding.
*/
- enum { WRAPPER_IS_DOM_BINDING = 1 << 1 };
+ enum { WRAPPER_IS_NOT_DOM_BINDING = 1 << 1 };
- enum { kWrapperFlagsMask = (WRAPPER_BIT_PRESERVED | WRAPPER_IS_DOM_BINDING) };
+ enum { kWrapperFlagsMask = (WRAPPER_BIT_PRESERVED | WRAPPER_IS_NOT_DOM_BINDING) };
JS::Heap<JSObject*> mWrapper;
FlagsType mFlags;
};
enum { WRAPPER_CACHE_FLAGS_BITS_USED = 2 };
NS_DEFINE_STATIC_IID_ACCESSOR(nsWrapperCache, NS_WRAPPERCACHE_IID)
--- a/dom/bindings/BindingUtils.h
+++ b/dom/bindings/BindingUtils.h
@@ -2863,17 +2863,16 @@ CreateGlobal(JSContext* aCx, T* aNative,
}
JSAutoCompartment ac(aCx, aGlobal);
{
js::SetReservedSlot(aGlobal, DOM_OBJECT_SLOT, PRIVATE_TO_JSVAL(aNative));
NS_ADDREF(aNative);
- aCache->SetIsDOMBinding();
aCache->SetWrapper(aGlobal);
dom::AllocateProtoAndIfaceCache(aGlobal,
CreateGlobalOptions<T>::ProtoAndIfaceCacheKind);
if (!CreateGlobalOptions<T>::PostCreateGlobal(aCx, aGlobal)) {
return false;
}
--- a/dom/bindings/Codegen.py
+++ b/dom/bindings/Codegen.py
@@ -13018,30 +13018,26 @@ class CGExampleClass(CGBindingImplClass)
visibility="public")],
destructor=ClassDestructor(visibility=destructorVisibility),
methods=self.methodDecls,
decorators=decorators,
extradeclarations=extradeclarations)
def define(self):
# Just override CGClass and do our own thing
- if self.descriptor.wrapperCache:
- setDOMBinding = " SetIsDOMBinding();\n"
- else:
- setDOMBinding = ""
if self.refcounted:
ctordtor = dedent("""
${nativeType}::${nativeType}()
{
- %s}
+ }
${nativeType}::~${nativeType}()
{
}
- """) % setDOMBinding
+ """)
else:
ctordtor = dedent("""
${nativeType}::${nativeType}()
{
MOZ_COUNT_CTOR(${nativeType});
}
${nativeType}::~${nativeType}()
@@ -13336,17 +13332,17 @@ class CGJSImplClass(CGBindingImplClass):
descriptor.interface.parent.identifier.name).jsImplParent
baseClasses = [ClassBase(parentClass)]
isupportsDecl = "NS_DECL_ISUPPORTS_INHERITED\n"
ccDecl = ("NS_DECL_CYCLE_COLLECTION_CLASS_INHERITED(%s, %s)\n" %
(descriptor.name, parentClass))
constructorBody = dedent("""
// Make sure we're an nsWrapperCache already
MOZ_ASSERT(static_cast<nsWrapperCache*>(this));
- // And that our ancestor has called SetIsDOMBinding()
+ // And that our ancestor has not called SetIsNotDOMBinding()
MOZ_ASSERT(IsDOMBinding());
""")
extradefinitions = fill(
"""
NS_IMPL_CYCLE_COLLECTION_INHERITED(${ifaceName}, ${parentClass}, mImpl, mParent)
NS_IMPL_ADDREF_INHERITED(${ifaceName}, ${parentClass})
NS_IMPL_RELEASE_INHERITED(${ifaceName}, ${parentClass})
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(${ifaceName})
@@ -13355,17 +13351,16 @@ class CGJSImplClass(CGBindingImplClass):
ifaceName=self.descriptor.name,
parentClass=parentClass)
else:
baseClasses = [ClassBase("nsSupportsWeakReference"),
ClassBase("nsWrapperCache")]
isupportsDecl = "NS_DECL_CYCLE_COLLECTING_ISUPPORTS\n"
ccDecl = ("NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(%s)\n" %
descriptor.name)
- constructorBody = "SetIsDOMBinding();\n"
extradefinitions = fill(
"""
NS_IMPL_CYCLE_COLLECTION_CLASS(${ifaceName})
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(${ifaceName})
NS_IMPL_CYCLE_COLLECTION_UNLINK(mImpl)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mParent)
NS_IMPL_CYCLE_COLLECTION_UNLINK_PRESERVED_WRAPPER
tmp->ClearWeakReferences();
@@ -13424,18 +13419,17 @@ class CGJSImplClass(CGBindingImplClass):
# We only have C++ ancestors, so only pass along the window
baseConstructors.insert(0,
"%s(aParent)" % parentClass)
constructor = ClassConstructor(
[Argument("JS::Handle<JSObject*>", "aJSImplObject"),
Argument("nsPIDOMWindow*", "aParent")],
visibility="public",
- baseConstructors=baseConstructors,
- body=constructorBody)
+ baseConstructors=baseConstructors)
self.methodDecls.append(
ClassMethod("_Create",
"bool",
JSNativeArguments(),
static=True,
body=self.getCreateFromExistingBody()))
--- a/dom/bluetooth/BluetoothAdapter.cpp
+++ b/dom/bluetooth/BluetoothAdapter.cpp
@@ -164,17 +164,16 @@ BluetoothAdapter::BluetoothAdapter(nsPID
, mJsDeviceAddresses(nullptr)
, mDiscoverable(false)
, mDiscovering(false)
, mPairable(false)
, mPowered(false)
, mIsRooted(false)
{
MOZ_ASSERT(aWindow);
- MOZ_ASSERT(IsDOMBinding());
const InfallibleTArray<BluetoothNamedValue>& values =
aValue.get_ArrayOfBluetoothNamedValue();
for (uint32_t i = 0; i < values.Length(); ++i) {
SetPropertyByValue(values[i]);
}
BluetoothService* bs = BluetoothService::Get();
--- a/dom/bluetooth/BluetoothDevice.cpp
+++ b/dom/bluetooth/BluetoothDevice.cpp
@@ -51,17 +51,16 @@ BluetoothDevice::BluetoothDevice(nsPIDOM
: DOMEventTargetHelper(aWindow)
, BluetoothPropertyContainer(BluetoothObjectType::TYPE_DEVICE)
, mJsUuids(nullptr)
, mJsServices(nullptr)
, mAdapterPath(aAdapterPath)
, mIsRooted(false)
{
MOZ_ASSERT(aWindow);
- MOZ_ASSERT(IsDOMBinding());
const InfallibleTArray<BluetoothNamedValue>& values =
aValue.get_ArrayOfBluetoothNamedValue();
for (uint32_t i = 0; i < values.Length(); ++i) {
SetPropertyByValue(values[i]);
}
BluetoothService* bs = BluetoothService::Get();
--- a/dom/bluetooth/BluetoothManager.cpp
+++ b/dom/bluetooth/BluetoothManager.cpp
@@ -95,17 +95,16 @@ private:
nsRefPtr<BluetoothManager> mManagerPtr;
};
BluetoothManager::BluetoothManager(nsPIDOMWindow *aWindow)
: DOMEventTargetHelper(aWindow)
, BluetoothPropertyContainer(BluetoothObjectType::TYPE_MANAGER)
{
MOZ_ASSERT(aWindow);
- MOZ_ASSERT(IsDOMBinding());
mPath.Assign('/');
BluetoothService* bs = BluetoothService::Get();
NS_ENSURE_TRUE_VOID(bs);
bs->RegisterBluetoothSignalHandler(NS_LITERAL_STRING(KEY_MANAGER), this);
}
--- a/dom/bluetooth2/BluetoothAdapter.cpp
+++ b/dom/bluetooth2/BluetoothAdapter.cpp
@@ -190,17 +190,16 @@ BluetoothAdapter::BluetoothAdapter(nsPID
const BluetoothValue& aValue)
: DOMEventTargetHelper(aWindow)
, mState(BluetoothAdapterState::Disabled)
, mDiscoverable(false)
, mDiscovering(false)
, mDiscoveryHandleInUse(nullptr)
{
MOZ_ASSERT(aWindow);
- MOZ_ASSERT(IsDOMBinding());
mPairingReqs = BluetoothPairingListener::Create(aWindow);
const InfallibleTArray<BluetoothNamedValue>& values =
aValue.get_ArrayOfBluetoothNamedValue();
for (uint32_t i = 0; i < values.Length(); ++i) {
SetPropertyByValue(values[i]);
}
--- a/dom/bluetooth2/BluetoothClassOfDevice.cpp
+++ b/dom/bluetooth2/BluetoothClassOfDevice.cpp
@@ -39,17 +39,16 @@ NS_INTERFACE_MAP_END
// Bit 7 ~ Bit 2: Minor device class
#define GET_MINOR_DEVICE_CLASS(cod) (((cod) & 0xfc) >> 2)
BluetoothClassOfDevice::BluetoothClassOfDevice(nsPIDOMWindow* aOwner)
: mOwnerWindow(aOwner)
{
MOZ_ASSERT(aOwner);
- SetIsDOMBinding();
Reset();
}
BluetoothClassOfDevice::~BluetoothClassOfDevice()
{}
void
--- a/dom/bluetooth2/BluetoothDevice.cpp
+++ b/dom/bluetooth2/BluetoothDevice.cpp
@@ -73,17 +73,16 @@ private:
BluetoothDevice::BluetoothDevice(nsPIDOMWindow* aWindow,
const BluetoothValue& aValue)
: DOMEventTargetHelper(aWindow)
, mPaired(false)
, mType(BluetoothDeviceType::Unknown)
{
MOZ_ASSERT(aWindow);
- MOZ_ASSERT(IsDOMBinding());
mCod = BluetoothClassOfDevice::Create(aWindow);
const InfallibleTArray<BluetoothNamedValue>& values =
aValue.get_ArrayOfBluetoothNamedValue();
for (uint32_t i = 0; i < values.Length(); ++i) {
SetPropertyByValue(values[i]);
}
--- a/dom/bluetooth2/BluetoothDiscoveryHandle.cpp
+++ b/dom/bluetooth2/BluetoothDiscoveryHandle.cpp
@@ -19,17 +19,16 @@ NS_INTERFACE_MAP_END_INHERITING(DOMEvent
NS_IMPL_ADDREF_INHERITED(BluetoothDiscoveryHandle, DOMEventTargetHelper)
NS_IMPL_RELEASE_INHERITED(BluetoothDiscoveryHandle, DOMEventTargetHelper)
BluetoothDiscoveryHandle::BluetoothDiscoveryHandle(nsPIDOMWindow* aWindow)
: DOMEventTargetHelper(aWindow)
{
MOZ_ASSERT(aWindow);
- MOZ_ASSERT(IsDOMBinding());
}
BluetoothDiscoveryHandle::~BluetoothDiscoveryHandle()
{
}
// static
already_AddRefed<BluetoothDiscoveryHandle>
--- a/dom/bluetooth2/BluetoothManager.cpp
+++ b/dom/bluetooth2/BluetoothManager.cpp
@@ -86,17 +86,16 @@ private:
nsRefPtr<BluetoothManager> mManager;
};
BluetoothManager::BluetoothManager(nsPIDOMWindow *aWindow)
: DOMEventTargetHelper(aWindow)
, mDefaultAdapterIndex(-1)
{
MOZ_ASSERT(aWindow);
- MOZ_ASSERT(IsDOMBinding());
ListenToBluetoothSignal(true);
BT_API2_LOGR("aWindow %p", aWindow);
// Query adapters list from bluetooth backend
BluetoothService* bs = BluetoothService::Get();
NS_ENSURE_TRUE_VOID(bs);
--- a/dom/bluetooth2/BluetoothPairingHandle.cpp
+++ b/dom/bluetooth2/BluetoothPairingHandle.cpp
@@ -38,18 +38,16 @@ BluetoothPairingHandle::BluetoothPairing
MOZ_ASSERT(aOwner && !aDeviceAddress.IsEmpty() && !aType.IsEmpty());
if (aType.EqualsLiteral(PAIRING_REQ_TYPE_DISPLAYPASSKEY) ||
aType.EqualsLiteral(PAIRING_REQ_TYPE_CONFIRMATION)) {
MOZ_ASSERT(!aPasskey.IsEmpty());
} else {
MOZ_ASSERT(aPasskey.IsEmpty());
}
-
- SetIsDOMBinding();
}
BluetoothPairingHandle::~BluetoothPairingHandle()
{
}
already_AddRefed<BluetoothPairingHandle>
BluetoothPairingHandle::Create(nsPIDOMWindow* aOwner,
--- a/dom/bluetooth2/BluetoothPairingListener.cpp
+++ b/dom/bluetooth2/BluetoothPairingListener.cpp
@@ -16,17 +16,16 @@ NS_INTERFACE_MAP_END_INHERITING(DOMEvent
NS_IMPL_ADDREF_INHERITED(BluetoothPairingListener, DOMEventTargetHelper)
NS_IMPL_RELEASE_INHERITED(BluetoothPairingListener, DOMEventTargetHelper)
BluetoothPairingListener::BluetoothPairingListener(nsPIDOMWindow* aWindow)
: DOMEventTargetHelper(aWindow)
{
MOZ_ASSERT(aWindow);
- MOZ_ASSERT(IsDOMBinding());
}
already_AddRefed<BluetoothPairingListener>
BluetoothPairingListener::Create(nsPIDOMWindow* aWindow)
{
MOZ_ASSERT(NS_IsMainThread());
MOZ_ASSERT(aWindow);
--- a/dom/camera/DOMCameraCapabilities.cpp
+++ b/dom/camera/DOMCameraCapabilities.cpp
@@ -52,17 +52,16 @@ CameraCapabilities::HasSupport(JSContext
CameraCapabilities::CameraCapabilities(nsPIDOMWindow* aWindow)
: mRecorderProfiles(JS::UndefinedValue())
, mWindow(aWindow)
{
DOM_CAMERA_LOGT("%s:%d : this=%p\n", __func__, __LINE__, this);
MOZ_COUNT_CTOR(CameraCapabilities);
mozilla::HoldJSObjects(this);
- SetIsDOMBinding();
}
CameraCapabilities::~CameraCapabilities()
{
DOM_CAMERA_LOGT("%s:%d : this=%p\n", __func__, __LINE__, this);
mRecorderProfiles = JS::UndefinedValue();
mozilla::DropJSObjects(this);
MOZ_COUNT_DTOR(CameraCapabilities);
--- a/dom/camera/DOMCameraControl.cpp
+++ b/dom/camera/DOMCameraControl.cpp
@@ -175,17 +175,16 @@ nsDOMCameraControl::nsDOMCameraControl(u
, mOnFacesDetectedCb(nullptr)
, mWindow(aWindow)
, mPreviewState(CameraControlListener::kPreviewStopped)
{
DOM_CAMERA_LOGT("%s:%d : this=%p\n", __func__, __LINE__, this);
mInput = new CameraPreviewMediaStream(this);
BindToOwner(aWindow);
- SetIsDOMBinding();
nsRefPtr<DOMCameraConfiguration> initialConfig =
new DOMCameraConfiguration(aInitialConfig);
// Create and initialize the underlying camera.
ICameraControl::Configuration config;
bool haveInitialConfig = false;
nsresult rv;
--- a/dom/camera/DOMCameraDetectedFace.cpp
+++ b/dom/camera/DOMCameraDetectedFace.cpp
@@ -47,11 +47,9 @@ DOMCameraDetectedFace::DOMCameraDetected
mLeftEye = new DOMPoint(this, aFace.leftEye.x, aFace.leftEye.y);
}
if (aFace.hasRightEye) {
mRightEye = new DOMPoint(this, aFace.rightEye.x, aFace.rightEye.y);
}
if (aFace.hasMouth) {
mMouth = new DOMPoint(this, aFace.mouth.x, aFace.mouth.y);
}
-
- SetIsDOMBinding();
}
--- a/dom/camera/DOMCameraManager.cpp
+++ b/dom/camera/DOMCameraManager.cpp
@@ -56,17 +56,16 @@ GetCameraLog()
nsDOMCameraManager::nsDOMCameraManager(nsPIDOMWindow* aWindow)
: mWindowId(aWindow->WindowID())
, mPermission(nsIPermissionManager::DENY_ACTION)
, mWindow(aWindow)
{
/* member initializers and constructor code */
DOM_CAMERA_LOGT("%s:%d : this=%p, windowId=%llx\n", __func__, __LINE__, this, mWindowId);
MOZ_COUNT_CTOR(nsDOMCameraManager);
- SetIsDOMBinding();
}
nsDOMCameraManager::~nsDOMCameraManager()
{
/* destructor code */
MOZ_COUNT_DTOR(nsDOMCameraManager);
DOM_CAMERA_LOGT("%s:%d : this=%p\n", __func__, __LINE__, this);
}
--- a/dom/canvas/CanvasGradient.h
+++ b/dom/canvas/CanvasGradient.h
@@ -61,17 +61,16 @@ public:
return mContext;
}
protected:
CanvasGradient(CanvasRenderingContext2D* aContext, Type aType)
: mContext(aContext)
, mType(aType)
{
- SetIsDOMBinding();
}
nsRefPtr<CanvasRenderingContext2D> mContext;
nsTArray<mozilla::gfx::GradientStop> mRawStops;
mozilla::RefPtr<mozilla::gfx::GradientStops> mStops;
Type mType;
virtual ~CanvasGradient() {}
};
--- a/dom/canvas/CanvasPattern.h
+++ b/dom/canvas/CanvasPattern.h
@@ -45,17 +45,16 @@ public:
: mContext(aContext)
, mSurface(aSurface)
, mPrincipal(principalForSecurityCheck)
, mTransform()
, mForceWriteOnly(forceWriteOnly)
, mCORSUsed(CORSUsed)
, mRepeat(aRepeat)
{
- SetIsDOMBinding();
}
JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE
{
return CanvasPatternBinding::Wrap(aCx, this);
}
CanvasRenderingContext2D* GetParentObject()
--- a/dom/canvas/CanvasRenderingContext2D.cpp
+++ b/dom/canvas/CanvasRenderingContext2D.cpp
@@ -827,17 +827,16 @@ CanvasRenderingContext2D::CanvasRenderin
, mResetLayer(true)
, mIPC(false)
, mStream(nullptr)
, mIsEntireFrameInvalid(false)
, mPredictManyRedrawCalls(false), mPathTransformWillUpdate(false)
, mInvalidateCount(0)
{
sNumLivingContexts++;
- SetIsDOMBinding();
// The default is to use OpenGL mode
if (!gfxPlatform::GetPlatform()->UseAcceleratedSkiaCanvas()) {
mRenderingMode = RenderingMode::SoftwareBackendMode;
}
}
@@ -4945,26 +4944,22 @@ CanvasRenderingContext2D::ShouldForceIna
NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(CanvasPath, AddRef)
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(CanvasPath, Release)
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(CanvasPath, mParent)
CanvasPath::CanvasPath(nsISupports* aParent)
: mParent(aParent)
{
- SetIsDOMBinding();
-
mPathBuilder = gfxPlatform::GetPlatform()->ScreenReferenceDrawTarget()->CreatePathBuilder();
}
CanvasPath::CanvasPath(nsISupports* aParent, TemporaryRef<PathBuilder> aPathBuilder)
: mParent(aParent), mPathBuilder(aPathBuilder)
{
- SetIsDOMBinding();
-
if (!mPathBuilder) {
mPathBuilder = gfxPlatform::GetPlatform()->ScreenReferenceDrawTarget()->CreatePathBuilder();
}
}
JSObject*
CanvasPath::WrapObject(JSContext* aCx)
{
--- a/dom/canvas/WebGLBuffer.cpp
+++ b/dom/canvas/WebGLBuffer.cpp
@@ -12,17 +12,16 @@
using namespace mozilla;
WebGLBuffer::WebGLBuffer(WebGLContext *context)
: WebGLBindableName<BufferBinding>()
, WebGLContextBoundObject(context)
, mByteLength(0)
{
- SetIsDOMBinding();
mContext->MakeContextCurrent();
mContext->gl->fGenBuffers(1, &mGLName);
mContext->mBuffers.insertBack(this);
}
WebGLBuffer::~WebGLBuffer() {
DeleteOnce();
}
--- a/dom/canvas/WebGLContext.cpp
+++ b/dom/canvas/WebGLContext.cpp
@@ -224,18 +224,16 @@ WebGLContextOptions::WebGLContextOptions
if (Preferences::GetBool("webgl.default-no-alpha", false))
alpha = false;
}
WebGLContext::WebGLContext()
: gl(nullptr)
, mNeedsFakeNoAlpha(false)
{
- SetIsDOMBinding();
-
mGeneration = 0;
mInvalidated = false;
mShouldPresent = true;
mResetLayer = true;
mOptionsFrozen = false;
mActiveTexture = 0;
mPixelStoreFlipY = false;
--- a/dom/canvas/WebGLExtensionBase.cpp
+++ b/dom/canvas/WebGLExtensionBase.cpp
@@ -7,17 +7,16 @@
#include "WebGLExtensions.h"
using namespace mozilla;
WebGLExtensionBase::WebGLExtensionBase(WebGLContext* context)
: WebGLContextBoundObject(context)
, mIsLost(false)
{
- SetIsDOMBinding();
}
WebGLExtensionBase::~WebGLExtensionBase()
{
}
void
WebGLExtensionBase::MarkLost()
--- a/dom/canvas/WebGLFramebuffer.cpp
+++ b/dom/canvas/WebGLFramebuffer.cpp
@@ -29,17 +29,16 @@ WebGLFramebuffer::WrapObject(JSContext*
WebGLFramebuffer::WebGLFramebuffer(WebGLContext* context)
: WebGLBindableName<FBTarget>()
, WebGLContextBoundObject(context)
, mStatus(0)
, mDepthAttachment(LOCAL_GL_DEPTH_ATTACHMENT)
, mStencilAttachment(LOCAL_GL_STENCIL_ATTACHMENT)
, mDepthStencilAttachment(LOCAL_GL_DEPTH_STENCIL_ATTACHMENT)
{
- SetIsDOMBinding();
mContext->MakeContextCurrent();
mContext->gl->fGenFramebuffers(1, &mGLName);
mContext->mFramebuffers.insertBack(this);
mColorAttachments.SetLength(1);
mColorAttachments[0].mAttachmentPoint = LOCAL_GL_COLOR_ATTACHMENT0;
}
--- a/dom/canvas/WebGLProgram.cpp
+++ b/dom/canvas/WebGLProgram.cpp
@@ -55,17 +55,16 @@ WebGLProgram::WebGLProgram(WebGLContext
: WebGLContextBoundObject(context)
, mLinkStatus(false)
, mGeneration(0)
, mIdentifierMap(new CStringMap)
, mIdentifierReverseMap(new CStringMap)
, mUniformInfoMap(new CStringToUniformInfoMap)
, mAttribMaxNameLength(0)
{
- SetIsDOMBinding();
mContext->MakeContextCurrent();
mGLName = mContext->gl->fCreateProgram();
mContext->mPrograms.insertBack(this);
}
void
WebGLProgram::Delete() {
DetachShaders();
--- a/dom/canvas/WebGLQuery.cpp
+++ b/dom/canvas/WebGLQuery.cpp
@@ -16,17 +16,16 @@ WebGLQuery::WrapObject(JSContext *cx) {
return dom::WebGLQueryBinding::Wrap(cx, this);
}
WebGLQuery::WebGLQuery(WebGLContext* context)
: WebGLContextBoundObject(context)
, mGLName(0)
, mType(0)
{
- SetIsDOMBinding();
mContext->mQueries.insertBack(this);
mContext->MakeContextCurrent();
mContext->gl->fGenQueries(1, &mGLName);
}
void WebGLQuery::Delete() {
mContext->MakeContextCurrent();
--- a/dom/canvas/WebGLRenderbuffer.cpp
+++ b/dom/canvas/WebGLRenderbuffer.cpp
@@ -46,17 +46,16 @@ WebGLRenderbuffer::WebGLRenderbuffer(Web
: WebGLBindableName<RBTarget>()
, WebGLContextBoundObject(context)
, mPrimaryRB(0)
, mSecondaryRB(0)
, mInternalFormat(0)
, mInternalFormatForGL(0)
, mImageDataStatus(WebGLImageDataStatus::NoImageData)
{
- SetIsDOMBinding();
mContext->MakeContextCurrent();
mContext->gl->fGenRenderbuffers(1, &mPrimaryRB);
if (!SupportsDepthStencil(mContext->gl))
mContext->gl->fGenRenderbuffers(1, &mSecondaryRB);
mContext->mRenderbuffers.insertBack(this);
}
--- a/dom/canvas/WebGLSampler.cpp
+++ b/dom/canvas/WebGLSampler.cpp
@@ -10,17 +10,16 @@
#include "mozilla/dom/WebGL2RenderingContextBinding.h"
using namespace mozilla;
WebGLSampler::WebGLSampler(WebGLContext* context)
: WebGLContextBoundObject(context)
{
- SetIsDOMBinding();
MOZ_CRASH("Not Implemented.");
}
WebGLSampler::~WebGLSampler()
{}
void
WebGLSampler::Delete()
--- a/dom/canvas/WebGLShader.cpp
+++ b/dom/canvas/WebGLShader.cpp
@@ -19,17 +19,16 @@ WebGLShader::WrapObject(JSContext *cx) {
WebGLShader::WebGLShader(WebGLContext *context, GLenum stype)
: WebGLContextBoundObject(context)
, mType(stype)
, mNeedsTranslation(true)
, mAttribMaxNameLength(0)
, mCompileStatus(false)
{
- SetIsDOMBinding();
mContext->MakeContextCurrent();
mGLName = mContext->gl->fCreateShader(mType);
mContext->mShaders.insertBack(this);
}
void
WebGLShader::Delete() {
mSource.Truncate();
--- a/dom/canvas/WebGLTexture.cpp
+++ b/dom/canvas/WebGLTexture.cpp
@@ -30,17 +30,16 @@ WebGLTexture::WebGLTexture(WebGLContext
, mWrapS(LOCAL_GL_REPEAT)
, mWrapT(LOCAL_GL_REPEAT)
, mFacesCount(0)
, mMaxLevelWithCustomImages(0)
, mHaveGeneratedMipmap(false)
, mImmutable(false)
, mFakeBlackStatus(WebGLTextureFakeBlackStatus::IncompleteTexture)
{
- SetIsDOMBinding();
mContext->MakeContextCurrent();
mContext->gl->fGenTextures(1, &mGLName);
mContext->mTextures.insertBack(this);
}
void
WebGLTexture::Delete() {
mImageInfos.Clear();
--- a/dom/canvas/WebGLTransformFeedback.cpp
+++ b/dom/canvas/WebGLTransformFeedback.cpp
@@ -10,17 +10,16 @@
#include "mozilla/dom/WebGL2RenderingContextBinding.h"
using namespace mozilla;
WebGLTransformFeedback::WebGLTransformFeedback(WebGLContext* context)
: WebGLContextBoundObject(context)
{
- SetIsDOMBinding();
MOZ_CRASH("Not Implemented.");
}
WebGLTransformFeedback::~WebGLTransformFeedback()
{}
void
WebGLTransformFeedback::Delete()
--- a/dom/canvas/WebGLVertexArray.cpp
+++ b/dom/canvas/WebGLVertexArray.cpp
@@ -18,17 +18,16 @@ JSObject*
WebGLVertexArray::WrapObject(JSContext *cx) {
return dom::WebGLVertexArrayBinding::Wrap(cx, this);
}
WebGLVertexArray::WebGLVertexArray(WebGLContext* context)
: WebGLBindableName<VAOBinding>()
, WebGLContextBoundObject(context)
{
- SetIsDOMBinding();
context->mVertexArrays.insertBack(this);
}
WebGLVertexArray*
WebGLVertexArray::Create(WebGLContext* context)
{
WebGLVertexArray* array;
if (context->gl->IsSupported(gl::GLFeature::vertex_array_object)) {
--- a/dom/cellbroadcast/CellBroadcastMessage.cpp
+++ b/dom/cellbroadcast/CellBroadcastMessage.cpp
@@ -92,18 +92,16 @@ CellBroadcastMessage::CellBroadcastMessa
mMessageClass.SetValue(
ToWebidlEnum<CellBroadcastMessageClass>(aMessageClass));
}
// CdmaServiceCategory represents a 16bit unsigned value.
if (aCdmaServiceCategory <= 0xFFFFU) {
mCdmaServiceCategory.SetValue(static_cast<uint16_t>(aCdmaServiceCategory));
}
-
- SetIsDOMBinding();
}
JSObject*
CellBroadcastMessage::WrapObject(JSContext* aCx)
{
return MozCellBroadcastMessageBinding::Wrap(aCx, this);
}
@@ -135,18 +133,16 @@ CellBroadcastEtwsInfo::CellBroadcastEtws
: mWindow(aWindow)
, mEmergencyUserAlert(aEmergencyUserAlert)
, mPopup(aPopup)
{
if (aWarningType < nsICellBroadcastService::GSM_ETWS_WARNING_INVALID) {
mWarningType.SetValue(
ToWebidlEnum<CellBroadcastEtwsWarningType>(aWarningType));
}
-
- SetIsDOMBinding();
}
JSObject*
CellBroadcastEtwsInfo::WrapObject(JSContext* aCx)
{
return MozCellBroadcastEtwsInfoBinding::Wrap(aCx, this);
}
--- a/dom/crypto/CryptoKey.cpp
+++ b/dom/crypto/CryptoKey.cpp
@@ -50,17 +50,16 @@ StringToUsage(const nsString& aUsage, Cr
CryptoKey::CryptoKey(nsIGlobalObject* aGlobal)
: mGlobal(aGlobal)
, mAttributes(0)
, mSymKey()
, mPrivateKey(nullptr)
, mPublicKey(nullptr)
{
- SetIsDOMBinding();
}
CryptoKey::~CryptoKey()
{
nsNSSShutDownPreventionLock locker;
if (isAlreadyShutDown()) {
return;
}
--- a/dom/events/CompositionEvent.cpp
+++ b/dom/events/CompositionEvent.cpp
@@ -27,17 +27,18 @@ CompositionEvent::CompositionEvent(Event
mEvent->time = PR_Now();
// XXX compositionstart is cancelable in draft of DOM3 Events.
// However, it doesn't make sence for us, we cannot cancel composition
// when we sends compositionstart event.
mEvent->mFlags.mCancelable = false;
}
- mData = mEvent->AsCompositionEvent()->data;
+ // XXX Do we really need to duplicate the data value?
+ mData = mEvent->AsCompositionEvent()->mData;
// TODO: Native event should have locale information.
}
NS_IMPL_ADDREF_INHERITED(CompositionEvent, UIEvent)
NS_IMPL_RELEASE_INHERITED(CompositionEvent, UIEvent)
NS_INTERFACE_MAP_BEGIN(CompositionEvent)
NS_INTERFACE_MAP_ENTRY(nsIDOMCompositionEvent)
--- a/dom/events/DOMEventTargetHelper.h
+++ b/dom/events/DOMEventTargetHelper.h
@@ -37,27 +37,23 @@ public:
{
}
explicit DOMEventTargetHelper(nsPIDOMWindow* aWindow)
: mParentObject(nullptr)
, mOwnerWindow(nullptr)
, mHasOrHasHadOwnerWindow(false)
{
BindToOwner(aWindow);
- // All objects coming through here are WebIDL objects
- SetIsDOMBinding();
}
explicit DOMEventTargetHelper(DOMEventTargetHelper* aOther)
: mParentObject(nullptr)
, mOwnerWindow(nullptr)
, mHasOrHasHadOwnerWindow(false)
{
BindToOwner(aOther);
- // All objects coming through here are WebIDL objects
- SetIsDOMBinding();
}
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SKIPPABLE_SCRIPT_HOLDER_CLASS(DOMEventTargetHelper)
NS_DECL_NSIDOMEVENTTARGET
virtual EventListenerManager* GetExistingListenerManager() const MOZ_OVERRIDE;
--- a/dom/events/DataTransfer.cpp
+++ b/dom/events/DataTransfer.cpp
@@ -78,17 +78,16 @@ DataTransfer::DataTransfer(nsISupports*
mIsExternal(aIsExternal),
mUserCancelled(false),
mIsCrossDomainSubFrameDrop(false),
mClipboardType(aClipboardType),
mDragImageX(0),
mDragImageY(0)
{
MOZ_ASSERT(mParent);
- SetIsDOMBinding();
// For these events, we want to be able to add data to the data transfer, so
// clear the readonly state. Otherwise, the data is already present. For
// external usage, cache the data from the native clipboard or drag.
if (aEventType == NS_CUT ||
aEventType == NS_COPY ||
aEventType == NS_DRAGDROP_START ||
aEventType == NS_DRAGDROP_GESTURE) {
mReadOnly = false;
@@ -124,17 +123,16 @@ DataTransfer::DataTransfer(nsISupports*
mIsCrossDomainSubFrameDrop(aIsCrossDomainSubFrameDrop),
mClipboardType(aClipboardType),
mItems(aItems),
mDragImage(aDragImage),
mDragImageX(aDragImageX),
mDragImageY(aDragImageY)
{
MOZ_ASSERT(mParent);
- SetIsDOMBinding();
// The items are copied from aItems into mItems. There is no need to copy
// the actual data in the items as the data transfer will be read only. The
// draggesture and dragstart events are the only times when items are
// modifiable, but those events should have been using the first constructor
// above.
NS_ASSERTION(aEventType != NS_DRAGDROP_GESTURE &&
aEventType != NS_DRAGDROP_START,
"invalid event type for DataTransfer constructor");
--- a/dom/events/DeviceMotionEvent.cpp
+++ b/dom/events/DeviceMotionEvent.cpp
@@ -104,17 +104,16 @@ DeviceAcceleration::DeviceAcceleration(D
Nullable<double> aX,
Nullable<double> aY,
Nullable<double> aZ)
: mOwner(aOwner)
, mX(aX)
, mY(aY)
, mZ(aZ)
{
- SetIsDOMBinding();
}
DeviceAcceleration::~DeviceAcceleration()
{
}
/******************************************************************************
* DeviceRotationRate
@@ -129,17 +128,16 @@ DeviceRotationRate::DeviceRotationRate(D
Nullable<double> aAlpha,
Nullable<double> aBeta,
Nullable<double> aGamma)
: mOwner(aOwner)
, mAlpha(aAlpha)
, mBeta(aBeta)
, mGamma(aGamma)
{
- SetIsDOMBinding();
}
DeviceRotationRate::~DeviceRotationRate()
{
}
} // namespace dom
} // namespace mozilla
--- a/dom/events/Event.cpp
+++ b/dom/events/Event.cpp
@@ -57,17 +57,16 @@ Event::Event(nsPIDOMWindow* aParent)
ConstructorInit(static_cast<nsGlobalWindow *>(aParent), nullptr, nullptr);
}
void
Event::ConstructorInit(EventTarget* aOwner,
nsPresContext* aPresContext,
WidgetEvent* aEvent)
{
- SetIsDOMBinding();
SetOwner(aOwner);
mIsMainThreadEvent = mOwner || NS_IsMainThread();
if (mIsMainThreadEvent) {
nsJSContext::LikelyShortLivingObjectCreated();
}
if (mIsMainThreadEvent && !sReturnHighResTimeStampIsSet) {
Preferences::AddBoolVarCache(&sReturnHighResTimeStamp,
--- a/dom/events/EventDispatcher.cpp
+++ b/dom/events/EventDispatcher.cpp
@@ -717,19 +717,16 @@ EventDispatcher::CreateEvent(EventTarget
return NS_NewDOMWheelEvent(aDOMEvent, aOwner, aPresContext,
aEvent->AsWheelEvent());
case eEditorInputEventClass:
return NS_NewDOMInputEvent(aDOMEvent, aOwner, aPresContext,
aEvent->AsEditorInputEvent());
case eDragEventClass:
return NS_NewDOMDragEvent(aDOMEvent, aOwner, aPresContext,
aEvent->AsDragEvent());
- case eTextEventClass:
- return NS_NewDOMUIEvent(aDOMEvent, aOwner, aPresContext,
- aEvent->AsTextEvent());
case eClipboardEventClass:
return NS_NewDOMClipboardEvent(aDOMEvent, aOwner, aPresContext,
aEvent->AsClipboardEvent());
case eSVGZoomEventClass:
return NS_NewDOMSVGZoomEvent(aDOMEvent, aOwner, aPresContext,
aEvent->AsSVGZoomEvent());
case eSMILTimeEventClass:
return NS_NewDOMTimeEvent(aDOMEvent, aOwner, aPresContext,
@@ -767,24 +764,24 @@ EventDispatcher::CreateEvent(EventTarget
if (aEventType.LowerCaseEqualsLiteral("mousescrollevents"))
return NS_NewDOMMouseScrollEvent(aDOMEvent, aOwner, aPresContext, nullptr);
if (aEventType.LowerCaseEqualsLiteral("dragevent") ||
aEventType.LowerCaseEqualsLiteral("dragevents"))
return NS_NewDOMDragEvent(aDOMEvent, aOwner, aPresContext, nullptr);
if (aEventType.LowerCaseEqualsLiteral("keyboardevent") ||
aEventType.LowerCaseEqualsLiteral("keyevents"))
return NS_NewDOMKeyboardEvent(aDOMEvent, aOwner, aPresContext, nullptr);
- if (aEventType.LowerCaseEqualsLiteral("compositionevent"))
+ if (aEventType.LowerCaseEqualsLiteral("compositionevent") ||
+ aEventType.LowerCaseEqualsLiteral("textevent") ||
+ aEventType.LowerCaseEqualsLiteral("textevents")) {
return NS_NewDOMCompositionEvent(aDOMEvent, aOwner, aPresContext, nullptr);
+ }
if (aEventType.LowerCaseEqualsLiteral("mutationevent") ||
aEventType.LowerCaseEqualsLiteral("mutationevents"))
return NS_NewDOMMutationEvent(aDOMEvent, aOwner, aPresContext, nullptr);
- if (aEventType.LowerCaseEqualsLiteral("textevent") ||
- aEventType.LowerCaseEqualsLiteral("textevents"))
- return NS_NewDOMUIEvent(aDOMEvent, aOwner, aPresContext, nullptr);
if (aEventType.LowerCaseEqualsLiteral("deviceorientationevent")) {
DeviceOrientationEventInit init;
nsRefPtr<DeviceOrientationEvent> event =
DeviceOrientationEvent::Constructor(aOwner, EmptyString(), init);
event.forget(aDOMEvent);
return NS_OK;
}
if (aEventType.LowerCaseEqualsLiteral("devicemotionevent"))
--- a/dom/events/EventNameList.h
+++ b/dom/events/EventNameList.h
@@ -646,20 +646,24 @@ NON_IDL_EVENT(warning,
eBasicEventClass)
NON_IDL_EVENT(speakerforcedchange,
NS_SPEAKERMANAGER_SPEAKERFORCEDCHANGE,
EventNameType_None,
eBasicEventClass)
// Events that only have on* attributes on XUL elements
+
+ // "text" event is legacy event for modifying composition string in nsEditor.
+ // This shouldn't be used by web/xul apps. "compositionupdate" should be
+ // used instead.
NON_IDL_EVENT(text,
- NS_TEXT_TEXT,
+ NS_COMPOSITION_CHANGE,
EventNameType_XUL,
- eTextEventClass)
+ eCompositionEventClass)
NON_IDL_EVENT(compositionstart,
NS_COMPOSITION_START,
EventNameType_XUL,
eCompositionEventClass)
NON_IDL_EVENT(compositionupdate,
NS_COMPOSITION_UPDATE,
EventNameType_XUL,
eCompositionEventClass)
--- a/dom/events/EventStateManager.cpp
+++ b/dom/events/EventStateManager.cpp
@@ -791,41 +791,30 @@ EventStateManager::PreHandleEvent(nsPres
DoContentCommandEvent(aEvent->AsContentCommandEvent());
}
break;
case NS_CONTENT_COMMAND_SCROLL:
{
DoContentCommandScrollEvent(aEvent->AsContentCommandEvent());
}
break;
- case NS_TEXT_TEXT:
- {
- WidgetTextEvent *textEvent = aEvent->AsTextEvent();
- if (IsTargetCrossProcess(textEvent)) {
- // Will not be handled locally, remote the event
- if (GetCrossProcessTarget()->SendTextEvent(*textEvent)) {
- // Cancel local dispatching
- aEvent->mFlags.mPropagationStopped = true;
- }
- }
- }
- break;
case NS_COMPOSITION_START:
if (aEvent->mFlags.mIsTrusted) {
// If the event is trusted event, set the selected text to data of
// composition event.
WidgetCompositionEvent* compositionEvent = aEvent->AsCompositionEvent();
WidgetQueryContentEvent selectedText(true, NS_QUERY_SELECTED_TEXT,
compositionEvent->widget);
DoQuerySelectedText(&selectedText);
NS_ASSERTION(selectedText.mSucceeded, "Failed to get selected text");
- compositionEvent->data = selectedText.mReply.mString;
+ compositionEvent->mData = selectedText.mReply.mString;
}
// through to compositionend handling
case NS_COMPOSITION_END:
+ case NS_COMPOSITION_CHANGE:
{
WidgetCompositionEvent* compositionEvent = aEvent->AsCompositionEvent();
if (IsTargetCrossProcess(compositionEvent)) {
// Will not be handled locally, remote the event
if (GetCrossProcessTarget()->SendCompositionEvent(*compositionEvent)) {
// Cancel local dispatching
aEvent->mFlags.mPropagationStopped = true;
}
--- a/dom/events/IMEStateManager.cpp
+++ b/dom/events/IMEStateManager.cpp
@@ -126,40 +126,27 @@ GetIMEStateSetOpenName(IMEState::Open aO
case IMEState::CLOSED:
return "CLOSED";
default:
return "illegal value";
}
}
static const char*
-GetEventClassIDName(EventClassID aEventClassID)
-{
- switch (aEventClassID) {
- case eCompositionEventClass:
- return "eCompositionEventClass";
- case eTextEventClass:
- return "eTextEventClass";
- default:
- return "unacceptable event struct type";
- }
-}
-
-static const char*
GetEventMessageName(uint32_t aMessage)
{
switch (aMessage) {
case NS_COMPOSITION_START:
return "NS_COMPOSITION_START";
case NS_COMPOSITION_END:
return "NS_COMPOSITION_END";
case NS_COMPOSITION_UPDATE:
return "NS_COMPOSITION_UPDATE";
- case NS_TEXT_TEXT:
- return "NS_TEXT_TEXT";
+ case NS_COMPOSITION_CHANGE:
+ return "NS_COMPOSITION_CHANGE";
default:
return "unacceptable event message";
}
}
static const char*
GetNotifyIMEMessageName(IMEMessage aMessage)
{
@@ -878,130 +865,126 @@ IMEStateManager::EnsureTextCompositionAr
if (sTextCompositions) {
return;
}
sTextCompositions = new TextCompositionArray();
}
// static
void
-IMEStateManager::DispatchCompositionEvent(nsINode* aEventTargetNode,
- nsPresContext* aPresContext,
- WidgetEvent* aEvent,
- nsEventStatus* aStatus,
- EventDispatchingCallback* aCallBack,
- bool aIsSynthesized)
+IMEStateManager::DispatchCompositionEvent(
+ nsINode* aEventTargetNode,
+ nsPresContext* aPresContext,
+ WidgetCompositionEvent* aCompositionEvent,
+ nsEventStatus* aStatus,
+ EventDispatchingCallback* aCallBack,
+ bool aIsSynthesized)
{
PR_LOG(sISMLog, PR_LOG_ALWAYS,
("ISM: IMEStateManager::DispatchCompositionEvent(aNode=0x%p, "
- "aPresContext=0x%p, aEvent={ mClass=%s, message=%s, "
+ "aPresContext=0x%p, aCompositionEvent={ message=%s, "
"mFlags={ mIsTrusted=%s, mPropagationStopped=%s } }, "
"aIsSynthesized=%s)",
aEventTargetNode, aPresContext,
- GetEventClassIDName(aEvent->mClass),
- GetEventMessageName(aEvent->message),
- GetBoolName(aEvent->mFlags.mIsTrusted),
- GetBoolName(aEvent->mFlags.mPropagationStopped),
+ GetEventMessageName(aCompositionEvent->message),
+ GetBoolName(aCompositionEvent->mFlags.mIsTrusted),
+ GetBoolName(aCompositionEvent->mFlags.mPropagationStopped),
GetBoolName(aIsSynthesized)));
- MOZ_ASSERT(aEvent->mClass == eCompositionEventClass ||
- aEvent->mClass == eTextEventClass);
- if (!aEvent->mFlags.mIsTrusted || aEvent->mFlags.mPropagationStopped) {
+ if (!aCompositionEvent->mFlags.mIsTrusted ||
+ aCompositionEvent->mFlags.mPropagationStopped) {
return;
}
- MOZ_ASSERT(aEvent->message != NS_COMPOSITION_UPDATE,
+ MOZ_ASSERT(aCompositionEvent->message != NS_COMPOSITION_UPDATE,
"compositionupdate event shouldn't be dispatched manually");
EnsureTextCompositionArray();
- WidgetGUIEvent* GUIEvent = aEvent->AsGUIEvent();
-
nsRefPtr<TextComposition> composition =
- sTextCompositions->GetCompositionFor(GUIEvent->widget);
+ sTextCompositions->GetCompositionFor(aCompositionEvent->widget);
if (!composition) {
// If synthesized event comes after delayed native composition events
// for request of commit or cancel, we should ignore it.
if (NS_WARN_IF(aIsSynthesized)) {
return;
}
PR_LOG(sISMLog, PR_LOG_DEBUG,
("ISM: IMEStateManager::DispatchCompositionEvent(), "
"adding new TextComposition to the array"));
- MOZ_ASSERT(GUIEvent->message == NS_COMPOSITION_START);
- composition = new TextComposition(aPresContext, aEventTargetNode, GUIEvent);
+ MOZ_ASSERT(aCompositionEvent->message == NS_COMPOSITION_START);
+ composition =
+ new TextComposition(aPresContext, aEventTargetNode, aCompositionEvent);
sTextCompositions->AppendElement(composition);
}
#ifdef DEBUG
else {
- MOZ_ASSERT(GUIEvent->message != NS_COMPOSITION_START);
+ MOZ_ASSERT(aCompositionEvent->message != NS_COMPOSITION_START);
}
#endif // #ifdef DEBUG
// Dispatch the event on composing target.
- composition->DispatchEvent(GUIEvent, aStatus, aCallBack, aIsSynthesized);
+ composition->DispatchCompositionEvent(aCompositionEvent, aStatus, aCallBack,
+ aIsSynthesized);
// WARNING: the |composition| might have been destroyed already.
// Remove the ended composition from the array.
// NOTE: When TextComposition is synthesizing compositionend event for
// emulating a commit, the instance shouldn't be removed from the array
// because IME may perform it later. Then, we need to ignore the
// following commit events in TextComposition::DispatchEvent().
// However, if commit or cancel for a request is performed synchronously
// during not safe to dispatch events, PresShell must have discarded
// compositionend event. Then, the synthesized compositionend event is
// the last event for the composition. In this case, we need to
// destroy the TextComposition with synthesized compositionend event.
if ((!aIsSynthesized ||
composition->WasNativeCompositionEndEventDiscarded()) &&
- aEvent->message == NS_COMPOSITION_END) {
+ aCompositionEvent->message == NS_COMPOSITION_END) {
TextCompositionArray::index_type i =
- sTextCompositions->IndexOf(GUIEvent->widget);
+ sTextCompositions->IndexOf(aCompositionEvent->widget);
if (i != TextCompositionArray::NoIndex) {
PR_LOG(sISMLog, PR_LOG_DEBUG,
("ISM: IMEStateManager::DispatchCompositionEvent(), "
"removing TextComposition from the array since NS_COMPOSTION_END "
"was dispatched"));
sTextCompositions->ElementAt(i)->Destroy();
sTextCompositions->RemoveElementAt(i);
}
}
}
// static
void
-IMEStateManager::OnCompositionEventDiscarded(WidgetEvent* aEvent)
+IMEStateManager::OnCompositionEventDiscarded(
+ const WidgetCompositionEvent* aCompositionEvent)
{
// Note that this method is never called for synthesized events for emulating
// commit or cancel composition.
PR_LOG(sISMLog, PR_LOG_ALWAYS,
- ("ISM: IMEStateManager::OnCompositionEventDiscarded(aEvent={ mClass=%s, "
+ ("ISM: IMEStateManager::OnCompositionEventDiscarded(aCompositionEvent={ "
"message=%s, mFlags={ mIsTrusted=%s } })",
- GetEventClassIDName(aEvent->mClass),
- GetEventMessageName(aEvent->message),
- GetBoolName(aEvent->mFlags.mIsTrusted)));
+ GetEventMessageName(aCompositionEvent->message),
+ GetBoolName(aCompositionEvent->mFlags.mIsTrusted)));
- MOZ_ASSERT(aEvent->mClass == eCompositionEventClass ||
- aEvent->mClass == eTextEventClass);
- if (!aEvent->mFlags.mIsTrusted) {
+ if (!aCompositionEvent->mFlags.mIsTrusted) {
return;
}
// Ignore compositionstart for now because sTextCompositions may not have
// been created yet.
- if (aEvent->message == NS_COMPOSITION_START) {
+ if (aCompositionEvent->message == NS_COMPOSITION_START) {
return;
}
- WidgetGUIEvent* GUIEvent = aEvent->AsGUIEvent();
nsRefPtr<TextComposition> composition =
- sTextCompositions->GetCompositionFor(GUIEvent->widget);
- composition->OnCompositionEventDiscarded(GUIEvent);
+ sTextCompositions->GetCompositionFor(aCompositionEvent->widget);
+ composition->OnCompositionEventDiscarded(aCompositionEvent);
}
// static
nsresult
IMEStateManager::NotifyIME(IMEMessage aMessage,
nsIWidget* aWidget)
{
nsRefPtr<TextComposition> composition;
@@ -1226,18 +1209,16 @@ IMEStateManager::GetTextCompositionFor(n
}
nsRefPtr<TextComposition> textComposition =
sTextCompositions->GetCompositionFor(aWidget);
return textComposition.forget();
}
// static
already_AddRefed<TextComposition>
-IMEStateManager::GetTextCompositionFor(WidgetGUIEvent* aEvent)
+IMEStateManager::GetTextCompositionFor(WidgetGUIEvent* aGUIEvent)
{
- MOZ_ASSERT(aEvent->AsCompositionEvent() || aEvent->AsTextEvent() ||
- aEvent->AsKeyboardEvent(),
- "aEvent has to be WidgetCompositionEvent, WidgetTextEvent or "
- "WidgetKeyboardEvent");
- return GetTextCompositionFor(aEvent->widget);
+ MOZ_ASSERT(aGUIEvent->AsCompositionEvent() || aGUIEvent->AsKeyboardEvent(),
+ "aGUIEvent has to be WidgetCompositionEvent or WidgetKeyboardEvent");
+ return GetTextCompositionFor(aGUIEvent->widget);
}
} // namespace mozilla
--- a/dom/events/IMEStateManager.h
+++ b/dom/events/IMEStateManager.h
@@ -87,49 +87,49 @@ public:
// aContent must be:
// If the editor is for <input> or <textarea>, the element.
// If the editor is for contenteditable, the active editinghost.
// If the editor is for designMode, nullptr.
static void OnFocusInEditor(nsPresContext* aPresContext,
nsIContent* aContent);
/**
- * All DOM composition events and DOM text events must be dispatched via
- * DispatchCompositionEvent() for storing the composition target
- * and ensuring a set of composition events must be fired the stored target.
- * If the stored composition event target is destroying, this removes the
- * stored composition automatically.
+ * All composition events must be dispatched via DispatchCompositionEvent()
+ * for storing the composition target and ensuring a set of composition
+ * events must be fired the stored target. If the stored composition event
+ * target is destroying, this removes the stored composition automatically.
*/
- static void DispatchCompositionEvent(nsINode* aEventTargetNode,
- nsPresContext* aPresContext,
- WidgetEvent* aEvent,
- nsEventStatus* aStatus,
- EventDispatchingCallback* aCallBack,
- bool aIsSynthesized = false);
+ static void DispatchCompositionEvent(
+ nsINode* aEventTargetNode,
+ nsPresContext* aPresContext,
+ WidgetCompositionEvent* aCompositionEvent,
+ nsEventStatus* aStatus,
+ EventDispatchingCallback* aCallBack,
+ bool aIsSynthesized = false);
/**
- * This is called when PresShell ignores composition event or text event due
- * to not safe to dispatch events.
+ * This is called when PresShell ignores a composition event due to not safe
+ * to dispatch events.
*/
- static void OnCompositionEventDiscarded(WidgetEvent* aEvent);
+ static void OnCompositionEventDiscarded(
+ const WidgetCompositionEvent* aCompositionEvent);
/**
* Get TextComposition from widget.
*/
static already_AddRefed<TextComposition>
GetTextCompositionFor(nsIWidget* aWidget);
/**
* Returns TextComposition instance for the event.
*
- * @param aEvent Should be a composition event or a text event which is
- * being dispatched.
+ * @param aGUIEvent Should be a composition event which is being dispatched.
*/
static already_AddRefed<TextComposition>
- GetTextCompositionFor(WidgetGUIEvent* aEvent);
+ GetTextCompositionFor(WidgetGUIEvent* aGUIEvent);
/**
* Send a notification to IME. It depends on the IME or platform spec what
* will occur (or not occur).
*/
static nsresult NotifyIME(IMEMessage aMessage, nsIWidget* aWidget);
static nsresult NotifyIME(IMEMessage aMessage, nsPresContext* aPresContext);
--- a/dom/events/ImageCaptureError.cpp
+++ b/dom/events/ImageCaptureError.cpp
@@ -19,17 +19,16 @@ NS_INTERFACE_MAP_END
ImageCaptureError::ImageCaptureError(nsISupports* aParent,
uint16_t aCode,
const nsAString& aMessage)
: mParent(aParent)
, mMessage(aMessage)
, mCode(aCode)
{
- SetIsDOMBinding();
}
ImageCaptureError::~ImageCaptureError()
{
}
nsISupports*
ImageCaptureError::GetParentObject() const
--- a/dom/events/PaintRequest.h
+++ b/dom/events/PaintRequest.h
@@ -20,17 +20,16 @@ class DOMRect;
class PaintRequest MOZ_FINAL : public nsIDOMPaintRequest
, public nsWrapperCache
{
public:
explicit PaintRequest(nsIDOMEvent* aParent)
: mParent(aParent)
{
mRequest.mFlags = 0;
- SetIsDOMBinding();
}
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(PaintRequest)
NS_DECL_NSIDOMPAINTREQUEST
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
@@ -56,17 +55,16 @@ private:
};
class PaintRequestList MOZ_FINAL : public nsISupports,
public nsWrapperCache
{
public:
explicit PaintRequestList(nsIDOMEvent *aParent) : mParent(aParent)
{
- SetIsDOMBinding();
}
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(PaintRequestList)
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
nsISupports* GetParentObject()
{
--- a/dom/events/TextComposition.cpp
+++ b/dom/events/TextComposition.cpp
@@ -24,23 +24,24 @@ namespace mozilla {
#define IDEOGRAPHIC_SPACE (NS_LITERAL_STRING("\x3000"))
/******************************************************************************
* TextComposition
******************************************************************************/
TextComposition::TextComposition(nsPresContext* aPresContext,
nsINode* aNode,
- WidgetGUIEvent* aEvent)
+ WidgetCompositionEvent* aCompositionEvent)
: mPresContext(aPresContext)
, mNode(aNode)
- , mNativeContext(aEvent->widget->GetInputContext().mNativeIMEContext)
+ , mNativeContext(
+ aCompositionEvent->widget->GetInputContext().mNativeIMEContext)
, mCompositionStartOffset(0)
, mCompositionTargetOffset(0)
- , mIsSynthesizedForTests(aEvent->mFlags.mIsSynthesizedForTests)
+ , mIsSynthesizedForTests(aCompositionEvent->mFlags.mIsSynthesizedForTests)
, mIsComposing(false)
, mIsEditorHandlingEvent(false)
, mIsRequestingCommit(false)
, mIsRequestingCancel(false)
, mRequestedToCommitOrCancel(false)
, mWasNativeCompositionEndEventDiscarded(false)
{
}
@@ -56,69 +57,70 @@ TextComposition::Destroy()
bool
TextComposition::MatchesNativeContext(nsIWidget* aWidget) const
{
return mNativeContext == aWidget->GetInputContext().mNativeIMEContext;
}
bool
-TextComposition::MaybeDispatchCompositionUpdate(const WidgetTextEvent* aEvent)
+TextComposition::MaybeDispatchCompositionUpdate(
+ const WidgetCompositionEvent* aCompositionEvent)
{
if (Destroyed()) {
return false;
}
- if (mLastData == aEvent->theText) {
+ if (mLastData == aCompositionEvent->mData) {
return true;
}
- WidgetCompositionEvent compositionUpdate(aEvent->mFlags.mIsTrusted,
+ WidgetCompositionEvent compositionUpdate(aCompositionEvent->mFlags.mIsTrusted,
NS_COMPOSITION_UPDATE,
- aEvent->widget);
- compositionUpdate.time = aEvent->time;
- compositionUpdate.timeStamp = aEvent->timeStamp;
- compositionUpdate.data = aEvent->theText;
+ aCompositionEvent->widget);
+ compositionUpdate.time = aCompositionEvent->time;
+ compositionUpdate.timeStamp = aCompositionEvent->timeStamp;
+ compositionUpdate.mData = aCompositionEvent->mData;
compositionUpdate.mFlags.mIsSynthesizedForTests =
- aEvent->mFlags.mIsSynthesizedForTests;
+ aCompositionEvent->mFlags.mIsSynthesizedForTests;
nsEventStatus status = nsEventStatus_eConsumeNoDefault;
- mLastData = compositionUpdate.data;
+ mLastData = compositionUpdate.mData;
EventDispatcher::Dispatch(mNode, mPresContext,
&compositionUpdate, nullptr, &status, nullptr);
return !Destroyed();
}
void
-TextComposition::OnCompositionEventDiscarded(const WidgetGUIEvent* aEvent)
+TextComposition::OnCompositionEventDiscarded(
+ const WidgetCompositionEvent* aCompositionEvent)
{
// Note that this method is never called for synthesized events for emulating
// commit or cancel composition.
- MOZ_ASSERT(aEvent->mFlags.mIsTrusted,
+ MOZ_ASSERT(aCompositionEvent->mFlags.mIsTrusted,
"Shouldn't be called with untrusted event");
- MOZ_ASSERT(aEvent->mClass == eCompositionEventClass ||
- aEvent->mClass == eTextEventClass);
// XXX If composition events are discarded, should we dispatch them with
// runnable event? However, even if we do so, it might make native IME
// confused due to async modification. Especially when native IME is
// TSF.
- if (aEvent->message != NS_COMPOSITION_END) {
+ if (aCompositionEvent->message != NS_COMPOSITION_END) {
return;
}
mWasNativeCompositionEndEventDiscarded = true;
}
void
-TextComposition::DispatchEvent(WidgetGUIEvent* aEvent,
- nsEventStatus* aStatus,
- EventDispatchingCallback* aCallBack,
- bool aIsSynthesized)
+TextComposition::DispatchCompositionEvent(
+ WidgetCompositionEvent* aCompositionEvent,
+ nsEventStatus* aStatus,
+ EventDispatchingCallback* aCallBack,
+ bool aIsSynthesized)
{
if (Destroyed()) {
*aStatus = nsEventStatus_eConsumeNoDefault;
return;
}
// If this instance has requested to commit or cancel composition but
// is not synthesizing commit event, that means that the IME commits or
@@ -139,97 +141,96 @@ TextComposition::DispatchEvent(WidgetGUI
// Note that most Chinese IMEs don't expose actual composition string to us.
// They typically tell us an IDEOGRAPHIC SPACE or empty string as composition
// string. Therefore, we should hack it only when:
// 1. committing string is empty string at requesting commit but the last
// data isn't IDEOGRAPHIC SPACE.
// 2. non-empty string is committed at requesting cancel.
if (!aIsSynthesized && (mIsRequestingCommit || mIsRequestingCancel)) {
nsString* committingData = nullptr;
- switch (aEvent->message) {
+ switch (aCompositionEvent->message) {
case NS_COMPOSITION_END:
- committingData = &aEvent->AsCompositionEvent()->data;
- break;
- case NS_TEXT_TEXT:
- committingData = &aEvent->AsTextEvent()->theText;
+ case NS_COMPOSITION_CHANGE:
+ committingData = &aCompositionEvent->mData;
break;
default:
NS_WARNING("Unexpected event comes during committing or "
"canceling composition");
break;
}
if (committingData) {
if (mIsRequestingCommit && committingData->IsEmpty() &&
mLastData != IDEOGRAPHIC_SPACE) {
committingData->Assign(mLastData);
} else if (mIsRequestingCancel && !committingData->IsEmpty()) {
committingData->Truncate();
}
}
}
- if (aEvent->message == NS_TEXT_TEXT) {
- if (!MaybeDispatchCompositionUpdate(aEvent->AsTextEvent())) {
+ if (aCompositionEvent->message == NS_COMPOSITION_CHANGE) {
+ if (!MaybeDispatchCompositionUpdate(aCompositionEvent)) {
return;
}
}
EventDispatcher::Dispatch(mNode, mPresContext,
- aEvent, nullptr, aStatus, aCallBack);
+ aCompositionEvent, nullptr, aStatus, aCallBack);
if (NS_WARN_IF(Destroyed())) {
return;
}
- // Emulate editor behavior of text event handler if no editor handles
- // composition/text events.
- if (aEvent->message == NS_TEXT_TEXT && !HasEditor()) {
- EditorWillHandleTextEvent(aEvent->AsTextEvent());
- EditorDidHandleTextEvent();
+ // Emulate editor behavior of compositionchange event (DOM text event) handler
+ // if no editor handles composition events.
+ if (aCompositionEvent->message == NS_COMPOSITION_CHANGE && !HasEditor()) {
+ EditorWillHandleCompositionChangeEvent(aCompositionEvent);
+ EditorDidHandleCompositionChangeEvent();
}
#ifdef DEBUG
- else if (aEvent->message == NS_COMPOSITION_END) {
+ else if (aCompositionEvent->message == NS_COMPOSITION_END) {
MOZ_ASSERT(!mIsComposing, "Why is the editor still composing?");
MOZ_ASSERT(!HasEditor(), "Why does the editor still keep to hold this?");
}
#endif // #ifdef DEBUG
// Notify composition update to widget if possible
- NotityUpdateComposition(aEvent);
+ NotityUpdateComposition(aCompositionEvent);
}
void
-TextComposition::NotityUpdateComposition(WidgetGUIEvent* aEvent)
+TextComposition::NotityUpdateComposition(
+ const WidgetCompositionEvent* aCompositionEvent)
{
nsEventStatus status;
// When compositon start, notify the rect of first offset character.
// When not compositon start, notify the rect of selected composition
- // string if text event.
- if (aEvent->message == NS_COMPOSITION_START) {
+ // string if compositionchange event.
+ if (aCompositionEvent->message == NS_COMPOSITION_START) {
nsCOMPtr<nsIWidget> widget = mPresContext->GetRootWidget();
// Update composition start offset
WidgetQueryContentEvent selectedTextEvent(true,
NS_QUERY_SELECTED_TEXT,
widget);
widget->DispatchEvent(&selectedTextEvent, status);
if (selectedTextEvent.mSucceeded) {
mCompositionStartOffset = selectedTextEvent.mReply.mOffset;
} else {
// Unknown offset
NS_WARNING("Cannot get start offset of IME composition");
mCompositionStartOffset = 0;
}
mCompositionTargetOffset = mCompositionStartOffset;
- } else if (aEvent->mClass != eTextEventClass) {
- return;
+ } else if (aCompositionEvent->message == NS_COMPOSITION_CHANGE) {
+ mCompositionTargetOffset =
+ mCompositionStartOffset + aCompositionEvent->TargetClauseOffset();
} else {
- mCompositionTargetOffset =
- mCompositionStartOffset + aEvent->AsTextEvent()->TargetClauseOffset();
+ return;
}
NotifyIME(NOTIFY_IME_OF_COMPOSITION_UPDATE);
}
void
TextComposition::DispatchCompositionEventRunnable(uint32_t aEventMessage,
const nsAString& aData,
@@ -260,19 +261,18 @@ TextComposition::RequestToCommit(nsIWidg
if (aDiscard) {
mIsRequestingCancel = true;
mIsRequestingCommit = false;
} else {
mIsRequestingCancel = false;
mIsRequestingCommit = true;
}
if (!mIsSynthesizedForTests) {
- // FYI: CompositionEvent and TextEvent caused by a call of NotifyIME()
- // may be discarded by PresShell if it's not safe to dispatch the
- // event.
+ // FYI: CompositionEvents caused by a call of NotifyIME() may be
+ // discarded by PresShell if it's not safe to dispatch the event.
nsresult rv =
aWidget->NotifyIME(IMENotification(aDiscard ?
REQUEST_TO_CANCEL_COMPOSITION :
REQUEST_TO_COMMIT_COMPOSITION));
if (rv == NS_ERROR_NOT_IMPLEMENTED) {
return rv;
}
if (NS_WARN_IF(NS_FAILED(rv))) {
@@ -281,83 +281,84 @@ TextComposition::RequestToCommit(nsIWidg
} else {
// Emulates to commit or cancel the composition
// FYI: These events may be discarded by PresShell if it's not safe to
// dispatch the event.
nsCOMPtr<nsIWidget> widget(aWidget);
nsAutoString commitData(aDiscard ? EmptyString() : lastData);
bool changingData = lastData != commitData;
- WidgetTextEvent textEvent(true, NS_TEXT_TEXT, widget);
- textEvent.theText = commitData;
- textEvent.mFlags.mIsSynthesizedForTests = true;
+ WidgetCompositionEvent changeEvent(true, NS_COMPOSITION_CHANGE, widget);
+ changeEvent.mData = commitData;
+ changeEvent.mFlags.mIsSynthesizedForTests = true;
- MaybeDispatchCompositionUpdate(&textEvent);
+ MaybeDispatchCompositionUpdate(&changeEvent);
// If changing the data or committing string isn't empty, we need to
- // dispatch text event for setting the composition string without
- // IME selection.
+ // dispatch compositionchange event for setting the composition string
+ // without IME selection.
if (!Destroyed() && !widget->Destroyed() &&
(changingData || !commitData.IsEmpty())) {
nsEventStatus status = nsEventStatus_eIgnore;
- widget->DispatchEvent(&textEvent, status);
+ widget->DispatchEvent(&changeEvent, status);
}
if (!Destroyed() && !widget->Destroyed()) {
nsEventStatus status = nsEventStatus_eIgnore;
WidgetCompositionEvent endEvent(true, NS_COMPOSITION_END, widget);
- endEvent.data = commitData;
+ endEvent.mData = commitData;
endEvent.mFlags.mIsSynthesizedForTests = true;
widget->DispatchEvent(&endEvent, status);
}
}
}
mRequestedToCommitOrCancel = true;
// If the request is performed synchronously, this must be already destroyed.
if (Destroyed()) {
return NS_OK;
}
// Otherwise, synthesize the commit in content.
nsAutoString data(aDiscard ? EmptyString() : lastData);
// If the last composition string and new data are different, we need to
- // dispatch text event for removing IME selection. However, if the commit
- // string is empty string and it's not changed from the last data, we don't
- // need to dispatch text event.
+ // dispatch compositionchange event for removing IME selection. However, if
+ // the commit string is empty string and it's not changed from the last data,
+ // we don't need to dispatch compositionchange event.
if (lastData != data || !data.IsEmpty()) {
- DispatchCompositionEventRunnable(NS_TEXT_TEXT, data, true);
+ DispatchCompositionEventRunnable(NS_COMPOSITION_CHANGE, data, true);
}
DispatchCompositionEventRunnable(NS_COMPOSITION_END, data, true);
return NS_OK;
}
nsresult
TextComposition::NotifyIME(IMEMessage aMessage)
{
NS_ENSURE_TRUE(mPresContext, NS_ERROR_NOT_AVAILABLE);
return IMEStateManager::NotifyIME(aMessage, mPresContext);
}
void
-TextComposition::EditorWillHandleTextEvent(const WidgetTextEvent* aTextEvent)
+TextComposition::EditorWillHandleCompositionChangeEvent(
+ const WidgetCompositionEvent* aCompositionChangeEvent)
{
- mIsComposing = aTextEvent->IsComposing();
- mRanges = aTextEvent->mRanges;
+ mIsComposing = aCompositionChangeEvent->IsComposing();
+ mRanges = aCompositionChangeEvent->mRanges;
mIsEditorHandlingEvent = true;
- MOZ_ASSERT(mLastData == aTextEvent->theText,
- "The text of a text event must be same as previous data attribute value "
- "of the latest compositionupdate event");
+ MOZ_ASSERT(mLastData == aCompositionChangeEvent->mData,
+ "The text of a compositionchange event must be same as previous data "
+ "attribute value of the latest compositionupdate event");
}
void
-TextComposition::EditorDidHandleTextEvent()
+TextComposition::EditorDidHandleCompositionChangeEvent()
{
mString = mLastData;
mIsEditorHandlingEvent = false;
}
void
TextComposition::StartHandlingComposition(nsIEditor* aEditor)
{
@@ -430,44 +431,35 @@ TextComposition::CompositionEventDispatc
switch (mEventMessage) {
case NS_COMPOSITION_START: {
WidgetCompositionEvent compStart(true, NS_COMPOSITION_START, widget);
WidgetQueryContentEvent selectedText(true, NS_QUERY_SELECTED_TEXT,
widget);
ContentEventHandler handler(presContext);
handler.OnQuerySelectedText(&selectedText);
NS_ASSERTION(selectedText.mSucceeded, "Failed to get selected text");
- compStart.data = selectedText.mReply.mString;
+ compStart.mData = selectedText.mReply.mString;
compStart.mFlags.mIsSynthesizedForTests =
mTextComposition->IsSynthesizedForTests();
IMEStateManager::DispatchCompositionEvent(mEventTarget, presContext,
&compStart, &status, nullptr,
mIsSynthesizedEvent);
break;
}
- case NS_COMPOSITION_END: {
+ case NS_COMPOSITION_END:
+ case NS_COMPOSITION_CHANGE: {
WidgetCompositionEvent compEvent(true, mEventMessage, widget);
- compEvent.data = mData;
+ compEvent.mData = mData;
compEvent.mFlags.mIsSynthesizedForTests =
mTextComposition->IsSynthesizedForTests();
IMEStateManager::DispatchCompositionEvent(mEventTarget, presContext,
&compEvent, &status, nullptr,
mIsSynthesizedEvent);
break;
}
- case NS_TEXT_TEXT: {
- WidgetTextEvent textEvent(true, NS_TEXT_TEXT, widget);
- textEvent.theText = mData;
- textEvent.mFlags.mIsSynthesizedForTests =
- mTextComposition->IsSynthesizedForTests();
- IMEStateManager::DispatchCompositionEvent(mEventTarget, presContext,
- &textEvent, &status, nullptr,
- mIsSynthesizedEvent);
- break;
- }
default:
MOZ_CRASH("Unsupported event");
}
return NS_OK;
}
/******************************************************************************
* TextCompositionArray
--- a/dom/events/TextComposition.h
+++ b/dom/events/TextComposition.h
@@ -35,32 +35,33 @@ class TextComposition MOZ_FINAL
{
friend class IMEStateManager;
NS_INLINE_DECL_REFCOUNTING(TextComposition)
public:
TextComposition(nsPresContext* aPresContext,
nsINode* aNode,
- WidgetGUIEvent* aEvent);
+ WidgetCompositionEvent* aCompositionEvent);
bool Destroyed() const { return !mPresContext; }
nsPresContext* GetPresContext() const { return mPresContext; }
nsINode* GetEventTargetNode() const { return mNode; }
// The latest CompositionEvent.data value except compositionstart event.
// This value is modified at dispatching compositionupdate.
const nsString& LastData() const { return mLastData; }
// The composition string which is already handled by the focused editor.
// I.e., this value must be same as the composition string on the focused
- // editor. This value is modified at a call of EditorDidHandleTextEvent().
+ // editor. This value is modified at a call of
+ // EditorDidHandleCompositionChangeEvent().
// Note that mString and mLastData are different between dispatcing
- // compositionupdate and text event handled by focused editor.
+ // compositionupdate and compositionchange event handled by focused editor.
const nsString& String() const { return mString; }
// Returns the clauses and/or caret range of the composition string.
- // This is modified at a call of EditorWillHandleTextEvent().
+ // This is modified at a call of EditorWillHandleCompositionChangeEvent().
// This may return null if there is no clauses and caret.
// XXX We should return |const TextRangeArray*| here, but it causes compile
// error due to inaccessible Release() method.
TextRangeArray* GetRanges() const { return mRanges; }
// Returns the widget which is proper to call NotifyIME().
nsIWidget* GetWidget() const
{
return mPresContext ? mPresContext->GetRootWidget() : nullptr;
@@ -119,39 +120,43 @@ public:
/**
* StartHandlingComposition() and EndHandlingComposition() are called by
* editor when it holds a TextComposition instance and release it.
*/
void StartHandlingComposition(nsIEditor* aEditor);
void EndHandlingComposition(nsIEditor* aEditor);
/**
- * TextEventHandlingMarker class should be created at starting to handle text
- * event in focused editor. This calls EditorWillHandleTextEvent() and
- * EditorDidHandleTextEvent() automatically.
+ * CompositionChangeEventHandlingMarker class should be created at starting
+ * to handle text event in focused editor. This calls
+ * EditorWillHandleCompositionChangeEvent() and
+ * EditorDidHandleCompositionChangeEvent() automatically.
*/
- class MOZ_STACK_CLASS TextEventHandlingMarker
+ class MOZ_STACK_CLASS CompositionChangeEventHandlingMarker
{
public:
- TextEventHandlingMarker(TextComposition* aComposition,
- const WidgetTextEvent* aTextEvent)
+ CompositionChangeEventHandlingMarker(
+ TextComposition* aComposition,
+ const WidgetCompositionEvent* aCompositionChangeEvent)
: mComposition(aComposition)
{
- mComposition->EditorWillHandleTextEvent(aTextEvent);
+ mComposition->EditorWillHandleCompositionChangeEvent(
+ aCompositionChangeEvent);
}
- ~TextEventHandlingMarker()
+ ~CompositionChangeEventHandlingMarker()
{
- mComposition->EditorDidHandleTextEvent();
+ mComposition->EditorDidHandleCompositionChangeEvent();
}
private:
nsRefPtr<TextComposition> mComposition;
- TextEventHandlingMarker();
- TextEventHandlingMarker(const TextEventHandlingMarker& aOther);
+ CompositionChangeEventHandlingMarker();
+ CompositionChangeEventHandlingMarker(
+ const CompositionChangeEventHandlingMarker& aOther);
};
private:
// Private destructor, to discourage deletion outside of Release():
~TextComposition()
{
// WARNING: mPresContext may be destroying, so, be careful if you touch it.
}
@@ -227,64 +232,67 @@ private:
/**
* HasEditor() returns true if mEditorWeak holds nsIEditor instance which is
* alive. Otherwise, false.
*/
bool HasEditor() const;
/**
- * EditorWillHandleTextEvent() must be called before the focused editor
- * handles the text event.
+ * EditorWillHandleCompositionChangeEvent() must be called before the focused
+ * editor handles the compositionchange event.
*/
- void EditorWillHandleTextEvent(const WidgetTextEvent* aTextEvent);
+ void EditorWillHandleCompositionChangeEvent(
+ const WidgetCompositionEvent* aCompositionChangeEvent);
/**
- * EditorDidHandleTextEvent() must be called after the focused editor handles
- * a text event.
+ * EditorDidHandleCompositionChangeEvent() must be called after the focused
+ * editor handles a compositionchange event.
*/
- void EditorDidHandleTextEvent();
+ void EditorDidHandleCompositionChangeEvent();
/**
- * DispatchEvent() dispatches the aEvent to the mContent synchronously.
- * The caller must ensure that it's safe to dispatch the event.
+ * DispatchCompositionEvent() dispatches the aCompositionEvent to the mContent
+ * synchronously. The caller must ensure that it's safe to dispatch the event.
*/
- void DispatchEvent(WidgetGUIEvent* aEvent,
- nsEventStatus* aStatus,
- EventDispatchingCallback* aCallBack,
- bool aIsSynthesized);
+ void DispatchCompositionEvent(WidgetCompositionEvent* aCompositionEvent,
+ nsEventStatus* aStatus,
+ EventDispatchingCallback* aCallBack,
+ bool aIsSynthesized);
/**
* MaybeDispatchCompositionUpdate() may dispatch a compositionupdate event
- * if aEvent changes composition string.
+ * if aCompositionEvent changes composition string.
* @return Returns false if dispatching the compositionupdate event caused
* destroying this composition.
*/
- bool MaybeDispatchCompositionUpdate(const WidgetTextEvent* aEvent);
+ bool MaybeDispatchCompositionUpdate(
+ const WidgetCompositionEvent* aCompositionEvent);
/**
* If IME has already dispatched compositionend event but it was discarded
* by PresShell due to not safe to dispatch, this returns true.
*/
bool WasNativeCompositionEndEventDiscarded() const
{
return mWasNativeCompositionEndEventDiscarded;
}
/**
* OnCompositionEventDiscarded() is called when PresShell discards
- * compositionupdate, compositionend or text event due to not safe to
- * dispatch event.
+ * compositionupdate, compositionend or compositionchange event due to not
+ * safe to dispatch event.
*/
- void OnCompositionEventDiscarded(const WidgetGUIEvent* aEvent);
+ void OnCompositionEventDiscarded(
+ const WidgetCompositionEvent* aCompositionEvent);
/**
* Calculate composition offset then notify composition update to widget
*/
- void NotityUpdateComposition(WidgetGUIEvent* aEvent);
+ void NotityUpdateComposition(const WidgetCompositionEvent* aCompositionEvent);
/**
* CompositionEventDispatcher dispatches the specified composition (or text)
* event.
*/
class CompositionEventDispatcher : public nsRunnable
{
public:
@@ -301,27 +309,24 @@ private:
uint32_t mEventMessage;
nsString mData;
bool mIsSynthesizedEvent;
CompositionEventDispatcher() {};
};
/**
- * DispatchCompositionEventRunnable() dispatches a composition or text event
- * to the content. Be aware, if you use this method, nsPresShellEventCB
- * isn't used. That means that nsIFrame::HandleEvent() is never called.
+ * DispatchCompositionEventRunnable() dispatches a composition event to the
+ * content. Be aware, if you use this method, nsPresShellEventCB isn't used.
+ * That means that nsIFrame::HandleEvent() is never called.
* WARNING: The instance which is managed by IMEStateManager may be
* destroyed by this method call.
*
- * @param aEventMessage Must be one of composition event or text event.
- * @param aData Used for data value if aEventMessage is
- * NS_COMPOSITION_END.
- * Used for theText value if aEventMessage is
- * NS_TEXT_TEXT.
+ * @param aEventMessage Must be one of composition events.
+ * @param aData Used for mData value.
* @param aIsSynthesizingCommit true if this is called for synthesizing
* commit or cancel composition. Otherwise,
* false.
*/
void DispatchCompositionEventRunnable(uint32_t aEventMessage,
const nsAString& aData,
bool aIsSynthesizingCommit = false);
};
--- a/dom/events/Touch.cpp
+++ b/dom/events/Touch.cpp
@@ -23,17 +23,16 @@ Touch::Touch(EventTarget* aTarget,
int32_t aScreenY,
int32_t aClientX,
int32_t aClientY,
int32_t aRadiusX,
int32_t aRadiusY,
float aRotationAngle,
float aForce)
{
- SetIsDOMBinding();
mTarget = aTarget;
mIdentifier = aIdentifier;
mPagePoint = CSSIntPoint(aPageX, aPageY);
mScreenPoint = nsIntPoint(aScreenX, aScreenY);
mClientPoint = CSSIntPoint(aClientX, aClientY);
mRefPoint = nsIntPoint(0, 0);
mPointsInitialized = true;
mRadius.x = aRadiusX;
@@ -47,17 +46,16 @@ Touch::Touch(EventTarget* aTarget,
}
Touch::Touch(int32_t aIdentifier,
nsIntPoint aPoint,
nsIntPoint aRadius,
float aRotationAngle,
float aForce)
{
- SetIsDOMBinding();
mIdentifier = aIdentifier;
mPagePoint = CSSIntPoint(0, 0);
mScreenPoint = nsIntPoint(0, 0);
mClientPoint = CSSIntPoint(0, 0);
mRefPoint = aPoint;
mPointsInitialized = false;
mRadius = aRadius;
mRotationAngle = aRotationAngle;
--- a/dom/events/TouchEvent.h
+++ b/dom/events/TouchEvent.h
@@ -24,25 +24,23 @@ class TouchList MOZ_FINAL : public nsISu
{
public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TouchList)
explicit TouchList(nsISupports* aParent)
: mParent(aParent)
{
- SetIsDOMBinding();
nsJSContext::LikelyShortLivingObjectCreated();
}
TouchList(nsISupports* aParent,
const WidgetTouchEvent::TouchArray& aTouches)
: mParent(aParent)
, mPoints(aTouches)
{
- SetIsDOMBinding();
nsJSContext::LikelyShortLivingObjectCreated();
}
void Append(Touch* aPoint)
{
mPoints.AppendElement(aPoint);
}
--- a/dom/events/UIEvent.cpp
+++ b/dom/events/UIEvent.cpp
@@ -339,21 +339,17 @@ UIEvent::GetIsChar(bool* aIsChar)
*aIsChar = IsChar();
return NS_OK;
}
bool
UIEvent::IsChar() const
{
WidgetKeyboardEvent* keyEvent = mEvent->AsKeyboardEvent();
- if (keyEvent) {
- return keyEvent->isChar;
- }
- WidgetTextEvent* textEvent = mEvent->AsTextEvent();
- return textEvent ? textEvent->isChar : false;
+ return keyEvent ? keyEvent->isChar : false;
}
NS_IMETHODIMP
UIEvent::DuplicatePrivateData()
{
mClientPoint =
Event::GetClientCoords(mPresContext, mEvent, mEvent->refPoint,
mClientPoint);
--- a/dom/fetch/Headers.cpp
+++ b/dom/fetch/Headers.cpp
@@ -104,17 +104,16 @@ Headers::Constructor(const GlobalObject&
return headers.forget();
}
Headers::Headers(const Headers& aOther)
: mOwner(aOther.mOwner)
, mGuard(aOther.mGuard)
{
- SetIsDOMBinding();
ErrorResult result;
Fill(aOther, result);
MOZ_ASSERT(!result.Failed());
}
void
Headers::Append(const nsACString& aName, const nsACString& aValue,
ErrorResult& aRv)
--- a/dom/fetch/Headers.h
+++ b/dom/fetch/Headers.h
@@ -48,17 +48,16 @@ private:
HeadersGuardEnum mGuard;
nsTArray<Entry> mList;
public:
explicit Headers(nsISupports* aOwner, HeadersGuardEnum aGuard = HeadersGuardEnum::None)
: mOwner(aOwner)
, mGuard(aGuard)
{
- SetIsDOMBinding();
}
explicit Headers(const Headers& aOther);
static bool PrefEnabled(JSContext* cx, JSObject* obj);
static already_AddRefed<Headers>
Constructor(const GlobalObject& aGlobal,
--- a/dom/fetch/Request.cpp
+++ b/dom/fetch/Request.cpp
@@ -39,17 +39,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
Request::Request(nsIGlobalObject* aOwner, InternalRequest* aRequest)
: mOwner(aOwner)
, mRequest(aRequest)
, mBodyUsed(false)
{
- SetIsDOMBinding();
}
Request::~Request()
{
}
already_AddRefed<InternalRequest>
Request::GetInternalRequest()
--- a/dom/fetch/Response.cpp
+++ b/dom/fetch/Response.cpp
@@ -24,17 +24,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
Response::Response(nsISupports* aOwner)
: mOwner(aOwner)
, mHeaders(new Headers(aOwner))
{
- SetIsDOMBinding();
}
Response::~Response()
{
}
/* static */ already_AddRefed<Response>
Response::Error(const GlobalObject& aGlobal)
--- a/dom/filesystem/Directory.cpp
+++ b/dom/filesystem/Directory.cpp
@@ -58,18 +58,16 @@ Directory::GetRoot(FileSystemBase* aFile
Directory::Directory(FileSystemBase* aFileSystem,
const nsAString& aPath)
: mFileSystem(aFileSystem)
, mPath(aPath)
{
MOZ_ASSERT(aFileSystem, "aFileSystem should not be null.");
// Remove the trailing "/".
mPath.Trim(FILESYSTEM_DOM_PATH_SEPARATOR, false, true);
-
- SetIsDOMBinding();
}
Directory::~Directory()
{
}
nsPIDOMWindow*
Directory::GetParentObject() const
--- a/dom/fmradio/FMRadio.cpp
+++ b/dom/fmradio/FMRadio.cpp
@@ -107,18 +107,16 @@ NS_IMPL_ISUPPORTS_INHERITED0(FMRadioRequ
FMRadio::FMRadio()
: mHeadphoneState(SWITCH_STATE_OFF)
, mRdsGroupMask(0)
, mAudioChannelAgentEnabled(false)
, mHasInternalAntenna(false)
, mIsShutdown(false)
{
LOG("FMRadio is initialized.");
-
- SetIsDOMBinding();
}
FMRadio::~FMRadio()
{
}
void
FMRadio::Init(nsPIDOMWindow *aWindow)
--- a/dom/gamepad/Gamepad.cpp
+++ b/dom/gamepad/Gamepad.cpp
@@ -28,17 +28,16 @@ Gamepad::Gamepad(nsISupports* aParent,
: mParent(aParent),
mID(aID),
mIndex(aIndex),
mMapping(aMapping),
mConnected(true),
mButtons(aNumButtons),
mAxes(aNumAxes)
{
- SetIsDOMBinding();
for (unsigned i = 0; i < aNumButtons; i++) {
mButtons.InsertElementAt(i, new GamepadButton(mParent));
}
mAxes.InsertElementsAt(0, aNumAxes, 0.0f);
}
void
Gamepad::SetIndex(uint32_t aIndex)
--- a/dom/gamepad/GamepadButton.h
+++ b/dom/gamepad/GamepadButton.h
@@ -15,17 +15,16 @@ namespace dom {
class GamepadButton : public nsISupports,
public nsWrapperCache
{
public:
explicit GamepadButton(nsISupports* aParent) : mParent(aParent),
mPressed(false),
mValue(0)
{
- SetIsDOMBinding();
}
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(GamepadButton)
nsISupports* GetParentObject() const
{
return mParent;
--- a/dom/geolocation/nsGeoPosition.cpp
+++ b/dom/geolocation/nsGeoPosition.cpp
@@ -153,17 +153,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
Position::Position(nsISupports* aParent, nsIDOMGeoPosition* aGeoPosition)
: mParent(aParent)
, mGeoPosition(aGeoPosition)
{
- SetIsDOMBinding();
}
Position::~Position()
{
}
nsISupports*
Position::GetParentObject() const
@@ -207,17 +206,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
Coordinates::Coordinates(Position* aPosition, nsIDOMGeoPositionCoords* aCoords)
: mPosition(aPosition)
, mCoords(aCoords)
{
- SetIsDOMBinding();
}
Coordinates::~Coordinates()
{
}
Position*
Coordinates::GetParentObject() const
--- a/dom/geolocation/nsGeolocation.cpp
+++ b/dom/geolocation/nsGeolocation.cpp
@@ -238,17 +238,16 @@ NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(PositionError, mParent)
NS_IMPL_CYCLE_COLLECTING_ADDREF(PositionError)
NS_IMPL_CYCLE_COLLECTING_RELEASE(PositionError)
PositionError::PositionError(Geolocation* aParent, int16_t aCode)
: mCode(aCode)
, mParent(aParent)
{
- SetIsDOMBinding();
}
PositionError::~PositionError(){}
NS_IMETHODIMP
PositionError::GetCode(int16_t *aCode)
{
@@ -1014,17 +1013,16 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(Geoloca
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(Geolocation,
mPendingCallbacks,
mWatchingCallbacks,
mPendingRequests)
Geolocation::Geolocation()
: mLastWatchId(0)
{
- SetIsDOMBinding();
}
Geolocation::~Geolocation()
{
if (mService) {
Shutdown();
}
}
--- a/dom/icc/Icc.cpp
+++ b/dom/icc/Icc.cpp
@@ -24,17 +24,16 @@ NS_INTERFACE_MAP_END_INHERITING(DOMEvent
NS_IMPL_ADDREF_INHERITED(Icc, DOMEventTargetHelper)
NS_IMPL_RELEASE_INHERITED(Icc, DOMEventTargetHelper)
Icc::Icc(nsPIDOMWindow* aWindow, long aClientId, nsIIccInfo* aIccInfo)
: mLive(true)
, mClientId(aClientId)
{
- SetIsDOMBinding();
BindToOwner(aWindow);
mProvider = do_GetService(NS_RILCONTENTHELPER_CONTRACTID);
if (aIccInfo) {
aIccInfo->GetIccid(mIccId);
UpdateIccInfo(aIccInfo);
}
--- a/dom/icc/IccInfo.cpp
+++ b/dom/icc/IccInfo.cpp
@@ -30,17 +30,16 @@ NS_IMPL_CYCLE_COLLECTING_RELEASE(IccInfo
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(IccInfo)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
IccInfo::IccInfo(nsPIDOMWindow* aWindow)
: mWindow(aWindow)
{
- SetIsDOMBinding();
}
void
IccInfo::Update(nsIIccInfo* aInfo)
{
mIccInfo = aInfo;
}
@@ -144,17 +143,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_
NS_INTERFACE_MAP_END_INHERITING(IccInfo)
NS_IMPL_ADDREF_INHERITED(GsmIccInfo, IccInfo)
NS_IMPL_RELEASE_INHERITED(GsmIccInfo, IccInfo)
GsmIccInfo::GsmIccInfo(nsPIDOMWindow* aWindow)
: IccInfo(aWindow)
{
- SetIsDOMBinding();
}
void
GsmIccInfo::Update(nsIGsmIccInfo* aInfo)
{
IccInfo::Update(aInfo);
mGsmIccInfo = aInfo;
}
@@ -184,17 +182,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_
NS_INTERFACE_MAP_END_INHERITING(IccInfo)
NS_IMPL_ADDREF_INHERITED(CdmaIccInfo, IccInfo)
NS_IMPL_RELEASE_INHERITED(CdmaIccInfo, IccInfo)
CdmaIccInfo::CdmaIccInfo(nsPIDOMWindow* aWindow)
: IccInfo(aWindow)
{
- SetIsDOMBinding();
}
void
CdmaIccInfo::Update(nsICdmaIccInfo* aInfo)
{
IccInfo::Update(aInfo);
mCdmaIccInfo = aInfo;
}
--- a/dom/indexedDB/IDBCursor.cpp
+++ b/dom/indexedDB/IDBCursor.cpp
@@ -55,18 +55,16 @@ IDBCursor::IDBCursor(Type aType,
aSourceObjectStore);
MOZ_ASSERT_IF(aType == Type_Index || aType == Type_IndexKey, aSourceIndex);
MOZ_ASSERT(aTransaction);
aTransaction->AssertIsOnOwningThread();
MOZ_ASSERT(aBackgroundActor);
MOZ_ASSERT(!aKey.IsUnset());
MOZ_ASSERT(mScriptOwner);
- SetIsDOMBinding();
-
if (mScriptOwner) {
mozilla::HoldJSObjects(this);
mRooted = true;
}
}
IDBCursor::~IDBCursor()
{
--- a/dom/indexedDB/IDBDatabase.cpp
+++ b/dom/indexedDB/IDBDatabase.cpp
@@ -200,18 +200,16 @@ IDBDatabase::IDBDatabase(IDBWrapperCache
, mClosed(false)
, mInvalidated(false)
{
MOZ_ASSERT(aOwnerCache);
MOZ_ASSERT(aFactory);
aFactory->AssertIsOnOwningThread();
MOZ_ASSERT(aActor);
MOZ_ASSERT(aSpec);
-
- SetIsDOMBinding();
}
IDBDatabase::~IDBDatabase()
{
AssertIsOnOwningThread();
MOZ_ASSERT(!mBackgroundActor);
}
--- a/dom/indexedDB/IDBEvents.h
+++ b/dom/indexedDB/IDBEvents.h
@@ -106,17 +106,16 @@ public:
virtual JSObject*
WrapObject(JSContext* aCx) MOZ_OVERRIDE;
private:
IDBVersionChangeEvent(EventTarget* aOwner, uint64_t aOldVersion)
: Event(aOwner, nullptr, nullptr)
, mOldVersion(aOldVersion)
{
- SetIsDOMBinding();
}
~IDBVersionChangeEvent()
{ }
static already_AddRefed<IDBVersionChangeEvent>
CreateInternal(EventTarget* aOwner,
const nsAString& aName,
--- a/dom/indexedDB/IDBFactory.cpp
+++ b/dom/indexedDB/IDBFactory.cpp
@@ -113,18 +113,16 @@ IDBFactory::IDBFactory()
, mRootedOwningObject(false)
, mBackgroundActorFailed(false)
, mPrivateBrowsingMode(false)
{
#ifdef DEBUG
mOwningThread = PR_GetCurrentThread();
#endif
AssertIsOnOwningThread();
-
- SetIsDOMBinding();
}
IDBFactory::~IDBFactory()
{
MOZ_ASSERT_IF(mBackgroundActorFailed, !mBackgroundActor);
if (mRootedOwningObject) {
mOwningObject = nullptr;
--- a/dom/indexedDB/IDBFileHandle.cpp
+++ b/dom/indexedDB/IDBFileHandle.cpp
@@ -27,17 +27,16 @@ NS_DEFINE_CID(kAppShellCID2, NS_APPSHELL
} // anonymous namespace
IDBFileHandle::IDBFileHandle(FileMode aMode,
RequestMode aRequestMode,
IDBMutableFile* aMutableFile)
: FileHandleBase(aMode, aRequestMode)
, mMutableFile(aMutableFile)
{
- SetIsDOMBinding();
}
IDBFileHandle::~IDBFileHandle()
{
}
// static
already_AddRefed<IDBFileHandle>
--- a/dom/indexedDB/IDBIndex.cpp
+++ b/dom/indexedDB/IDBIndex.cpp
@@ -51,18 +51,16 @@ IDBIndex::IDBIndex(IDBObjectStore* aObje
, mCachedKeyPath(JSVAL_VOID)
, mMetadata(aMetadata)
, mId(aMetadata->id())
, mRooted(false)
{
MOZ_ASSERT(aObjectStore);
aObjectStore->AssertIsOnOwningThread();
MOZ_ASSERT(aMetadata);
-
- SetIsDOMBinding();
}
IDBIndex::~IDBIndex()
{
AssertIsOnOwningThread();
if (mRooted) {
mCachedKeyPath = JSVAL_VOID;
--- a/dom/indexedDB/IDBObjectStore.cpp
+++ b/dom/indexedDB/IDBObjectStore.cpp
@@ -864,18 +864,16 @@ IDBObjectStore::IDBObjectStore(IDBTransa
, mCachedKeyPath(JSVAL_VOID)
, mSpec(aSpec)
, mId(aSpec->metadata().id())
, mRooted(false)
{
MOZ_ASSERT(aTransaction);
aTransaction->AssertIsOnOwningThread();
MOZ_ASSERT(aSpec);
-
- SetIsDOMBinding();
}
IDBObjectStore::~IDBObjectStore()
{
AssertIsOnOwningThread();
if (mRooted) {
mCachedKeyPath = JSVAL_VOID;
--- a/dom/interfaces/events/nsIDOMEvent.idl
+++ b/dom/interfaces/events/nsIDOMEvent.idl
@@ -283,21 +283,16 @@ NS_NewDOMMutationEvent(nsIDOMEvent** aRe
nsPresContext* aPresContext,
mozilla::InternalMutationEvent* aEvent);
nsresult
NS_NewDOMDeviceMotionEvent(nsIDOMEvent** aResult,
mozilla::dom::EventTarget* aOwner,
nsPresContext* aPresContext,
mozilla::WidgetEvent* aEvent);
nsresult
-NS_NewDOMTextEvent(nsIDOMEvent** aResult,
- mozilla::dom::EventTarget* aOwner,
- nsPresContext* aPresContext,
- mozilla::WidgetTextEvent* aEvent);
-nsresult
NS_NewDOMBeforeUnloadEvent(nsIDOMEvent** aResult,
mozilla::dom::EventTarget* aOwner,
nsPresContext* aPresContext,
mozilla::WidgetEvent* aEvent);
nsresult
NS_NewDOMSVGEvent(nsIDOMEvent** aResult,
mozilla::dom::EventTarget* aOwner,
nsPresContext* aPresContext,
--- a/dom/ipc/PBrowser.ipdl
+++ b/dom/ipc/PBrowser.ipdl
@@ -39,17 +39,16 @@ using struct nsIMEUpdatePreference from
using struct nsIntPoint from "nsPoint.h";
using struct nsIntRect from "nsRect.h";
using struct nsIntSize from "nsSize.h";
using class mozilla::WidgetKeyboardEvent from "ipc/nsGUIEventIPC.h";
using class mozilla::WidgetMouseEvent from "ipc/nsGUIEventIPC.h";
using class mozilla::WidgetWheelEvent from "ipc/nsGUIEventIPC.h";
using struct nsRect from "nsRect.h";
using class mozilla::WidgetSelectionEvent from "ipc/nsGUIEventIPC.h";
-using class mozilla::WidgetTextEvent from "ipc/nsGUIEventIPC.h";
using class mozilla::WidgetTouchEvent from "ipc/nsGUIEventIPC.h";
using struct mozilla::dom::RemoteDOMEvent from "mozilla/dom/TabMessageUtils.h";
using mozilla::dom::ScreenOrientation from "mozilla/dom/ScreenOrientation.h";
using struct mozilla::layers::TextureFactoryIdentifier from "mozilla/layers/CompositorTypes.h";
using mozilla::CSSPoint from "Units.h";
using mozilla::CSSToScreenScale from "Units.h";
using mozilla::CommandInt from "mozilla/EventForwards.h";
using mozilla::layers::GeckoContentController::APZStateChange from "mozilla/layers/GeckoContentController.h";
@@ -474,18 +473,16 @@ child:
KeyEvent(nsString aType,
int32_t aKeyCode,
int32_t aCharCode,
int32_t aModifiers,
bool aPreventDefault);
CompositionEvent(WidgetCompositionEvent event);
- TextEvent(WidgetTextEvent event);
-
SelectionEvent(WidgetSelectionEvent event);
/**
* Activate event forwarding from client to parent.
*/
ActivateFrameEvent(nsString aType, bool capture);
LoadRemoteScript(nsString aURL, bool aRunInGlobalScope);
@@ -537,16 +534,21 @@ child:
async RequestNotifyAfterRemotePaint();
/**
* Tell the child that the UI resolution changed for the containing
* window.
*/
UIResolutionChanged();
+ /**
+ * Tell the child of an app's offline status
+ */
+ AppOfflineStatus(uint32_t id, bool offline);
+
/*
* FIXME: write protocol!
state LIVE:
send LoadURL goto LIVE;
//etc.
send Destroy goto DYING;
--- a/dom/ipc/TabChild.cpp
+++ b/dom/ipc/TabChild.cpp
@@ -75,16 +75,17 @@
#include "nsViewportInfo.h"
#include "JavaScriptChild.h"
#include "nsILoadContext.h"
#include "ipc/nsGUIEventIPC.h"
#include "mozilla/gfx/Matrix.h"
#include "UnitTransforms.h"
#include "ClientLayerManager.h"
#include "LayersLogging.h"
+#include "nsIOService.h"
#include "nsColorPickerProxy.h"
#define BROWSER_ELEMENT_CHILD_SCRIPT \
NS_LITERAL_STRING("chrome://global/content/BrowserElementChild.js")
#define TABC_LOG(...)
// #define TABC_LOG(...) printf_stderr("TABC: " __VA_ARGS__)
@@ -2384,25 +2385,16 @@ TabChild::RecvCompositionEvent(const Wid
{
WidgetCompositionEvent localEvent(event);
localEvent.widget = mWidget;
DispatchWidgetEvent(localEvent);
return true;
}
bool
-TabChild::RecvTextEvent(const WidgetTextEvent& event)
-{
- WidgetTextEvent localEvent(event);
- localEvent.widget = mWidget;
- DispatchWidgetEvent(localEvent);
- return true;
-}
-
-bool
TabChild::RecvSelectionEvent(const WidgetSelectionEvent& event)
{
WidgetSelectionEvent localEvent(event);
localEvent.widget = mWidget;
DispatchWidgetEvent(localEvent);
return true;
}
@@ -2576,16 +2568,28 @@ TabChild::RecvAsyncMessage(const nsStrin
static_cast<nsFrameMessageManager*>(mTabChildGlobal->mMessageManager.get());
CpowIdHolder cpows(Manager(), aCpows);
mm->ReceiveMessage(static_cast<EventTarget*>(mTabChildGlobal),
aMessage, false, &cloneData, &cpows, aPrincipal, nullptr);
}
return true;
}
+bool
+TabChild::RecvAppOfflineStatus(const uint32_t& aId, const bool& aOffline)
+{
+ // Instantiate the service to make sure gIOService is initialized
+ nsCOMPtr<nsIIOService> ioService = mozilla::services::GetIOService();
+ if (gIOService && ioService) {
+ gIOService->SetAppOfflineInternal(aId, aOffline ?
+ nsIAppOfflineInfo::OFFLINE : nsIAppOfflineInfo::ONLINE);
+ }
+ return true;
+}
+
class UnloadScriptEvent : public nsRunnable
{
public:
UnloadScriptEvent(TabChild* aTabChild, TabChildGlobal* aTabChildGlobal)
: mTabChild(aTabChild), mTabChildGlobal(aTabChildGlobal)
{ }
NS_IMETHOD Run()
--- a/dom/ipc/TabChild.h
+++ b/dom/ipc/TabChild.h
@@ -133,16 +133,21 @@ public:
aVisitor.mForceContentDispatch = true;
return NS_OK;
}
virtual JSContext* GetJSContextForEventHandlers() MOZ_OVERRIDE;
virtual nsIPrincipal* GetPrincipal() MOZ_OVERRIDE;
virtual JSObject* GetGlobalJSObject() MOZ_OVERRIDE;
+ virtual JSObject* WrapObject(JSContext* cx) MOZ_OVERRIDE
+ {
+ MOZ_CRASH("TabChildGlobal doesn't use DOM bindings!");
+ }
+
nsCOMPtr<nsIContentFrameMessageManager> mMessageManager;
nsRefPtr<TabChildBase> mTabChild;
protected:
~TabChildGlobal();
};
class ContentListener MOZ_FINAL : public nsIDOMEventListener
@@ -355,26 +360,27 @@ public:
virtual bool RecvRealTouchMoveEvent(const WidgetTouchEvent& aEvent,
const ScrollableLayerGuid& aGuid) MOZ_OVERRIDE;
virtual bool RecvKeyEvent(const nsString& aType,
const int32_t& aKeyCode,
const int32_t& aCharCode,
const int32_t& aModifiers,
const bool& aPreventDefault) MOZ_OVERRIDE;
virtual bool RecvCompositionEvent(const mozilla::WidgetCompositionEvent& event) MOZ_OVERRIDE;
- virtual bool RecvTextEvent(const mozilla::WidgetTextEvent& event) MOZ_OVERRIDE;
virtual bool RecvSelectionEvent(const mozilla::WidgetSelectionEvent& event) MOZ_OVERRIDE;
virtual bool RecvActivateFrameEvent(const nsString& aType, const bool& capture) MOZ_OVERRIDE;
virtual bool RecvLoadRemoteScript(const nsString& aURL,
const bool& aRunInGlobalScope) MOZ_OVERRIDE;
virtual bool RecvAsyncMessage(const nsString& aMessage,
const ClonedMessageData& aData,
const InfallibleTArray<CpowEntry>& aCpows,
const IPC::Principal& aPrincipal) MOZ_OVERRIDE;
+ virtual bool RecvAppOfflineStatus(const uint32_t& aId, const bool& aOffline) MOZ_OVERRIDE;
+
virtual PDocumentRendererChild*
AllocPDocumentRendererChild(const nsRect& documentRect, const gfx::Matrix& transform,
const nsString& bgcolor,
const uint32_t& renderFlags, const bool& flushLayout,
const nsIntSize& renderSize) MOZ_OVERRIDE;
virtual bool DeallocPDocumentRendererChild(PDocumentRendererChild* actor) MOZ_OVERRIDE;
virtual bool RecvPDocumentRendererConstructor(PDocumentRendererChild* actor,
const nsRect& documentRect,
--- a/dom/ipc/TabParent.cpp
+++ b/dom/ipc/TabParent.cpp
@@ -235,16 +235,17 @@ TabParent::TabParent(nsIContentParent* a
, mDPI(0)
, mDefaultScale(0)
, mShown(false)
, mUpdatedDimensions(false)
, mManager(aManager)
, mMarkedDestroying(false)
, mIsDestroyed(false)
, mAppPackageFileDescriptorSent(false)
+ , mSendOfflineStatus(true)
, mChromeFlags(aChromeFlags)
{
MOZ_ASSERT(aManager);
}
TabParent::~TabParent()
{
}
@@ -494,16 +495,24 @@ TabParent::LoadURL(nsIURI* aURI)
if (!mShown) {
NS_WARNING(nsPrintfCString("TabParent::LoadURL(%s) called before "
"Show(). Ignoring LoadURL.\n",
spec.get()).get());
return;
}
+ uint32_t appId = OwnOrContainingAppId();
+ if (mSendOfflineStatus && NS_IsAppOffline(appId)) {
+ // If the app is offline in the parent process
+ // pass that state to the child process as well
+ unused << SendAppOfflineStatus(appId, true);
+ }
+ mSendOfflineStatus = false;
+
unused << SendLoadURL(spec);
// If this app is a packaged app then we can speed startup by sending over
// the file descriptor for the "application.zip" file that it will
// invariably request. Only do this once.
if (!mAppPackageFileDescriptorSent) {
mAppPackageFileDescriptorSent = true;
@@ -1560,53 +1569,55 @@ TabParent::HandleQueryContentEvent(Widge
}
bool
TabParent::SendCompositionEvent(WidgetCompositionEvent& event)
{
if (mIsDestroyed) {
return false;
}
+
+ if (event.message == NS_COMPOSITION_CHANGE) {
+ return SendCompositionChangeEvent(event);
+ }
+
mIMEComposing = event.message != NS_COMPOSITION_END;
mIMECompositionStart = std::min(mIMESelectionAnchor, mIMESelectionFocus);
if (mIMECompositionEnding)
return true;
event.mSeqno = ++mIMESeqno;
return PBrowserParent::SendCompositionEvent(event);
}
/**
* During REQUEST_TO_COMMIT_COMPOSITION or REQUEST_TO_CANCEL_COMPOSITION,
- * widget usually sends a NS_TEXT_TEXT event to finalize or clear the
- * composition, respectively
+ * widget usually sends a NS_COMPOSITION_CHANGE event to finalize or
+ * clear the composition, respectively
*
* Because the event will not reach content in time, we intercept it
* here and pass the text as the EndIMEComposition return value
*/
bool
-TabParent::SendTextEvent(WidgetTextEvent& event)
+TabParent::SendCompositionChangeEvent(WidgetCompositionEvent& event)
{
- if (mIsDestroyed) {
- return false;
- }
if (mIMECompositionEnding) {
- mIMECompositionText = event.theText;
+ mIMECompositionText = event.mData;
return true;
}
// We must be able to simulate the selection because
// we might not receive selection updates in time
if (!mIMEComposing) {
mIMECompositionStart = std::min(mIMESelectionAnchor, mIMESelectionFocus);
}
mIMESelectionAnchor = mIMESelectionFocus =
- mIMECompositionStart + event.theText.Length();
+ mIMECompositionStart + event.mData.Length();
event.mSeqno = ++mIMESeqno;
- return PBrowserParent::SendTextEvent(event);
+ return PBrowserParent::SendCompositionEvent(event);
}
bool
TabParent::SendSelectionEvent(WidgetSelectionEvent& event)
{
if (mIsDestroyed) {
return false;
}
--- a/dom/ipc/TabParent.h
+++ b/dom/ipc/TabParent.h
@@ -313,17 +313,16 @@ public:
NS_DECL_ISUPPORTS
NS_DECL_NSIAUTHPROMPTPROVIDER
NS_DECL_NSISECUREBROWSERUI
static TabParent *GetIMETabParent() { return mIMETabParent; }
bool HandleQueryContentEvent(mozilla::WidgetQueryContentEvent& aEvent);
bool SendCompositionEvent(mozilla::WidgetCompositionEvent& event);
- bool SendTextEvent(mozilla::WidgetTextEvent& event);
bool SendSelectionEvent(mozilla::WidgetSelectionEvent& event);
static TabParent* GetFrom(nsFrameLoader* aFrameLoader);
static TabParent* GetFrom(nsIContent* aContent);
nsIContentParent* Manager() { return mManager; }
/**
@@ -359,16 +358,18 @@ protected:
virtual PRenderFrameParent* AllocPRenderFrameParent(ScrollingBehavior* aScrolling,
TextureFactoryIdentifier* aTextureFactoryIdentifier,
uint64_t* aLayersId,
bool* aSuccess) MOZ_OVERRIDE;
virtual bool DeallocPRenderFrameParent(PRenderFrameParent* aFrame) MOZ_OVERRIDE;
virtual bool RecvRemotePaintIsReady() MOZ_OVERRIDE;
+ bool SendCompositionChangeEvent(mozilla::WidgetCompositionEvent& event);
+
// IME
static TabParent *mIMETabParent;
nsString mIMECacheText;
uint32_t mIMESelectionAnchor;
uint32_t mIMESelectionFocus;
bool mIMEComposing;
bool mIMECompositionEnding;
// Buffer to store composition text during ResetInputState
@@ -422,16 +423,20 @@ private:
// managing PContent.
bool mMarkedDestroying;
// When true, the TabParent is invalid and we should not send IPC messages
// anymore.
bool mIsDestroyed;
// Whether we have already sent a FileDescriptor for the app package.
bool mAppPackageFileDescriptorSent;
+ // Whether we need to send the offline status to the TabChild
+ // This is true, until the first call of LoadURL
+ bool mSendOfflineStatus;
+
uint32_t mChromeFlags;
nsCOMPtr<nsILoadContext> mLoadContext;
};
} // namespace dom
} // namespace mozilla
--- a/dom/media/GetUserMediaRequest.cpp
+++ b/dom/media/GetUserMediaRequest.cpp
@@ -18,17 +18,16 @@ GetUserMediaRequest::GetUserMediaRequest
const MediaStreamConstraints& aConstraints,
bool aIsSecure)
: mInnerWindowID(aInnerWindow->WindowID())
, mOuterWindowID(aInnerWindow->GetOuterWindow()->WindowID())
, mCallID(aCallID)
, mConstraints(new MediaStreamConstraints(aConstraints))
, mIsSecure(aIsSecure)
{
- SetIsDOMBinding();
}
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_0(GetUserMediaRequest)
NS_IMPL_CYCLE_COLLECTING_ADDREF(GetUserMediaRequest)
NS_IMPL_CYCLE_COLLECTING_RELEASE(GetUserMediaRequest)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(GetUserMediaRequest)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
--- a/dom/media/PeerConnection.js
+++ b/dom/media/PeerConnection.js
@@ -145,16 +145,25 @@ GlobalPCList.prototype = {
}
else if (topic == "network:offline-status-changed") {
if (data == "offline") {
// this._list shold be empty here
this._networkdown = true;
} else if (data == "online") {
this._networkdown = false;
}
+ } else if (topic == "network:app-offline-status-changed") {
+ // App just went offline. The subject also contains the appId,
+ // but navigator.onLine checks that for us
+ if (!this._networkdown && !this._win.navigator.onLine) {
+ for (let winId in this._list) {
+ cleanupWinId(this._list, winId);
+ }
+ }
+ this._networkdown = !this._win.navigator.onLine;
} else if (topic == "gmp-plugin-crash") {
// a plugin crashed; if it's associated with any of our PCs, fire an
// event to the DOM window
let sep = data.indexOf(' ');
let pluginId = data.slice(0, sep);
let rest = data.slice(sep+1);
// This presumes no spaces in the name!
sep = rest.indexOf(' ');
@@ -327,17 +336,17 @@ RTCPeerConnection.prototype = {
__init: function(rtcConfig) {
if (!rtcConfig.iceServers ||
!Services.prefs.getBoolPref("media.peerconnection.use_document_iceservers")) {
rtcConfig.iceServers =
JSON.parse(Services.prefs.getCharPref("media.peerconnection.default_iceservers"));
}
this._mustValidateRTCConfiguration(rtcConfig,
"RTCPeerConnection constructor passed invalid RTCConfiguration");
- if (_globalPCList._networkdown) {
+ if (_globalPCList._networkdown || !this._win.navigator.onLine) {
throw new this._win.DOMError("",
"Can't create RTCPeerConnections when the network is down");
}
this.makeGetterSetterEH("onaddstream");
this.makeGetterSetterEH("onaddtrack");
this.makeGetterSetterEH("onicecandidate");
this.makeGetterSetterEH("onnegotiationneeded");
--- a/dom/mobileconnection/MobileCellInfo.cpp
+++ b/dom/mobileconnection/MobileCellInfo.cpp
@@ -25,17 +25,16 @@ MobileCellInfo::MobileCellInfo(nsPIDOMWi
, mGsmLocationAreaCode(-1)
, mGsmCellId(-1)
, mCdmaBaseStationId(-1)
, mCdmaBaseStationLatitude(-1)
, mCdmaBaseStationLongitude(-1)
, mCdmaSystemId(-1)
, mCdmaNetworkId(-1)
{
- SetIsDOMBinding();
}
MobileCellInfo::MobileCellInfo(int32_t aGsmLocationAreaCode,
int64_t aGsmCellId,
int32_t aCdmaBaseStationId,
int32_t aCdmaBaseStationLatitude,
int32_t aCdmaBaseStationLongitude,
int32_t aCdmaSystemId,
@@ -44,19 +43,18 @@ MobileCellInfo::MobileCellInfo(int32_t a
, mGsmCellId(aGsmCellId)
, mCdmaBaseStationId(aCdmaBaseStationId)
, mCdmaBaseStationLatitude(aCdmaBaseStationLatitude)
, mCdmaBaseStationLongitude(aCdmaBaseStationLongitude)
, mCdmaSystemId(aCdmaSystemId)
, mCdmaNetworkId(aCdmaNetworkId)
{
// The instance created by this way is only used for IPC stuff. It won't be
- // expose to JS directly, we will clone this instance to the one that is
- // maintained in MobileConnectionChild. So we don't need SetIsDOMBinding()
- // here.
+ // exposed to JS directly, we will clone this instance to the one that is
+ // maintained in MobileConnectionChild.
}
void
MobileCellInfo::Update(nsIMobileCellInfo* aInfo)
{
if (!aInfo) {
return;
}
@@ -68,17 +66,16 @@ MobileCellInfo::Update(nsIMobileCellInfo
aInfo->GetCdmaBaseStationLongitude(&mCdmaBaseStationLongitude);
aInfo->GetCdmaSystemId(&mCdmaSystemId);
aInfo->GetCdmaNetworkId(&mCdmaNetworkId);
}
JSObject*
MobileCellInfo::WrapObject(JSContext* aCx)
{
- MOZ_ASSERT(IsDOMBinding());
return MozMobileCellInfoBinding::Wrap(aCx, this);
}
// nsIMobileCellInfo
NS_IMETHODIMP
MobileCellInfo::GetGsmLocationAreaCode(int32_t* aGsmLocationAreaCode)
{
--- a/dom/mobileconnection/MobileConnection.cpp
+++ b/dom/mobileconnection/MobileConnection.cpp
@@ -102,18 +102,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_
NS_INTERFACE_MAP_END_INHERITING(DOMEventTargetHelper)
NS_IMPL_ADDREF_INHERITED(MobileConnection, DOMEventTargetHelper)
NS_IMPL_RELEASE_INHERITED(MobileConnection, DOMEventTargetHelper)
MobileConnection::MobileConnection(nsPIDOMWindow* aWindow, uint32_t aClientId)
: DOMEventTargetHelper(aWindow)
{
- SetIsDOMBinding();
-
nsCOMPtr<nsIMobileConnectionService> service =
do_GetService(NS_MOBILE_CONNECTION_SERVICE_CONTRACTID);
// Not being able to acquire the service isn't fatal since we check
// for it explicitly below.
if (!service) {
NS_WARNING("Could not acquire nsIMobileConnectionService!");
return;
--- a/dom/mobileconnection/MobileConnectionArray.cpp
+++ b/dom/mobileconnection/MobileConnectionArray.cpp
@@ -29,17 +29,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
MobileConnectionArray::MobileConnectionArray(nsPIDOMWindow* aWindow)
: mLengthInitialized(false)
, mWindow(aWindow)
{
- SetIsDOMBinding();
}
MobileConnectionArray::~MobileConnectionArray()
{
}
nsPIDOMWindow*
MobileConnectionArray::GetParentObject() const
--- a/dom/mobileconnection/MobileConnectionInfo.cpp
+++ b/dom/mobileconnection/MobileConnectionInfo.cpp
@@ -53,17 +53,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_INTERFACE_MAP_END
MobileConnectionInfo::MobileConnectionInfo(nsPIDOMWindow* aWindow)
: mConnected(false)
, mEmergencyCallsOnly(false)
, mRoaming(false)
, mWindow(aWindow)
{
- SetIsDOMBinding();
}
MobileConnectionInfo::MobileConnectionInfo(const nsAString& aState,
bool aConnected,
bool aEmergencyCallsOnly,
bool aRoaming,
nsIMobileNetworkInfo* aNetworkInfo,
const nsAString& aType,
@@ -72,19 +71,18 @@ MobileConnectionInfo::MobileConnectionIn
nsIMobileCellInfo* aCellInfo)
: mConnected(aConnected)
, mEmergencyCallsOnly(aEmergencyCallsOnly)
, mRoaming(aRoaming)
, mSignalStrength(aSignalStrength)
, mRelSignalStrength(aRelSignalStrength)
{
// The instance created by this way is only used for IPC stuff. It won't be
- // expose to JS directly, we will clone this instance to the one that is
- // maintained in MobileConnectionChild. So we don't need SetIsDOMBinding()
- // here.
+ // exposed to JS directly, we will clone this instance to the one that is
+ // maintained in MobileConnectionChild.
// Update mState and mType
CONVERT_STRING_TO_NULLABLE_ENUM(aState, MobileConnectionState, mState);
CONVERT_STRING_TO_NULLABLE_ENUM(aType, MobileConnectionType, mType);
// Update mNetworkInfo
if (aNetworkInfo) {
mNetworkInfo = new MobileNetworkInfo(mWindow);
@@ -161,17 +159,16 @@ MobileConnectionInfo::Update(nsIMobileCo
} else {
mCellInfo = nullptr;
}
}
JSObject*
MobileConnectionInfo::WrapObject(JSContext* aCx)
{
- MOZ_ASSERT(IsDOMBinding());
return MozMobileConnectionInfoBinding::Wrap(aCx, this);
}
// nsIMobileConnectionInfo
NS_IMETHODIMP
MobileConnectionInfo::GetState(nsAString& aState)
{
--- a/dom/mobileconnection/MobileNetworkInfo.cpp
+++ b/dom/mobileconnection/MobileNetworkInfo.cpp
@@ -17,33 +17,31 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_ENTRY(nsIMobileNetworkInfo)
NS_INTERFACE_MAP_END
MobileNetworkInfo::MobileNetworkInfo(nsPIDOMWindow* aWindow)
: mWindow(aWindow)
{
- SetIsDOMBinding();
}
MobileNetworkInfo::MobileNetworkInfo(const nsAString& aShortName,
const nsAString& aLongName,
const nsAString& aMcc,
const nsAString& aMnc,
const nsAString& aState)
: mShortName(aShortName)
, mLongName(aLongName)
, mMcc(aMcc)
, mMnc(aMnc)
, mState(aState)
{
// The parent object is nullptr when MobileNetworkInfo is created by this way.
// And it won't be exposed to web content.
- SetIsDOMBinding();
}
void
MobileNetworkInfo::Update(nsIMobileNetworkInfo* aInfo)
{
if (!aInfo) {
return;
}
--- a/dom/network/Connection.cpp
+++ b/dom/network/Connection.cpp
@@ -23,29 +23,22 @@ namespace network {
NS_IMPL_QUERY_INTERFACE_INHERITED(Connection, DOMEventTargetHelper,
nsINetworkProperties)
// Don't use |Connection| alone, since that confuses nsTraceRefcnt since
// we're not the only class with that name.
NS_IMPL_ADDREF_INHERITED(dom::network::Connection, DOMEventTargetHelper)
NS_IMPL_RELEASE_INHERITED(dom::network::Connection, DOMEventTargetHelper)
-Connection::Connection()
- : mType(static_cast<ConnectionType>(kDefaultType))
+Connection::Connection(nsPIDOMWindow* aWindow)
+ : DOMEventTargetHelper(aWindow)
+ , mType(static_cast<ConnectionType>(kDefaultType))
, mIsWifi(kDefaultIsWifi)
, mDHCPGateway(kDefaultDHCPGateway)
{
- SetIsDOMBinding();
-}
-
-void
-Connection::Init(nsPIDOMWindow* aWindow)
-{
- BindToOwner(aWindow);
-
hal::RegisterNetworkObserver(this);
hal::NetworkInformation networkInfo;
hal::GetCurrentNetworkInformation(&networkInfo);
UpdateFromNetworkInfo(networkInfo);
}
--- a/dom/network/Connection.h
+++ b/dom/network/Connection.h
@@ -27,19 +27,18 @@ class Connection MOZ_FINAL : public DOME
, public nsINetworkProperties
{
public:
NS_DECL_ISUPPORTS_INHERITED
NS_DECL_NSINETWORKPROPERTIES
NS_REALLY_FORWARD_NSIDOMEVENTTARGET(DOMEventTargetHelper)
- Connection();
+ Connection(nsPIDOMWindow *aWindow);
- void Init(nsPIDOMWindow *aWindow);
void Shutdown();
// For IObserver
void Notify(const hal::NetworkInformation& aNetworkInfo);
// WebIDL
virtual JSObject* WrapObject(JSContext* aCx) MOZ_OVERRIDE;
--- a/dom/network/TCPSocketParent.cpp
+++ b/dom/network/TCPSocketParent.cpp
@@ -63,24 +63,70 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTING_ADDREF(TCPSocketParentBase)
NS_IMPL_CYCLE_COLLECTING_RELEASE(TCPSocketParentBase)
TCPSocketParentBase::TCPSocketParentBase()
: mIPCOpen(false)
{
+ mObserver = new mozilla::net::OfflineObserver(this);
mozilla::HoldJSObjects(this);
}
TCPSocketParentBase::~TCPSocketParentBase()
{
+ if (mObserver) {
+ mObserver->RemoveObserver();
+ }
mozilla::DropJSObjects(this);
}
+uint32_t
+TCPSocketParent::GetAppId()
+{
+ uint32_t appId = nsIScriptSecurityManager::UNKNOWN_APP_ID;
+ const PContentParent *content = Manager()->Manager();
+ const InfallibleTArray<PBrowserParent*>& browsers = content->ManagedPBrowserParent();
+ if (browsers.Length() > 0) {
+ TabParent *tab = static_cast<TabParent*>(browsers[0]);
+ appId = tab->OwnAppId();
+ }
+ return appId;
+};
+
+nsresult
+TCPSocketParent::OfflineNotification(nsISupports *aSubject)
+{
+ nsCOMPtr<nsIAppOfflineInfo> info(do_QueryInterface(aSubject));
+ if (!info) {
+ return NS_OK;
+ }
+
+ uint32_t targetAppId = nsIScriptSecurityManager::UNKNOWN_APP_ID;
+ info->GetAppId(&targetAppId);
+
+ // Obtain App ID
+ uint32_t appId = GetAppId();
+ if (appId != targetAppId) {
+ return NS_OK;
+ }
+
+ // If the app is offline, close the socket
+ if (mSocket && NS_IsAppOffline(appId)) {
+ mSocket->Close();
+ mSocket = nullptr;
+ mIntermediaryObj = nullptr;
+ mIntermediary = nullptr;
+ }
+
+ return NS_OK;
+}
+
+
void
TCPSocketParentBase::ReleaseIPDLReference()
{
MOZ_ASSERT(mIPCOpen);
mIPCOpen = false;
this->Release();
}
@@ -110,22 +156,22 @@ TCPSocketParent::RecvOpen(const nsString
// tests without this loophole.
if (net::UsingNeckoIPCSecurity() &&
!AssertAppProcessPermission(Manager()->Manager(), "tcp-socket")) {
FireInteralError(this, __LINE__);
return true;
}
// Obtain App ID
- uint32_t appId = nsIScriptSecurityManager::NO_APP_ID;
- const PContentParent *content = Manager()->Manager();
- const InfallibleTArray<PBrowserParent*>& browsers = content->ManagedPBrowserParent();
- if (browsers.Length() > 0) {
- TabParent *tab = static_cast<TabParent*>(browsers[0]);
- appId = tab->OwnAppId();
+ uint32_t appId = GetAppId();
+
+ if (NS_IsAppOffline(appId)) {
+ NS_ERROR("Can't open socket because app is offline");
+ FireInteralError(this, __LINE__);
+ return true;
}
nsresult rv;
mIntermediary = do_CreateInstance("@mozilla.org/tcp-socket-intermediary;1", &rv);
if (NS_FAILED(rv)) {
FireInteralError(this, __LINE__);
return true;
}
--- a/dom/network/TCPSocketParent.h
+++ b/dom/network/TCPSocketParent.h
@@ -6,41 +6,44 @@
#define mozilla_dom_TCPSocketParent_h
#include "mozilla/net/PTCPSocketParent.h"
#include "nsITCPSocketParent.h"
#include "nsCycleCollectionParticipant.h"
#include "nsCOMPtr.h"
#include "nsIDOMTCPSocket.h"
#include "js/TypeDecls.h"
+#include "mozilla/net/OfflineObserver.h"
#define TCPSOCKETPARENT_CID \
{ 0x4e7246c6, 0xa8b3, 0x426d, { 0x9c, 0x17, 0x76, 0xda, 0xb1, 0xe1, 0xe1, 0x4a } }
namespace mozilla {
namespace dom {
class PBrowserParent;
class TCPSocketParentBase : public nsITCPSocketParent
+ , public mozilla::net::DisconnectableParent
{
public:
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TCPSocketParentBase)
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
void AddIPDLReference();
void ReleaseIPDLReference();
protected:
TCPSocketParentBase();
virtual ~TCPSocketParentBase();
JS::Heap<JSObject*> mIntermediaryObj;
nsCOMPtr<nsITCPSocketIntermediary> mIntermediary;
nsCOMPtr<nsIDOMTCPSocket> mSocket;
+ nsRefPtr<mozilla::net::OfflineObserver> mObserver;
bool mIPCOpen;
};
class TCPSocketParent : public mozilla::net::PTCPSocketParent
, public TCPSocketParentBase
{
public:
NS_DECL_NSITCPSOCKETPARENT
@@ -53,16 +56,18 @@ public:
virtual bool RecvStartTLS() MOZ_OVERRIDE;
virtual bool RecvSuspend() MOZ_OVERRIDE;
virtual bool RecvResume() MOZ_OVERRIDE;
virtual bool RecvClose() MOZ_OVERRIDE;
virtual bool RecvData(const SendableData& aData,
const uint32_t& aTrackingNumber) MOZ_OVERRIDE;
virtual bool RecvRequestDelete() MOZ_OVERRIDE;
+ virtual nsresult OfflineNotification(nsISupports *) MOZ_OVERRIDE;
+ virtual uint32_t GetAppId() MOZ_OVERRIDE;
private:
virtual void ActorDestroy(ActorDestroyReason why) MOZ_OVERRIDE;
};
} // namespace dom
} // namespace mozilla
--- a/dom/network/UDPSocketParent.cpp
+++ b/dom/network/UDPSocketParent.cpp
@@ -10,24 +10,74 @@
#include "nsIUDPSocket.h"
#include "nsINetAddr.h"
#include "mozilla/AppProcessChecker.h"
#include "mozilla/unused.h"
#include "mozilla/ipc/InputStreamUtils.h"
#include "mozilla/net/DNS.h"
#include "mozilla/net/NeckoCommon.h"
#include "mozilla/net/PNeckoParent.h"
+#include "nsNetUtil.h"
+#include "mozilla/dom/ContentParent.h"
+#include "mozilla/dom/TabParent.h"
namespace mozilla {
namespace dom {
NS_IMPL_ISUPPORTS(UDPSocketParent, nsIUDPSocketListener)
+UDPSocketParent::UDPSocketParent()
+ : mIPCOpen(true)
+{
+ mObserver = new mozilla::net::OfflineObserver(this);
+}
+
UDPSocketParent::~UDPSocketParent()
{
+ if (mObserver) {
+ mObserver->RemoveObserver();
+ }
+}
+
+nsresult
+UDPSocketParent::OfflineNotification(nsISupports *aSubject)
+{
+ nsCOMPtr<nsIAppOfflineInfo> info(do_QueryInterface(aSubject));
+ if (!info) {
+ return NS_OK;
+ }
+
+ uint32_t targetAppId = nsIScriptSecurityManager::UNKNOWN_APP_ID;
+ info->GetAppId(&targetAppId);
+
+ // Obtain App ID
+ uint32_t appId = GetAppId();
+ if (appId != targetAppId) {
+ return NS_OK;
+ }
+
+ // If the app is offline, close the socket
+ if (mSocket && NS_IsAppOffline(appId)) {
+ mSocket->Close();
+ }
+
+ return NS_OK;
+}
+
+uint32_t
+UDPSocketParent::GetAppId()
+{
+ uint32_t appId = nsIScriptSecurityManager::UNKNOWN_APP_ID;
+ const PContentParent *content = Manager()->Manager();
+ const InfallibleTArray<PBrowserParent*>& browsers = content->ManagedPBrowserParent();
+ if (browsers.Length() > 0) {
+ TabParent *tab = static_cast<TabParent*>(browsers[0]);
+ appId = tab->OwnAppId();
+ }
+ return appId;
}
bool
UDPSocketParent::Init(const nsACString& aFilter)
{
if (!aFilter.IsEmpty()) {
nsAutoCString contractId(NS_NETWORK_UDP_SOCKET_FILTER_HANDLER_PREFIX);
contractId.Append(aFilter);
--- a/dom/network/UDPSocketParent.h
+++ b/dom/network/UDPSocketParent.h
@@ -6,57 +6,61 @@
#ifndef mozilla_dom_UDPSocketParent_h__
#define mozilla_dom_UDPSocketParent_h__
#include "mozilla/net/PUDPSocketParent.h"
#include "nsCOMPtr.h"
#include "nsIUDPSocket.h"
#include "nsIUDPSocketFilter.h"
+#include "mozilla/net/OfflineObserver.h"
namespace mozilla {
namespace dom {
class UDPSocketParent : public mozilla::net::PUDPSocketParent
, public nsIUDPSocketListener
+ , public mozilla::net::DisconnectableParent
{
public:
NS_DECL_THREADSAFE_ISUPPORTS
NS_DECL_NSIUDPSOCKETLISTENER
- UDPSocketParent() :
- mIPCOpen(true) {}
+ UDPSocketParent();
bool Init(const nsACString& aFilter);
virtual bool RecvBind(const UDPAddressInfo& aAddressInfo,
const bool& aAddressReuse, const bool& aLoopback) MOZ_OVERRIDE;
virtual bool RecvOutgoingData(const UDPData& aData, const UDPSocketAddr& aAddr) MOZ_OVERRIDE;
virtual bool RecvClose() MOZ_OVERRIDE;
virtual bool RecvRequestDelete() MOZ_OVERRIDE;
virtual bool RecvJoinMulticast(const nsCString& aMulticastAddress,
const nsCString& aInterface) MOZ_OVERRIDE;
virtual bool RecvLeaveMulticast(const nsCString& aMulticastAddress,
const nsCString& aInterface) MOZ_OVERRIDE;
+ virtual nsresult OfflineNotification(nsISupports *) MOZ_OVERRIDE;
+ virtual uint32_t GetAppId() MOZ_OVERRIDE;
private:
virtual ~UDPSocketParent();
virtual void ActorDestroy(ActorDestroyReason why) MOZ_OVERRIDE;
void Send(const InfallibleTArray<uint8_t>& aData, const UDPSocketAddr& aAddr);
void Send(const InputStreamParams& aStream, const UDPSocketAddr& aAddr);
nsresult BindInternal(const nsCString& aHost, const uint16_t& aPort,
const bool& aAddressReuse, const bool& aLoopback);
void FireInternalError(uint32_t aLineNo);
bool mIPCOpen;
nsCOMPtr<nsIUDPSocket> mSocket;
nsCOMPtr<nsIUDPSocketFilter> mFilter;
+ nsRefPtr<mozilla::net::OfflineObserver> mObserver;
};
} // namespace dom
} // namespace mozilla
#endif // !defined(mozilla_dom_UDPSocketParent_h__)
--- a/dom/nfc/MozNDEFRecord.cpp
+++ b/dom/nfc/MozNDEFRecord.cpp
@@ -145,17 +145,16 @@ MozNDEFRecord::MozNDEFRecord(JSContext*
}
if (aOptions.mPayload.WasPassed()) {
const Uint8Array& payload = aOptions.mPayload.Value();
payload.ComputeLengthAndData();
mPayload = Uint8Array::Create(aCx, this, payload.Length(), payload.Data());
}
- SetIsDOMBinding();
HoldData();
}
MozNDEFRecord::~MozNDEFRecord()
{
DropData();
}
--- a/dom/notification/DesktopNotification.h
+++ b/dom/notification/DesktopNotification.h
@@ -46,18 +46,16 @@ public:
MOZ_ASSERT(aWindow);
mOwner = aWindow;
nsCOMPtr<nsIScriptObjectPrincipal> sop = do_QueryInterface(aWindow);
MOZ_ASSERT(sop);
mPrincipal = sop->GetPrincipal();
MOZ_ASSERT(mPrincipal);
-
- SetIsDOMBinding();
}
void Shutdown() {
mOwner = nullptr;
}
nsPIDOMWindow* GetParentObject() const
{
--- a/dom/power/PowerManager.h
+++ b/dom/power/PowerManager.h
@@ -24,21 +24,16 @@ namespace dom {
class PowerManager MOZ_FINAL : public nsIDOMMozWakeLockListener
, public nsWrapperCache
{
public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(PowerManager)
NS_DECL_NSIDOMMOZWAKELOCKLISTENER
- PowerManager()
- {
- SetIsDOMBinding();
- }
-
nsresult Init(nsIDOMWindow *aWindow);
nsresult Shutdown();
static already_AddRefed<PowerManager> CreateInstance(nsPIDOMWindow*);
// WebIDL
nsIDOMWindow* GetParentObject() const
{
--- a/dom/power/WakeLock.cpp
+++ b/dom/power/WakeLock.cpp
@@ -34,17 +34,16 @@ NS_INTERFACE_MAP_END
NS_IMPL_CYCLE_COLLECTING_ADDREF(WakeLock)
NS_IMPL_CYCLE_COLLECTING_RELEASE(WakeLock)
WakeLock::WakeLock()
: mLocked(false)
, mHidden(true)
, mContentParentID(CONTENT_PROCESS_ID_UNKNOWN)
{
- SetIsDOMBinding();
}
WakeLock::~WakeLock()
{
DoUnlock();
DetachEventListener();
}
--- a/dom/promise/Promise.cpp
+++ b/dom/promise/Promise.cpp
@@ -302,17 +302,16 @@ Promise::Promise(nsIGlobalObject* aGloba
, mState(Pending)
, mTaskPending(false)
, mHadRejectCallback(false)
, mResolvePending(false)
{
MOZ_ASSERT(mGlobal);
mozilla::HoldJSObjects(this);
- SetIsDOMBinding();
}
Promise::~Promise()
{
MaybeReportRejectedOnce();
mozilla::DropJSObjects(this);
}
--- a/dom/smil/TimeEvent.cpp
+++ b/dom/smil/TimeEvent.cpp
@@ -14,17 +14,16 @@ namespace dom {
TimeEvent::TimeEvent(EventTarget* aOwner,
nsPresContext* aPresContext,
InternalSMILTimeEvent* aEvent)
: Event(aOwner, aPresContext,
aEvent ? aEvent : new InternalSMILTimeEvent(false, 0))
, mDetail(mEvent->AsSMILTimeEvent()->detail)
{
- SetIsDOMBinding();
if (aEvent) {
mEventIsInternal = false;
} else {
mEventIsInternal = true;
}
if (mPresContext) {
nsCOMPtr<nsIDocShell> docShell = mPresContext->GetDocShell();
--- a/dom/speakermanager/SpeakerManager.cpp
+++ b/dom/speakermanager/SpeakerManager.cpp
@@ -20,17 +20,16 @@ NS_IMPL_QUERY_INTERFACE_INHERITED(Speake
nsIDOMEventListener)
NS_IMPL_ADDREF_INHERITED(SpeakerManager, DOMEventTargetHelper)
NS_IMPL_RELEASE_INHERITED(SpeakerManager, DOMEventTargetHelper)
SpeakerManager::SpeakerManager()
: mForcespeaker(false)
, mVisible(false)
{
- SetIsDOMBinding();
SpeakerManagerService *service =
SpeakerManagerService::GetOrCreateSpeakerManagerService();
MOZ_ASSERT(service);
service->RegisterSpeakerManager(this);
}
SpeakerManager::~SpeakerManager()
{
--- a/dom/storage/DOMStorage.cpp
+++ b/dom/storage/DOMStorage.cpp
@@ -47,17 +47,16 @@ DOMStorage::DOMStorage(nsIDOMWindow* aWi
, mManager(aManager)
, mCache(aCache)
, mDocumentURI(aDocumentURI)
, mPrincipal(aPrincipal)
, mIsPrivate(aIsPrivate)
, mIsSessionOnly(false)
{
mCache->Preload();
- SetIsDOMBinding();
}
DOMStorage::~DOMStorage()
{
mCache->KeepAlive();
}
/* virtual */ JSObject*
--- a/dom/system/gonk/AudioChannelManager.cpp
+++ b/dom/system/gonk/AudioChannelManager.cpp
@@ -25,17 +25,16 @@ NS_IMPL_ADDREF_INHERITED(AudioChannelMan
NS_IMPL_RELEASE_INHERITED(AudioChannelManager, DOMEventTargetHelper)
AudioChannelManager::AudioChannelManager()
: mState(SWITCH_STATE_UNKNOWN)
, mVolumeChannel(-1)
{
RegisterSwitchObserver(SWITCH_HEADPHONES, this);
mState = GetCurrentSwitchState(SWITCH_HEADPHONES);
- SetIsDOMBinding();
}
AudioChannelManager::~AudioChannelManager()
{
UnregisterSwitchObserver(SWITCH_HEADPHONES, this);
nsCOMPtr<EventTarget> target = do_QueryInterface(GetOwner());
NS_ENSURE_TRUE_VOID(target);
--- a/dom/telephony/CallsList.cpp
+++ b/dom/telephony/CallsList.cpp
@@ -24,18 +24,16 @@ NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
CallsList::CallsList(Telephony* aTelephony, TelephonyCallGroup* aGroup)
: mTelephony(aTelephony), mGroup(aGroup)
{
MOZ_ASSERT(mTelephony);
-
- SetIsDOMBinding();
}
CallsList::~CallsList()
{
}
nsPIDOMWindow*
CallsList::GetParentObject() const
--- a/dom/telephony/TelephonyCallId.cpp
+++ b/dom/telephony/TelephonyCallId.cpp
@@ -14,17 +14,16 @@ namespace dom {
TelephonyCallId::TelephonyCallId(nsPIDOMWindow* aWindow,
const nsAString& aNumber,
uint16_t aNumberPresentation,
const nsAString& aName,
uint16_t aNamePresentation)
: mWindow(aWindow), mNumber(aNumber), mNumberPresentation(aNumberPresentation),
mName(aName), mNamePresentation(aNamePresentation)
{
- SetIsDOMBinding();
}
TelephonyCallId::~TelephonyCallId()
{
}
JSObject*
TelephonyCallId::WrapObject(JSContext* aCx)
--- a/dom/time/TimeManager.h
+++ b/dom/time/TimeManager.h
@@ -31,17 +31,16 @@ public:
}
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(TimeManager)
explicit TimeManager(nsPIDOMWindow* aWindow)
: mWindow(aWindow)
{
- SetIsDOMBinding();
}
nsPIDOMWindow* GetParentObject() const
{
return mWindow;
}
JSObject* WrapObject(JSContext* aCx);
--- a/dom/voicemail/VoicemailStatus.cpp
+++ b/dom/voicemail/VoicemailStatus.cpp
@@ -26,18 +26,16 @@ NS_INTERFACE_MAP_END
VoicemailStatus::VoicemailStatus(nsISupports* aParent,
nsIVoicemailProvider* aProvider)
: mParent(aParent)
, mProvider(aProvider)
{
MOZ_ASSERT(mParent);
MOZ_ASSERT(mProvider);
-
- SetIsDOMBinding();
}
JSObject*
VoicemailStatus::WrapObject(JSContext* aCx)
{
return MozVoicemailStatusBinding::Wrap(aCx, this);
}
--- a/dom/workers/Location.h
+++ b/dom/workers/Location.h
@@ -39,17 +39,16 @@ class WorkerLocation MOZ_FINAL : public
, mHostname(aHostname)
, mPort(aPort)
, mPathname(aPathname)
, mSearch(aSearch)
, mHash(aHash)
, mOrigin(aOrigin)
{
MOZ_COUNT_CTOR(WorkerLocation);
- SetIsDOMBinding();
}
~WorkerLocation()
{
MOZ_COUNT_DTOR(WorkerLocation);
}
public:
--- a/dom/workers/MessagePort.cpp
+++ b/dom/workers/MessagePort.cpp
@@ -76,24 +76,22 @@ BEGIN_WORKERS_NAMESPACE
MessagePort::MessagePort(nsPIDOMWindow* aWindow, SharedWorker* aSharedWorker,
uint64_t aSerial)
: MessagePortBase(aWindow), mSharedWorker(aSharedWorker),
mWorkerPrivate(nullptr), mSerial(aSerial), mStarted(false)
{
AssertIsOnMainThread();
MOZ_ASSERT(aSharedWorker);
- SetIsDOMBinding();
}
MessagePort::MessagePort(WorkerPrivate* aWorkerPrivate, uint64_t aSerial)
: mWorkerPrivate(aWorkerPrivate), mSerial(aSerial), mStarted(false)
{
aWorkerPrivate->AssertIsOnWorkerThread();
- SetIsDOMBinding();
}
MessagePort::~MessagePort()
{
Close();
}
void
--- a/dom/workers/Navigator.h
+++ b/dom/workers/Navigator.h
@@ -31,17 +31,16 @@ class WorkerNavigator MOZ_FINAL : public
bool mOnline;
WorkerNavigator(const NavigatorProperties& aProperties,
bool aOnline)
: mProperties(aProperties)
, mOnline(aOnline)
{
MOZ_COUNT_CTOR(WorkerNavigator);
- SetIsDOMBinding();
}
~WorkerNavigator()
{
MOZ_COUNT_DTOR(WorkerNavigator);
}
public:
--- a/dom/workers/Performance.cpp
+++ b/dom/workers/Performance.cpp
@@ -13,17 +13,16 @@ NS_IMPL_CYCLE_COLLECTION_ROOT_NATIVE(Per
NS_IMPL_CYCLE_COLLECTION_UNROOT_NATIVE(Performance, Release)
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE_0(Performance)
Performance::Performance(WorkerPrivate* aWorkerPrivate)
: mWorkerPrivate(aWorkerPrivate)
{
mWorkerPrivate->AssertIsOnWorkerThread();
- SetIsDOMBinding();
}
Performance::~Performance()
{
mWorkerPrivate->AssertIsOnWorkerThread();
}
JSObject*
--- a/dom/workers/RuntimeService.cpp
+++ b/dom/workers/RuntimeService.cpp
@@ -2595,16 +2595,22 @@ RuntimeService::Observe(nsISupports* aSu
GarbageCollectAllWorkers(/* shrinking = */ true);
CycleCollectAllWorkers();
return NS_OK;
}
if (!strcmp(aTopic, NS_IOSERVICE_OFFLINE_STATUS_TOPIC)) {
SendOfflineStatusChangeEventToAllWorkers(NS_IsOffline());
return NS_OK;
}
+ if (!strcmp(aTopic, NS_IOSERVICE_APP_OFFLINE_STATUS_TOPIC)) {
+ BROADCAST_ALL_WORKERS(OfflineStatusChangeEvent,
+ NS_IsOffline() ||
+ NS_IsAppOffline(workers[index]->GetPrincipal()));
+ return NS_OK;
+ }
NS_NOTREACHED("Unknown observer topic!");
return NS_OK;
}
/* static */ void
RuntimeService::WorkerPrefChanged(const char* aPrefName, void* aClosure)
{
--- a/dom/workers/WorkerPrivate.cpp
+++ b/dom/workers/WorkerPrivate.cpp
@@ -2130,18 +2130,16 @@ WorkerPrivateParent<Derived>::WorkerPriv
mMemoryReportCondVar(mMutex, "WorkerPrivateParent Memory Report CondVar"),
mParent(aParent), mScriptURL(aScriptURL),
mSharedWorkerName(aSharedWorkerName), mBusyCount(0), mMessagePortSerial(0),
mParentStatus(Pending), mParentSuspended(false),
mIsChromeWorker(aIsChromeWorker), mMainThreadObjectsForgotten(false),
mWorkerType(aWorkerType),
mCreationTimeStamp(TimeStamp::Now())
{
- SetIsDOMBinding();
-
MOZ_ASSERT_IF(!IsDedicatedWorker(),
!aSharedWorkerName.IsVoid() && NS_IsMainThread());
MOZ_ASSERT_IF(IsDedicatedWorker(), aSharedWorkerName.IsEmpty());
if (aLoadInfo.mWindow) {
AssertIsOnMainThread();
MOZ_ASSERT(aLoadInfo.mWindow->IsInnerWindow(),
"Should have inner window here!");
@@ -3025,16 +3023,21 @@ WorkerPrivateParent<Derived>::OfflineSta
}
}
void
WorkerPrivate::OfflineStatusChangeEventInternal(JSContext* aCx, bool aIsOffline)
{
AssertIsOnWorkerThread();
+ // The worker is already in this state. No need to dispatch an event.
+ if (mOnLine == !aIsOffline) {
+ return;
+ }
+
for (uint32_t index = 0; index < mChildWorkers.Length(); ++index) {
mChildWorkers[index]->OfflineStatusChangeEvent(aCx, aIsOffline);
}
mOnLine = !aIsOffline;
WorkerGlobalScope* globalScope = GlobalScope();
nsRefPtr<WorkerNavigator> nav = globalScope->GetExistingNavigator();
if (nav) {
@@ -3577,17 +3580,17 @@ WorkerPrivate::WorkerPrivate(JSContext*
if (aParent) {
aParent->AssertIsOnWorkerThread();
aParent->GetAllPreferences(mPreferences);
mOnLine = aParent->OnLine();
}
else {
AssertIsOnMainThread();
RuntimeService::GetDefaultPreferences(mPreferences);
- mOnLine = !NS_IsOffline();
+ mOnLine = !NS_IsOffline() && !NS_IsAppOffline(aLoadInfo.mPrincipal);
}
}
WorkerPrivate::~WorkerPrivate()
{
}
// static
--- a/dom/workers/WorkerScope.cpp
+++ b/dom/workers/WorkerScope.cpp
@@ -42,18 +42,16 @@ using namespace mozilla::dom;
USING_WORKERS_NAMESPACE
BEGIN_WORKERS_NAMESPACE
WorkerGlobalScope::WorkerGlobalScope(WorkerPrivate* aWorkerPrivate)
: mWorkerPrivate(aWorkerPrivate)
{
mWorkerPrivate->AssertIsOnWorkerThread();
-
- SetIsDOMBinding();
}
WorkerGlobalScope::~WorkerGlobalScope()
{
mWorkerPrivate->AssertIsOnWorkerThread();
}
NS_IMPL_CYCLE_COLLECTION_CLASS(WorkerGlobalScope)
--- a/dom/workers/XMLHttpRequest.cpp
+++ b/dom/workers/XMLHttpRequest.cpp
@@ -1570,18 +1570,16 @@ SendRunnable::MainThreadRun()
XMLHttpRequest::XMLHttpRequest(WorkerPrivate* aWorkerPrivate)
: mWorkerPrivate(aWorkerPrivate),
mResponseType(XMLHttpRequestResponseType::Text), mTimeout(0),
mRooted(false), mBackgroundRequest(false), mWithCredentials(false),
mCanceled(false), mMozAnon(false), mMozSystem(false)
{
mWorkerPrivate->AssertIsOnWorkerThread();
- SetIsDOMBinding();
-
mozilla::HoldJSObjects(this);
}
XMLHttpRequest::~XMLHttpRequest()
{
mWorkerPrivate->AssertIsOnWorkerThread();
ReleaseProxy(XHRIsGoingAway);
--- a/dom/workers/XMLHttpRequestUpload.cpp
+++ b/dom/workers/XMLHttpRequestUpload.cpp
@@ -9,17 +9,16 @@
#include "mozilla/dom/XMLHttpRequestUploadBinding.h"
USING_WORKERS_NAMESPACE
XMLHttpRequestUpload::XMLHttpRequestUpload(XMLHttpRequest* aXHR)
: mXHR(aXHR)
{
- SetIsDOMBinding();
}
XMLHttpRequestUpload::~XMLHttpRequestUpload()
{
}
NS_IMPL_ADDREF_INHERITED(XMLHttpRequestUpload, nsXHREventTarget)
NS_IMPL_RELEASE_INHERITED(XMLHttpRequestUpload, nsXHREventTarget)
--- a/dom/xbl/XBLChildrenElement.h
+++ b/dom/xbl/XBLChildrenElement.h
@@ -147,17 +147,16 @@ private:
class nsAnonymousContentList : public nsINodeList
{
public:
explicit nsAnonymousContentList(nsIContent* aParent)
: mParent(aParent)
{
MOZ_COUNT_CTOR(nsAnonymousContentList);
- SetIsDOMBinding();
}
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(nsAnonymousContentList)
// nsIDOMNodeList interface
NS_DECL_NSIDOMNODELIST
// nsINodeList interface
--- a/dom/xslt/xpath/XPathResult.cpp
+++ b/dom/xslt/xpath/XPathResult.cpp
@@ -24,30 +24,28 @@ XPathResult::XPathResult(nsINode* aParen
: mParent(aParent),
mDocument(nullptr),
mCurrentPos(0),
mResultType(ANY_TYPE),
mInvalidIteratorState(true),
mBooleanResult(false),
mNumberResult(0)
{
- SetIsDOMBinding();
}
XPathResult::XPathResult(const XPathResult &aResult)
: mParent(aResult.mParent),
mResult(aResult.mResult),
mResultNodes(aResult.mResultNodes),
mDocument(aResult.mDocument),
mContextNode(aResult.mContextNode),
mCurrentPos(0),
mResultType(aResult.mResultType),
mInvalidIteratorState(aResult.mInvalidIteratorState)
{
- SetIsDOMBinding();
if (mDocument) {
mDocument->AddMutationObserver(this);
}
}
XPathResult::~XPathResult()
{
RemoveObserver();
--- a/editor/libeditor/nsEditor.cpp
+++ b/editor/libeditor/nsEditor.cpp
@@ -968,17 +968,17 @@ nsEditor::EndPlaceHolderTransaction()
}
else
{
// in the future we will check to make sure undo is off here,
// since that is the only known case where the placeholdertxn would disappear on us.
// For now just removing the assert.
}
// notify editor observers of action but if composing, it's done by
- // text event handler.
+ // compositionchange event handler.
if (!mComposition) {
NotifyEditorObservers(eNotifyEditorObserversOfEnd);
}
} else {
NotifyEditorObservers(eNotifyEditorObserversOfCancel);
}
}
mPlaceHolderBatch--;
@@ -5092,37 +5092,32 @@ nsEditor::IsAcceptableInputEvent(nsIDOME
// focus, we shouldn't handle it.
if (widgetEvent->IsUsingCoordinates()) {
nsCOMPtr<nsIContent> focusedContent = GetFocusedContent();
if (!focusedContent) {
return false;
}
}
- // If composition event or text event isn't dispatched via widget,
- // we need to ignore them since they cannot be managed by TextComposition.
- // E.g., the event was created by chrome JS.
+ // If a composition event isn't dispatched via widget, we need to ignore them
+ // since they cannot be managed by TextComposition. E.g., the event was
+ // created by chrome JS.
// Note that if we allow to handle such events, editor may be confused by
// strange event order.
bool needsWidget = false;
WidgetGUIEvent* widgetGUIEvent = nullptr;
switch (widgetEvent->message) {
case NS_USER_DEFINED_EVENT:
// If events are not created with proper event interface, their message
// are initialized with NS_USER_DEFINED_EVENT. Let's ignore such event.
return false;
- case NS_TEXT_TEXT:
- // Don't allow text events whose internal event are not
- // WidgetTextEvent.
- widgetGUIEvent = aEvent->GetInternalNSEvent()->AsTextEvent();
- needsWidget = true;
- break;
case NS_COMPOSITION_START:
case NS_COMPOSITION_END:
case NS_COMPOSITION_UPDATE:
+ case NS_COMPOSITION_CHANGE:
// Don't allow composition events whose internal event are not
// WidgetCompositionEvent.
widgetGUIEvent = aEvent->GetInternalNSEvent()->AsCompositionEvent();
needsWidget = true;
break;
default:
break;
}
--- a/editor/libeditor/nsEditor.h
+++ b/editor/libeditor/nsEditor.h
@@ -412,19 +412,18 @@ protected:
bool CanEnableSpellCheck()
{
// Check for password/readonly/disabled, which are not spellchecked
// regardless of DOM. Also, check to see if spell check should be skipped or not.
return !IsPasswordEditor() && !IsReadonly() && !IsDisabled() && !ShouldSkipSpellCheck();
}
/**
- * EnsureComposition() should be composition event handlers or text event
- * handler. This tries to get the composition for the event and set it to
- * mComposition.
+ * EnsureComposition() should be called by composition event handlers. This
+ * tries to get the composition for the event and set it to mComposition.
*/
void EnsureComposition(mozilla::WidgetGUIEvent* aEvent);
public:
/** All editor operations which alter the doc should be prefaced
* with a call to StartOperation, naming the action and direction */
NS_IMETHOD StartOperation(EditAction opID,
--- a/editor/libeditor/nsEditorEventListener.cpp
+++ b/editor/libeditor/nsEditorEventListener.cpp
@@ -451,17 +451,17 @@ nsEditorEventListener::HandleEvent(nsIDO
}
// focus
case NS_FOCUS_CONTENT:
return Focus(aEvent);
// blur
case NS_BLUR_CONTENT:
return Blur(aEvent);
// text
- case NS_TEXT_TEXT:
+ case NS_COMPOSITION_CHANGE:
return HandleText(aEvent);
// compositionstart
case NS_COMPOSITION_START:
return HandleStartComposition(aEvent);
// compositionend
case NS_COMPOSITION_END:
HandleEndComposition(aEvent);
return NS_OK;
--- a/editor/libeditor/nsPlaintextEditor.cpp
+++ b/editor/libeditor/nsPlaintextEditor.cpp
@@ -841,50 +841,52 @@ nsPlaintextEditor::BeginIMEComposition(W
return nsEditor::BeginIMEComposition(aEvent);
}
nsresult
nsPlaintextEditor::UpdateIMEComposition(nsIDOMEvent* aDOMTextEvent)
{
NS_ABORT_IF_FALSE(aDOMTextEvent, "aDOMTextEvent must not be nullptr");
- WidgetTextEvent* widgetTextEvent =
- aDOMTextEvent->GetInternalNSEvent()->AsTextEvent();
- NS_ENSURE_TRUE(widgetTextEvent, NS_ERROR_INVALID_ARG);
+ WidgetCompositionEvent* compositionChangeEvent =
+ aDOMTextEvent->GetInternalNSEvent()->AsCompositionEvent();
+ NS_ENSURE_TRUE(compositionChangeEvent, NS_ERROR_INVALID_ARG);
+ MOZ_ASSERT(compositionChangeEvent->message == NS_COMPOSITION_CHANGE,
+ "The internal event should be NS_COMPOSITION_CHANGE");
- EnsureComposition(widgetTextEvent);
+ EnsureComposition(compositionChangeEvent);
nsCOMPtr<nsIPresShell> ps = GetPresShell();
NS_ENSURE_TRUE(ps, NS_ERROR_NOT_INITIALIZED);
nsCOMPtr<nsISelection> selection;
nsresult rv = GetSelection(getter_AddRefs(selection));
NS_ENSURE_SUCCESS(rv, rv);
// NOTE: TextComposition should receive selection change notification before
- // TextEventHandlingMarker notifies TextComposition of the end of
- // handling TextEvent because TextComposition may need to ignore
- // selection changes caused by composition. Therefore,
- // TextEventHandlingMarker must be destroyed after a call of
- // NotifiyEditorObservers(eNotifyEditorObserversOfEnd) or
+ // CompositionChangeEventHandlingMarker notifies TextComposition of the
+ // end of handling compositionchange event because TextComposition may
+ // need to ignore selection changes caused by composition. Therefore,
+ // CompositionChangeEventHandlingMarker must be destroyed after a call
+ // of NotifiyEditorObservers(eNotifyEditorObserversOfEnd) or
// NotifiyEditorObservers(eNotifyEditorObserversOfCancel) which notifies
// TextComposition of a selection change.
MOZ_ASSERT(!mPlaceHolderBatch,
"UpdateIMEComposition() must be called without place holder batch");
- TextComposition::TextEventHandlingMarker
- textEventHandlingMarker(mComposition, widgetTextEvent);
+ TextComposition::CompositionChangeEventHandlingMarker
+ compositionChangeEventHandlingMarker(mComposition, compositionChangeEvent);
NotifyEditorObservers(eNotifyEditorObserversOfBefore);
nsRefPtr<nsCaret> caretP = ps->GetCaret();
{
nsAutoPlaceHolderBatch batch(this, nsGkAtoms::IMETxnName);
- rv = InsertText(widgetTextEvent->theText);
+ rv = InsertText(compositionChangeEvent->mData);
if (caretP) {
caretP->SetSelection(selection);
}
}
// If still composing, we should fire input event via observer.
// Note that if committed, we don't need to notify it since it will be
--- a/editor/libeditor/tests/test_bug1026397.html
+++ b/editor/libeditor/tests/test_bug1026397.html
@@ -42,30 +42,30 @@ function runTests()
input.selectionStart = input.selectionEnd = aCaretOffset;
if (aAdditionalExplanation) {
aAdditionalExplanation = " " + aAdditionalExplanation;
} else {
aAdditionalExplanation = "";
}
synthesizeComposition({ type: "compositionstart" });
- synthesizeText(
+ synthesizeCompositionChange(
{ "composition":
{ "string": aInsertString,
"clauses":
[
{ "length": aInsertString.length, "attr": COMPOSITION_ATTR_RAWINPUT }
]
},
"caret": { "start": aInsertString.length, "length": 0 }
});
is(input.value, aExpectedValueDuringComposition,
"The value of input whose maxlength is " + maxLengthStr + " should be "
+ aExpectedValueDuringComposition + " during composition" + aAdditionalExplanation);
- synthesizeText(
+ synthesizeCompositionChange(
{ "composition":
{ "string": aInsertString,
"clauses":
[
{ "length": 0, "attr": 0 }
]
},
"caret": { "start": aInsertString.length, "length": 0 }
--- a/editor/libeditor/tests/test_bug697842.html
+++ b/editor/libeditor/tests/test_bug697842.html
@@ -48,55 +48,55 @@ function runTests()
editor.addEventListener("compositionupdate", handler, true);
editor.addEventListener("text", handler, true);
// start composition
synthesizeComposition({ type: "compositionstart" });
// input first character
composingString = "\u306B";
- synthesizeText(
+ synthesizeCompositionChange(
{ "composition":
{ "string": composingString,
"clauses":
[
{ "length": 1, "attr": COMPOSITION_ATTR_RAWINPUT }
]
},
"caret": { "start": 1, "length": 0 }
});
// input second character
composingString = "\u306B\u3085";
- synthesizeText(
+ synthesizeCompositionChange(
{ "composition":
{ "string": composingString,
"clauses":
[
{ "length": 2, "attr": COMPOSITION_ATTR_RAWINPUT }
]
},
"caret": { "start": 2, "length": 0 }
});
// convert them
- synthesizeText(
+ synthesizeCompositionChange(
{ "composition":
{ "string": composingString,
"clauses":
[
{ "length": 2,
"attr": COMPOSITION_ATTR_SELECTEDCONVERTEDTEXT }
]
},
"caret": { "start": 2, "length": 0 }
});
// commit
- synthesizeText(
+ synthesizeCompositionChange(
{ "composition":
{ "string": composingString,
"clauses":
[
{ "length": 0, "attr": 0 }
]
},
"caret": { "start": 2, "length": 0 }
--- a/editor/libeditor/tests/test_bug795785.html
+++ b/editor/libeditor/tests/test_bug795785.html
@@ -117,29 +117,29 @@ function doCompositionTest(aElement, aEl
var str = "Web \u958b\u767a\u8005\u306e\u7686\u3055\u3093\u306f\u3001" +
"Firefox \u306b\u5b9f\u88c5\u3055\u308c\u3066\u3044\u308b HTML5" +
" \u3084 CSS \u306e\u65b0\u6a5f\u80fd\u3092\u6d3b\u7528\u3059" +
"\u308b\u3053\u3068\u3067\u3001\u9b45\u529b\u3042\u308b Web " +
"\u30b5\u30a4\u30c8\u3084\u9769\u65b0\u7684\u306a Web \u30a2" +
"\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u3088\u308a" +
"\u77ed\u6642\u9593\u3067\u7c21\u5358\u306b\u4f5c\u6210\u3067" +
"\u304d\u307e\u3059\u3002";
- synthesizeText({
+ synthesizeCompositionChange({
composition: {
string: str,
clauses: [
{ length: str.length, attr: COMPOSITION_ATTR_RAWINPUT }
]
},
caret: { start: str.length, length: 0 }
});
hitEventLoop(function () {
isnot(aElement.scrollTop, 0,
aElementDescription + " was not scrolled by composition");
- synthesizeText({
+ synthesizeCompositionChange({
composition: { string: "", clauses: [ { length: 0, attr: 0 } ] },
caret: { start: 0, length: 0 }
});
synthesizeComposition({ type: "compositionend", data: "" });
hitEventLoop(function () {
is(aElement.scrollTop, 0,
aElementDescription + " was not scrolled back to the top by canceling composition");
aCallback();
--- a/editor/libeditor/tests/test_contenteditable_text_input_handling.html
+++ b/editor/libeditor/tests/test_contenteditable_text_input_handling.html
@@ -217,17 +217,17 @@ function runTests()
if (!aFocus._isEditable) {
return;
}
// IME
// start composition
synthesizeComposition({ type: "compositionstart" });
// input first character
- synthesizeText(
+ synthesizeCompositionChange(
{ "composition":
{ "string": "\u3089",
"clauses":
[
{ "length": 1, "attr": COMPOSITION_ATTR_RAWINPUT }
]
},
"caret": { "start": 1, "length": 0 }
@@ -252,17 +252,17 @@ function runTests()
if (!querySelectedText.succeeded) {
return;
}
is(querySelectedText.offset, 1,
"query selected text event returns wrong offset" + when);
is(querySelectedText.text, "",
"query selected text event returns wrong selected text" + when);
// commit composition
- synthesizeText(
+ synthesizeCompositionChange(
{ "composition":
{ "string": "\u3089",
"clauses":
[
{ "length": 0, "attr": 0 }
]
},
"caret": { "start": 1, "length": 0 }
--- a/gfx/2d/FilterNodeSoftware.cpp
+++ b/gfx/2d/FilterNodeSoftware.cpp
@@ -1151,41 +1151,51 @@ FilterNodeTransformSoftware::SourceRectF
}
TemporaryRef<DataSourceSurface>
FilterNodeTransformSoftware::Render(const IntRect& aRect)
{
IntRect srcRect = SourceRectForOutputRect(aRect);
RefPtr<DataSourceSurface> input =
- GetInputDataSourceSurface(IN_TRANSFORM_IN, srcRect, NEED_COLOR_CHANNELS);
+ GetInputDataSourceSurface(IN_TRANSFORM_IN, srcRect);
if (!input) {
return nullptr;
}
Matrix transform = Matrix::Translation(srcRect.x, srcRect.y) * mMatrix *
Matrix::Translation(-aRect.x, -aRect.y);
if (transform.IsIdentity() && srcRect.Size() == aRect.Size()) {
return input.forget();
}
+ RefPtr<DataSourceSurface> surf =
+ Factory::CreateDataSourceSurface(aRect.Size(), input->GetFormat());
+
+ DataSourceSurface::MappedSurface mapping;
+ surf->Map(DataSourceSurface::MapType::WRITE, &mapping);
+
RefPtr<DrawTarget> dt =
- Factory::CreateDrawTarget(BackendType::CAIRO, aRect.Size(), input->GetFormat());
+ Factory::CreateDrawTargetForData(BackendType::CAIRO,
+ mapping.mData,
+ surf->GetSize(),
+ mapping.mStride,
+ surf->GetFormat());
if (!dt) {
return nullptr;
}
Rect r(0, 0, srcRect.width, srcRect.height);
dt->SetTransform(transform);
dt->DrawSurface(input, r, r, DrawSurfaceOptions(mFilter));
- RefPtr<SourceSurface> result = dt->Snapshot();
- RefPtr<DataSourceSurface> resultData = result->GetDataSurface();
- return resultData.forget();
+ dt->Flush();
+ surf->Unmap();
+ return surf.forget();
}
void
FilterNodeTransformSoftware::RequestFromInputsForRect(const IntRect &aRect)
{
RequestInputRect(IN_TRANSFORM_IN, SourceRectForOutputRect(aRect));
}
--- a/gfx/gl/GLConsts.h
+++ b/gfx/gl/GLConsts.h
@@ -5182,16 +5182,18 @@
#define LOCAL_EGL_CONTEXT_PRIORITY_MEDIUM_IMG 0x3102
#define LOCAL_EGL_CORE_NATIVE_ENGINE 0x305B
#define LOCAL_EGL_COVERAGE_BUFFERS_NV 0x30E0
#define LOCAL_EGL_COVERAGE_SAMPLES_NV 0x30E1
#define LOCAL_EGL_COVERAGE_SAMPLE_RESOLVE_DEFAULT_NV 0x3132
#define LOCAL_EGL_COVERAGE_SAMPLE_RESOLVE_NONE_NV 0x3133
#define LOCAL_EGL_COVERAGE_SAMPLE_RESOLVE_NV 0x3131
#define LOCAL_EGL_D3D_TEXTURE_2D_SHARE_HANDLE_ANGLE 0x3200
+#define LOCAL_EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE ((EGLNativeDisplayType)-2)
+#define LOCAL_EGL_D3D11_ONLY_DISPLAY_ANGLE ((EGLNativeDisplayType)-3)
#define LOCAL_EGL_DEFAULT_DISPLAY ((EGLNativeDisplayType)0)
#define LOCAL_EGL_DEPTH_ENCODING_NONE_NV 0
#define LOCAL_EGL_DEPTH_ENCODING_NONLINEAR_NV 0x30E3
#define LOCAL_EGL_DEPTH_ENCODING_NV 0x30E2
#define LOCAL_EGL_DEPTH_SIZE 0x3025
#define LOCAL_EGL_DISCARD_SAMPLES_ARM 0x3286
#define LOCAL_EGL_DISPLAY_SCALING 10000
#define LOCAL_EGL_DMA_BUF_PLANE0_FD_EXT 0x3272
--- a/gfx/gl/GLContext.cpp
+++ b/gfx/gl/GLContext.cpp
@@ -1735,20 +1735,19 @@ GLContext::UpdatePixelFormat()
#ifdef DEBUG
const SurfaceCaps& caps = Caps();
MOZ_ASSERT(!caps.any, "Did you forget to DetermineCaps()?");
MOZ_ASSERT(caps.color == !!format.red);
MOZ_ASSERT(caps.color == !!format.green);
MOZ_ASSERT(caps.color == !!format.blue);
- MOZ_ASSERT(caps.alpha == !!format.alpha);
-
// These we either must have if they're requested, or
// we can have if they're not.
+ MOZ_ASSERT(caps.alpha == !!format.alpha || !caps.alpha);
MOZ_ASSERT(caps.depth == !!format.depth || !caps.depth);
MOZ_ASSERT(caps.stencil == !!format.stencil || !caps.stencil);
MOZ_ASSERT(caps.antialias == (format.samples > 1));
#endif
mPixelFormat = new PixelBufferFormat(format);
}
--- a/gfx/gl/GLLibraryEGL.cpp
+++ b/gfx/gl/GLLibraryEGL.cpp
@@ -227,17 +227,39 @@ GLLibraryEGL::EnsureInitialized()
GLLibraryLoader::LoadSymbols(mEGLLibrary, &optionalSymbols[0]);
#if defined(MOZ_WIDGET_GONK) && ANDROID_VERSION >= 18
MOZ_RELEASE_ASSERT(mSymbols.fQueryStringImplementationANDROID,
"Couldn't find eglQueryStringImplementationANDROID");
#endif
- mEGLDisplay = fGetDisplay(EGL_DEFAULT_DISPLAY);
+ mEGLDisplay = nullptr;
+
+#ifdef XP_WIN
+ // XXX we have no way of knowing if this is ANGLE, or if we're just using
+ // a native EGL on windows. We don't really do the latter right now, so
+ // let's assume it is ANGLE, and try our special types.
+
+ // D3D11 ANGLE only works with OMTC; there's a bug in the non-OMTC layer
+ // manager, and it's pointless to try to fix it. We also don't try D3D11
+ // ANGLE if the layer manager is prefering D3D9 (hrm, do we care?)
+ if (gfxPrefs::LayersOffMainThreadCompositionEnabled() &&
+ !gfxPrefs::LayersPreferD3D9())
+ {
+ if (gfxPrefs::WebGLANGLEForceD3D11()) {
+ mEGLDisplay = fGetDisplay(LOCAL_EGL_D3D11_ONLY_DISPLAY_ANGLE);
+ } else if (gfxPrefs::WebGLANGLETryD3D11()) {
+ mEGLDisplay = fGetDisplay(LOCAL_EGL_D3D11_ELSE_D3D9_DISPLAY_ANGLE);
+ }
+ }
+#endif
+
+ if (!mEGLDisplay)
+ mEGLDisplay = fGetDisplay(EGL_DEFAULT_DISPLAY);
if (!fInitialize(mEGLDisplay, nullptr, nullptr))
return false;
const char *vendor = (const char*) fQueryString(mEGLDisplay, LOCAL_EGL_VENDOR);
if (vendor && (strstr(vendor, "TransGaming") != 0 || strstr(vendor, "Google Inc.") != 0)) {
mIsANGLE = true;
}
--- a/gfx/layers/Compositor.h
+++ b/gfx/layers/Compositor.h
@@ -118,17 +118,17 @@ class DrawTarget;
namespace layers {
struct Effect;
struct EffectChain;
class Image;
class ISurfaceAllocator;
class Layer;
-class NewTextureSource;
+class TextureSource;
class DataTextureSource;
class CompositingRenderTarget;
class PCompositorParent;
class LayerManagerComposite;
enum SurfaceInitMode
{
INIT_MODE_NONE,
--- a/gfx/layers/RotatedBuffer.cpp
+++ b/gfx/layers/RotatedBuffer.cpp
@@ -722,21 +722,21 @@ RotatedContentBuffer::BorrowDrawTargetFo
drawPtr = &aIter->mDrawRegion;
}
if (result->GetBackendType() == BackendType::DIRECT2D ||
result->GetBackendType() == BackendType::DIRECT2D1_1) {
drawPtr->SimplifyOutwardByArea(100 * 100);
}
if (aPaintState.mMode == SurfaceMode::SURFACE_COMPONENT_ALPHA) {
- MOZ_ASSERT(mDTBuffer && mDTBufferOnWhite);
if (!mDTBuffer || !mDTBufferOnWhite) {
// This can happen in release builds if allocating one of the two buffers
// failed. This is pretty bad and the reason for the failure is already
// reported through gfxCriticalError.
+ MOZ_ASSERT(false);
return nullptr;
}
nsIntRegionRectIterator iter(*drawPtr);
const nsIntRect *iterRect;
while ((iterRect = iter.Next())) {
mDTBuffer->FillRect(Rect(iterRect->x, iterRect->y, iterRect->width, iterRect->height),
ColorPattern(Color(0.0, 0.0, 0.0, 1.0)));
mDTBufferOnWhite->FillRect(Rect(iterRect->x, iterRect->y, iterRect->width, iterRect->height),
--- a/gfx/layers/TextureDIB.cpp
+++ b/gfx/layers/TextureDIB.cpp
@@ -123,17 +123,17 @@ DIBTextureHost::DIBTextureHost(TextureFl
dont_AddRef(reinterpret_cast<gfxWindowsSurface*>(aDescriptor.surface()));
MOZ_ASSERT(mSurface);
mSize = ToIntSize(mSurface->GetSize());
mFormat = ImageFormatToSurfaceFormat(
gfxPlatform::GetPlatform()->OptimalFormatForContent(mSurface->GetContentType()));
}
-NewTextureSource*
+TextureSource*
DIBTextureHost::GetTextureSources()
{
if (!mTextureSource) {
Updated();
}
return mTextureSource;
}
--- a/gfx/layers/TextureDIB.h
+++ b/gfx/layers/TextureDIB.h
@@ -65,17 +65,17 @@ protected:
};
class DIBTextureHost : public TextureHost
{
public:
DIBTextureHost(TextureFlags aFlags,
const SurfaceDescriptorDIB& aDescriptor);
- virtual NewTextureSource* GetTextureSources() MOZ_OVERRIDE;
+ virtual TextureSource* GetTextureSources() MOZ_OVERRIDE;
virtual void DeallocateDeviceData() MOZ_OVERRIDE;
virtual void SetCompositor(Compositor* aCompositor) MOZ_OVERRIDE;
virtual gfx::SurfaceFormat GetFormat() const MOZ_OVERRIDE { return mFormat; }
virtual gfx::IntSize GetSize() const MOZ_OVERRIDE { return mSize; }
--- a/gfx/layers/basic/BasicColorLayer.cpp
+++ b/gfx/layers/basic/BasicColorLayer.cpp
@@ -57,19 +57,22 @@ public:
Rect snapped(mBounds.x, mBounds.y, mBounds.width, mBounds.height);
if (UserToDevicePixelSnapped(snapped, aDT->GetTransform())) {
Matrix mat = aDT->GetTransform();
mat.Invert();
snapped = mat.TransformBounds(snapped);
}
+ // Clip drawing in case we're using (unbounded) operator source.
+ aDT->PushClipRect(snapped);
FillRectWithMask(aDT, aDeviceOffset, snapped, ToColor(mColor),
DrawOptions(GetEffectiveOpacity(), GetEffectiveOperator(this)),
aMaskLayer);
+ aDT->PopClip();
}
protected:
BasicLayerManager* BasicManager()
{
return static_cast<BasicLayerManager*>(mManager);
}
};
--- a/gfx/layers/basic/BasicLayerManager.cpp
+++ b/gfx/layers/basic/BasicLayerManager.cpp
@@ -790,36 +790,34 @@ BasicLayerManager::PaintLayer(gfxContext
// just throw an error.
if (aLayer->GetEffectiveTransform().IsSingular()) {
return;
}
RenderTraceScope trace("BasicLayerManager::PaintLayer", "707070");
const nsIntRect* clipRect = aLayer->GetEffectiveClipRect();
- // aLayer might not be a container layer, but if so we take care not to use
- // the container variable
- BasicContainerLayer* container = static_cast<BasicContainerLayer*>(aLayer);
- bool needsGroup = aLayer->GetFirstChild() &&
- container->UseIntermediateSurface();
+ BasicContainerLayer* container =
+ static_cast<BasicContainerLayer*>(aLayer->AsContainerLayer());
+ bool needsGroup = container && container->UseIntermediateSurface();
BasicImplData* data = ToData(aLayer);
bool needsClipToVisibleRegion =
data->GetClipToVisibleRegion() && !aLayer->AsPaintedLayer();
- NS_ASSERTION(needsGroup || !aLayer->GetFirstChild() ||
+ NS_ASSERTION(needsGroup || !container ||
container->GetOperator() == CompositionOp::OP_OVER,
"non-OVER operator should have forced UseIntermediateSurface");
- NS_ASSERTION(!aLayer->GetFirstChild() || !aLayer->GetMaskLayer() ||
+ NS_ASSERTION(!container || !aLayer->GetMaskLayer() ||
container->UseIntermediateSurface(),
"ContainerLayer with mask layer should force UseIntermediateSurface");
gfxContextAutoSaveRestore contextSR;
gfxMatrix transform;
// Will return an identity matrix for 3d transforms, and is handled separately below.
bool is2D = paintLayerContext.Setup2DTransform();
- NS_ABORT_IF_FALSE(is2D || needsGroup || !aLayer->GetFirstChild(), "Must PushGroup for 3d transforms!");
+ NS_ABORT_IF_FALSE(is2D || needsGroup || !container, "Must PushGroup for 3d transforms!");
bool needsSaveRestore =
needsGroup || clipRect || needsClipToVisibleRegion || !is2D;
if (needsSaveRestore) {
contextSR.SetContext(aTarget);
if (clipRect) {
aTarget->NewPath();
--- a/gfx/layers/basic/MacIOSurfaceTextureHostBasic.h
+++ b/gfx/layers/basic/MacIOSurfaceTextureHostBasic.h
@@ -18,17 +18,17 @@ class BasicCompositor;
/**
* A texture source meant for use with BasicCompositor.
*
* It does not own any GL texture, and attaches its shared handle to one of
* the compositor's temporary textures when binding.
*/
class MacIOSurfaceTextureSourceBasic
: public TextureSourceBasic,
- public NewTextureSource
+ public TextureSource
{
public:
MacIOSurfaceTextureSourceBasic(BasicCompositor* aCompositor,
MacIOSurface* aSurface);
virtual ~MacIOSurfaceTextureSourceBasic();
virtual TextureSourceBasic* AsSourceBasic() MOZ_OVERRIDE { return this; }
@@ -58,17 +58,17 @@ public:
const SurfaceDescriptorMacIOSurface& aDescriptor);
virtual void SetCompositor(Compositor* aCompositor) MOZ_OVERRIDE;
virtual bool Lock() MOZ_OVERRIDE;
virtual gfx::SurfaceFormat GetFormat() const MOZ_OVERRIDE;
- virtual NewTextureSource* GetTextureSources() MOZ_OVERRIDE
+ virtual TextureSource* GetTextureSources() MOZ_OVERRIDE
{
return mTextureSource;
}
virtual TemporaryRef<gfx::DataSourceSurface> GetAsSurface() MOZ_OVERRIDE
{
return nullptr; // XXX - implement this (for MOZ_DUMP_PAINTING)
}
--- a/gfx/layers/basic/X11TextureSourceBasic.h
+++ b/gfx/layers/basic/X11TextureSourceBasic.h
@@ -12,17 +12,17 @@
namespace mozilla {
namespace layers {
class BasicCompositor;
// TextureSource for Xlib-backed surfaces.
class X11TextureSourceBasic
: public TextureSourceBasic
- , public NewTextureSource
+ , public TextureSource
{
public:
X11TextureSourceBasic(BasicCompositor* aCompositor, gfxXlibSurface* aSurface);
virtual X11TextureSourceBasic* AsSourceBasic() MOZ_OVERRIDE { return this; }
virtual gfx::IntSize GetSize() const MOZ_OVERRIDE;
--- a/gfx/layers/composite/ContentHost.cpp
+++ b/gfx/layers/composite/ContentHost.cpp
@@ -44,18 +44,18 @@ ContentHostBase::Composite(EffectChain&
{
NS_ASSERTION(aVisibleRegion, "Requires a visible region");
AutoLockCompositableHost lock(this);
if (lock.Failed()) {
return;
}
- RefPtr<NewTextureSource> source = GetTextureSource();
- RefPtr<NewTextureSource> sourceOnWhite = GetTextureSourceOnWhite();
+ RefPtr<TextureSource> source = GetTextureSource();
+ RefPtr<TextureSource> sourceOnWhite = GetTextureSourceOnWhite();
if (!source) {
return;
}
RefPtr<TexturedEffect> effect = GenEffect(aFilter);
if (!effect) {
return;
@@ -203,18 +203,18 @@ ContentHostBase::Composite(EffectChain&
}
GetCompositor()->DrawDiagnostics(diagnostics, nsIntRegion(mBufferRect), aClipRect,
aTransform, mFlashCounter);
}
TemporaryRef<TexturedEffect>
ContentHostBase::GenEffect(const gfx::Filter& aFilter)
{
- RefPtr<NewTextureSource> source = GetTextureSource();
- RefPtr<NewTextureSource> sourceOnWhite = GetTextureSourceOnWhite();
+ RefPtr<TextureSource> source = GetTextureSource();
+ RefPtr<TextureSource> sourceOnWhite = GetTextureSourceOnWhite();
if (!source) {
return nullptr;
}
return CreateTexturedEffect(source, sourceOnWhite, aFilter, true);
}
void
ContentHostTexture::UseTextureHost(TextureHost* aTexture)
@@ -434,24 +434,24 @@ void
ContentHostIncremental::ProcessTextureUpdates()
{
for (uint32_t i = 0; i < mUpdateList.Length(); i++) {
mUpdateList[i]->Execute(this);
}
mUpdateList.Clear();
}
-NewTextureSource*
+TextureSource*
ContentHostIncremental::GetTextureSource()
{
MOZ_ASSERT(mLocked);
return mSource;
}
-NewTextureSource*
+TextureSource*
ContentHostIncremental::GetTextureSourceOnWhite()
{
MOZ_ASSERT(mLocked);
return mSourceOnWhite;
}
void
ContentHostIncremental::TextureCreationRequest::Execute(ContentHostIncremental* aHost)
--- a/gfx/layers/composite/ContentHost.h
+++ b/gfx/layers/composite/ContentHost.h
@@ -98,18 +98,18 @@ public:
virtual void Composite(EffectChain& aEffectChain,
float aOpacity,
const gfx::Matrix4x4& aTransform,
const gfx::Filter& aFilter,
const gfx::Rect& aClipRect,
const nsIntRegion* aVisibleRegion = nullptr);
- virtual NewTextureSource* GetTextureSource() = 0;
- virtual NewTextureSource* GetTextureSourceOnWhite() = 0;
+ virtual TextureSource* GetTextureSource() = 0;
+ virtual TextureSource* GetTextureSourceOnWhite() = 0;
virtual TemporaryRef<TexturedEffect> GenEffect(const gfx::Filter& aFilter) MOZ_OVERRIDE;
protected:
virtual nsIntPoint GetOriginOffset()
{
return mBufferRect.TopLeft() - mBufferRotation;
}
@@ -168,21 +168,21 @@ public:
MOZ_ASSERT(mLocked);
mTextureHost->Unlock();
if (mTextureHostOnWhite) {
mTextureHostOnWhite->Unlock();
}
mLocked = false;
}
- virtual NewTextureSource* GetTextureSource() MOZ_OVERRIDE {
+ virtual TextureSource* GetTextureSource() MOZ_OVERRIDE {
MOZ_ASSERT(mLocked);
return mTextureHost->GetTextureSources();
}
- virtual NewTextureSource* GetTextureSourceOnWhite() MOZ_OVERRIDE {
+ virtual TextureSource* GetTextureSourceOnWhite() MOZ_OVERRIDE {
MOZ_ASSERT(mLocked);
if (mTextureHostOnWhite) {
return mTextureHostOnWhite->GetTextureSources();
}
return nullptr;
}
LayerRenderState GetRenderState();
@@ -286,18 +286,18 @@ public:
return true;
}
virtual void Unlock() MOZ_OVERRIDE {
MOZ_ASSERT(mLocked);
mLocked = false;
}
- virtual NewTextureSource* GetTextureSource() MOZ_OVERRIDE;
- virtual NewTextureSource* GetTextureSourceOnWhite() MOZ_OVERRIDE;
+ virtual TextureSource* GetTextureSource() MOZ_OVERRIDE;
+ virtual TextureSource* GetTextureSourceOnWhite() MOZ_OVERRIDE;
private:
void FlushUpdateQueue();
void ProcessTextureUpdates();
class Request
{
--- a/gfx/layers/composite/ImageHost.cpp
+++ b/gfx/layers/composite/ImageHost.cpp
@@ -99,17 +99,17 @@ ImageHost::Composite(EffectChain& aEffec
mFrontBuffer->SetCompositor(GetCompositor());
mFrontBuffer->SetCompositableBackendSpecificData(GetCompositableBackendSpecificData());
AutoLockCompositableHost autoLock(this);
if (autoLock.Failed()) {
NS_WARNING("failed to lock front buffer");
return;
}
- RefPtr<NewTextureSource> source = GetTextureSource();
+ RefPtr<TextureSource> source = GetTextureSource();
if (!source) {
return;
}
RefPtr<TexturedEffect> effect = GenEffect(aFilter);
if (!effect) {
return;
}
@@ -268,27 +268,27 @@ ImageHost::Lock()
void
ImageHost::Unlock()
{
MOZ_ASSERT(mLocked);
mFrontBuffer->Unlock();
mLocked = false;
}
-TemporaryRef<NewTextureSource>
+TemporaryRef<TextureSource>
ImageHost::GetTextureSource()
{
MOZ_ASSERT(mLocked);
return mFrontBuffer->GetTextureSources();
}
TemporaryRef<TexturedEffect>
ImageHost::GenEffect(const gfx::Filter& aFilter)
{
- RefPtr<NewTextureSource> source = GetTextureSource();
+ RefPtr<TextureSource> source = GetTextureSource();
if (!source) {
return nullptr;
}
bool isAlphaPremultiplied = true;
if (mFrontBuffer->GetFlags() & TextureFlags::NON_PREMULTIPLIED)
isAlphaPremultiplied = false;
return CreateTexturedEffect(mFrontBuffer->GetFormat(),
--- a/gfx/layers/composite/ImageHost.h
+++ b/gfx/layers/composite/ImageHost.h
@@ -79,17 +79,17 @@ public:
virtual TemporaryRef<gfx::DataSourceSurface> GetAsSurface() MOZ_OVERRIDE;
#endif
virtual bool Lock() MOZ_OVERRIDE;
virtual void Unlock() MOZ_OVERRIDE;
- virtual TemporaryRef<NewTextureSource> GetTextureSource();
+ virtual TemporaryRef<TextureSource> GetTextureSource();
virtual TemporaryRef<TexturedEffect> GenEffect(const gfx::Filter& aFilter) MOZ_OVERRIDE;
protected:
RefPtr<TextureHost> mFrontBuffer;
nsIntRect mPictureRect;
bool mHasPictureRect;
--- a/gfx/layers/composite/TextureHost.cpp
+++ b/gfx/layers/composite/TextureHost.cpp
@@ -362,28 +362,28 @@ BufferTextureHost::Updated(const nsIntRe
}
void
BufferTextureHost::SetCompositor(Compositor* aCompositor)
{
if (mCompositor == aCompositor) {
return;
}
- RefPtr<NewTextureSource> it = mFirstSource;
+ RefPtr<TextureSource> it = mFirstSource;
while (it) {
it->SetCompositor(aCompositor);
it = it->GetNextSibling();
}
mCompositor = aCompositor;
}
void
BufferTextureHost::DeallocateDeviceData()
{
- RefPtr<NewTextureSource> it = mFirstSource;
+ RefPtr<TextureSource> it = mFirstSource;
while (it) {
it->DeallocateDeviceData();
it = it->GetNextSibling();
}
}
bool
BufferTextureHost::Lock()
@@ -398,17 +398,17 @@ BufferTextureHost::Lock()
void
BufferTextureHost::Unlock()
{
MOZ_ASSERT(mLocked);
mLocked = false;
}
-NewTextureSource*
+TextureSource*
BufferTextureHost::GetTextureSources()
{
MOZ_ASSERT(mLocked);
MOZ_ASSERT(mFirstSource);
return mFirstSource;
}
gfx::SurfaceFormat
@@ -860,17 +860,17 @@ StreamTextureHost::Lock()
default:
break;
}
break;
default:
break;
}
- RefPtr<NewTextureSource> newTexSource;
+ RefPtr<TextureSource> newTexSource;
if (compositorSupportsShSurfType) {
gfx::SurfaceFormat format = abstractSurf->mHasAlpha ? gfx::SurfaceFormat::R8G8B8A8
: gfx::SurfaceFormat::R8G8B8X8;
switch (abstractSurf->mType) {
case gl::SharedSurfaceType::Basic: {
gl::SharedSurface_Basic* surf = gl::SharedSurface_Basic::Cast(abstractSurf);
--- a/gfx/layers/composite/TextureHost.h
+++ b/gfx/layers/composite/TextureHost.h
@@ -83,25 +83,29 @@ public:
* between backends, the TextureSource interface is split into different
* interfaces (TextureSourceOGL, etc.), and TextureSource mostly provide
* access to these interfaces.
*
* This class is used on the compositor side.
*/
class TextureSource
{
-protected:
- virtual ~TextureSource();
-
public:
NS_INLINE_DECL_REFCOUNTING(TextureSource)
TextureSource();
/**
+ * Should be overridden in order to deallocate the data that is associated
+ * with the rendering backend, such as GL textures.
+ */
+ virtual void DeallocateDeviceData() {}
+
+
+ /**
* Return the size of the texture in texels.
* If this is a tile iterator, GetSize must return the size of the current tile.
*/
virtual gfx::IntSize GetSize() const = 0;
/**
* Return the pixel format of this texture
*/
@@ -109,92 +113,59 @@ public:
/**
* Cast to a TextureSource for for each backend..
*/
virtual TextureSourceOGL* AsSourceOGL() { return nullptr; }
virtual TextureSourceD3D9* AsSourceD3D9() { return nullptr; }
virtual TextureSourceD3D11* AsSourceD3D11() { return nullptr; }
virtual TextureSourceBasic* AsSourceBasic() { return nullptr; }
-
/**
* Cast to a DataTextureSurce.
*/
virtual DataTextureSource* AsDataTextureSource() { return nullptr; }
/**
- * In some rare cases we currently need to consider a group of textures as one
- * TextureSource, that can be split in sub-TextureSources.
- */
- virtual TextureSource* GetSubSource(int index) { return nullptr; }
-
- /**
* Overload this if the TextureSource supports big textures that don't fit in
* one device texture and must be tiled internally.
*/
virtual BigImageIterator* AsBigImageIterator() { return nullptr; }
-};
-
-/**
- * XXX - merge this class with TextureSource when deprecated texture classes
- * are completely removed.
- */
-class NewTextureSource : public TextureSource
-{
-public:
- NewTextureSource()
- {
- MOZ_COUNT_CTOR(NewTextureSource);
- }
-protected:
- virtual ~NewTextureSource()
- {
- MOZ_COUNT_DTOR(NewTextureSource);
- }
-
-public:
- /**
- * Should be overridden in order to deallocate the data that is associated
- * with the rendering backend, such as GL textures.
- */
- virtual void DeallocateDeviceData() = 0;
virtual void SetCompositor(Compositor* aCompositor) {}
- void SetNextSibling(NewTextureSource* aTexture)
- {
- mNextSibling = aTexture;
- }
+ void SetNextSibling(TextureSource* aTexture) { mNextSibling = aTexture; }
+
+ TextureSource* GetNextSibling() const { return mNextSibling; }
- NewTextureSource* GetNextSibling() const
- {
- return mNextSibling;
- }
-
- // temporary adapter to use the same SubSource API as the old TextureSource
- virtual TextureSource* GetSubSource(int index) MOZ_OVERRIDE
+ /**
+ * In some rare cases we currently need to consider a group of textures as one
+ * TextureSource, that can be split in sub-TextureSources.
+ */
+ TextureSource* GetSubSource(int index)
{
switch (index) {
case 0: return this;
case 1: return GetNextSibling();
case 2: return GetNextSibling() ? GetNextSibling()->GetNextSibling() : nullptr;
}
return nullptr;
}
protected:
- RefPtr<NewTextureSource> mNextSibling;
+ virtual ~TextureSource();
+
+ RefPtr<TextureSource> mNextSibling;
};
/**
* Interface for TextureSources that can be updated from a DataSourceSurface.
*
* All backend should implement at least one DataTextureSource.
*/
-class DataTextureSource : public NewTextureSource
+class DataTextureSource : public TextureSource
{
public:
DataTextureSource()
: mUpdateSerial(0)
{}
virtual DataTextureSource* AsDataTextureSource() MOZ_OVERRIDE { return this; }
@@ -323,17 +294,17 @@ public:
/**
* Return a list of TextureSources for use with a Compositor.
*
* This can trigger texture uploads, so do not call it inside transactions
* so as to not upload textures while the main thread is blocked.
* Must not be called while this TextureHost is not sucessfully Locked.
*/
- virtual NewTextureSource* GetTextureSources() = 0;
+ virtual TextureSource* GetTextureSources() = 0;
/**
* Is called before compositing if the shared data has changed since last
* composition.
* This method should be overload in cases like when we need to do a texture
* upload for example.
*
* @param aRegion The region that has been changed, if nil, it means that the
@@ -494,17 +465,17 @@ public:
virtual size_t GetBufferSize() = 0;
virtual void Updated(const nsIntRegion* aRegion = nullptr) MOZ_OVERRIDE;
virtual bool Lock() MOZ_OVERRIDE;
virtual void Unlock() MOZ_OVERRIDE;
- virtual NewTextureSource* GetTextureSources() MOZ_OVERRIDE;
+ virtual TextureSource* GetTextureSources() MOZ_OVERRIDE;
virtual void DeallocateDeviceData() MOZ_OVERRIDE;
virtual void SetCompositor(Compositor* aCompositor) MOZ_OVERRIDE;
/**
* Return the format that is exposed to the compositor when calling
* GetTextureSources.
@@ -616,17 +587,17 @@ public:
virtual void SetCompositor(Compositor* aCompositor) MOZ_OVERRIDE;
virtual bool Lock() MOZ_OVERRIDE;
virtual void Unlock() MOZ_OVERRIDE;
virtual gfx::SurfaceFormat GetFormat() const MOZ_OVERRIDE;
- virtual NewTextureSource* GetTextureSources() MOZ_OVERRIDE
+ virtual TextureSource* GetTextureSources() MOZ_OVERRIDE
{
return mTextureSource;
}
virtual TemporaryRef<gfx::DataSourceSurface> GetAsSurface() MOZ_OVERRIDE
{
return nullptr; // XXX - implement this (for MOZ_DUMP_PAINTING)
}
@@ -635,17 +606,17 @@ public:
#ifdef MOZ_LAYERS_HAVE_LOG
virtual const char* Name() { return "StreamTextureHost"; }
#endif
protected:
Compositor* mCompositor;
gl::SurfaceStream* mStream;
- RefPtr<NewTextureSource> mTextureSource;
+ RefPtr<TextureSource> mTextureSource;
RefPtr<DataTextureSource> mDataTextureSource;
};
class MOZ_STACK_CLASS AutoLockTextureHost
{
public:
explicit AutoLockTextureHost(TextureHost* aTexture)
: mTexture(aTexture)
@@ -666,19 +637,20 @@ private:
RefPtr<TextureHost> mTexture;
bool mLocked;
};
/**
* This can be used as an offscreen rendering target by the compositor, and
* subsequently can be used as a source by the compositor.
*/
-class CompositingRenderTarget : public TextureSource
+class CompositingRenderTarget: public TextureSource
{
public:
+
explicit CompositingRenderTarget(const gfx::IntPoint& aOrigin)
: mOrigin(aOrigin)
{}
virtual ~CompositingRenderTarget() {}
#ifdef MOZ_DUMP_PAINTING
virtual TemporaryRef<gfx::DataSourceSurface> Dump(Compositor* aCompositor) { return nullptr; }
#endif
--- a/gfx/layers/composite/TiledContentHost.cpp
+++ b/gfx/layers/composite/TiledContentHost.cpp
@@ -481,18 +481,18 @@ TiledContentHost::RenderTile(const TileH
AutoLockTextureHost autoLock(aTile.mTextureHost);
AutoLockTextureHost autoLockOnWhite(aTile.mTextureHostOnWhite);
if (autoLock.Failed() ||
autoLockOnWhite.Failed()) {
NS_WARNING("Failed to lock tile");
return;
}
- RefPtr<NewTextureSource> source = aTile.mTextureHost->GetTextureSources();
- RefPtr<NewTextureSource> sourceOnWhite =
+ RefPtr<TextureSource> source = aTile.mTextureHost->GetTextureSources();
+ RefPtr<TextureSource> sourceOnWhite =
aTile.mTextureHostOnWhite ? aTile.mTextureHostOnWhite->GetTextureSources() : nullptr;
if (!source || (aTile.mTextureHostOnWhite && !sourceOnWhite)) {
return;
}
RefPtr<TexturedEffect> effect = CreateTexturedEffect(source, sourceOnWhite, aFilter, true);
if (!effect) {
return;
--- a/gfx/layers/composite/X11TextureHost.h
+++ b/gfx/layers/composite/X11TextureHost.h
@@ -25,32 +25,32 @@ public:
virtual void SetCompositor(Compositor* aCompositor) MOZ_OVERRIDE;
virtual bool Lock() MOZ_OVERRIDE;
virtual gfx::SurfaceFormat GetFormat() const MOZ_OVERRIDE;
virtual gfx::IntSize GetSize() const MOZ_OVERRIDE;
- virtual NewTextureSource* GetTextureSources() MOZ_OVERRIDE
+ virtual TextureSource* GetTextureSources() MOZ_OVERRIDE
{
return mTextureSource;
}
virtual TemporaryRef<gfx::DataSourceSurface> GetAsSurface() MOZ_OVERRIDE
{
return nullptr; // XXX - implement this (for MOZ_DUMP_PAINTING)
}
#ifdef MOZ_LAYERS_HAVE_LOG
virtual const char* Name() { return "X11TextureHost"; }
#endif
protected:
Compositor* mCompositor;
- RefPtr<NewTextureSource> mTextureSource;
+ RefPtr<TextureSource> mTextureSource;
RefPtr<gfxXlibSurface> mSurface;
};
} // namespace layers
} // namespace mozilla
#endif // MOZILLA_GFX_X11TEXTUREHOST__H
--- a/gfx/layers/d3d11/TextureD3D11.cpp
+++ b/gfx/layers/d3d11/TextureD3D11.cpp
@@ -480,17 +480,17 @@ DXGITextureHostD3D11::Lock()
void
DXGITextureHostD3D11::Unlock()
{
MOZ_ASSERT(mIsLocked);
UnlockD3DTexture(mTextureSource->GetD3D11Texture());
mIsLocked = false;
}
-NewTextureSource*
+TextureSource*
DXGITextureHostD3D11::GetTextureSources()
{
MOZ_ASSERT(mIsLocked);
// If Lock was successful we must have a valid TextureSource.
MOZ_ASSERT(mTextureSource);
return mTextureSource.get();
}
--- a/gfx/layers/d3d11/TextureD3D11.h
+++ b/gfx/layers/d3d11/TextureD3D11.h
@@ -171,17 +171,17 @@ protected:
* A TextureHost for shared D3D11 textures.
*/
class DXGITextureHostD3D11 : public TextureHost
{
public:
DXGITextureHostD3D11(TextureFlags aFlags,
const SurfaceDescriptorD3D10& aDescriptor);
- virtual NewTextureSource* GetTextureSources() MOZ_OVERRIDE;
+ virtual TextureSource* GetTextureSources() MOZ_OVERRIDE;
virtual void DeallocateDeviceData() MOZ_OVERRIDE {}
virtual void SetCompositor(Compositor* aCompositor) MOZ_OVERRIDE;
virtual gfx::SurfaceFormat GetFormat() const MOZ_OVERRIDE { return mFormat; }
virtual bool Lock() MOZ_OVERRIDE;
--- a/gfx/layers/d3d9/TextureD3D9.cpp
+++ b/gfx/layers/d3d9/TextureD3D9.cpp
@@ -884,17 +884,17 @@ void
TextureHostD3D9::SetCompositor(Compositor* aCompositor)
{
mCompositor = static_cast<CompositorD3D9*>(aCompositor);
if (mTextureSource) {
mTextureSource->SetCompositor(aCompositor);
}
}
-NewTextureSource*
+TextureSource*
TextureHostD3D9::GetTextureSources()
{
MOZ_ASSERT(mIsLocked);
MOZ_ASSERT(mTextureSource);
return mTextureSource;
}
bool
@@ -960,17 +960,17 @@ DXGITextureHostD3D9::OpenSharedHandle()
return;
}
mTextureSource = new DataTextureSourceD3D9(mFormat, mSize, mCompositor, texture);
return;
}
-NewTextureSource*
+TextureSource*
DXGITextureHostD3D9::GetTextureSources()
{
MOZ_ASSERT(mIsLocked);
MOZ_ASSERT(mTextureSource);
return mTextureSource;
}
bool
--- a/gfx/layers/d3d9/TextureD3D9.h
+++ b/gfx/layers/d3d9/TextureD3D9.h
@@ -287,17 +287,17 @@ private:
};
class TextureHostD3D9 : public TextureHost
{
public:
TextureHostD3D9(TextureFlags aFlags,
const SurfaceDescriptorD3D9& aDescriptor);
- virtual NewTextureSource* GetTextureSources() MOZ_OVERRIDE;
+ virtual TextureSource* GetTextureSources() MOZ_OVERRIDE;
virtual void DeallocateDeviceData() MOZ_OVERRIDE;
virtual void SetCompositor(Compositor* aCompositor) MOZ_OVERRIDE;
virtual gfx::SurfaceFormat GetFormat() const MOZ_OVERRIDE { return mFormat; }
virtual bool Lock() MOZ_OVERRIDE;
@@ -328,17 +328,17 @@ protected:
};
class DXGITextureHostD3D9 : public TextureHost
{
public:
DXGITextureHostD3D9(TextureFlags aFlags,
const SurfaceDescriptorD3D10& aDescriptor);
- virtual NewTextureSource* GetTextureSources() MOZ_OVERRIDE;
+ virtual TextureSource* GetTextureSources() MOZ_OVERRIDE;
virtual void DeallocateDeviceData() MOZ_OVERRIDE;
virtual void SetCompositor(Compositor* aCompositor) MOZ_OVERRIDE;
virtual gfx::SurfaceFormat GetFormat() const MOZ_OVER