1e509ee18Sopenharmony_ci#!/usr/bin/env python3
2e509ee18Sopenharmony_ci# -*- coding: utf-8 -*-
3e509ee18Sopenharmony_ci"""
4e509ee18Sopenharmony_ciCopyright (c) 2024 Huawei Device Co., Ltd.
5e509ee18Sopenharmony_ciLicensed under the Apache License, Version 2.0 (the "License");
6e509ee18Sopenharmony_ciyou may not use this file except in compliance with the License.
7e509ee18Sopenharmony_ciYou may obtain a copy of the License at
8e509ee18Sopenharmony_ci
9e509ee18Sopenharmony_ci    http://www.apache.org/licenses/LICENSE-2.0
10e509ee18Sopenharmony_ci
11e509ee18Sopenharmony_ciUnless required by applicable law or agreed to in writing, software
12e509ee18Sopenharmony_cidistributed under the License is distributed on an "AS IS" BASIS,
13e509ee18Sopenharmony_ciWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14e509ee18Sopenharmony_ciSee the License for the specific language governing permissions and
15e509ee18Sopenharmony_cilimitations under the License.
16e509ee18Sopenharmony_ci
17e509ee18Sopenharmony_ciDescription: Python CDP Debugger.
18e509ee18Sopenharmony_ci"""
19e509ee18Sopenharmony_ci
20e509ee18Sopenharmony_cifrom dataclasses import dataclass, field
21e509ee18Sopenharmony_cifrom enum import Enum
22e509ee18Sopenharmony_cifrom typing import Optional, List
23e509ee18Sopenharmony_ci
24e509ee18Sopenharmony_ci
25e509ee18Sopenharmony_ci@dataclass
26e509ee18Sopenharmony_ciclass DropFrameParams:
27e509ee18Sopenharmony_ci    dropped_depth: int = 1
28e509ee18Sopenharmony_ci
29e509ee18Sopenharmony_ci
30e509ee18Sopenharmony_ci@dataclass
31e509ee18Sopenharmony_ciclass ReplyNativeCallingParams:
32e509ee18Sopenharmony_ci    user_code: bool = True
33e509ee18Sopenharmony_ci
34e509ee18Sopenharmony_ci
35e509ee18Sopenharmony_ci@dataclass
36e509ee18Sopenharmony_ciclass SetMixedDebugEnabledParams:
37e509ee18Sopenharmony_ci    enabled: bool
38e509ee18Sopenharmony_ci    mixed_stack_enabled: bool
39e509ee18Sopenharmony_ci
40e509ee18Sopenharmony_ci
41e509ee18Sopenharmony_ci@dataclass
42e509ee18Sopenharmony_ciclass SmartStepIntoParams:
43e509ee18Sopenharmony_ci    url: str
44e509ee18Sopenharmony_ci    line_number: int
45e509ee18Sopenharmony_ci
46e509ee18Sopenharmony_ci
47e509ee18Sopenharmony_ci@dataclass
48e509ee18Sopenharmony_ciclass PauseOnExceptionsState(Enum):
49e509ee18Sopenharmony_ci    ALL = 'all'
50e509ee18Sopenharmony_ci    NONE = 'none'
51e509ee18Sopenharmony_ci    CAUGHT = 'caught'
52e509ee18Sopenharmony_ci    UNCAUGHT = 'uncaught'
53e509ee18Sopenharmony_ci
54e509ee18Sopenharmony_ci
55e509ee18Sopenharmony_ci@dataclass
56e509ee18Sopenharmony_ciclass EvaluateOnCallFrameParams:
57e509ee18Sopenharmony_ci    expression: str
58e509ee18Sopenharmony_ci    call_frame_id: int = 0
59e509ee18Sopenharmony_ci    object_group: str = "console"
60e509ee18Sopenharmony_ci    include_command_line_api: bool = True
61e509ee18Sopenharmony_ci    silent: bool = True
62e509ee18Sopenharmony_ci
63e509ee18Sopenharmony_ci
64e509ee18Sopenharmony_ci@dataclass
65e509ee18Sopenharmony_ciclass BreakLocationUrl:
66e509ee18Sopenharmony_ci    url: str
67e509ee18Sopenharmony_ci    line_number: int
68e509ee18Sopenharmony_ci    column_number: Optional[int] = 0
69e509ee18Sopenharmony_ci    condition: Optional[str] = None
70e509ee18Sopenharmony_ci
71e509ee18Sopenharmony_ci    def to_json(self):
72e509ee18Sopenharmony_ci        json = {'url': self.url,
73e509ee18Sopenharmony_ci                'lineNumber': self.line_number,
74e509ee18Sopenharmony_ci                'columnNumber': self.column_number}
75e509ee18Sopenharmony_ci        if self.condition is not None:
76e509ee18Sopenharmony_ci            json['condition'] = self.condition
77e509ee18Sopenharmony_ci        return json
78e509ee18Sopenharmony_ci
79e509ee18Sopenharmony_ci
80e509ee18Sopenharmony_ci@dataclass
81e509ee18Sopenharmony_ciclass RemoveBreakpointsUrl:
82e509ee18Sopenharmony_ci    url: str = ""
83e509ee18Sopenharmony_ci
84e509ee18Sopenharmony_ci
85e509ee18Sopenharmony_ci@dataclass
86e509ee18Sopenharmony_ciclass SetBreakpointsLocations:
87e509ee18Sopenharmony_ci    locations: list = field(default_factory=list)
88e509ee18Sopenharmony_ci
89e509ee18Sopenharmony_ci
90e509ee18Sopenharmony_cidef enable():
91e509ee18Sopenharmony_ci    command = {'method': 'Debugger.enable'}
92e509ee18Sopenharmony_ci    return command
93e509ee18Sopenharmony_ci
94e509ee18Sopenharmony_ci
95e509ee18Sopenharmony_cidef resume():
96e509ee18Sopenharmony_ci    command = {'method': 'Debugger.resume'}
97e509ee18Sopenharmony_ci    return command
98e509ee18Sopenharmony_ci
99e509ee18Sopenharmony_ci
100e509ee18Sopenharmony_cidef remove_breakpoints_by_url(params: RemoveBreakpointsUrl):
101e509ee18Sopenharmony_ci    command = {'method': 'Debugger.removeBreakpointsByUrl',
102e509ee18Sopenharmony_ci               'params': {'url': params.url}}
103e509ee18Sopenharmony_ci    return command
104e509ee18Sopenharmony_ci
105e509ee18Sopenharmony_ci
106e509ee18Sopenharmony_cidef get_possible_and_set_breakpoint_by_url(params: SetBreakpointsLocations):
107e509ee18Sopenharmony_ci    locations = []
108e509ee18Sopenharmony_ci    for location in params.locations:
109e509ee18Sopenharmony_ci        locations.append(location.to_json())
110e509ee18Sopenharmony_ci    command = {'method': 'Debugger.getPossibleAndSetBreakpointByUrl',
111e509ee18Sopenharmony_ci               'params': {'locations': locations}}
112e509ee18Sopenharmony_ci    return command
113e509ee18Sopenharmony_ci
114e509ee18Sopenharmony_ci
115e509ee18Sopenharmony_cidef step_over():
116e509ee18Sopenharmony_ci    command = {'method': 'Debugger.stepOver'}
117e509ee18Sopenharmony_ci    return command
118e509ee18Sopenharmony_ci
119e509ee18Sopenharmony_ci
120e509ee18Sopenharmony_cidef step_into():
121e509ee18Sopenharmony_ci    command = {'method': 'Debugger.stepInto'}
122e509ee18Sopenharmony_ci    return command
123e509ee18Sopenharmony_ci
124e509ee18Sopenharmony_ci
125e509ee18Sopenharmony_cidef step_out():
126e509ee18Sopenharmony_ci    command = {'method': 'Debugger.stepOut'}
127e509ee18Sopenharmony_ci    return command
128e509ee18Sopenharmony_ci
129e509ee18Sopenharmony_ci
130e509ee18Sopenharmony_cidef disable():
131e509ee18Sopenharmony_ci    command = {'method': 'Debugger.disable'}
132e509ee18Sopenharmony_ci    return command
133e509ee18Sopenharmony_ci
134e509ee18Sopenharmony_ci
135e509ee18Sopenharmony_cidef set_pause_on_exceptions(params: PauseOnExceptionsState):
136e509ee18Sopenharmony_ci    command = {'method': 'Debugger.setPauseOnExceptions',
137e509ee18Sopenharmony_ci               'params': {'state': params.value}}
138e509ee18Sopenharmony_ci    return command
139e509ee18Sopenharmony_ci
140e509ee18Sopenharmony_ci
141e509ee18Sopenharmony_cidef evaluate_on_call_frame(params: EvaluateOnCallFrameParams):
142e509ee18Sopenharmony_ci    command = {'method': 'Debugger.evaluateOnCallFrame',
143e509ee18Sopenharmony_ci               'params': {
144e509ee18Sopenharmony_ci                   'callFrameId': str(params.call_frame_id),
145e509ee18Sopenharmony_ci                   'expression': params.expression,
146e509ee18Sopenharmony_ci                   'includeCommandLineApi': params.include_command_line_api,
147e509ee18Sopenharmony_ci                   'objectGroup': params.object_group,
148e509ee18Sopenharmony_ci                   'silent': params.silent}}
149e509ee18Sopenharmony_ci    return command
150e509ee18Sopenharmony_ci
151e509ee18Sopenharmony_ci
152e509ee18Sopenharmony_cidef pause():
153e509ee18Sopenharmony_ci    command = {'method': 'Debugger.pause'}
154e509ee18Sopenharmony_ci    return command
155e509ee18Sopenharmony_ci
156e509ee18Sopenharmony_ci
157e509ee18Sopenharmony_cidef set_mixed_debug_enabled(params: SetMixedDebugEnabledParams):
158e509ee18Sopenharmony_ci    command = {'method': 'Debugger.setMixedDebugEnabled',
159e509ee18Sopenharmony_ci               'params': {'enabled': params.enabled, 'mixedStackEnabled': params.mixed_stack_enabled}}
160e509ee18Sopenharmony_ci    return command
161e509ee18Sopenharmony_ci
162e509ee18Sopenharmony_ci
163e509ee18Sopenharmony_cidef reply_native_calling(params: ReplyNativeCallingParams):
164e509ee18Sopenharmony_ci    command = {'method': 'Debugger.replyNativeCalling',
165e509ee18Sopenharmony_ci               'params': {'userCode': params.user_code}}
166e509ee18Sopenharmony_ci    return command
167e509ee18Sopenharmony_ci
168e509ee18Sopenharmony_ci
169e509ee18Sopenharmony_cidef drop_frame(params: DropFrameParams):
170e509ee18Sopenharmony_ci    command = {'method': 'Debugger.dropFrame',
171e509ee18Sopenharmony_ci               'params': {'droppedDepth': params.dropped_depth}}
172e509ee18Sopenharmony_ci    return command
173e509ee18Sopenharmony_ci
174e509ee18Sopenharmony_ci
175e509ee18Sopenharmony_cidef smart_step_into(params: SmartStepIntoParams):
176e509ee18Sopenharmony_ci    command = {'method': 'Debugger.smartStepInto',
177e509ee18Sopenharmony_ci               'params': {'url': params.url, 'lineNumber': params.line_number}}
178e509ee18Sopenharmony_ci    return command