Page Menu
Home
Software Heritage
Search
Configure Global Search
Log In
Files
F8390863
supports.js
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
4 KB
Subscribers
None
supports.js
View Options
import
{
getGlobalObject
}
from
'./global.js'
;
import
{
logger
}
from
'./logger.js'
;
/**
* Tells whether current environment supports ErrorEvent objects
* {@link supportsErrorEvent}.
*
* @returns Answer to the given question.
*/
function
supportsErrorEvent
()
{
try
{
new
ErrorEvent
(
''
);
return
true
;
}
catch
(
e
)
{
return
false
;
}
}
/**
* Tells whether current environment supports DOMError objects
* {@link supportsDOMError}.
*
* @returns Answer to the given question.
*/
function
supportsDOMError
()
{
try
{
// Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':
// 1 argument required, but only 0 present.
// @ts-ignore It really needs 1 argument, not 0.
new
DOMError
(
''
);
return
true
;
}
catch
(
e
)
{
return
false
;
}
}
/**
* Tells whether current environment supports DOMException objects
* {@link supportsDOMException}.
*
* @returns Answer to the given question.
*/
function
supportsDOMException
()
{
try
{
new
DOMException
(
''
);
return
true
;
}
catch
(
e
)
{
return
false
;
}
}
/**
* Tells whether current environment supports Fetch API
* {@link supportsFetch}.
*
* @returns Answer to the given question.
*/
function
supportsFetch
()
{
if
(
!
(
'fetch'
in
getGlobalObject
()))
{
return
false
;
}
try
{
new
Headers
();
new
Request
(
''
);
new
Response
();
return
true
;
}
catch
(
e
)
{
return
false
;
}
}
/**
* isNativeFetch checks if the given function is a native implementation of fetch()
*/
function
isNativeFetch
(
func
)
{
return
func
&&
/^function fetch\(\)\s+\{\s+\[native code\]\s+\}$/
.
test
(
func
.
toString
());
}
/**
* Tells whether current environment supports Fetch API natively
* {@link supportsNativeFetch}.
*
* @returns true if `window.fetch` is natively implemented, false otherwise
*/
function
supportsNativeFetch
()
{
if
(
!
supportsFetch
())
{
return
false
;
}
var
global
=
getGlobalObject
();
// Fast path to avoid DOM I/O
if
(
isNativeFetch
(
global
.
fetch
))
{
return
true
;
}
// window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)
// so create a "pure" iframe to see if that has native fetch
let
result
=
false
;
var
doc
=
global
.
document
;
if
(
doc
&&
typeof
(
doc
.
createElement
)
===
'function'
)
{
try
{
var
sandbox
=
doc
.
createElement
(
'iframe'
);
sandbox
.
hidden
=
true
;
doc
.
head
.
appendChild
(
sandbox
);
if
(
sandbox
.
contentWindow
&&
sandbox
.
contentWindow
.
fetch
)
{
result
=
isNativeFetch
(
sandbox
.
contentWindow
.
fetch
);
}
doc
.
head
.
removeChild
(
sandbox
);
}
catch
(
err
)
{
(
typeof
__SENTRY_DEBUG__
===
'undefined'
||
__SENTRY_DEBUG__
)
&&
logger
.
warn
(
'Could not create sandbox iframe for pure fetch check, bailing to window.fetch: '
,
err
);
}
}
return
result
;
}
/**
* Tells whether current environment supports ReportingObserver API
* {@link supportsReportingObserver}.
*
* @returns Answer to the given question.
*/
function
supportsReportingObserver
()
{
return
'ReportingObserver'
in
getGlobalObject
();
}
/**
* Tells whether current environment supports Referrer Policy API
* {@link supportsReferrerPolicy}.
*
* @returns Answer to the given question.
*/
function
supportsReferrerPolicy
()
{
// Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default'
// (see https://caniuse.com/#feat=referrer-policy),
// it doesn't. And it throws an exception instead of ignoring this parameter...
// REF: https://github.com/getsentry/raven-js/issues/1233
if
(
!
supportsFetch
())
{
return
false
;
}
try
{
new
Request
(
'_'
,
{
referrerPolicy
:
'origin'
,
});
return
true
;
}
catch
(
e
)
{
return
false
;
}
}
/**
* Tells whether current environment supports History API
* {@link supportsHistory}.
*
* @returns Answer to the given question.
*/
function
supportsHistory
()
{
// NOTE: in Chrome App environment, touching history.pushState, *even inside
// a try/catch block*, will cause Chrome to output an error to console.error
// borrowed from: https://github.com/angular/angular.js/pull/13945/files
var
global
=
getGlobalObject
();
var
chrome
=
(
global
).
chrome
;
var
isChromePackagedApp
=
chrome
&&
chrome
.
app
&&
chrome
.
app
.
runtime
;
var
hasHistoryApi
=
'history'
in
global
&&
!!
global
.
history
.
pushState
&&
!!
global
.
history
.
replaceState
;
return
!
isChromePackagedApp
&&
hasHistoryApi
;
}
export
{
isNativeFetch
,
supportsDOMError
,
supportsDOMException
,
supportsErrorEvent
,
supportsFetch
,
supportsHistory
,
supportsNativeFetch
,
supportsReferrerPolicy
,
supportsReportingObserver
};
//# sourceMappingURL=supports.js.map
File Metadata
Details
Attached
Mime Type
text/x-java
Expires
Jun 4 2025, 6:36 PM (14 w, 4 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3295613
Attached To
rDWAPPS Web applications
Event Timeline
Log In to Comment