2016-10-02 19:41:17 +00:00
|
|
|
# Copyright 2016 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.
|
|
|
|
|
|
|
|
import os
|
|
|
|
|
|
|
|
from testrunner.local import testsuite
|
|
|
|
from testrunner.local import utils
|
2017-12-13 12:47:24 +00:00
|
|
|
from testrunner.objects import testcase
|
2018-01-04 10:42:49 +00:00
|
|
|
from testrunner.outproc import base as outproc
|
2016-10-02 19:41:17 +00:00
|
|
|
|
|
|
|
PROTOCOL_TEST_JS = "protocol-test.js"
|
2020-06-10 03:54:24 +00:00
|
|
|
WASM_INSPECTOR_JS = "wasm-inspector-test.js"
|
[class] support out-of-scope private member access in debug-evaluate
Previously in the DevTools console, users could inspect a preview of all private class members on an instance, but if they wanted to evaluate or inspect a specific private class member out of a long list, they had to be debugging and in a scope that has access to those private names.
This patch adds support for extraordinary access of out-of-scope private member access in debug-evaluate, specifically for Debugger.evaluateOnCallframe() (for console calls invoked during debugging) and Runtime.evaluate() (for console calls invoked when the user is not debugging). This kind of access is not otherwise allowed in normal execution, but in the DevTools console it makes sense to relax the rules a bit for a better developer experience.
To support this kind of extraordinary access, if the parsing_while_debugging or is_repl_mode flag is set, when we encounter a private name reference that's in a top-level scope or an eval scope under a top-level scope, instead of throwing immediately, we bind the reference to a dynamic lookup variable, and emit bytecode that calls to %GetPrivateName() or %SetPrivateName() in the runtime to perform lookup of the private name as well as the load/store operations accordingly.
If there are more than on private name on the receiver matching the description (for example, an object with two `#field` private names from different classes), we throw an error for the ambiguity (we can consider supporting selection among the conflicting private names later, for the initial support we just throw for simplicity).
If there are no matching private names, or if the found private class member does not support the desired operation (e.g. attempting to write to a read-only private accessor), we throw an error as well.
If there is exactly one matching private name, and the found private class member support the desired operation, we dispatch to the proper behavior in the runtime calls.
Doc: https://docs.google.com/document/d/1Va89BKHjCDs9RccDWhuZBb6LyRMAd6BXM3-p25oHd8I/edit
Bug: chromium:1381806
Change-Id: I7d1db709470246050d2e4c2a85b2292e63c01fe9
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4020267
Commit-Queue: Joyee Cheung <joyee@igalia.com>
Reviewed-by: Toon Verwaest <verwaest@chromium.org>
Cr-Commit-Position: refs/heads/main@{#85421}
2023-01-19 14:29:20 +00:00
|
|
|
PRIVATE_MEMBER_TEST_JS = "private-class-member-inspector-test.js"
|
2016-10-02 19:41:17 +00:00
|
|
|
EXPECTED_SUFFIX = "-expected.txt"
|
2017-02-27 20:20:39 +00:00
|
|
|
RESOURCES_FOLDER = "resources"
|
2022-04-19 07:52:44 +00:00
|
|
|
|
2016-10-02 19:41:17 +00:00
|
|
|
|
2019-02-05 14:00:49 +00:00
|
|
|
class TestLoader(testsuite.JSTestLoader):
|
|
|
|
@property
|
|
|
|
def excluded_files(self):
|
[class] support out-of-scope private member access in debug-evaluate
Previously in the DevTools console, users could inspect a preview of all private class members on an instance, but if they wanted to evaluate or inspect a specific private class member out of a long list, they had to be debugging and in a scope that has access to those private names.
This patch adds support for extraordinary access of out-of-scope private member access in debug-evaluate, specifically for Debugger.evaluateOnCallframe() (for console calls invoked during debugging) and Runtime.evaluate() (for console calls invoked when the user is not debugging). This kind of access is not otherwise allowed in normal execution, but in the DevTools console it makes sense to relax the rules a bit for a better developer experience.
To support this kind of extraordinary access, if the parsing_while_debugging or is_repl_mode flag is set, when we encounter a private name reference that's in a top-level scope or an eval scope under a top-level scope, instead of throwing immediately, we bind the reference to a dynamic lookup variable, and emit bytecode that calls to %GetPrivateName() or %SetPrivateName() in the runtime to perform lookup of the private name as well as the load/store operations accordingly.
If there are more than on private name on the receiver matching the description (for example, an object with two `#field` private names from different classes), we throw an error for the ambiguity (we can consider supporting selection among the conflicting private names later, for the initial support we just throw for simplicity).
If there are no matching private names, or if the found private class member does not support the desired operation (e.g. attempting to write to a read-only private accessor), we throw an error as well.
If there is exactly one matching private name, and the found private class member support the desired operation, we dispatch to the proper behavior in the runtime calls.
Doc: https://docs.google.com/document/d/1Va89BKHjCDs9RccDWhuZBb6LyRMAd6BXM3-p25oHd8I/edit
Bug: chromium:1381806
Change-Id: I7d1db709470246050d2e4c2a85b2292e63c01fe9
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/4020267
Commit-Queue: Joyee Cheung <joyee@igalia.com>
Reviewed-by: Toon Verwaest <verwaest@chromium.org>
Cr-Commit-Position: refs/heads/main@{#85421}
2023-01-19 14:29:20 +00:00
|
|
|
return {PROTOCOL_TEST_JS, WASM_INSPECTOR_JS, PRIVATE_MEMBER_TEST_JS}
|
2019-02-05 14:00:49 +00:00
|
|
|
|
|
|
|
@property
|
|
|
|
def excluded_dirs(self):
|
|
|
|
return {RESOURCES_FOLDER}
|
|
|
|
|
|
|
|
|
2017-12-13 12:47:24 +00:00
|
|
|
class TestSuite(testsuite.TestSuite):
|
2019-02-05 14:00:49 +00:00
|
|
|
def _test_loader_class(self):
|
|
|
|
return TestLoader
|
2016-10-02 19:41:17 +00:00
|
|
|
|
2017-12-12 21:33:16 +00:00
|
|
|
def _test_class(self):
|
2017-12-13 12:47:24 +00:00
|
|
|
return TestCase
|
2016-10-02 19:41:17 +00:00
|
|
|
|
2017-12-12 21:33:16 +00:00
|
|
|
|
2017-12-13 12:47:24 +00:00
|
|
|
class TestCase(testcase.TestCase):
|
2017-12-12 21:33:16 +00:00
|
|
|
def __init__(self, *args, **kwargs):
|
2017-12-13 12:47:24 +00:00
|
|
|
super(TestCase, self).__init__(*args, **kwargs)
|
2017-12-12 21:33:16 +00:00
|
|
|
|
|
|
|
self._source_flags = self._parse_source_flags()
|
|
|
|
|
2018-01-31 12:01:49 +00:00
|
|
|
def _get_files_params(self):
|
2017-12-12 21:33:16 +00:00
|
|
|
return [
|
|
|
|
os.path.join(self.suite.root, PROTOCOL_TEST_JS),
|
|
|
|
os.path.join(self.suite.root, self.path + self._get_suffix()),
|
|
|
|
]
|
|
|
|
|
|
|
|
def _get_source_flags(self):
|
|
|
|
return self._source_flags
|
|
|
|
|
|
|
|
def _get_source_path(self):
|
|
|
|
return os.path.join(self.suite.root, self.path + self._get_suffix())
|
|
|
|
|
2017-12-19 14:48:08 +00:00
|
|
|
def get_shell(self):
|
2017-12-12 21:33:16 +00:00
|
|
|
return 'inspector-test'
|
|
|
|
|
2023-01-31 13:46:33 +00:00
|
|
|
def get_android_resources(self):
|
|
|
|
super_resources = super().get_android_resources()
|
|
|
|
return super_resources + [
|
2022-04-19 07:52:44 +00:00
|
|
|
os.path.join('test', 'inspector', 'debugger', 'resources',
|
|
|
|
'break-locations.js'),
|
|
|
|
os.path.join('test', 'inspector', WASM_INSPECTOR_JS),
|
2018-09-11 09:43:12 +00:00
|
|
|
]
|
|
|
|
|
2017-12-21 14:48:59 +00:00
|
|
|
@property
|
|
|
|
def output_proc(self):
|
2018-01-04 07:39:09 +00:00
|
|
|
return outproc.ExpectedOutProc(
|
|
|
|
self.expected_outcomes,
|
2020-03-03 18:04:10 +00:00
|
|
|
os.path.join(self.suite.root, self.path) + EXPECTED_SUFFIX,
|
2023-01-20 16:22:22 +00:00
|
|
|
self.test_config.regenerate_expected_files)
|