Skip to content

Commit 54b32d7

Browse files
Subresource Integrity (iissnan#247)
1 parent f21fff4 commit 54b32d7

File tree

11 files changed

+46
-21
lines changed

11 files changed

+46
-21
lines changed

layout/_partials/head/head.njk

+5-5
Original file line numberDiff line numberDiff line change
@@ -38,19 +38,19 @@
3838

3939
{{ next_font() }}
4040

41-
<link rel="stylesheet" href="{{ theme.vendors.fontawesome }}">
41+
{{ next_vendors('fontawesome') }}
4242

4343
{%- if theme.motion.enable %}
44-
<link rel="stylesheet" href="{{ theme.vendors.animate_css }}">
44+
{{ next_vendors('animate_css') }}
4545
{%- endif %}
4646

4747
{%- if theme.fancybox %}
48-
<link rel="stylesheet" href="{{ theme.vendors.fancybox_css }}">
48+
{{ next_vendors('fancybox_css') }}
4949
{%- endif %}
5050

5151
{%- if theme.nprogress.enable %}
52-
<link rel="stylesheet" href="{{ theme.vendors.nprogress_css }}">
53-
<script src="{{ theme.vendors.nprogress_js }}"></script>
52+
{{ next_vendors('nprogress_css') }}
53+
{{ next_vendors('nprogress_js') }}
5454
{%- endif %}
5555

5656
{{ next_data('main', next_config()) }}

layout/_scripts/vendors.njk

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{%- if theme.canvas_ribbon.enable %}
2-
<script size="{{ theme.canvas_ribbon.size }}" alpha="{{ theme.canvas_ribbon.alpha }}" zIndex="{{ theme.canvas_ribbon.zIndex }}" src="{{ theme.vendors.canvas_ribbon }}"></script>
2+
<script size="{{ theme.canvas_ribbon.size }}" alpha="{{ theme.canvas_ribbon.alpha }}" zIndex="{{ theme.canvas_ribbon.zIndex }}" src="{{ theme.vendors.canvas_ribbon.url }}"></script>
33
{%- endif %}
44

55
{%- for name in js_vendors() %}
6-
<script src="{{ url_for(theme.vendors[name]) }}"></script>
6+
{{ next_vendors(name) }}
77
{%- endfor %}

layout/_third-party/comments/disqusjs.njk

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<link rel="stylesheet" href="{{ theme.vendors.disqusjs_css }}">
1+
{{ next_vendors('disqusjs_css') }}
22

33
{{ next_data('disqusjs', theme.disqusjs, {
44
js: theme.vendors.disqusjs_js

layout/_third-party/comments/gitalk.njk

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<link rel="stylesheet" href="{{ theme.vendors.gitalk_css }}">
1+
{{ next_vendors('gitalk_css') }}
22

33
{{ next_data('gitalk', theme.gitalk, {
44
js: theme.vendors.gitalk_js,

layout/_third-party/math/katex.njk

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
<link rel="stylesheet" href="{{ theme.vendors.katex }}">
1+
{{ next_vendors('katex') }}
22
{%- if theme.math.katex.copy_tex %}
3-
<link rel="stylesheet" href="{{ theme.vendors.copy_tex_css }}">
3+
{{ next_vendors('copy_tex_css') }}
44
{{ next_data('katex', {
55
copy_tex_js: theme.vendors.copy_tex_js
66
}) }}

layout/_third-party/quicklink.njk

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{%- if theme.quicklink.enable %}
2-
<script src="{{ theme.vendors.quicklink }}"></script>
2+
{{ next_vendors('quicklink') }}
33
{{ next_data('quicklink', page.quicklink, {
44
url: url | replace(r/index\.html$/, '')
55
}) }}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<script src="{{ theme.vendors.algolia_search }}"></script>
2-
<script src="{{ theme.vendors.instant_search }}"></script>
1+
{{ next_vendors('algolia_search') }}
2+
{{ next_vendors('instant_search') }}
33

44
{{- next_js('third-party/search/algolia-search.js') }}
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{%- if theme.firestore.enable %}
2-
<script src="{{ theme.vendors.firebase_app }}"></script>
3-
<script src="{{ theme.vendors.firebase_firestore }}"></script>
2+
{{ next_vendors('firebase_app') }}
3+
{{ next_vendors('firebase_firestore') }}
44
{{ next_data('firestore', theme.firestore) }}
55
{{ next_js('third-party/statistics/firestore.js') }}
66
{%- endif %}

scripts/events/lib/vendors.js

+7-2
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,9 @@ module.exports = hexo => {
1919
}
2020
for (const [key, value] of Object.entries(dependencies)) {
2121
if (vendors[key]) {
22-
vendors[key] = url_for.call(hexo, vendors[key]);
22+
vendors[key] = {
23+
url: url_for.call(hexo, vendors[key])
24+
};
2325
continue;
2426
}
2527
const { name, version, file, alias, unavailable } = value;
@@ -32,6 +34,9 @@ module.exports = hexo => {
3234
let { plugins = 'jsdelivr' } = vendors;
3335
if (plugins === 'cdnjs' && unavailable && unavailable.includes('cdnjs')) plugins = 'jsdelivr';
3436
if (plugins === 'local' && typeof internal === 'undefined') plugins = 'jsdelivr';
35-
vendors[key] = links[plugins] || links.jsdelivr;
37+
vendors[key] = {
38+
url : links[plugins] || links.jsdelivr,
39+
integrity: value.integrity
40+
};
3641
}
3742
};

scripts/helpers/engine.js

+11
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,17 @@ hexo.extend.helper.register('next_js', function(file, pjax = false) {
2929
return `<script ${pjax ? 'data-pjax ' : ''}src="${src}"></script>`;
3030
});
3131

32+
hexo.extend.helper.register('next_vendors', function(name) {
33+
const { url, integrity } = this.theme.vendors[name];
34+
const type = url.endsWith('css') ? 'css' : 'js';
35+
if (type === 'css') {
36+
if (integrity) return `<link rel="stylesheet" href="${url}" integrity="${integrity}" crossorigin="anonymous">`;
37+
return `<link rel="stylesheet" href="${url}">`;
38+
}
39+
if (integrity) return `<script src="${url}" integrity="${integrity}" crossorigin="anonymous"></script>`;
40+
return `<script src="${url}"></script>`;
41+
});
42+
3243
hexo.extend.helper.register('next_data', function(name, ...data) {
3344
const { escape_html } = this;
3445
const json = data.length === 1 ? data[0] : Object.assign({}, ...data);

source/js/utils.js

+12-3
Original file line numberDiff line numberDiff line change
@@ -337,9 +337,9 @@ NexT.utils = {
337337
}
338338
},
339339

340-
getScript: function(url, options = {}, legacyCondition) {
340+
getScript: function(src, options = {}, legacyCondition) {
341341
if (typeof options === 'function') {
342-
return this.getScript(url, {
342+
return this.getScript(src, {
343343
condition: legacyCondition
344344
}).then(options);
345345
}
@@ -373,7 +373,16 @@ NexT.utils = {
373373
script.onload = resolve;
374374
script.onerror = reject;
375375

376-
script.src = url;
376+
if (typeof src === 'object') {
377+
const { url, integrity } = src;
378+
script.src = url;
379+
if (integrity) {
380+
script.integrity = integrity;
381+
script.crossOrigin = 'anonymous';
382+
}
383+
} else {
384+
script.src = src;
385+
}
377386
(parentNode || document.head).appendChild(script);
378387
}
379388
});

0 commit comments

Comments
 (0)