chrome-devtools-frontend 1.0.948445 → 1.0.948916

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/config/gni/devtools_grd_files.gni +0 -6
  2. package/front_end/core/i18n/locales/en-US.json +15 -30
  3. package/front_end/core/i18n/locales/en-XL.json +15 -30
  4. package/front_end/core/sdk/RemoteObject.ts +15 -1
  5. package/front_end/entrypoints/devtools_app/devtools_app.ts +0 -1
  6. package/front_end/entrypoints/visibility.gni +3 -1
  7. package/front_end/entrypoints/worker_app/worker_app.ts +0 -1
  8. package/front_end/generated/InspectorBackendCommands.js +8 -1
  9. package/front_end/generated/protocol-mapping.d.ts +4 -0
  10. package/front_end/generated/protocol-proxy-api.d.ts +6 -0
  11. package/front_end/generated/protocol.d.ts +9 -0
  12. package/front_end/models/issues_manager/AttributionReportingIssue.ts +27 -2
  13. package/front_end/panels/console/ConsolePrompt.ts +0 -4
  14. package/front_end/panels/elements/AccessibilityTreeUtils.ts +1 -7
  15. package/front_end/panels/elements/PropertiesWidget.ts +109 -4
  16. package/front_end/panels/elements/propertiesWidget.css +34 -0
  17. package/front_end/panels/emulation/DeviceModeToolbar.ts +5 -1
  18. package/package.json +1 -1
  19. package/scripts/eslint_rules/lib/ban_a_tags_in_lit_html.js +2 -11
  20. package/scripts/eslint_rules/lib/ban_literal_devtools_component_tag_names.js +2 -11
  21. package/scripts/eslint_rules/lib/ban_self_closing_custom_element_tagnames.js +2 -11
  22. package/scripts/eslint_rules/lib/ban_style_tags_in_lit_html.js +2 -11
  23. package/scripts/eslint_rules/lib/lit_html_data_as_type.js +2 -11
  24. package/scripts/eslint_rules/lib/lit_html_no_attribute_quotes.js +1 -13
  25. package/scripts/eslint_rules/lib/lit_no_style_interpolation.js +2 -11
  26. package/scripts/eslint_rules/lib/static_tag_must_be_static_property.js +2 -11
  27. package/scripts/eslint_rules/lib/utils.js +29 -0
  28. package/scripts/eslint_rules/tests/.eslintrc.js +4 -0
  29. package/scripts/eslint_rules/tests/utils_test.js +40 -0
  30. package/front_end/panels/help/HelpImpl.ts +0 -141
  31. package/front_end/panels/help/ReleaseNoteText.ts +0 -1496
  32. package/front_end/panels/help/ReleaseNoteView.ts +0 -107
  33. package/front_end/panels/help/help-meta.ts +0 -145
  34. package/front_end/panels/help/help.ts +0 -13
  35. package/front_end/panels/help/releaseNote.css +0 -115
