forked from mirrors/gecko-dev
Differential Revision: https://phabricator.services.mozilla.com/D37217 --HG-- extra : moz-landing-system : lando
91 lines
2.8 KiB
JavaScript
91 lines
2.8 KiB
JavaScript
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
|
|
* You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
"use strict";
|
|
|
|
this.documentMetadata = (function() {
|
|
|
|
function findSiteName() {
|
|
let el = document.querySelector("meta[property~='og:site_name'][content]");
|
|
if (el) {
|
|
return el.getAttribute("content");
|
|
}
|
|
// nytimes.com uses this property:
|
|
el = document.querySelector("meta[name='cre'][content]");
|
|
if (el) {
|
|
return el.getAttribute("content");
|
|
}
|
|
return null;
|
|
}
|
|
|
|
function getOpenGraph() {
|
|
const openGraph = {};
|
|
// If you update this, also update _OPENGRAPH_PROPERTIES in shot.js:
|
|
const forceSingle = `title type url`.split(" ");
|
|
const openGraphProperties = `
|
|
title type url image audio description determiner locale site_name video
|
|
image:secure_url image:type image:width image:height
|
|
video:secure_url video:type video:width image:height
|
|
audio:secure_url audio:type
|
|
article:published_time article:modified_time article:expiration_time article:author article:section article:tag
|
|
book:author book:isbn book:release_date book:tag
|
|
profile:first_name profile:last_name profile:username profile:gender
|
|
`.split(/\s+/g);
|
|
for (const prop of openGraphProperties) {
|
|
let elems = document.querySelectorAll(`meta[property~='og:${prop}'][content]`);
|
|
if (forceSingle.includes(prop) && elems.length > 1) {
|
|
elems = [elems[0]];
|
|
}
|
|
let value;
|
|
if (elems.length > 1) {
|
|
value = [];
|
|
for (const elem of elems) {
|
|
const v = elem.getAttribute("content");
|
|
if (v) {
|
|
value.push(v);
|
|
}
|
|
}
|
|
if (!value.length) {
|
|
value = null;
|
|
}
|
|
} else if (elems.length === 1) {
|
|
value = elems[0].getAttribute("content");
|
|
}
|
|
if (value) {
|
|
openGraph[prop] = value;
|
|
}
|
|
}
|
|
return openGraph;
|
|
}
|
|
|
|
function getTwitterCard() {
|
|
const twitterCard = {};
|
|
// If you update this, also update _TWITTERCARD_PROPERTIES in shot.js:
|
|
const properties = `
|
|
card site title description image
|
|
player player:width player:height player:stream player:stream:content_type
|
|
`.split(/\s+/g);
|
|
for (const prop of properties) {
|
|
const elem = document.querySelector(`meta[name='twitter:${prop}'][content]`);
|
|
if (elem) {
|
|
const value = elem.getAttribute("content");
|
|
if (value) {
|
|
twitterCard[prop] = value;
|
|
}
|
|
}
|
|
}
|
|
return twitterCard;
|
|
}
|
|
|
|
return function documentMetadata() {
|
|
const result = {};
|
|
result.docTitle = document.title;
|
|
result.siteName = findSiteName();
|
|
result.openGraph = getOpenGraph();
|
|
result.twitterCard = getTwitterCard();
|
|
return result;
|
|
};
|
|
|
|
})();
|
|
null;
|