Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
/* global chrome */

import {normalizeUrl} from 'react-devtools-shared/src/utils';
import {normalizeUrlIfValid} from 'react-devtools-shared/src/utils';
import {__DEBUG__} from 'react-devtools-shared/src/constants';

let debugIDCounter = 0;
Expand Down Expand Up @@ -117,7 +117,7 @@ async function fetchFileWithCaching(url: string): Promise<string> {
chrome.devtools.inspectedWindow.getResources(r => resolve(r)),
);

const normalizedReferenceURL = normalizeUrl(url);
const normalizedReferenceURL = normalizeUrlIfValid(url);
const resource = resources.find(r => r.url === normalizedReferenceURL);

if (resource != null) {
Expand Down
7 changes: 6 additions & 1 deletion packages/react-devtools-extensions/src/main/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import {
LOCAL_STORAGE_TRACE_UPDATES_ENABLED_KEY,
} from 'react-devtools-shared/src/constants';
import {logEvent} from 'react-devtools-shared/src/Logger';
import {normalizeUrlIfValid} from 'react-devtools-shared/src/utils';

import {
setBrowserSelectionFromReact,
Expand Down Expand Up @@ -128,7 +129,11 @@ function createBridgeAndStore() {
: source;

// We use 1-based line and column, Chrome expects them 0-based.
chrome.devtools.panels.openResource(sourceURL, line - 1, column - 1);
chrome.devtools.panels.openResource(
normalizeUrlIfValid(sourceURL),
line - 1,
column - 1,
);
};

// TODO (Webpack 5) Hopefully we can remove this prop after the Webpack 5 migration.
Expand Down
4 changes: 1 addition & 3 deletions packages/react-devtools-shared/src/symbolicateSource.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
* @flow
*/

import {normalizeUrl} from 'react-devtools-shared/src/utils';
import SourceMapConsumer from 'react-devtools-shared/src/hooks/SourceMapConsumer';

import type {Source} from 'react-devtools-shared/src/shared/types';
Expand Down Expand Up @@ -91,9 +90,8 @@ export async function symbolicateSource(
try {
// sourceMapURL = https://react.dev/script.js.map
void new URL(possiblyURL); // test if it is a valid URL
const normalizedURL = normalizeUrl(possiblyURL);

return {sourceURL: normalizedURL, line, column};
return {sourceURL: possiblyURL, line, column};
} catch (e) {
// This is not valid URL
if (
Expand Down
14 changes: 11 additions & 3 deletions packages/react-devtools-shared/src/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -996,9 +996,17 @@ export function backendToFrontendSerializedElementMapper(
};
}

// Chrome normalizes urls like webpack-internals:// but new URL don't, so cannot use new URL here.
export function normalizeUrl(url: string): string {
return url.replace('/./', '/');
/**
* Should be used when treating url as a Chrome Resource URL.
*/
export function normalizeUrlIfValid(url: string): string {
try {
// TODO: Chrome will use the basepath to create a Resource URL.
return new URL(url).toString();
} catch {
// Giving up if it's not a valid URL without basepath
return url;
}
}

export function getIsReloadAndProfileSupported(): boolean {
Expand Down
Loading