mirror of
https://github.com/NohamR/safari-internal-js.git
synced 2026-02-22 02:45:41 +00:00
105 lines
2.9 KiB
JavaScript
105 lines
2.9 KiB
JavaScript
//# sourceURL=__InjectedScript_MetadataExtractor.js
|
|
/* Copyright (c) 2025 Apple Inc. All rights reserved. */
|
|
function getIconType(e) {
|
|
var o = e.getAttribute("rel");
|
|
return "apple-touch-icon" === o
|
|
? IconTypeAppleTouchIcon
|
|
: "apple-touch-icon-precomposed" === o
|
|
? IconTypeAppleTouchIconPrecomposed
|
|
: IconTypeFavicon;
|
|
}
|
|
function compareIconsDescending(e, o) {
|
|
var c = getIconType(e),
|
|
t = getIconType(o);
|
|
if (c === IconTypeFavicon && t !== IconTypeFavicon) return 1;
|
|
if (t === IconTypeFavicon && c !== IconTypeFavicon) return -1;
|
|
var n = e.getAttribute("sizes"),
|
|
r = o.getAttribute("sizes"),
|
|
p = 0,
|
|
a = 0;
|
|
return (
|
|
n
|
|
? (p = parseInt(n))
|
|
: n ||
|
|
(c !== IconTypeAppleTouchIcon &&
|
|
c !== IconTypeAppleTouchIconPrecomposed) ||
|
|
(p = AppleTouchIconDefaultWidth),
|
|
r
|
|
? (a = parseInt(r))
|
|
: r ||
|
|
(t !== IconTypeAppleTouchIcon &&
|
|
t !== IconTypeAppleTouchIconPrecomposed) ||
|
|
(a = AppleTouchIconDefaultWidth),
|
|
a > p
|
|
? 1
|
|
: a < p
|
|
? -1
|
|
: c !== IconTypeAppleTouchIconPrecomposed &&
|
|
t === IconTypeAppleTouchIconPrecomposed
|
|
? 1
|
|
: t !== IconTypeAppleTouchIconPrecomposed &&
|
|
c === IconTypeAppleTouchIconPrecomposed
|
|
? -1
|
|
: 0
|
|
);
|
|
}
|
|
function colorComponentsFromString(e) {
|
|
var o = document.createElement("canvas");
|
|
((o.width = 1), (o.height = 1));
|
|
var c = o.getContext("2d");
|
|
((c.fillStyle = e), c.fillRect(0, 0, 1, 1));
|
|
var t = c.getImageData(0, 0, 1, 1);
|
|
return [t.data[0], t.data[1], t.data[2]];
|
|
}
|
|
var MetadataExtractor = function () {};
|
|
const IconTypeFavicon = 0,
|
|
IconTypeAppleTouchIcon = 1,
|
|
IconTypeAppleTouchIconPrecomposed = 2,
|
|
AppleTouchIconDefaultWidth = 60;
|
|
MetadataExtractor.prototype = {
|
|
extractAndSortIconsWithSelector: function (e) {
|
|
var o = document.head.querySelectorAll(e);
|
|
return o.length
|
|
? Array.prototype.slice.call(o).sort(compareIconsDescending)
|
|
: [];
|
|
},
|
|
extractAppleTouchIconURLs: function () {
|
|
for (
|
|
var e = this.extractAndSortIconsWithSelector(
|
|
"link[rel=apple-touch-icon], link[rel=apple-touch-icon-precomposed]",
|
|
),
|
|
o = [],
|
|
c = 0;
|
|
c < e.length;
|
|
++c
|
|
) {
|
|
var t = e[c].href;
|
|
t && o.push(t);
|
|
}
|
|
return o;
|
|
},
|
|
extractFaviconURLs: function () {
|
|
for (
|
|
var e = this.extractAndSortIconsWithSelector(
|
|
"link[rel='shortcut icon'], link[rel=icon]",
|
|
),
|
|
o = [],
|
|
c = e.length,
|
|
t = 0;
|
|
t < c;
|
|
++t
|
|
)
|
|
o.push(e[t].href);
|
|
return o;
|
|
},
|
|
extractTemplateIconURLAndColor: function () {
|
|
var e = document.head.querySelector("link[rel=mask-icon]");
|
|
if (!e) return null;
|
|
var o = e.getAttribute("color");
|
|
return o && e.href
|
|
? { url: e.href, color: colorComponentsFromString(o) }
|
|
: null;
|
|
},
|
|
};
|
|
var MetadataExtractorJS = new MetadataExtractor();
|