Commit ea3ee6da authored by Benedikt Meurer's avatar Benedikt Meurer Committed by V8 LUCI CQ

[inspector] Derive breakpoint hint based on resolved location.

When setting a breakpoint on a line (in the DevTools front-end), the
front-end sends a columnNumber of 0 and the inspector automatically
resolves the actual location (in bytecode execution order). In order
to also support changing source code, the inspector memorizes a text
hint, and uses that to adjust the location upon reload. This hint was
however taken based on the original line and column numbers, rather than
the resolved location, which causes trouble when syntactic order doesn't
match execution order, as in case of `await o.m()`.

In order to address that we now remember the textual hint based on the
resolved location.

Fixed: chromium:1081162
Also-By: kimanh@chromium.org
Change-Id: I7d08373440693b7abc18c29c1a05929d771d3031
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2905606
Commit-Queue: Benedikt Meurer <bmeurer@chromium.org>
Auto-Submit: Benedikt Meurer <bmeurer@chromium.org>
Reviewed-by: 's avatarKim-Anh Tran <kimanh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#74675}
parent 5b48a13a
...@@ -579,7 +579,8 @@ Response V8DebuggerAgentImpl::setBreakpointByUrl( ...@@ -579,7 +579,8 @@ Response V8DebuggerAgentImpl::setBreakpointByUrl(
std::unique_ptr<protocol::Debugger::Location> location = setBreakpointImpl( std::unique_ptr<protocol::Debugger::Location> location = setBreakpointImpl(
breakpointId, script.first, condition, lineNumber, columnNumber); breakpointId, script.first, condition, lineNumber, columnNumber);
if (location && type != BreakpointType::kByUrlRegex) { if (location && type != BreakpointType::kByUrlRegex) {
hint = breakpointHint(*script.second, lineNumber, columnNumber); hint = breakpointHint(*script.second, location->getLineNumber(),
location->getColumnNumber(columnNumber));
} }
if (location) (*locations)->emplace_back(std::move(location)); if (location) (*locations)->emplace_back(std::move(location));
} }
......
Regression test for crbug/1081162
Running test: testBreakpointResolved
After Debugger.setBreakpointByUrl
async function foo(o) {
await o.#bar();
}
After Debugger.breakpointResolved
async function foo(o) {
await o.#bar();
}
// Copyright 2021 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
let {session, contextGroup, Protocol} = InspectorTest.start('Regression test for crbug/1081162');
const source = `
async function foo(o) {
await o.bar();
}
`;
const url = 'v8://test/foo.js';
session.setupScriptMap();
InspectorTest.runAsyncTestSuite([
async function testBreakpointResolved() {
await Protocol.Debugger.enable();
contextGroup.addScript(source, 0, 0, url);
await Protocol.Debugger.onceScriptParsed();
let {result: {locations: [location]}} = await Protocol.Debugger.setBreakpointByUrl({url, lineNumber: 2, columnNumber: 0});
InspectorTest.log('After Debugger.setBreakpointByUrl');
await session.logSourceLocation(location);
contextGroup.addScript(source, 0, 0, url);
({params: {location}} = await Protocol.Debugger.onceBreakpointResolved());
InspectorTest.log('After Debugger.breakpointResolved');
await session.logSourceLocation(location);
await Protocol.Debugger.disable();
}
]);
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment