Skip to content

Commit 3a80ba5

Browse files
committed
Core: Abandon strict mode to restore browser support
This reverts commit 9776354.
1 parent 9776354 commit 3a80ba5

File tree

4 files changed

+52
-42
lines changed

4 files changed

+52
-42
lines changed

build/tasks/build.js

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@ module.exports = function( grunt ) {
2323
baseUrl: "src",
2424
name: "jquery",
2525

26-
// Allow strict mode
27-
useStrict: true,
28-
2926
// We have multiple minify steps
3027
optimize: "none",
3128

src/callbacks.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,10 @@ jQuery.Callbacks = function( options ) {
7676
memory = queue.shift();
7777
while ( ++firingIndex < list.length ) {
7878

79+
// Preserve null/undefined context
80+
// (which non-strict `apply` maps to the global object)
81+
self.context = memory[ 0 ];
82+
7983
// Run callback and check for early termination
8084
if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
8185
options.stopOnFalse ) {
@@ -92,7 +96,7 @@ jQuery.Callbacks = function( options ) {
9296
memory = false;
9397
}
9498

95-
firing = false;
99+
self.context = firing = false;
96100

97101
// Clean up if we're done firing for good
98102
if ( locked ) {

src/deferred.js

Lines changed: 42 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -71,9 +71,11 @@ jQuery.extend( {
7171
},
7272
then: function( onFulfilled, onRejected, onProgress ) {
7373
var maxDepth = 0;
74-
function resolve( depth, deferred, handler, special ) {
74+
function resolve( depth, deferred, callbacks, handler, special ) {
7575
return function() {
76-
var that = this,
76+
77+
// Recover null/undefined context from global `this`
78+
var that = depth === 0 ? callbacks.context : this,
7779
args = arguments,
7880
mightThrow = function() {
7981
var returned, then;
@@ -113,8 +115,10 @@ jQuery.extend( {
113115
if ( special ) {
114116
then.call(
115117
returned,
116-
resolve( maxDepth, deferred, Identity, special ),
117-
resolve( maxDepth, deferred, Thrower, special )
118+
resolve( maxDepth, deferred, callbacks, Identity,
119+
special ),
120+
resolve( maxDepth, deferred, callbacks, Thrower,
121+
special )
118122
);
119123

120124
// Normal processors (resolve) also hook into progress
@@ -125,9 +129,11 @@ jQuery.extend( {
125129

126130
then.call(
127131
returned,
128-
resolve( maxDepth, deferred, Identity, special ),
129-
resolve( maxDepth, deferred, Thrower, special ),
130-
resolve( maxDepth, deferred, Identity,
132+
resolve( maxDepth, deferred, callbacks, Identity,
133+
special ),
134+
resolve( maxDepth, deferred, callbacks, Thrower,
135+
special ),
136+
resolve( maxDepth, deferred, callbacks, Identity,
131137
deferred.notify )
132138
);
133139
}
@@ -203,6 +209,7 @@ jQuery.extend( {
203209
resolve(
204210
0,
205211
newDefer,
212+
tuples[ 0 ][ 3 ],
206213
jQuery.isFunction( onProgress ) ?
207214
onProgress :
208215
Identity,
@@ -215,6 +222,7 @@ jQuery.extend( {
215222
resolve(
216223
0,
217224
newDefer,
225+
tuples[ 1 ][ 3 ],
218226
jQuery.isFunction( onFulfilled ) ?
219227
onFulfilled :
220228
Identity
@@ -226,6 +234,7 @@ jQuery.extend( {
226234
resolve(
227235
0,
228236
newDefer,
237+
tuples[ 2 ][ 3 ],
229238
jQuery.isFunction( onRejected ) ?
230239
onRejected :
231240
Thrower
@@ -247,34 +256,39 @@ jQuery.extend( {
247256
var list = tuple[ 2 ],
248257
stateString = tuple[ 5 ];
249258

250-
// promise.progress = list.add
251-
// promise.done = list.add
252-
// promise.fail = list.add
253-
promise[ tuple[ 1 ] ] = list.add;
259+
list.add( function() {
260+
261+
// Handle state
262+
if ( stateString ) {
254263

255-
// Handle state
256-
if ( stateString ) {
257-
list.add(
258-
function() {
264+
// state = "resolved" (i.e., fulfilled)
265+
// state = "rejected"
266+
state = stateString;
259267

260-
// state = "resolved" (i.e., fulfilled)
261-
// state = "rejected"
262-
state = stateString;
263-
},
268+
// progress_callbacks.lock
269+
tuples[ 0 ][ 2 ].lock();
264270

265271
// rejected_callbacks.disable
266272
// fulfilled_callbacks.disable
267-
tuples[ 3 - i ][ 2 ].disable,
273+
tuples[ 3 - i ][ 2 ].disable();
274+
}
268275

269-
// progress_callbacks.lock
270-
tuples[ 0 ][ 2 ].lock
271-
);
272-
}
276+
// Fire .then handlers, recovering null/undefined context from global `this`
277+
// progress_handlers.fire
278+
// fulfilled_handlers.fire
279+
// rejected_handlers.fire
280+
tuple[ 3 ].fireWith( list.context, arguments );
281+
} );
282+
283+
// promise.progress = list.add
284+
// promise.done = list.add
285+
// promise.fail = list.add
286+
promise[ tuple[ 1 ] ] = list.add;
273287

274-
// progress_handlers.fire
275-
// fulfilled_handlers.fire
276-
// rejected_handlers.fire
277-
list.add( tuple[ 3 ].fire );
288+
// deferred.notifyWith = list.fireWith
289+
// deferred.resolveWith = list.fireWith
290+
// deferred.rejectWith = list.fireWith
291+
deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
278292

279293
// deferred.notify = function() { deferred.notifyWith(...) }
280294
// deferred.resolve = function() { deferred.resolveWith(...) }
@@ -283,11 +297,6 @@ jQuery.extend( {
283297
deferred[ tuple[ 0 ] + "With" ]( this === deferred ? undefined : this, arguments );
284298
return this;
285299
};
286-
287-
// deferred.notifyWith = list.fireWith
288-
// deferred.resolveWith = list.fireWith
289-
// deferred.rejectWith = list.fireWith
290-
deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
291300
} );
292301

293302
// Make the deferred a promise

src/wrapper.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@
3838
// Pass this if window is not defined yet
3939
}( typeof window !== "undefined" ? window : this, function( window, noGlobal ) {
4040

41-
// Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
42-
// throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
43-
// arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
44-
// enough that all such attempts are guarded in a try block.
45-
"use strict";
41+
// Support: Firefox 18+
42+
// Can't be in strict mode, several libs including ASP.NET trace
43+
// the stack via arguments.caller.callee and Firefox dies if
44+
// you try to trace through "use strict" call chains. (#13335)
45+
//"use strict";
4646

4747
// @CODE
4848
// build.js inserts compiled jQuery here

0 commit comments

Comments
 (0)