Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

core: rename url-shim to url-utils, stop extending global URL #14360

Merged
merged 4 commits into from Sep 7, 2022
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions cli/run.js
Expand Up @@ -19,7 +19,7 @@ import * as Printer from './printer.js';
import lighthouse, {legacyNavigation} from '../core/index.js';
import {getLhrFilenamePrefix} from '../report/generator/file-namer.js';
import * as assetSaver from '../core/lib/asset-saver.js';
import URL from '../core/lib/url-shim.js';
import UrlUtils from '../core/lib/url-utils.js';

/** @typedef {Error & {code: string, friendlyMessage?: string}} ExitError */

Expand Down Expand Up @@ -232,7 +232,7 @@ async function runLighthouse(url, flags, config) {
}

const shouldGather = flags.gatherMode || flags.gatherMode === flags.auditMode;
const shouldUseLocalChrome = URL.isLikeLocalhost(flags.hostname);
const shouldUseLocalChrome = UrlUtils.isLikeLocalhost(flags.hostname);
if (shouldGather && shouldUseLocalChrome) {
launchedChrome = await getDebuggableChrome(flags);
flags.port = launchedChrome.port;
Expand Down
10 changes: 5 additions & 5 deletions core/audits/byte-efficiency/modern-image-formats.js
Expand Up @@ -9,7 +9,7 @@


import {ByteEfficiencyAudit} from './byte-efficiency-audit.js';
import URL from '../../lib/url-shim.js';
import UrlUtils from '../../lib/url-utils.js';
import * as i18n from '../../lib/i18n/i18n.js';

const UIStrings = {
Expand Down Expand Up @@ -106,7 +106,7 @@ class ModernImageFormats extends ByteEfficiencyAudit {
const imageElement = imageElementsByURL.get(image.url);

if (image.failed) {
warnings.push(`Unable to decode ${URL.getURLDisplayName(image.url)}`);
warnings.push(`Unable to decode ${UrlUtils.getURLDisplayName(image.url)}`);
continue;
}

Expand All @@ -123,7 +123,7 @@ class ModernImageFormats extends ByteEfficiencyAudit {

if (typeof webpSize === 'undefined') {
if (!imageElement) {
warnings.push(`Unable to locate resource ${URL.getURLDisplayName(image.url)}`);
warnings.push(`Unable to locate resource ${UrlUtils.getURLDisplayName(image.url)}`);
continue;
}

Expand Down Expand Up @@ -152,8 +152,8 @@ class ModernImageFormats extends ByteEfficiencyAudit {
const wastedBytes = image.originalSize - avifSize;
if (wastedBytes < IGNORE_THRESHOLD_IN_BYTES) continue;

const url = URL.elideDataURI(image.url);
const isCrossOrigin = !URL.originsMatch(pageURL, image.url);
const url = UrlUtils.elideDataURI(image.url);
const isCrossOrigin = !UrlUtils.originsMatch(pageURL, image.url);

items.push({
node: imageElement ? ByteEfficiencyAudit.makeNodeItem(imageElement.node) : undefined,
Expand Down
4 changes: 2 additions & 2 deletions core/audits/byte-efficiency/offscreen-images.js
Expand Up @@ -12,7 +12,7 @@
import {ByteEfficiencyAudit} from './byte-efficiency-audit.js';
import {NetworkRequest} from '../../lib/network-request.js';
import {Sentry} from '../../lib/sentry.js';
import URL from '../../lib/url-shim.js';
import UrlUtils from '../../lib/url-utils.js';
import * as i18n from '../../lib/i18n/i18n.js';
import Interactive from '../../computed/metrics/interactive.js';
import ProcessedTrace from '../../computed/processed-trace.js';
Expand Down Expand Up @@ -87,7 +87,7 @@ class OffscreenImages extends ByteEfficiencyAudit {
// If the image had its loading behavior explicitly controlled already, treat it as passed.
if (image.loading === 'lazy' || image.loading === 'eager') return null;

const url = URL.elideDataURI(image.src);
const url = UrlUtils.elideDataURI(image.src);
const totalPixels = image.displayedWidth * image.displayedHeight;
const visiblePixels = this.computeVisiblePixels(image.clientRect, viewportDimensions);
// Treat images with 0 area as if they're offscreen. See https://github.com/GoogleChrome/lighthouse/issues/1914
Expand Down
4 changes: 2 additions & 2 deletions core/audits/byte-efficiency/uses-long-cache-ttl.js
Expand Up @@ -8,7 +8,7 @@ import parseCacheControl from 'parse-cache-control';

import {Audit} from '../audit.js';
import {NetworkRequest} from '../../lib/network-request.js';
import URL from '../../lib/url-shim.js';
import UrlUtils from '../../lib/url-utils.js';
import {linearInterpolation} from '../../lib/statistics.js';
import * as i18n from '../../lib/i18n/i18n.js';
import NetworkRecords from '../../computed/network-records.js';
Expand Down Expand Up @@ -233,7 +233,7 @@ class CacheHeaders extends Audit {
const cacheHitProbability = CacheHeaders.getCacheHitProbability(cacheLifetimeInSeconds);
if (cacheHitProbability > IGNORE_THRESHOLD_IN_PERCENT) continue;

const url = URL.elideDataURI(record.url);
const url = UrlUtils.elideDataURI(record.url);
const totalBytes = record.transferSize || 0;
const wastedBytes = (1 - cacheHitProbability) * totalBytes;

Expand Down
10 changes: 5 additions & 5 deletions core/audits/byte-efficiency/uses-optimized-images.js
Expand Up @@ -10,7 +10,7 @@


import {ByteEfficiencyAudit} from './byte-efficiency-audit.js';
import URL from '../../lib/url-shim.js';
import UrlUtils from '../../lib/url-utils.js';
import * as i18n from '../../lib/i18n/i18n.js';

const UIStrings = {
Expand Down Expand Up @@ -83,7 +83,7 @@ class UsesOptimizedImages extends ByteEfficiencyAudit {
const imageElement = imageElementsByURL.get(image.url);

if (image.failed) {
warnings.push(`Unable to decode ${URL.getURLDisplayName(image.url)}`);
warnings.push(`Unable to decode ${UrlUtils.getURLDisplayName(image.url)}`);
continue;
} else if (/(jpeg|bmp)/.test(image.mimeType) === false) {
continue;
Expand All @@ -94,7 +94,7 @@ class UsesOptimizedImages extends ByteEfficiencyAudit {

if (typeof jpegSize === 'undefined') {
if (!imageElement) {
warnings.push(`Unable to locate resource ${URL.getURLDisplayName(image.url)}`);
warnings.push(`Unable to locate resource ${UrlUtils.getURLDisplayName(image.url)}`);
continue;
}

Expand All @@ -111,8 +111,8 @@ class UsesOptimizedImages extends ByteEfficiencyAudit {

if (image.originalSize < jpegSize + IGNORE_THRESHOLD_IN_BYTES) continue;

const url = URL.elideDataURI(image.url);
const isCrossOrigin = !URL.originsMatch(pageURL, image.url);
const url = UrlUtils.elideDataURI(image.url);
const isCrossOrigin = !UrlUtils.originsMatch(pageURL, image.url);
const jpegSavings = UsesOptimizedImages.computeSavings({...image, jpegSize});

items.push({
Expand Down
Expand Up @@ -13,7 +13,7 @@

import {Audit} from '../audit.js';
import * as UsesResponsiveImages from './uses-responsive-images.js';
import URL from '../../lib/url-shim.js';
import UrlUtils from '../../lib/url-utils.js';
import * as i18n from '../../lib/i18n/i18n.js';

const UIStrings = {
Expand Down Expand Up @@ -71,7 +71,7 @@ class UsesResponsiveImagesSnapshot extends Audit {

items.push({
node: Audit.makeNodeItem(image.node),
url: URL.elideDataURI(image.src),
url: UrlUtils.elideDataURI(image.src),
displayedDimensions: `${displayed.width}x${displayed.height}`,
actualDimensions: `${actual.width}x${actual.height}`,
});
Expand Down
4 changes: 2 additions & 2 deletions core/audits/byte-efficiency/uses-responsive-images.js
Expand Up @@ -16,7 +16,7 @@
import {ByteEfficiencyAudit} from './byte-efficiency-audit.js';
import {NetworkRequest} from '../../lib/network-request.js';
import ImageRecords from '../../computed/image-records.js';
import URL from '../../lib/url-shim.js';
import UrlUtils from '../../lib/url-utils.js';
import * as i18n from '../../lib/i18n/i18n.js';

const UIStrings = {
Expand Down Expand Up @@ -100,7 +100,7 @@ class UsesResponsiveImages extends ByteEfficiencyAudit {
const displayed = this.getDisplayedDimensions(image, ViewportDimensions);
const usedPixels = displayed.width * displayed.height;

const url = URL.elideDataURI(image.src);
const url = UrlUtils.elideDataURI(image.src);
const actualPixels = image.naturalWidth * image.naturalHeight;
const wastedRatio = 1 - (usedPixels / actualPixels);
const totalBytes = NetworkRequest.getResourceSizeOnNetwork(networkRecord);
Expand Down
4 changes: 2 additions & 2 deletions core/audits/byte-efficiency/uses-text-compression.js
Expand Up @@ -10,7 +10,7 @@


import {ByteEfficiencyAudit} from './byte-efficiency-audit.js';
import URL from '../../lib/url-shim.js';
import UrlUtils from '../../lib/url-utils.js';
import * as i18n from '../../lib/i18n/i18n.js';

const UIStrings = {
Expand Down Expand Up @@ -68,7 +68,7 @@ class ResponsesAreCompressed extends ByteEfficiencyAudit {
}

// remove duplicates
const url = URL.elideDataURI(record.url);
const url = UrlUtils.elideDataURI(record.url);
const isDuplicate = items.find(item => item.url === url &&
item.totalBytes === record.resourceSize);
if (isDuplicate) {
Expand Down
4 changes: 2 additions & 2 deletions core/audits/dobetterweb/uses-http2.js
Expand Up @@ -14,7 +14,7 @@

import {Audit} from '../audit.js';
import ThirdParty from '../../lib/third-party-web.js';
import URL from '../../lib/url-shim.js';
import UrlUtils from '../../lib/url-utils.js';
import {ByteEfficiencyAudit} from '../byte-efficiency/byte-efficiency-audit.js';
import Interactive from '../../computed/metrics/lantern-interactive.js';
import {NetworkRequest} from '../../lib/network-request.js';
Expand Down Expand Up @@ -167,7 +167,7 @@ class UsesHTTP2Audit extends Audit {
const groupedByOrigin = new Map();
for (const record of networkRecords) {
if (!UsesHTTP2Audit.isStaticAsset(record)) continue;
if (URL.isLikeLocalhost(record.parsedURL.host)) continue;
if (UrlUtils.isLikeLocalhost(record.parsedURL.host)) continue;
const existing = groupedByOrigin.get(record.parsedURL.securityOrigin) || [];
existing.push(record);
groupedByOrigin.set(record.parsedURL.securityOrigin, existing);
Expand Down
13 changes: 7 additions & 6 deletions core/audits/font-display.js
Expand Up @@ -5,14 +5,15 @@
*/

import {Audit} from './audit.js';
import URL from '../lib/url-shim.js';
const PASSING_FONT_DISPLAY_REGEX = /^(block|fallback|optional|swap)$/;
const CSS_URL_REGEX = /url\((.*?)\)/;
const CSS_URL_GLOBAL_REGEX = new RegExp(CSS_URL_REGEX, 'g');
import UrlUtils from '../lib/url-utils.js';
import * as i18n from '../lib/i18n/i18n.js';
import {Sentry} from '../lib/sentry.js';
import NetworkRecords from '../computed/network-records.js';

const PASSING_FONT_DISPLAY_REGEX = /^(block|fallback|optional|swap)$/;
const CSS_URL_REGEX = /url\((.*?)\)/;
const CSS_URL_GLOBAL_REGEX = new RegExp(CSS_URL_REGEX, 'g');

const UIStrings = {
/** Title of a diagnostic audit that provides detail on if all the text on a webpage was visible while the page was loading its webfonts. This descriptive title is shown to users when the amount is acceptable and no user action is required. */
title: 'All text remains visible during webfont loads',
Expand Down Expand Up @@ -98,7 +99,7 @@ class FontDisplay extends Audit {
// Convert the relative CSS URL to an absolute URL and add it to the target set.
for (const relativeURL of relativeURLs) {
try {
const relativeRoot = URL.isValid(stylesheet.header.sourceURL) ?
const relativeRoot = UrlUtils.isValid(stylesheet.header.sourceURL) ?
stylesheet.header.sourceURL : artifacts.URL.finalUrl;
const absoluteURL = new URL(relativeURL, relativeRoot);
targetURLSet.add(absoluteURL.href);
Expand All @@ -121,7 +122,7 @@ class FontDisplay extends Audit {
/** @type {Map<string, number>} */
const warningCountByOrigin = new Map();
for (const warningUrl of warningUrls) {
const origin = URL.getOrigin(warningUrl);
const origin = UrlUtils.getOrigin(warningUrl);
if (!origin) continue;

const count = warningCountByOrigin.get(origin) || 0;
Expand Down
6 changes: 3 additions & 3 deletions core/audits/image-aspect-ratio.js
Expand Up @@ -12,7 +12,7 @@


import {Audit} from './audit.js';
import URL from '../lib/url-shim.js';
import UrlUtils from '../lib/url-utils.js';
import * as i18n from '../lib/i18n/i18n.js';

const UIStrings = {
Expand Down Expand Up @@ -54,7 +54,7 @@ class ImageAspectRatio extends Audit {
* @return {{url: string, node: LH.Audit.Details.NodeValue, displayedAspectRatio: string, actualAspectRatio: string, doRatiosMatch: boolean}}
*/
static computeAspectRatios(image) {
const url = URL.elideDataURI(image.src);
const url = UrlUtils.elideDataURI(image.src);
const actualAspectRatio = image.naturalDimensions.width / image.naturalDimensions.height;
const displayedAspectRatio = image.displayedWidth / image.displayedHeight;

Expand Down Expand Up @@ -89,7 +89,7 @@ class ImageAspectRatio extends Audit {
// - filter all svgs as they have no natural dimensions to audit
// - filter out images that have falsy naturalWidth or naturalHeight
return !image.isCss &&
URL.guessMimeType(image.src) !== 'image/svg+xml' &&
UrlUtils.guessMimeType(image.src) !== 'image/svg+xml' &&
image.naturalDimensions &&
image.naturalDimensions.height > 5 &&
image.naturalDimensions.width > 5 &&
Expand Down
6 changes: 3 additions & 3 deletions core/audits/image-size-responsive.js
Expand Up @@ -11,7 +11,7 @@


import {Audit} from './audit.js';
import URL from '../lib/url-shim.js';
import UrlUtils from '../lib/url-utils.js';
import * as i18n from '../lib/i18n/i18n.js';

/** @typedef {LH.Artifacts.ImageElement & Required<Pick<LH.Artifacts.ImageElement, 'naturalDimensions'>>} ImageWithNaturalDimensions */
Expand Down Expand Up @@ -96,7 +96,7 @@ function isCandidate(image) {
) {
return false;
}
if (URL.guessMimeType(image.src) === 'image/svg+xml') {
if (UrlUtils.guessMimeType(image.src) === 'image/svg+xml') {
return false;
}
if (image.isCss) {
Expand Down Expand Up @@ -147,7 +147,7 @@ function getResult(image, DPR) {
const [expectedWidth, expectedHeight] =
expectedImageSize(image.displayedWidth, image.displayedHeight, DPR);
return {
url: URL.elideDataURI(image.src),
url: UrlUtils.elideDataURI(image.src),
node: Audit.makeNodeItem(image.node),
displayedSize: `${image.displayedWidth} x ${image.displayedHeight}`,
actualSize: `${image.naturalDimensions.width} x ${image.naturalDimensions.height}`,
Expand Down
4 changes: 2 additions & 2 deletions core/audits/is-on-https.js
Expand Up @@ -5,7 +5,7 @@
*/

import {Audit} from './audit.js';
import URL from '../lib/url-shim.js';
import UrlUtils from '../lib/url-utils.js';
import {NetworkRequest} from '../lib/network-request.js';
import NetworkRecords from '../computed/network-records.js';
import * as i18n from '../lib/i18n/i18n.js';
Expand Down Expand Up @@ -75,7 +75,7 @@ class HTTPS extends Audit {
return NetworkRecords.request(devtoolsLogs, context).then(networkRecords => {
const insecureURLs = networkRecords
.filter(record => !NetworkRequest.isSecureRequest(record))
.map(record => URL.elideDataURI(record.url));
.map(record => UrlUtils.elideDataURI(record.url));

/** @type {Array<{url: string, resolution?: LH.IcuMessage|string}>} */
const items = Array.from(new Set(insecureURLs)).map(url => ({url, resolution: undefined}));
Expand Down
4 changes: 2 additions & 2 deletions core/audits/network-requests.js
Expand Up @@ -5,7 +5,7 @@
*/

import {Audit} from './audit.js';
import URL from '../lib/url-shim.js';
import UrlUtils from '../lib/url-utils.js';
import NetworkRecords from '../computed/network-records.js';
import MainResource from '../computed/main-resource.js';

Expand Down Expand Up @@ -62,7 +62,7 @@ class NetworkRequests extends Audit {
undefined;

return {
url: URL.elideDataURI(record.url),
url: UrlUtils.elideDataURI(record.url),
protocol: record.protocol,
startTime: timeToMs(record.startTime),
endTime: timeToMs(record.endTime),
Expand Down
4 changes: 2 additions & 2 deletions core/audits/seo/canonical.js
Expand Up @@ -5,7 +5,7 @@
*/

import {Audit} from '../audit.js';
import URL from '../../lib/url-shim.js';
import UrlUtils from '../../lib/url-utils.js';
import MainResource from '../../computed/main-resource.js';
import * as i18n from '../../lib/i18n/i18n.js';

Expand Down Expand Up @@ -93,7 +93,7 @@ class Canonical extends Audit {
// Links that had an hrefRaw but didn't have a valid href were invalid, flag them
if (!link.href) invalidCanonicalLink = link;
// Links that had a valid href but didn't have a valid hrefRaw must have been relatively resolved, flag them
else if (!URL.isValid(link.hrefRaw)) relativeCanonicallink = link;
else if (!UrlUtils.isValid(link.hrefRaw)) relativeCanonicallink = link;
// Otherwise, it was a valid canonical URL
else uniqueCanonicalURLs.add(link.href);
} else if (link.rel === 'alternate') {
Expand Down
1 change: 0 additions & 1 deletion core/audits/seo/is-crawlable.js
Expand Up @@ -7,7 +7,6 @@
import robotsParser from 'robots-parser';

import {Audit} from '../audit.js';
import URL from '../../lib/url-shim.js';
import MainResource from '../../computed/main-resource.js';
import * as i18n from '../../lib/i18n/i18n.js';

Expand Down
4 changes: 2 additions & 2 deletions core/audits/seo/link-text.js
Expand Up @@ -5,7 +5,7 @@
*/

import {Audit} from '../audit.js';
import URL from '../../lib/url-shim.js';
import UrlUtils from '../../lib/url-utils.js';
import * as i18n from '../../lib/i18n/i18n.js';

const BLOCKLIST = new Set([
Expand Down Expand Up @@ -121,7 +121,7 @@ class LinkText extends Audit {
href.startsWith('mailto:') ||
// This line prevents the audit from flagging anchor links.
// In this case it is better to use `finalUrl` than `mainDocumentUrl`.
URL.equalWithExcludedFragments(link.href, artifacts.URL.finalUrl)
UrlUtils.equalWithExcludedFragments(link.href, artifacts.URL.finalUrl)
) {
return false;
}
Expand Down
1 change: 0 additions & 1 deletion core/audits/seo/plugins.js
Expand Up @@ -5,7 +5,6 @@
*/

import {Audit} from '../audit.js';
import URL from '../../lib/url-shim.js';
import * as i18n from '../../lib/i18n/i18n.js';

const JAVA_APPLET_TYPE = 'application/x-java-applet';
Expand Down
1 change: 0 additions & 1 deletion core/audits/seo/robots-txt.js
Expand Up @@ -12,7 +12,6 @@
*/

import {Audit} from '../audit.js';
import URL from '../../lib/url-shim.js';
import * as i18n from '../../lib/i18n/i18n.js';

const HTTP_CLIENT_ERROR_CODE_LOW = 400;
Expand Down
1 change: 0 additions & 1 deletion core/audits/service-worker.js
Expand Up @@ -4,7 +4,6 @@
* Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.
*/

import URL from '../lib/url-shim.js';
import {Audit} from './audit.js';
import * as i18n from '../lib/i18n/i18n.js';

Expand Down