@@ -356,8 +356,6 @@ grd_files_release_sources = [
356
356
  "front_end/panels/emulation/emulation-meta.js",
357
357
  "front_end/panels/emulation/emulation.js",
358
358
  "front_end/panels/event_listeners/event_listeners.js",
359
- "front_end/panels/help/help-meta.js",
360
- "front_end/panels/help/help.js",
361
359
  "front_end/panels/input/input-meta.js",
362
360
  "front_end/panels/input/input.js",
363
361
  "front_end/panels/issues/components/components.js",
@@ -957,10 +955,6 @@ grd_files_debug_sources = [
957
955
  "front_end/panels/event_listeners/EventListenersUtils.js",
958
956
  "front_end/panels/event_listeners/EventListenersView.js",
959
957
  "front_end/panels/event_listeners/eventListenersView.css.js",
960
- "front_end/panels/help/HelpImpl.js",
961
- "front_end/panels/help/ReleaseNoteText.js",
962
- "front_end/panels/help/ReleaseNoteView.js",
963
- "front_end/panels/help/releaseNote.css.js",
964
958
  "front_end/panels/input/InputModel.js",
965
959
  "front_end/panels/input/InputTimeline.js",
966
960
  "front_end/panels/input/inputTimeline.css.js",
@@ -4664,6 +4664,21 @@
4664
4664
  "panels/elements/PlatformFontsWidget.ts | renderedFonts": {
4665
4665
  "message": "Rendered Fonts"
4666
4666
  },
4667
+ "panels/elements/PropertiesWidget.ts | filter": {
4668
+ "message": "Filter"
4669
+ },
4670
+ "panels/elements/PropertiesWidget.ts | filterProperties": {
4671
+ "message": "Filter Properties"
4672
+ },
4673
+ "panels/elements/PropertiesWidget.ts | noMatchingProperty": {
4674
+ "message": "No matching property"
4675
+ },
4676
+ "panels/elements/PropertiesWidget.ts | showAll": {
4677
+ "message": "Show all"
4678
+ },
4679
+ "panels/elements/PropertiesWidget.ts | showAllTooltip": {
4680
+ "message": "When unchecked, only properties whose values are neither null nor undefined will be shown"
4681
+ },
4667
4682
  "panels/elements/StylePropertyTreeElement.ts | copyAllCssDeclarationsAsJs": {
4668
4683
  "message": "Copy all declarations as JS"
4669
4684
  },
@@ -4958,36 +4973,6 @@
4958
4973
  "panels/event_listeners/EventListenersView.ts | toggleWhetherEventListenerIs": {
4959
4974
  "message": "Toggle whether event listener is passive or blocking"
4960
4975
  },
4961
- "panels/help/help-meta.ts | bug": {
4962
- "message": "bug"
4963
- },
4964
- "panels/help/help-meta.ts | doNotShowWhatsNewAfterEachUpdate": {
4965
- "message": "Do not show What's New after each update"
4966
- },
4967
- "panels/help/help-meta.ts | releaseNotes": {
4968
- "message": "Release notes"
4969
- },
4970
- "panels/help/help-meta.ts | reportADevtoolsIssue": {
4971
- "message": "Report a DevTools issue"
4972
- },
4973
- "panels/help/help-meta.ts | reportTranslationIssue": {
4974
- "message": "Report a translation issue"
4975
- },
4976
- "panels/help/help-meta.ts | showWhatsNew": {
4977
- "message": "Show What's New"
4978
- },
4979
- "panels/help/help-meta.ts | showWhatsNewAfterEachUpdate": {
4980
- "message": "Show What's New after each update"
4981
- },
4982
- "panels/help/help-meta.ts | whatsNew": {
4983
- "message": "What's New"
4984
- },
4985
- "panels/help/ReleaseNoteView.ts | close": {
4986
- "message": "Close"
4987
- },
4988
- "panels/help/ReleaseNoteView.ts | learnMore": {
4989
- "message": "Learn more"
4990
- },
4991
4976
  "panels/input/input-meta.ts | inputs": {
4992
4977
  "message": "Inputs"
4993
4978
  },
@@ -4664,6 +4664,21 @@
4664
4664
  "panels/elements/PlatformFontsWidget.ts | renderedFonts": {
4665
4665
  "message": "R̂én̂d́êŕêd́ F̂ón̂t́ŝ"
4666
4666
  },
4667
+ "panels/elements/PropertiesWidget.ts | filter": {
4668
+ "message": "F̂íl̂t́êŕ"
4669
+ },
4670
+ "panels/elements/PropertiesWidget.ts | filterProperties": {
4671
+ "message": "F̂íl̂t́êŕ P̂ŕôṕêŕt̂íêś"
4672
+ },
4673
+ "panels/elements/PropertiesWidget.ts | noMatchingProperty": {
4674
+ "message": "N̂ó m̂át̂ćĥín̂ǵ p̂ŕôṕêŕt̂ý"
4675
+ },
4676
+ "panels/elements/PropertiesWidget.ts | showAll": {
4677
+ "message": "Ŝh́ôẃ âĺl̂"
4678
+ },
4679
+ "panels/elements/PropertiesWidget.ts | showAllTooltip": {
4680
+ "message": "Ŵh́êń ûńĉh́êćk̂éd̂, ón̂ĺŷ ṕr̂óp̂ér̂t́îéŝ ẃĥóŝé v̂ál̂úêś âŕê ńêít̂h́êŕ n̂úl̂ĺ n̂ór̂ ún̂d́êf́îńêd́ ŵíl̂ĺ b̂é ŝh́ôẃn̂"
4681
+ },
4667
4682
  "panels/elements/StylePropertyTreeElement.ts | copyAllCssDeclarationsAsJs": {
4668
4683
  "message": "Ĉóp̂ý âĺl̂ d́êćl̂ár̂át̂íôńŝ áŝ J́Ŝ"
4669
4684
  },
@@ -4958,36 +4973,6 @@
4958
4973
  "panels/event_listeners/EventListenersView.ts | toggleWhetherEventListenerIs": {
4959
4974
  "message": "T̂óĝǵl̂é ŵh́êt́ĥér̂ év̂én̂t́ l̂íŝt́êńêŕ îś p̂áŝśîv́ê ór̂ b́l̂óĉḱîńĝ"
4960
4975
  },
4961
- "panels/help/help-meta.ts | bug": {
4962
- "message": "b̂úĝ"
4963
- },
4964
- "panels/help/help-meta.ts | doNotShowWhatsNewAfterEachUpdate": {
4965
- "message": "D̂ó n̂ót̂ śĥóŵ Ẃĥát̂'ś N̂éŵ áf̂t́êŕ êáĉh́ ûṕd̂át̂é"
4966
- },
4967
- "panels/help/help-meta.ts | releaseNotes": {
4968
- "message": "R̂él̂éâśê ńôt́êś"
4969
- },
4970
- "panels/help/help-meta.ts | reportADevtoolsIssue": {
4971
- "message": "R̂ép̂ór̂t́ â D́êv́T̂óôĺŝ íŝśûé"
4972
- },
4973
- "panels/help/help-meta.ts | reportTranslationIssue": {
4974
- "message": "R̂ép̂ór̂t́ â t́r̂án̂śl̂át̂íôń îśŝúê"
4975
- },
4976
- "panels/help/help-meta.ts | showWhatsNew": {
4977
- "message": "Ŝh́ôẃ Ŵh́ât́'ŝ Ńêẃ"
4978
- },
4979
- "panels/help/help-meta.ts | showWhatsNewAfterEachUpdate": {
4980
- "message": "Ŝh́ôẃ Ŵh́ât́'ŝ Ńêẃ âf́t̂ér̂ éâćĥ úp̂d́ât́ê"
4981
- },
4982
- "panels/help/help-meta.ts | whatsNew": {
4983
- "message": "Ŵh́ât́'ŝ Ńêẃ"
4984
- },
4985
- "panels/help/ReleaseNoteView.ts | close": {
4986
- "message": "Ĉĺôśê"
4987
- },
4988
- "panels/help/ReleaseNoteView.ts | learnMore": {
4989
- "message": "L̂éâŕn̂ ḿôŕê"
4990
- },
4991
4976
  "panels/input/input-meta.ts | inputs": {
4992
4977
  "message": "Îńp̂út̂ś"
4993
4978
  },
@@ -33,7 +33,7 @@
33
33
  */
34
34
 
35
35
  import type * as ProtocolProxyApi from '../../generated/protocol-proxy-api.js';
36
- import type * as Protocol from '../../generated/protocol.js';
36
+ import * as Protocol from '../../generated/protocol.js';
37
37
 
38
38
  import type {DebuggerModel, FunctionDetails} from './DebuggerModel.js';
39
39
  import type {RuntimeModel} from './RuntimeModel.js';
@@ -62,6 +62,20 @@ export class RemoteObject {
62
62
  return remoteObject.type;
63
63
  }
64
64
 
65
+ static isNullOrUndefined(remoteObject: RemoteObject|null|undefined): boolean {
66
+ if (remoteObject === null || remoteObject === undefined) {
67
+ return true;
68
+ }
69
+ switch (remoteObject.type) {
70
+ case Protocol.Runtime.RemoteObjectType.Object:
71
+ return remoteObject.subtype === Protocol.Runtime.RemoteObjectSubtype.Null;
72
+ case Protocol.Runtime.RemoteObjectType.Undefined:
73
+ return true;
74
+ default:
75
+ return false;
76
+ }
77
+ }
78
+
65
79
  static arrayNameFromDescription(description: string): string {
66
80
  return description.replace(_descriptionLengthParenRegex, '').replace(_descriptionLengthSquareRegex, '');
67
81
  }
@@ -15,7 +15,6 @@ import '../../panels/developer_resources/developer_resources-meta.js';
15
15
  import '../inspector_main/inspector_main-meta.js';
16
16
  import '../../panels/application/application-meta.js';
17
17
  import '../../panels/issues/issues-meta.js';
18
- import '../../panels/help/help-meta.js';
19
18
  import '../../panels/layers/layers-meta.js';
20
19
  import '../../panels/lighthouse/lighthouse-meta.js';
21
20
  import '../../panels/media/media-meta.js';
@@ -2,6 +2,8 @@
2
2
  # Use of this source code is governed by a BSD-style license that can be
3
3
  # found in the LICENSE file.
4
4
 
5
+ import("../visibility.gni")
6
+
5
7
  declare_args() {
6
- devtools_entrypoints_visibility = []
8
+ devtools_entrypoints_visibility = devtools_visibility
7
9
  }
@@ -5,7 +5,6 @@ import '../shell/shell.js';
5
5
  import '../../panels/browser_debugger/browser_debugger-meta.js';
6
6
  import '../../panels/developer_resources/developer_resources-meta.js';
7
7
  import '../../panels/elements/elements-meta.js';
8
- import '../../panels/help/help-meta.js';
9
8
  import '../../panels/issues/issues-meta.js';
10
9
  import '../../panels/layer_viewer/layer_viewer-meta.js';
11
10
  import '../../panels/mobile_throttling/mobile_throttling-meta.js';
@@ -270,7 +270,12 @@ export function registerCommands(inspectorBackend) {
270
270
  AttributionSourceUntrustworthyOrigin: 'AttributionSourceUntrustworthyOrigin',
271
271
  AttributionUntrustworthyOrigin: 'AttributionUntrustworthyOrigin',
272
272
  AttributionTriggerDataTooLarge: 'AttributionTriggerDataTooLarge',
273
- AttributionEventSourceTriggerDataTooLarge: 'AttributionEventSourceTriggerDataTooLarge'
273
+ AttributionEventSourceTriggerDataTooLarge: 'AttributionEventSourceTriggerDataTooLarge',
274
+ InvalidAttributionSourceExpiry: 'InvalidAttributionSourceExpiry',
275
+ InvalidAttributionSourcePriority: 'InvalidAttributionSourcePriority',
276
+ InvalidEventSourceTriggerData: 'InvalidEventSourceTriggerData',
277
+ InvalidTriggerPriority: 'InvalidTriggerPriority',
278
+ InvalidTriggerDedupKey: 'InvalidTriggerDedupKey'
274
279
  });
275
280
  inspectorBackend.registerEnum(
276
281
  'Audits.GenericIssueErrorType', {CrossOriginPortalPostMessageError: 'CrossOriginPortalPostMessageError'});
@@ -591,6 +596,8 @@ export function registerCommands(inspectorBackend) {
591
596
  inspectorBackend.registerCommand('Cast.disable', [], []);
592
597
  inspectorBackend.registerCommand(
593
598
  'Cast.setSinkToUse', [{'name': 'sinkName', 'type': 'string', 'optional': false}], []);
599
+ inspectorBackend.registerCommand(
600
+ 'Cast.startDesktopMirroring', [{'name': 'sinkName', 'type': 'string', 'optional': false}], []);
594
601
  inspectorBackend.registerCommand(
595
602
  'Cast.startTabMirroring', [{'name': 'sinkName', 'type': 'string', 'optional': false}], []);
596
603
  inspectorBackend.registerCommand('Cast.stopCasting', [{'name': 'sinkName', 'type': 'string', 'optional': false}], []);
@@ -1086,6 +1086,10 @@ export namespace ProtocolMapping {
1086
1086
  * sink via Presentation API, Remote Playback API, or Cast SDK.
1087
1087
  */
1088
1088
  'Cast.setSinkToUse': {paramsType: [Protocol.Cast.SetSinkToUseRequest]; returnType: void;};
1089
+ /**
1090
+ * Starts mirroring the desktop to the sink.
1091
+ */
1092
+ 'Cast.startDesktopMirroring': {paramsType: [Protocol.Cast.StartDesktopMirroringRequest]; returnType: void;};
1089
1093
  /**
1090
1094
  * Starts mirroring the tab to the sink.
1091
1095
  */
@@ -751,6 +751,12 @@ declare namespace ProtocolProxyApi {
751
751
  */
752
752
  invoke_setSinkToUse(params: Protocol.Cast.SetSinkToUseRequest): Promise<Protocol.ProtocolResponseWithError>;
753
753
 
754
+ /**
755
+ * Starts mirroring the desktop to the sink.
756
+ */
757
+ invoke_startDesktopMirroring(params: Protocol.Cast.StartDesktopMirroringRequest):
758
+ Promise<Protocol.ProtocolResponseWithError>;
759
+
754
760
  /**
755
761
  * Starts mirroring the tab to the sink.
756
762
  */
@@ -967,6 +967,11 @@ declare namespace Protocol {
967
967
  AttributionUntrustworthyOrigin = 'AttributionUntrustworthyOrigin',
968
968
  AttributionTriggerDataTooLarge = 'AttributionTriggerDataTooLarge',
969
969
  AttributionEventSourceTriggerDataTooLarge = 'AttributionEventSourceTriggerDataTooLarge',
970
+ InvalidAttributionSourceExpiry = 'InvalidAttributionSourceExpiry',
971
+ InvalidAttributionSourcePriority = 'InvalidAttributionSourcePriority',
972
+ InvalidEventSourceTriggerData = 'InvalidEventSourceTriggerData',
973
+ InvalidTriggerPriority = 'InvalidTriggerPriority',
974
+ InvalidTriggerDedupKey = 'InvalidTriggerDedupKey',
970
975
  }
971
976
 
972
977
  /**
@@ -2773,6 +2778,10 @@ declare namespace Protocol {
2773
2778
  sinkName: string;
2774
2779
  }
2775
2780
 
2781
+ export interface StartDesktopMirroringRequest {
2782
+ sinkName: string;
2783
+ }
2784
+
2776
2785
  export interface StartTabMirroringRequest {
2777
2786
  sinkName: string;
2778
2787
  }
@@ -17,8 +17,13 @@ export const enum IssueCode {
17
17
  AttributionSourceUntrustworthyOrigin = 'AttributionReportingIssue::AttributionSourceUntrustworthyOrigin',
18
18
  AttributionUntrustworthyFrameOrigin = 'AttributionReportingIssue::AttributionUntrustworthyFrameOrigin',
19
19
  AttributionUntrustworthyOrigin = 'AttributionReportingIssue::AttributionUntrustworthyOrigin',
20
- AttributionTriggerDataTooLarge = 'AttrubtionReportingIssue::AttributionTriggerDataTooLarge',
21
- AttributionEventSourceTriggerDataTooLarge = 'AttrubtionReportingIssue::AttributionEventSourceTriggerDataTooLarge',
20
+ AttributionTriggerDataTooLarge = 'AttributionReportingIssue::AttributionTriggerDataTooLarge',
21
+ AttributionEventSourceTriggerDataTooLarge = 'AttributionReportingIssue::AttributionEventSourceTriggerDataTooLarge',
22
+ InvalidAttributionSourceExpiry = 'AttributionReportingIssue::InvalidAttributionSourceExpiry',
23
+ InvalidAttributionSourcePriority = 'AttributionReportingIssue::InvalidAttributionSourcePriority',
24
+ InvalidEventSourceTriggerData = 'AttributionReportingIssue::InvalidEventSourceTriggerData',
25
+ InvalidTriggerPriority = 'AttributionReportingIssue::InvalidTriggerPriority',
26
+ InvalidTriggerDedupKey = 'AttributionReportingIssue::InvalidTriggerDedupKey',
22
27
  }
23
28
 
24
29
  function getIssueCode(details: Protocol.Audits.AttributionReportingIssueDetails): IssueCode {
@@ -40,6 +45,16 @@ function getIssueCode(details: Protocol.Audits.AttributionReportingIssueDetails)
40
45
  return IssueCode.AttributionTriggerDataTooLarge;
41
46
  case Protocol.Audits.AttributionReportingIssueType.AttributionEventSourceTriggerDataTooLarge:
42
47
  return IssueCode.AttributionEventSourceTriggerDataTooLarge;
48
+ case Protocol.Audits.AttributionReportingIssueType.InvalidAttributionSourceExpiry:
49
+ return IssueCode.InvalidAttributionSourceExpiry;
50
+ case Protocol.Audits.AttributionReportingIssueType.InvalidAttributionSourcePriority:
51
+ return IssueCode.InvalidAttributionSourcePriority;
52
+ case Protocol.Audits.AttributionReportingIssueType.InvalidEventSourceTriggerData:
53
+ return IssueCode.InvalidEventSourceTriggerData;
54
+ case Protocol.Audits.AttributionReportingIssueType.InvalidTriggerPriority:
55
+ return IssueCode.InvalidTriggerPriority;
56
+ case Protocol.Audits.AttributionReportingIssueType.InvalidTriggerDedupKey:
57
+ return IssueCode.InvalidTriggerDedupKey;
43
58
  }
44
59
  }
45
60
 
@@ -108,6 +123,16 @@ export class AttributionReportingIssue extends Issue<IssueCode> {
108
123
  file: 'arAttributionEventSourceTriggerDataTooLarge.md',
109
124
  links: [],
110
125
  };
126
+ case IssueCode.InvalidAttributionSourceExpiry:
127
+ return null;
128
+ case IssueCode.InvalidAttributionSourcePriority:
129
+ return null;
130
+ case IssueCode.InvalidEventSourceTriggerData:
131
+ return null;
132
+ case IssueCode.InvalidTriggerPriority:
133
+ return null;
134
+ case IssueCode.InvalidTriggerDedupKey:
135
+ return null;
111
136
  }
112
137
  }
113
138
 
@@ -259,7 +259,6 @@ export class ConsolePrompt extends Common.ObjectWrapper.eventMixin<EventTypes, t
259
259
  } else {
260
260
  this.editor.dispatch({scrollIntoView: true});
261
261
  }
262
- this.enterProcessedForTest();
263
262
  return true;
264
263
  }
265
264
 
@@ -283,9 +282,6 @@ export class ConsolePrompt extends Common.ObjectWrapper.eventMixin<EventTypes, t
283
282
  }
284
283
  }
285
284
 
286
- private enterProcessedForTest(): void {
287
- }
288
-
289
285
  private editorUpdate(update: CodeMirror.ViewUpdate): void {
290
286
  if (update.docChanged ||
291
287
  CodeMirror.selectedCompletion(update.state) !== CodeMirror.selectedCompletion(update.startState)) {
@@ -86,13 +86,7 @@ async function getChildren(node: SDK.AccessibilityModel.AccessibilityNode):
86
86
  const localRoot = await getRootNode(frameId);
87
87
  return [localRoot];
88
88
  }
89
- if (node.hasUnloadedChildren()) {
90
- await node.accessibilityModel().requestAXChildren(node.id(), node.getFrameId() || undefined);
91
- if (node.numChildren() !== node.children().length) {
92
- throw new Error('Once loaded, number of children and length of children must match.');
93
- }
94
- }
95
- return node.children();
89
+ return node.accessibilityModel().requestAXChildren(node.id(), node.getFrameId() || undefined);
96
90
  }
97
91
 
98
92
  export async function sdkNodeToAXTreeNodes(sdkNode: SDK.AccessibilityModel.AccessibilityNode): Promise<AXTreeNode[]> {
@@ -31,25 +31,67 @@
31
31
  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
32
  */
33
33
 
34
- import propertiesWidgetStyles from './propertiesWidget.css.js';
35
- import type * as Common from '../../core/common/common.js';
34
+ import * as Common from '../../core/common/common.js';
36
35
  import * as Host from '../../core/host/host.js';
36
+ import * as i18n from '../../core/i18n/i18n.js';
37
37
  import * as SDK from '../../core/sdk/sdk.js';
38
+ import * as Protocol from '../../generated/protocol.js';
38
39
  import * as ObjectUI from '../../ui/legacy/components/object_ui/object_ui.js';
39
40
  import * as UI from '../../ui/legacy/legacy.js';
40
41
 
42
+ import propertiesWidgetStyles from './propertiesWidget.css.js';
43
+ import {StylesSidebarPane} from './StylesSidebarPane.js';
44
+
41
45
  const OBJECT_GROUP_NAME = 'properties-sidebar-pane';
42
46
 
47
+ const UIStrings = {
48
+ /**
49
+ * @description Placeholder text for a text input used to filter which DOM element properties show up in
50
+ * the Properties tab of the Elements panel.
51
+ */
52
+ filter: 'Filter',
53
+ /**
54
+ * @description ARIA accessible name for the text input used to filter which DOM element properties show up
55
+ * in the Properties tab of the Elements panel.
56
+ */
57
+ filterProperties: 'Filter Properties',
58
+ /**
59
+ * @description Text on the checkbox in the Properties tab of the Elements panel, which controls whether
60
+ * all properties of the currently selected DOM element are shown, or only meaningful properties (i.e.
61
+ * excluding properties whose values aren't set for example).
62
+ */
63
+ showAll: 'Show all',
64
+ /**
65
+ * @description Tooltip on the checkbox in the Properties tab of the Elements panel, which controls whether
66
+ * all properties of the currently selected DOM element are shown, or only meaningful properties (i.e.
67
+ * excluding properties whose values aren't set for example).
68
+ */
69
+ showAllTooltip: 'When unchecked, only properties whose values are neither null nor undefined will be shown',
70
+ /**
71
+ * @description Text shown to the user when a filter is applied in the Properties tab of the Elements panel, but
72
+ * no properties matched the filter and thus no results were returned.
73
+ */
74
+ noMatchingProperty: 'No matching property',
75
+ };
76
+ const str_ = i18n.i18n.registerUIStrings('panels/elements/PropertiesWidget.ts', UIStrings);
77
+ const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
78
+
43
79
  let propertiesWidgetInstance: PropertiesWidget;
44
80
 
45
81
  export class PropertiesWidget extends UI.ThrottledWidget.ThrottledWidget {
46
82
  private node: SDK.DOMModel.DOMNode|null;
83
+ private readonly showAllPropertiesSetting: Common.Settings.Setting<boolean>;
84
+ private filterRegex: RegExp|null = null;
85
+ private readonly noMatchesElement: HTMLElement;
47
86
  private readonly treeOutline: ObjectUI.ObjectPropertiesSection.ObjectPropertiesSectionsTreeOutline;
48
87
  private readonly expandController: ObjectUI.ObjectPropertiesSection.ObjectPropertiesSectionsTreeExpandController;
49
88
  private lastRequestedNode?: SDK.DOMModel.DOMNode;
50
89
  constructor() {
51
90
  super(true /* isWebComponent */);
52
91
 
92
+ this.showAllPropertiesSetting = Common.Settings.Settings.instance().createSetting('showAllProperties', false);
93
+ this.showAllPropertiesSetting.addChangeListener(this.filterList.bind(this));
94
+
53
95
  SDK.TargetManager.TargetManager.instance().addModelListener(
54
96
  SDK.DOMModel.DOMModel, SDK.DOMModel.Events.AttrModified, this.onNodeChange, this);
55
97
  SDK.TargetManager.TargetManager.instance().addModelListener(
@@ -61,6 +103,20 @@ export class PropertiesWidget extends UI.ThrottledWidget.ThrottledWidget {
61
103
  UI.Context.Context.instance().addFlavorChangeListener(SDK.DOMModel.DOMNode, this.setNode, this);
62
104
  this.node = UI.Context.Context.instance().flavor(SDK.DOMModel.DOMNode);
63
105
 
106
+ const hbox = this.contentElement.createChild('div', 'hbox properties-widget-toolbar');
107
+ const filterContainerElement = hbox.createChild('div', 'properties-widget-filter-box');
108
+ const filterInput = StylesSidebarPane.createPropertyFilterElement(
109
+ i18nString(UIStrings.filter), hbox, this.filterProperties.bind(this));
110
+ UI.ARIAUtils.setAccessibleName(filterInput, i18nString(UIStrings.filterProperties));
111
+ filterContainerElement.appendChild(filterInput);
112
+
113
+ const toolbar = new UI.Toolbar.Toolbar('styles-pane-toolbar', hbox);
114
+ toolbar.appendToolbarItem(new UI.Toolbar.ToolbarSettingCheckbox(
115
+ this.showAllPropertiesSetting, i18nString(UIStrings.showAllTooltip), i18nString(UIStrings.showAll)));
116
+
117
+ this.noMatchesElement = this.contentElement.createChild('div', 'gray-info-message hidden');
118
+ this.noMatchesElement.textContent = i18nString(UIStrings.noMatchingProperty);
119
+
64
120
  this.treeOutline = new ObjectUI.ObjectPropertiesSection.ObjectPropertiesSectionsTreeOutline({readOnly: true});
65
121
  this.treeOutline.setShowSelectionOnKeyboardFocus(/* show */ true, /* preventTabOrder */ false);
66
122
  this.expandController =
@@ -73,6 +129,7 @@ export class PropertiesWidget extends UI.ThrottledWidget.ThrottledWidget {
73
129
 
74
130
  this.update();
75
131
  }
132
+
76
133
  static instance(opts: {
77
134
  forceNew: boolean|null,
78
135
  }|undefined = {forceNew: null}): PropertiesWidget {
@@ -84,6 +141,46 @@ export class PropertiesWidget extends UI.ThrottledWidget.ThrottledWidget {
84
141
  return propertiesWidgetInstance;
85
142
  }
86
143
 
144
+ private filterProperties(this: PropertiesWidget, regex: RegExp|null): void {
145
+ this.filterRegex = regex;
146
+ this.filterList();
147
+ }
148
+
149
+ private filterList(): void {
150
+ const isHidden = (property: SDK.RemoteObject.RemoteObjectProperty): boolean => {
151
+ if (!this.showAllPropertiesSetting.get()) {
152
+ if (SDK.RemoteObject.RemoteObject.isNullOrUndefined(property.value)) {
153
+ return true;
154
+ }
155
+ if (property.value?.type === Protocol.Runtime.RemoteObjectType.Undefined ||
156
+ (property.value?.type === Protocol.Runtime.RemoteObjectType.Object &&
157
+ property.value.subtype === Protocol.Runtime.RemoteObjectSubtype.Null)) {
158
+ return true;
159
+ }
160
+ }
161
+ if (this.filterRegex !== null) {
162
+ if (this.filterRegex.test(property.name)) {
163
+ return false;
164
+ }
165
+ if (this.filterRegex.test(property.value?.description ?? '')) {
166
+ return false;
167
+ }
168
+ return true;
169
+ }
170
+ return false;
171
+ };
172
+ let noMatches = true;
173
+ for (const element of this.treeOutline.rootElement().children()) {
174
+ const {property} = element as ObjectUI.ObjectPropertiesSection.ObjectPropertyTreeElement;
175
+ const hidden = isHidden(property);
176
+ if (!hidden) {
177
+ noMatches = false;
178
+ }
179
+ element.hidden = hidden;
180
+ }
181
+ this.noMatchesElement.classList.toggle('hidden', !noMatches);
182
+ }
183
+
87
184
  private setNode(event: Common.EventTarget.EventTargetEvent<SDK.DOMModel.DOMNode|null>): void {
88
185
  this.node = event.data;
89
186
  this.update();
@@ -106,8 +203,15 @@ export class PropertiesWidget extends UI.ThrottledWidget.ThrottledWidget {
106
203
  return;
107
204
  }
108
205
 
109
- await ObjectUI.ObjectPropertiesSection.ObjectPropertyTreeElement.populate(
110
- this.treeOutline.rootElement(), object, true, true, undefined, undefined);
206
+ const treeElement = this.treeOutline.rootElement();
207
+ let {properties} = await SDK.RemoteObject.RemoteObject.loadFromObjectPerProto(object, true /* generatePreview */);
208
+ treeElement.removeChildren();
209
+ if (properties === null) {
210
+ properties = [];
211
+ }
212
+ ObjectUI.ObjectPropertiesSection.ObjectPropertyTreeElement.populateWithProperties(
213
+ treeElement, properties, null, true /* skipProto */, true /* skipGettersAndSetters */, object);
214
+ this.filterList();
111
215
  }
112
216
 
113
217
  private onNodeChange(event: Common.EventTarget
@@ -122,6 +226,7 @@ export class PropertiesWidget extends UI.ThrottledWidget.ThrottledWidget {
122
226
  }
123
227
  this.update();
124
228
  }
229
+
125
230
  wasShown(): void {
126
231
  super.wasShown();
127
232
  this.registerCSSFiles([propertiesWidgetStyles]);
@@ -8,3 +8,37 @@
8
8
  padding: 2px 0 2px 5px;
9
9
  flex: none;
10
10
  }
11
+
12
+ .properties-widget-toolbar {
13
+ border-bottom: 1px solid var(--color-details-hairline-light);
14
+ flex-shrink: 0;
15
+ }
16
+
17
+ .properties-widget-filter-box {
18
+ flex: auto;
19
+ display: flex;
20
+ }
21
+
22
+ .properties-widget-filter-box > input {
23
+ outline: none !important; /* stylelint-disable-line declaration-no-important */
24
+ border: none;
25
+ width: 100%;
26
+ background: var(--color-background);
27
+ padding-left: 4px;
28
+ margin: 3px;
29
+ }
30
+
31
+ .properties-widget-filter-box > input:focus,
32
+ .properties-widget-filter-box > input:not(:placeholder-shown) {
33
+ box-shadow: var(--legacy-focus-ring-active-shadow);
34
+ }
35
+
36
+ .properties-widget-filter-box > input::placeholder {
37
+ color: var(--color-text-disabled);
38
+ }
39
+
40
+ @media (forced-colors: active) {
41
+ .properties-widget-filter-box > input {
42
+ border: 1px solid ButtonText;
43
+ }
44
+ }
@@ -402,7 +402,7 @@ export class DeviceModeToolbar {
402
402
  private appendScaleMenuItems(contextMenu: UI.ContextMenu.ContextMenu): void {
403
403
  if (this.model.type() === EmulationModel.DeviceModeModel.Type.Device) {
404
404
  contextMenu.footerSection().appendItem(
405
- i18nString(UIStrings.fitToWindowF, {PH1: this.getPrettyZoomPercentage()}),
405
+ i18nString(UIStrings.fitToWindowF, {PH1: this.getPrettyFitZoomPercentage()}),
406
406
  this.onScaleMenuChanged.bind(this, this.model.fitScale()), false);
407
407
  }
408
408
  contextMenu.footerSection().appendCheckboxItem(
@@ -693,6 +693,10 @@ export class DeviceModeToolbar {
693
693
  }
694
694
  }
695
695
 
696
+ private getPrettyFitZoomPercentage(): string {
697
+ return `${(this.model.fitScale() * 100).toFixed(0)}`;
698
+ }
699
+
696
700
  private getPrettyZoomPercentage(): string {
697
701
  return `${(this.model.scale() * 100).toFixed(0)}`;
698
702
  }
package/package.json CHANGED
@@ -53,5 +53,5 @@
53
53
  "unittest": "scripts/test/run_unittests.py --no-text-coverage",
54
54
  "watch": "third_party/node/node.py --output scripts/watch_build.js"
55
55
  },
56
- "version": "1.0.948445"
56
+ "version": "1.0.948916"
57
57
  }
@@ -3,16 +3,7 @@
3
3
  // found in the LICENSE file.
4
4
  'use strict';
5
5
 
6
- function isLitHtmlTemplateCall(taggedTemplateExpression) {
7
- if (taggedTemplateExpression.name) {
8
- // Call to html`` and we assume that html = LitHtml's html function.
9
- return taggedTemplateExpression.name === 'html';
10
- }
11
-
12
- // Match calls to LitHtml.html``
13
- return taggedTemplateExpression.object && taggedTemplateExpression.object.name === 'LitHtml' &&
14
- taggedTemplateExpression.property.name === 'html';
15
- }
6
+ const {isLitHtmlTemplateCall} = require('./utils.js');
16
7
 
17
8
  module.exports = {
18
9
  meta: {
@@ -27,7 +18,7 @@ module.exports = {
27
18
  create: function(context) {
28
19
  return {
29
20
  TaggedTemplateExpression(node) {
30
- const isLitHtmlCall = isLitHtmlTemplateCall(node.tag);
21
+ const isLitHtmlCall = isLitHtmlTemplateCall(node);
31
22
  if (!isLitHtmlCall) {
32
23
  return;
33
24
  }
@@ -3,16 +3,7 @@
3
3
  // found in the LICENSE file.
4
4
  'use strict';
5
5
 
6
- function isLitHtmlTemplateCall(taggedTemplateExpression) {
7
- if (taggedTemplateExpression.name) {
8
- // Call to html`` and we assume that html = LitHtml's html function.
9
- return taggedTemplateExpression.name === 'html';
10
- }
11
-
12
- // Match calls to LitHtml.html``
13
- return taggedTemplateExpression.object && taggedTemplateExpression.object.name === 'LitHtml' &&
14
- taggedTemplateExpression.property.name === 'html';
15
- }
6
+ const {isLitHtmlTemplateCall} = require('./utils.js');
16
7
 
17
8
  module.exports = {
18
9
  meta: {
@@ -28,7 +19,7 @@ module.exports = {
28
19
  create: function(context) {
29
20
  return {
30
21
  TaggedTemplateExpression(node) {
31
- const isLitHtmlCall = isLitHtmlTemplateCall(node.tag);
22
+ const isLitHtmlCall = isLitHtmlTemplateCall(node);
32
23
  if (!isLitHtmlCall) {
33
24
  return;
34
25
  }