Commit fcaae0cc authored by Jason Laster's avatar Jason Laster
Browse files

Bug 1537779 - Improve column breakpoint UI performance. r=loganfsmyth

Differential Revision: https://phabricator.services.mozilla.com/D28552

--HG--
extra : moz-landing-system : lando
parent b5ec0b5d
Loading
Loading
Loading
Loading
+4 −3
Original line number Original line Diff line number Diff line
@@ -16,7 +16,7 @@ import type {
  SourceId
  SourceId
} from "../../../src/types";
} from "../../../src/types";
import type { SourceMapConsumer } from "source-map";
import type { SourceMapConsumer } from "source-map";
import type { locationOptions } from "./source-map";
import type { LocationOptions } from "./source-map";


export const dispatcher = new WorkerDispatcher();
export const dispatcher = new WorkerDispatcher();


@@ -80,12 +80,13 @@ export const getAllGeneratedLocations = async (


export const getOriginalLocation = async (
export const getOriginalLocation = async (
  location: SourceLocation,
  location: SourceLocation,
  options: locationOptions = {}
  options: LocationOptions = {}
): Promise<SourceLocation> => _getOriginalLocation(location, options);
): Promise<SourceLocation> => _getOriginalLocation(location, options);


export const getOriginalLocations = async (
export const getOriginalLocations = async (
  sourceId: SourceId,
  locations: SourceLocation[],
  locations: SourceLocation[],
  options: locationOptions = {}
  options: LocationOptions = {}
): Promise<SourceLocation[]> =>
): Promise<SourceLocation[]> =>
  dispatcher.invoke("getOriginalLocations", locations, options);
  dispatcher.invoke("getOriginalLocations", locations, options);


+35 −17
Original line number Original line Diff line number Diff line
@@ -46,7 +46,7 @@ type Range = {
  }
  }
};
};


export type locationOptions = {
export type LocationOptions = {
  search?: "LEAST_UPPER_BOUND" | "GREATEST_LOWER_BOUND"
  search?: "LEAST_UPPER_BOUND" | "GREATEST_LOWER_BOUND"
};
};


@@ -261,28 +261,30 @@ async function getAllGeneratedLocations(
  }));
  }));
}
}


function getOriginalLocations(
async function getOriginalLocations(
  sourceId: string,
  locations: SourceLocation[],
  locations: SourceLocation[],
  options: locationOptions = {}
  options: LocationOptions = {}
) {
): Promise<SourceLocation[]> {
  return Promise.all(
  if (locations.some(location => location.sourceId != sourceId)) {
    locations.map(location => getOriginalLocation(location, options))
    throw new Error("Generated locations must belong to the same source");
  );
  }
  }


async function getOriginalLocation(
  const map = await getSourceMap(sourceId);
  location: SourceLocation,
  if (!map) {
  { search }: locationOptions = {}
    return locations;
): Promise<SourceLocation> {
  if (!isGeneratedId(location.sourceId)) {
    return location;
  }
  }


  const map = await getSourceMap(location.sourceId);
  return locations.map(location =>
  if (!map) {
    getOriginalLocationSync(map, location, options)
    return location;
  );
}
}


function getOriginalLocationSync(
  map,
  location: SourceLocation,
  { search }: LocationOptions = {}
): SourceLocation {
  // First check for an exact match
  // First check for an exact match
  let match = map.originalPositionFor({
  let match = map.originalPositionFor({
    line: location.line,
    line: location.line,
@@ -321,6 +323,22 @@ async function getOriginalLocation(
  };
  };
}
}


async function getOriginalLocation(
  location: SourceLocation,
  options: LocationOptions = {}
): Promise<SourceLocation> {
  if (!isGeneratedId(location.sourceId)) {
    return location;
  }

  const map = await getSourceMap(location.sourceId);
  if (!map) {
    return location;
  }

  return getOriginalLocationSync(map, location, options);
}

async function getOriginalSourceText(
async function getOriginalSourceText(
  originalSource: Source
  originalSource: Source
): Promise<?{
): Promise<?{
+6 −0
Original line number Original line Diff line number Diff line
@@ -39,7 +39,13 @@ async function mapLocations(
  generatedLocations: SourceLocation[],
  generatedLocations: SourceLocation[],
  { sourceMaps }: ThunkArgs
  { sourceMaps }: ThunkArgs
) {
) {
  if (generatedLocations.length == 0) {
    return [];
  }

  const { sourceId } = generatedLocations[0];
  const originalLocations = await sourceMaps.getOriginalLocations(
  const originalLocations = await sourceMaps.getOriginalLocations(
    sourceId,
    generatedLocations
    generatedLocations
  );
  );


+22 −9
Original line number Original line Diff line number Diff line
@@ -4111,20 +4111,20 @@ async function getAllGeneratedLocations(location, originalSource) {
  }));
  }));
}
}
function getOriginalLocations(locations, options = {}) {
async function getOriginalLocations(sourceId, locations, options = {}) {
  return Promise.all(locations.map(location => getOriginalLocation(location, options)));
  if (locations.some(location => location.sourceId != sourceId)) {
    throw new Error("Generated locations must belong to the same source");
  }
  }
async function getOriginalLocation(location, { search } = {}) {
  const map = await getSourceMap(sourceId);
  if (!isGeneratedId(location.sourceId)) {
  if (!map) {
    return location;
    return locations;
  }
  }
  const map = await getSourceMap(location.sourceId);
  return locations.map(location => getOriginalLocationSync(map, location, options));
  if (!map) {
    return location;
}
}
function getOriginalLocationSync(map, location, { search } = {}) {
  // First check for an exact match
  // First check for an exact match
  let match = map.originalPositionFor({
  let match = map.originalPositionFor({
    line: location.line,
    line: location.line,
@@ -4163,6 +4163,19 @@ async function getOriginalLocation(location, { search } = {}) {
  };
  };
}
}
async function getOriginalLocation(location, options = {}) {
  if (!isGeneratedId(location.sourceId)) {
    return location;
  }
  const map = await getSourceMap(location.sourceId);
  if (!map) {
    return location;
  }
  return getOriginalLocationSync(map, location, options);
}
async function getOriginalSourceText(originalSource) {
async function getOriginalSourceText(originalSource) {
  assert(isOriginalId(originalSource.id), "Source is not an original source");
  assert(isOriginalId(originalSource.id), "Source is not an original source");