chrome-devtools-frontend 1.0.1029149 → 1.0.1030070

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.
@@ -280,6 +280,7 @@ grd_files_release_sources = [
280
280
  "front_end/models/issues_manager/descriptions/TwaHttpError.md",
281
281
  "front_end/models/issues_manager/descriptions/TwaPageUnavailableOffline.md",
282
282
  "front_end/models/issues_manager/descriptions/arInsecureContext.md",
283
+ "front_end/models/issues_manager/descriptions/arInvalidEligibleHeader.md",
283
284
  "front_end/models/issues_manager/descriptions/arInvalidRegisterSourceHeader.md",
284
285
  "front_end/models/issues_manager/descriptions/arInvalidRegisterTriggerHeader.md",
285
286
  "front_end/models/issues_manager/descriptions/arPermissionPolicyDisabled.md",
@@ -1451,6 +1451,9 @@
1451
1451
  "models/issues_manager/DeprecationIssue.ts | openWebDatabaseInsecureContext": {
1452
1452
  "message": "WebSQL in non-secure contexts is deprecated and will be removed in M107. Please use Web Storage or Indexed Database."
1453
1453
  },
1454
+ "models/issues_manager/DeprecationIssue.ts | persistentQuotaType": {
1455
+ "message": "StorageType.persistent is deprecated. Please use standardized navigator.storage instead."
1456
+ },
1454
1457
  "models/issues_manager/DeprecationIssue.ts | pictureSourceSrc": {
1455
1458
  "message": "<source src> with a <picture> parent is invalid and therefore ignored. Please use <source srcset> instead."
1456
1459
  },
@@ -8792,6 +8795,9 @@
8792
8795
  "panels/protocol_monitor/ProtocolMonitor.ts | sendRawCDPCommand": {
8793
8796
  "message": "Send a raw CDP command"
8794
8797
  },
8798
+ "panels/protocol_monitor/ProtocolMonitor.ts | sendRawCDPCommandExplanation": {
8799
+ "message": "Format: 'Domain.commandName' for a command without parameters, or '{\"command\":\"Domain.commandName\", \"parameters\": {...}}' as a JSON object for a command with parameters. 'cmd'/'method' and 'args'/'params'/'arguments' are also supported as alternative keys for the JSON object."
8800
+ },
8795
8801
  "panels/protocol_monitor/ProtocolMonitor.ts | session": {
8796
8802
  "message": "Session"
8797
8803
  },
@@ -1451,6 +1451,9 @@
1451
1451
  "models/issues_manager/DeprecationIssue.ts | openWebDatabaseInsecureContext": {
1452
1452
  "message": "Ŵéb̂ŚQ̂Ĺ îń n̂ón̂-śêćûŕê ćôńt̂éx̂t́ŝ íŝ d́êṕr̂éĉát̂éd̂ án̂d́ ŵíl̂ĺ b̂é r̂ém̂óv̂éd̂ ín̂ Ḿ107. P̂ĺêáŝé ûśê Ẃêb́ Ŝt́ôŕâǵê ór̂ Ín̂d́êx́êd́ D̂át̂áb̂áŝé."
1453
1453
  },
1454
+ "models/issues_manager/DeprecationIssue.ts | persistentQuotaType": {
1455
+ "message": "StorageType.persistent îś d̂ép̂ŕêćât́êd́. P̂ĺêáŝé ûśê śt̂án̂d́âŕd̂íẑéd̂ navigator.storage ín̂śt̂éâd́."
1456
+ },
1454
1457
  "models/issues_manager/DeprecationIssue.ts | pictureSourceSrc": {
1455
1458
  "message": "<source src> ŵít̂h́ â <picture> ṕâŕêńt̂ íŝ ín̂v́âĺîd́ âńd̂ t́ĥér̂éf̂ór̂é îǵn̂ór̂éd̂. Ṕl̂éâśê úŝé <source srcset> îńŝt́êád̂."
1456
1459
  },
@@ -8792,6 +8795,9 @@
8792
8795
  "panels/protocol_monitor/ProtocolMonitor.ts | sendRawCDPCommand": {
8793
8796
  "message": "Ŝén̂d́ â ŕâẃ CDP ĉóm̂ḿâńd̂"
8794
8797
  },
8798
+ "panels/protocol_monitor/ProtocolMonitor.ts | sendRawCDPCommandExplanation": {
8799
+ "message": "F̂ór̂ḿât́: 'Domain.commandName' f̂ór̂ á ĉóm̂ḿâńd̂ ẃît́ĥóût́ p̂ár̂ám̂ét̂ér̂ś, ôŕ '{\"command\":\"Domain.commandName\", \"parameters\": {...}}' âś â J́ŜÓN̂ ób̂j́êćt̂ f́ôŕ â ćôḿm̂án̂d́ ŵít̂h́ p̂ár̂ám̂ét̂ér̂ś. 'cmd'/'method' âńd̂ 'args'/'params'/'arguments' ár̂é âĺŝó ŝúp̂ṕôŕt̂éd̂ áŝ ál̂t́êŕn̂át̂ív̂é k̂éŷś f̂ór̂ t́ĥé JSON ôb́ĵéĉt́."
8800
+ },
8795
8801
  "panels/protocol_monitor/ProtocolMonitor.ts | session": {
8796
8802
  "message": "Ŝéŝśîón̂"
8797
8803
  },
@@ -63,7 +63,7 @@ inspectorBackend.registerEnum("Audits.HeavyAdReason", {NetworkTotalLimit: "Netwo
63
63
  inspectorBackend.registerEnum("Audits.ContentSecurityPolicyViolationType", {KInlineViolation: "kInlineViolation", KEvalViolation: "kEvalViolation", KURLViolation: "kURLViolation", KTrustedTypesSinkViolation: "kTrustedTypesSinkViolation", KTrustedTypesPolicyViolation: "kTrustedTypesPolicyViolation", KWasmEvalViolation: "kWasmEvalViolation"});
64
64
  inspectorBackend.registerEnum("Audits.SharedArrayBufferIssueType", {TransferIssue: "TransferIssue", CreationIssue: "CreationIssue"});
65
65
  inspectorBackend.registerEnum("Audits.TwaQualityEnforcementViolationType", {KHttpError: "kHttpError", KUnavailableOffline: "kUnavailableOffline", KDigitalAssetLinks: "kDigitalAssetLinks"});
66
- inspectorBackend.registerEnum("Audits.AttributionReportingIssueType", {PermissionPolicyDisabled: "PermissionPolicyDisabled", AttributionSourceUntrustworthyOrigin: "AttributionSourceUntrustworthyOrigin", AttributionUntrustworthyOrigin: "AttributionUntrustworthyOrigin", UntrustworthyReportingOrigin: "UntrustworthyReportingOrigin", InsecureContext: "InsecureContext", InvalidHeader: "InvalidHeader", InvalidRegisterTriggerHeader: "InvalidRegisterTriggerHeader"});
66
+ inspectorBackend.registerEnum("Audits.AttributionReportingIssueType", {PermissionPolicyDisabled: "PermissionPolicyDisabled", UntrustworthyReportingOrigin: "UntrustworthyReportingOrigin", InsecureContext: "InsecureContext", InvalidHeader: "InvalidHeader", InvalidRegisterTriggerHeader: "InvalidRegisterTriggerHeader", InvalidEligibleHeader: "InvalidEligibleHeader"});
67
67
  inspectorBackend.registerEnum("Audits.GenericIssueErrorType", {CrossOriginPortalPostMessageError: "CrossOriginPortalPostMessageError"});
68
68
  inspectorBackend.registerEnum("Audits.DeprecationIssueType", {AuthorizationCoveredByWildcard: "AuthorizationCoveredByWildcard", CanRequestURLHTTPContainingNewline: "CanRequestURLHTTPContainingNewline", ChromeLoadTimesConnectionInfo: "ChromeLoadTimesConnectionInfo", ChromeLoadTimesFirstPaintAfterLoadTime: "ChromeLoadTimesFirstPaintAfterLoadTime", ChromeLoadTimesWasAlternateProtocolAvailable: "ChromeLoadTimesWasAlternateProtocolAvailable", CookieWithTruncatingChar: "CookieWithTruncatingChar", CrossOriginAccessBasedOnDocumentDomain: "CrossOriginAccessBasedOnDocumentDomain", CrossOriginWindowAlert: "CrossOriginWindowAlert", CrossOriginWindowConfirm: "CrossOriginWindowConfirm", CSSSelectorInternalMediaControlsOverlayCastButton: "CSSSelectorInternalMediaControlsOverlayCastButton", DeprecationExample: "DeprecationExample", DocumentDomainSettingWithoutOriginAgentClusterHeader: "DocumentDomainSettingWithoutOriginAgentClusterHeader", EventPath: "EventPath", ExpectCTHeader: "ExpectCTHeader", GeolocationInsecureOrigin: "GeolocationInsecureOrigin", GeolocationInsecureOriginDeprecatedNotRemoved: "GeolocationInsecureOriginDeprecatedNotRemoved", GetUserMediaInsecureOrigin: "GetUserMediaInsecureOrigin", HostCandidateAttributeGetter: "HostCandidateAttributeGetter", IdentityInCanMakePaymentEvent: "IdentityInCanMakePaymentEvent", InsecurePrivateNetworkSubresourceRequest: "InsecurePrivateNetworkSubresourceRequest", LegacyConstraintGoogIPv6: "LegacyConstraintGoogIPv6", LocalCSSFileExtensionRejected: "LocalCSSFileExtensionRejected", MediaSourceAbortRemove: "MediaSourceAbortRemove", MediaSourceDurationTruncatingBuffered: "MediaSourceDurationTruncatingBuffered", NavigateEventRestoreScroll: "NavigateEventRestoreScroll", NavigateEventTransitionWhile: "NavigateEventTransitionWhile", NoSysexWebMIDIWithoutPermission: "NoSysexWebMIDIWithoutPermission", NotificationInsecureOrigin: "NotificationInsecureOrigin", NotificationPermissionRequestedIframe: "NotificationPermissionRequestedIframe", ObsoleteWebRtcCipherSuite: "ObsoleteWebRtcCipherSuite", OpenWebDatabaseInsecureContext: "OpenWebDatabaseInsecureContext", OverflowVisibleOnReplacedElement: "OverflowVisibleOnReplacedElement", PersistentQuotaType: "PersistentQuotaType", PictureSourceSrc: "PictureSourceSrc", PrefixedCancelAnimationFrame: "PrefixedCancelAnimationFrame", PrefixedRequestAnimationFrame: "PrefixedRequestAnimationFrame", PrefixedStorageInfo: "PrefixedStorageInfo", PrefixedVideoDisplayingFullscreen: "PrefixedVideoDisplayingFullscreen", PrefixedVideoEnterFullscreen: "PrefixedVideoEnterFullscreen", PrefixedVideoEnterFullScreen: "PrefixedVideoEnterFullScreen", PrefixedVideoExitFullscreen: "PrefixedVideoExitFullscreen", PrefixedVideoExitFullScreen: "PrefixedVideoExitFullScreen", PrefixedVideoSupportsFullscreen: "PrefixedVideoSupportsFullscreen", RangeExpand: "RangeExpand", RequestedSubresourceWithEmbeddedCredentials: "RequestedSubresourceWithEmbeddedCredentials", RTCConstraintEnableDtlsSrtpFalse: "RTCConstraintEnableDtlsSrtpFalse", RTCConstraintEnableDtlsSrtpTrue: "RTCConstraintEnableDtlsSrtpTrue", RTCPeerConnectionComplexPlanBSdpUsingDefaultSdpSemantics: "RTCPeerConnectionComplexPlanBSdpUsingDefaultSdpSemantics", RTCPeerConnectionSdpSemanticsPlanB: "RTCPeerConnectionSdpSemanticsPlanB", RtcpMuxPolicyNegotiate: "RtcpMuxPolicyNegotiate", SharedArrayBufferConstructedWithoutIsolation: "SharedArrayBufferConstructedWithoutIsolation", TextToSpeech_DisallowedByAutoplay: "TextToSpeech_DisallowedByAutoplay", V8SharedArrayBufferConstructedInExtensionWithoutIsolation: "V8SharedArrayBufferConstructedInExtensionWithoutIsolation", XHRJSONEncodingDetection: "XHRJSONEncodingDetection", XMLHttpRequestSynchronousInNonWorkerOutsideBeforeUnload: "XMLHttpRequestSynchronousInNonWorkerOutsideBeforeUnload", XRSupportsSession: "XRSupportsSession"});
69
69
  inspectorBackend.registerEnum("Audits.ClientHintIssueReason", {MetaTagAllowListInvalidOrigin: "MetaTagAllowListInvalidOrigin", MetaTagModifiedHTML: "MetaTagModifiedHTML"});
@@ -343,9 +343,9 @@ inspectorBackend.registerCommand("IndexedDB.deleteDatabase", [{"name": "security
343
343
  inspectorBackend.registerCommand("IndexedDB.deleteObjectStoreEntries", [{"name": "securityOrigin", "type": "string", "optional": true}, {"name": "storageKey", "type": "string", "optional": true}, {"name": "databaseName", "type": "string", "optional": false}, {"name": "objectStoreName", "type": "string", "optional": false}, {"name": "keyRange", "type": "object", "optional": false}], []);
344
344
  inspectorBackend.registerCommand("IndexedDB.disable", [], []);
345
345
  inspectorBackend.registerCommand("IndexedDB.enable", [], []);
346
- inspectorBackend.registerCommand("IndexedDB.requestData", [{"name": "securityOrigin", "type": "string", "optional": false}, {"name": "databaseName", "type": "string", "optional": false}, {"name": "objectStoreName", "type": "string", "optional": false}, {"name": "indexName", "type": "string", "optional": false}, {"name": "skipCount", "type": "number", "optional": false}, {"name": "pageSize", "type": "number", "optional": false}, {"name": "keyRange", "type": "object", "optional": true}], ["objectStoreDataEntries", "hasMore"]);
346
+ inspectorBackend.registerCommand("IndexedDB.requestData", [{"name": "securityOrigin", "type": "string", "optional": true}, {"name": "storageKey", "type": "string", "optional": true}, {"name": "databaseName", "type": "string", "optional": false}, {"name": "objectStoreName", "type": "string", "optional": false}, {"name": "indexName", "type": "string", "optional": false}, {"name": "skipCount", "type": "number", "optional": false}, {"name": "pageSize", "type": "number", "optional": false}, {"name": "keyRange", "type": "object", "optional": true}], ["objectStoreDataEntries", "hasMore"]);
347
347
  inspectorBackend.registerCommand("IndexedDB.getMetadata", [{"name": "securityOrigin", "type": "string", "optional": true}, {"name": "storageKey", "type": "string", "optional": true}, {"name": "databaseName", "type": "string", "optional": false}, {"name": "objectStoreName", "type": "string", "optional": false}], ["entriesCount", "keyGeneratorValue"]);
348
- inspectorBackend.registerCommand("IndexedDB.requestDatabase", [{"name": "securityOrigin", "type": "string", "optional": false}, {"name": "databaseName", "type": "string", "optional": false}], ["databaseWithObjectStores"]);
348
+ inspectorBackend.registerCommand("IndexedDB.requestDatabase", [{"name": "securityOrigin", "type": "string", "optional": true}, {"name": "storageKey", "type": "string", "optional": true}, {"name": "databaseName", "type": "string", "optional": false}], ["databaseWithObjectStores"]);
349
349
  inspectorBackend.registerCommand("IndexedDB.requestDatabaseNames", [{"name": "securityOrigin", "type": "string", "optional": false}], ["databaseNames"]);
350
350
 
351
351
  // Input.
@@ -1302,8 +1302,7 @@ export const generatedProperties = [
1302
1302
  "keywords": [
1303
1303
  "visible",
1304
1304
  "auto",
1305
- "hidden",
1306
- "hidden-matchable"
1305
+ "hidden"
1307
1306
  ],
1308
1307
  "name": "content-visibility"
1309
1308
  },
@@ -4082,8 +4081,7 @@ export const generatedPropertyValues = {
4082
4081
  "values": [
4083
4082
  "visible",
4084
4083
  "auto",
4085
- "hidden",
4086
- "hidden-matchable"
4084
+ "hidden"
4087
4085
  ]
4088
4086
  },
4089
4087
  "counter-increment": {
@@ -963,12 +963,11 @@ export namespace Audits {
963
963
 
964
964
  export const enum AttributionReportingIssueType {
965
965
  PermissionPolicyDisabled = 'PermissionPolicyDisabled',
966
- AttributionSourceUntrustworthyOrigin = 'AttributionSourceUntrustworthyOrigin',
967
- AttributionUntrustworthyOrigin = 'AttributionUntrustworthyOrigin',
968
966
  UntrustworthyReportingOrigin = 'UntrustworthyReportingOrigin',
969
967
  InsecureContext = 'InsecureContext',
970
968
  InvalidHeader = 'InvalidHeader',
971
969
  InvalidRegisterTriggerHeader = 'InvalidRegisterTriggerHeader',
970
+ InvalidEligibleHeader = 'InvalidEligibleHeader',
972
971
  }
973
972
 
974
973
  /**
@@ -977,10 +976,6 @@ export namespace Audits {
977
976
  */
978
977
  export interface AttributionReportingIssueDetails {
979
978
  violationType: AttributionReportingIssueType;
980
- /**
981
- * TODO(apaseltiner): Remove this once it is no longer referenced by the frontend.
982
- */
983
- frame?: AffectedFrame;
984
979
  request?: AffectedRequest;
985
980
  violatingNodeId?: DOM.BackendNodeId;
986
981
  invalidParameter?: string;
@@ -5919,9 +5914,14 @@ export namespace IndexedDB {
5919
5914
 
5920
5915
  export interface RequestDataRequest {
5921
5916
  /**
5917
+ * At least and at most one of securityOrigin, storageKey must be specified.
5922
5918
  * Security origin.
5923
5919
  */
5924
- securityOrigin: string;
5920
+ securityOrigin?: string;
5921
+ /**
5922
+ * Storage key.
5923
+ */
5924
+ storageKey?: string;
5925
5925
  /**
5926
5926
  * Database name.
5927
5927
  */
@@ -5994,9 +5994,14 @@ export namespace IndexedDB {
5994
5994
 
5995
5995
  export interface RequestDatabaseRequest {
5996
5996
  /**
5997
+ * At least and at most one of securityOrigin, storageKey must be specified.
5997
5998
  * Security origin.
5998
5999
  */
5999
- securityOrigin: string;
6000
+ securityOrigin?: string;
6001
+ /**
6002
+ * Storage key.
6003
+ */
6004
+ storageKey?: string;
6000
6005
  /**
6001
6006
  * Database name.
6002
6007
  */
@@ -14,6 +14,7 @@ export const enum IssueCode {
14
14
  InsecureContext = 'AttributionReportingIssue::InsecureContext',
15
15
  InvalidRegisterSourceHeader = 'AttributionReportingIssue::InvalidRegisterSourceHeader',
16
16
  InvalidRegisterTriggerHeader = 'AttributionReportingIssue::InvalidRegisterTriggerHeader',
17
+ InvalidEligibleHeader = 'AttributionReportingIssue::InvalidEligibleHeader',
17
18
  // TODO(apaseltiner): Remove this once old issue types are removed from
18
19
  // protocol.
19
20
  Unknown = 'AttributionReportingIssue::Unknown',
@@ -31,6 +32,8 @@ function getIssueCode(details: Protocol.Audits.AttributionReportingIssueDetails)
31
32
  return IssueCode.InvalidRegisterSourceHeader;
32
33
  case Protocol.Audits.AttributionReportingIssueType.InvalidRegisterTriggerHeader:
33
34
  return IssueCode.InvalidRegisterTriggerHeader;
35
+ case Protocol.Audits.AttributionReportingIssueType.InvalidEligibleHeader:
36
+ return IssueCode.InvalidEligibleHeader;
34
37
  default:
35
38
  return IssueCode.Unknown;
36
39
  }
@@ -76,6 +79,14 @@ export class AttributionReportingIssue extends Issue<IssueCode> {
76
79
  file: 'arInvalidRegisterTriggerHeader.md',
77
80
  links: [],
78
81
  };
82
+ case IssueCode.InvalidEligibleHeader:
83
+ return {
84
+ file: 'arInvalidEligibleHeader.md',
85
+ links: [{
86
+ link: 'https://tools.ietf.org/id/draft-ietf-httpbis-header-structure-15.html#rfc.section.4.2.2',
87
+ linkTitle: 'Structured Headers RFC',
88
+ }],
89
+ };
79
90
  case IssueCode.Unknown:
80
91
  return null;
81
92
  }
@@ -186,6 +186,11 @@ const UIStrings = {
186
186
  */
187
187
  openWebDatabaseInsecureContext:
188
188
  'WebSQL in non-secure contexts is deprecated and will be removed in M107. Please use Web Storage or Indexed Database.',
189
+ /**
190
+ * @description Warning displayed to developers when persistent storage type is used to notify that storage type is deprecated.
191
+ */
192
+ persistentQuotaType:
193
+ '`StorageType.persistent` is deprecated. Please use standardized `navigator.storage` instead.',
189
194
  /**
190
195
  * @description This issue indicates that a `<source>` element with a `<picture>` parent was using an `src` attribute, which is not valid and is ignored by the browser. The `srcset` attribute should be used instead.
191
196
  */
@@ -446,6 +451,11 @@ export class DeprecationIssue extends Issue {
446
451
  feature = 5175124599767040;
447
452
  milestone = 105;
448
453
  break;
454
+ case Protocol.Audits.DeprecationIssueType.PersistentQuotaType:
455
+ messageFunction = i18nLazyString(UIStrings.persistentQuotaType);
456
+ feature = 5176235376246784;
457
+ milestone = 106;
458
+ break;
449
459
  case Protocol.Audits.DeprecationIssueType.PictureSourceSrc:
450
460
  messageFunction = i18nLazyString(UIStrings.pictureSourceSrc);
451
461
  break;
@@ -0,0 +1,19 @@
1
+ # Ensure that the `Attribution-Reporting-Eligible` header is valid
2
+
3
+ This page sent a request containing an `Attribution-Reporting-Eligible` header,
4
+ but the header value was not a valid structured dictionary, causing any source
5
+ or trigger registration in the response to be ignored.
6
+
7
+ The header should contain a structured dictionary as follows:
8
+
9
+ To allow the response to register an event source:
10
+ `Attribution-Reporting-Eligible: event-source`
11
+
12
+ To allow the response to register a trigger:
13
+ `Attribution-Reporting-Eligible: trigger`
14
+
15
+ To allow the response to register an event source or a trigger:
16
+ `Attribution-Reporting-Eligible: event-source, trigger`
17
+
18
+ To prevent the response from registering anything:
19
+ `Attribution-Reporting-Eligible: `
@@ -26,6 +26,8 @@ import {cssRuleValidatorsMap, type AuthoringHint} from './CSSRuleValidator.js';
26
26
  const FlexboxEditor = ElementsComponents.StylePropertyEditor.FlexboxEditor;
27
27
  const GridEditor = ElementsComponents.StylePropertyEditor.GridEditor;
28
28
 
29
+ export const activeHints = new WeakMap<Element, AuthoringHint>();
30
+
29
31
  const UIStrings = {
30
32
  /**
31
33
  *@description Text in Color Swatch Popover Icon of the Elements panel
@@ -719,11 +721,7 @@ export class StylePropertyTreeElement extends UI.TreeOutline.TreeElement {
719
721
  const showAuthoringHint = authoringHint !== null && this.property.parsedOk;
720
722
  if (showAuthoringHint) {
721
723
  const hintIcon = UI.Icon.Icon.create('mediumicon-info', 'hint');
722
- const hintPopover =
723
- new UI.PopoverHelper.PopoverHelper(hintIcon, event => this.handleHintPopoverRequest(authoringHint, event));
724
- hintPopover.setHasPadding(true);
725
- hintPopover.setTimeout(0, 100);
726
-
724
+ activeHints.set(hintIcon, authoringHint);
727
725
  this.listItemElement.append(hintIcon);
728
726
  }
729
727
 
@@ -836,24 +834,6 @@ export class StylePropertyTreeElement extends UI.TreeOutline.TreeElement {
836
834
  return null;
837
835
  }
838
836
 
839
- private handleHintPopoverRequest(authoringHint: AuthoringHint, event: Event): UI.PopoverHelper.PopoverRequest|null {
840
- const link = event.composedPath()[0];
841
- Platform.DCHECK(() => link instanceof Element, 'Link is not an instance of Element');
842
-
843
- return {
844
- box: (link as Element).boxInWindow(),
845
- show: async(popover: UI.GlassPane.GlassPane): Promise<boolean> => {
846
- const node = this.node();
847
- if (!node) {
848
- return false;
849
- }
850
- const popupElement = new ElementsComponents.CSSHintDetailsView.CSSHintDetailsView(authoringHint);
851
- popover.contentElement.insertAdjacentElement('beforeend', popupElement);
852
- return true;
853
- },
854
- };
855
- }
856
-
857
837
  private mouseUp(event: MouseEvent): void {
858
838
  const activeTreeElement = parentMap.get(this.parentPaneInternal);
859
839
  parentMap.delete(this.parentPaneInternal);
@@ -60,7 +60,7 @@ import {StyleEditorWidget} from './StyleEditorWidget.js';
60
60
  import {StylePropertyHighlighter} from './StylePropertyHighlighter.js';
61
61
  import stylesSidebarPaneStyles from './stylesSidebarPane.css.js';
62
62
 
63
- import {type StylePropertyTreeElement} from './StylePropertyTreeElement.js';
63
+ import {activeHints, type StylePropertyTreeElement} from './StylePropertyTreeElement.js';
64
64
  import {
65
65
  StylePropertiesSection,
66
66
  BlankStylePropertiesSection,
@@ -213,6 +213,7 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
213
213
  private needsForceUpdate: boolean;
214
214
  private readonly resizeThrottler: Common.Throttler.Throttler;
215
215
  private readonly imagePreviewPopover: ImagePreviewPopover;
216
+ #hintPopoverHelper: UI.PopoverHelper.PopoverHelper;
216
217
  activeCSSAngle: InlineEditor.CSSAngle.CSSAngle|null;
217
218
  #urlToChangeTracker: Map<Platform.DevToolsPath.UrlString, ChangeTracker> = new Map();
218
219
  #copyChangesButton?: UI.Toolbar.ToolbarButton;
@@ -282,6 +283,35 @@ export class StylesSidebarPane extends Common.ObjectWrapper.eventMixin<EventType
282
283
  }, () => this.node());
283
284
 
284
285
  this.activeCSSAngle = null;
286
+
287
+ this.#hintPopoverHelper = new UI.PopoverHelper.PopoverHelper(this.contentElement, event => {
288
+ const icon = event.composedPath()[0] as Element;
289
+
290
+ if (!icon) {
291
+ return null;
292
+ }
293
+
294
+ if (!icon.matches('.hint')) {
295
+ return null;
296
+ }
297
+
298
+ const hint = activeHints.get(icon);
299
+
300
+ if (!hint) {
301
+ return null;
302
+ }
303
+
304
+ return {
305
+ box: icon.boxInWindow(),
306
+ show: async(popover: UI.GlassPane.GlassPane): Promise<boolean> => {
307
+ const popupElement = new ElementsComponents.CSSHintDetailsView.CSSHintDetailsView(hint);
308
+ popover.contentElement.appendChild(popupElement);
309
+ return true;
310
+ },
311
+ };
312
+ });
313
+ this.#hintPopoverHelper.setTimeout(200);
314
+ this.#hintPopoverHelper.setHasPadding(true);
285
315
  }
286
316
 
287
317
  swatchPopoverHelper(): InlineEditor.SwatchPopoverHelper.SwatchPopoverHelper {
@@ -57,6 +57,7 @@ export class AttributionReportingIssueDetailsView extends AffectedResourcesView
57
57
  switch (issueCode) {
58
58
  case IssuesManager.AttributionReportingIssue.IssueCode.InvalidRegisterSourceHeader:
59
59
  case IssuesManager.AttributionReportingIssue.IssueCode.InvalidRegisterTriggerHeader:
60
+ case IssuesManager.AttributionReportingIssue.IssueCode.InvalidEligibleHeader:
60
61
  this.appendColumnTitle(header, i18nString(UIStrings.request));
61
62
  this.appendColumnTitle(header, i18nString(UIStrings.invalidHeaderValue));
62
63
  break;
@@ -92,6 +93,7 @@ export class AttributionReportingIssueDetailsView extends AffectedResourcesView
92
93
  switch (issueCode) {
93
94
  case IssuesManager.AttributionReportingIssue.IssueCode.InvalidRegisterSourceHeader:
94
95
  case IssuesManager.AttributionReportingIssue.IssueCode.InvalidRegisterTriggerHeader:
96
+ case IssuesManager.AttributionReportingIssue.IssueCode.InvalidEligibleHeader:
95
97
  this.#appendRequestOrEmptyCell(element, details.request);
96
98
  this.appendIssueDetailCell(element, details.invalidParameter || '');
97
99
  break;
@@ -6,7 +6,6 @@ import * as Common from '../../../core/common/common.js';
6
6
  import * as Host from '../../../core/host/host.js';
7
7
  import * as i18n from '../../../core/i18n/i18n.js';
8
8
  import * as Platform from '../../../core/platform/platform.js';
9
- import {assertNotNullOrUndefined} from '../../../core/platform/platform.js';
10
9
  import * as SDK from '../../../core/sdk/sdk.js';
11
10
  import * as Protocol from '../../../generated/protocol.js';
12
11
  import * as IssuesManager from '../../../models/issues_manager/issues_manager.js';
@@ -174,12 +173,16 @@ export class RequestHeadersView extends UI.Widget.VBox {
174
173
  wasShown(): void {
175
174
  this.#request.addEventListener(SDK.NetworkRequest.Events.RemoteAddressChanged, this.#refreshHeadersView, this);
176
175
  this.#request.addEventListener(SDK.NetworkRequest.Events.FinishedLoading, this.#refreshHeadersView, this);
176
+ this.#request.addEventListener(SDK.NetworkRequest.Events.RequestHeadersChanged, this.#refreshHeadersView, this);
177
+ this.#request.addEventListener(SDK.NetworkRequest.Events.ResponseHeadersChanged, this.#refreshHeadersView, this);
177
178
  this.#refreshHeadersView();
178
179
  }
179
180
 
180
181
  willHide(): void {
181
182
  this.#request.removeEventListener(SDK.NetworkRequest.Events.RemoteAddressChanged, this.#refreshHeadersView, this);
182
183
  this.#request.removeEventListener(SDK.NetworkRequest.Events.FinishedLoading, this.#refreshHeadersView, this);
184
+ this.#request.removeEventListener(SDK.NetworkRequest.Events.RequestHeadersChanged, this.#refreshHeadersView, this);
185
+ this.#request.removeEventListener(SDK.NetworkRequest.Events.ResponseHeadersChanged, this.#refreshHeadersView, this);
183
186
  }
184
187
 
185
188
  #refreshHeadersView(): void {
@@ -212,7 +215,9 @@ export class RequestHeadersComponent extends HTMLElement {
212
215
  }
213
216
 
214
217
  #render(): void {
215
- assertNotNullOrUndefined(this.#request);
218
+ if (!this.#request) {
219
+ return;
220
+ }
216
221
 
217
222
  // Disabled until https://crbug.com/1079231 is fixed.
218
223
  // clang-format off
@@ -224,8 +229,10 @@ export class RequestHeadersComponent extends HTMLElement {
224
229
  // clang-format on
225
230
  }
226
231
 
227
- #renderResponseHeaders(): LitHtml.TemplateResult {
228
- assertNotNullOrUndefined(this.#request);
232
+ #renderResponseHeaders(): LitHtml.LitTemplate {
233
+ if (!this.#request) {
234
+ return LitHtml.nothing;
235
+ }
229
236
 
230
237
  const headersWithIssues = [];
231
238
  if (this.#request.wasBlocked()) {
@@ -299,8 +306,10 @@ export class RequestHeadersComponent extends HTMLElement {
299
306
  // clang-format on
300
307
  }
301
308
 
302
- #renderRequestHeaders(): LitHtml.TemplateResult {
303
- assertNotNullOrUndefined(this.#request);
309
+ #renderRequestHeaders(): LitHtml.LitTemplate {
310
+ if (!this.#request) {
311
+ return LitHtml.nothing;
312
+ }
304
313
 
305
314
  const headers = this.#request.requestHeaders().slice();
306
315
  headers.sort(function(a, b) {
@@ -337,8 +346,7 @@ export class RequestHeadersComponent extends HTMLElement {
337
346
  }
338
347
 
339
348
  #maybeRenderProvisionalHeadersWarning(): LitHtml.LitTemplate {
340
- assertNotNullOrUndefined(this.#request);
341
- if (this.#request.requestHeadersText() !== undefined) {
349
+ if (!this.#request || this.#request.requestHeadersText() !== undefined) {
342
350
  return LitHtml.nothing;
343
351
  }
344
352
 
@@ -381,7 +389,10 @@ export class RequestHeadersComponent extends HTMLElement {
381
389
  LitHtml.nothing
382
390
  }${header.name}:
383
391
  </div>
384
- <div class="header-value ${header.headerValueIncorrect ? 'header-warning' : ''}">
392
+ <div
393
+ class="header-value ${header.headerValueIncorrect ? 'header-warning' : ''}"
394
+ @copy=${():void => Host.userMetrics.actionTaken(Host.UserMetrics.Action.NetworkPanelCopyValue)}
395
+ >
385
396
  ${header.value?.toString() || ''}
386
397
  ${this.#maybeRenderHeaderValueSuffix(header)}
387
398
  </div>
@@ -535,8 +546,10 @@ export class RequestHeadersComponent extends HTMLElement {
535
546
  `;
536
547
  }
537
548
 
538
- #renderGeneralSection(): LitHtml.TemplateResult {
539
- assertNotNullOrUndefined(this.#request);
549
+ #renderGeneralSection(): LitHtml.LitTemplate {
550
+ if (!this.#request) {
551
+ return LitHtml.nothing;
552
+ }
540
553
 
541
554
  let coloredCircleClassName = 'red-circle';
542
555
  if (this.#request.statusCode < 300 || this.#request.statusCode === 304) {
@@ -576,28 +589,43 @@ export class RequestHeadersComponent extends HTMLElement {
576
589
  >
577
590
  <div class="row">
578
591
  <div class="header-name">${i18nString(UIStrings.requestUrl)}:</div>
579
- <div class="header-value">${this.#request.url()}</div>
592
+ <div
593
+ class="header-value"
594
+ @copy=${():void => Host.userMetrics.actionTaken(Host.UserMetrics.Action.NetworkPanelCopyValue)}
595
+ >${this.#request.url()}</div>
580
596
  </div>
581
597
  ${this.#request.statusCode? html`
582
598
  <div class="row">
583
599
  <div class="header-name">${i18nString(UIStrings.requestMethod)}:</div>
584
- <div class="header-value">${this.#request.requestMethod}</div>
600
+ <div
601
+ class="header-value"
602
+ @copy=${():void => Host.userMetrics.actionTaken(Host.UserMetrics.Action.NetworkPanelCopyValue)}
603
+ >${this.#request.requestMethod}</div>
585
604
  </div>
586
605
  <div class="row">
587
606
  <div class="header-name">${i18nString(UIStrings.statusCode)}:</div>
588
- <div class="header-value ${coloredCircleClassName} ${statusTextHasComment ? 'status-with-comment' : ''}">${statusText}</div>
607
+ <div
608
+ class="header-value ${coloredCircleClassName} ${statusTextHasComment ? 'status-with-comment' : ''}"
609
+ @copy=${():void => Host.userMetrics.actionTaken(Host.UserMetrics.Action.NetworkPanelCopyValue)}
610
+ >${statusText}</div>
589
611
  </div>
590
612
  ` : ''}
591
613
  ${this.#request.remoteAddress()? html`
592
614
  <div class="row">
593
615
  <div class="header-name">${i18nString(UIStrings.remoteAddress)}:</div>
594
- <div class="header-value">${this.#request.remoteAddress()}</div>
616
+ <div
617
+ class="header-value"
618
+ @copy=${():void => Host.userMetrics.actionTaken(Host.UserMetrics.Action.NetworkPanelCopyValue)}
619
+ >${this.#request.remoteAddress()}</div>
595
620
  </div>
596
621
  ` : ''}
597
622
  ${this.#request.referrerPolicy()? html`
598
623
  <div class="row">
599
624
  <div class="header-name">${i18nString(UIStrings.referrerPolicy)}:</div>
600
- <div class="header-value">${this.#request.referrerPolicy()}</div>
625
+ <div
626
+ class="header-value"
627
+ @copy=${():void => Host.userMetrics.actionTaken(Host.UserMetrics.Action.NetworkPanelCopyValue)}
628
+ >${this.#request.referrerPolicy()}</div>
601
629
  </div>
602
630
  ` : ''}
603
631
  </${Category.litTagName}>
@@ -82,6 +82,11 @@ const UIStrings = {
82
82
  *@description A placeholder for an input in Protocol Monitor. The input accepts commands that are sent to the backend on Enter. CDP stands for Chrome DevTools Protocol.
83
83
  */
84
84
  sendRawCDPCommand: 'Send a raw `CDP` command',
85
+ /**
86
+ * @description A tooltip text for the input in the Protocol Monitor panel. The tooltip describes what format is expected.
87
+ */
88
+ sendRawCDPCommandExplanation:
89
+ 'Format: `\'Domain.commandName\'` for a command without parameters, or `\'{"command":"Domain.commandName", "parameters": {...}}\'` as a JSON object for a command with parameters. `\'cmd\'`/`\'method\'` and `\'args\'`/`\'params\'`/`\'arguments\'` are also supported as alternative keys for the `JSON` object.',
85
90
  };
86
91
  const str_ = i18n.i18n.registerUIStrings('panels/protocol_monitor/ProtocolMonitor.ts', UIStrings);
87
92
  const i18nString = i18n.i18n.getLocalizedString.bind(undefined, str_);
@@ -120,6 +125,8 @@ export class ProtocolMonitorImpl extends UI.Widget.VBox {
120
125
  private messages: LogMessage[] = [];
121
126
  private isRecording: boolean = false;
122
127
 
128
+ #historyAutocompleteDataProvider = new HistoryAutocompleteDataProvider();
129
+
123
130
  constructor() {
124
131
  super(true);
125
132
  this.started = false;
@@ -287,31 +294,35 @@ export class ProtocolMonitorImpl extends UI.Widget.VBox {
287
294
  });
288
295
  topToolbar.appendToolbarItem(this.textFilterUI);
289
296
 
290
- const onSend = (): void => {
291
- const value = input.value();
292
- // If input cannot be parsed as json, we assume it's the command name
293
- // for a command without parameters. Otherwise, we expect an object
294
- // with "command" and "parameters" attributes.
295
- let json = null;
296
- try {
297
- json = JSON.parse(value);
298
- } catch (err) {
299
- }
300
- const command = json ? json.command : value;
301
- const parameters = json ? json.parameters : null;
302
- const test = ProtocolClient.InspectorBackend.test;
303
- // TODO: TS thinks that properties are read-only because
304
- // in TS test is defined as a namespace.
305
- // @ts-ignore
306
- test.sendRawMessage(command, parameters, () => {});
307
- };
308
- const input = new UI.Toolbar.ToolbarInput(i18nString(UIStrings.sendRawCDPCommand), '', 1, .2, '', undefined, false);
309
- input.addEventListener(UI.Toolbar.ToolbarInput.Event.EnterPressed, onSend);
310
297
  const bottomToolbar = new UI.Toolbar.Toolbar('protocol-monitor-bottom-toolbar', this.contentElement);
311
- bottomToolbar.appendToolbarItem(input);
298
+ bottomToolbar.appendToolbarItem(this.#createCommandInput());
312
299
  }
313
300
 
314
- static instance(opts = {forceNew: null}): ProtocolMonitorImpl {
301
+ #createCommandInput(): UI.Toolbar.ToolbarInput {
302
+ const placeholder = i18nString(UIStrings.sendRawCDPCommand);
303
+ const accessiblePlaceholder = placeholder;
304
+ const growFactor = 1;
305
+ const shrinkFactor = 0.2;
306
+ const tooltip = i18nString(UIStrings.sendRawCDPCommandExplanation);
307
+ const input = new UI.Toolbar.ToolbarInput(
308
+ placeholder, accessiblePlaceholder, growFactor, shrinkFactor, tooltip,
309
+ this.#historyAutocompleteDataProvider.buildTextPromptCompletions, false);
310
+ input.addEventListener(UI.Toolbar.ToolbarInput.Event.EnterPressed, () => this.#onCommandSend(input));
311
+ return input;
312
+ }
313
+
314
+ #onCommandSend(input: UI.Toolbar.ToolbarInput): void {
315
+ const value = input.value();
316
+ const {command, parameters} = parseCommandInput(value);
317
+ const test = ProtocolClient.InspectorBackend.test;
318
+ // TODO: TS thinks that properties are read-only because
319
+ // in TS test is defined as a namespace.
320
+ // @ts-ignore
321
+ test.sendRawMessage(command, parameters, () => {});
322
+ this.#historyAutocompleteDataProvider.addEntry(value);
323
+ }
324
+
325
+ static instance(opts: {forceNew: null|boolean} = {forceNew: null}): ProtocolMonitorImpl {
315
326
  const {forceNew} = opts;
316
327
  if (!protocolMonitorImplInstance || forceNew) {
317
328
  protocolMonitorImplInstance = new ProtocolMonitorImpl();
@@ -481,6 +492,39 @@ export class ProtocolMonitorImpl extends UI.Widget.VBox {
481
492
  }
482
493
  }
483
494
 
495
+ export class HistoryAutocompleteDataProvider {
496
+ #maxHistorySize = 200;
497
+ #commandHistory = new Set<string>();
498
+
499
+ constructor(maxHistorySize?: number) {
500
+ if (maxHistorySize !== undefined) {
501
+ this.#maxHistorySize = maxHistorySize;
502
+ }
503
+ }
504
+
505
+ buildTextPromptCompletions =
506
+ async(expression: string, prefix: string, force?: boolean): Promise<UI.SuggestBox.Suggestions> => {
507
+ if (!prefix && !force && expression) {
508
+ return [];
509
+ }
510
+ const newestToOldest = [...this.#commandHistory].reverse();
511
+ return newestToOldest.filter(cmd => cmd.startsWith(prefix)).map(text => ({
512
+ text,
513
+ }));
514
+ };
515
+
516
+ addEntry(value: string): void {
517
+ if (this.#commandHistory.has(value)) {
518
+ this.#commandHistory.delete(value);
519
+ }
520
+ this.#commandHistory.add(value);
521
+ if (this.#commandHistory.size > this.#maxHistorySize) {
522
+ const earliestEntry = this.#commandHistory.values().next().value;
523
+ this.#commandHistory.delete(earliestEntry);
524
+ }
525
+ }
526
+ }
527
+
484
528
  export class InfoWidget extends UI.Widget.VBox {
485
529
  private readonly tabbedPane: UI.TabbedPane.TabbedPane;
486
530
  constructor() {
@@ -518,3 +562,17 @@ export class InfoWidget extends UI.Widget.VBox {
518
562
  this.tabbedPane.changeTabView('response', SourceFrame.JSONView.JSONView.createViewSync(responseParsed));
519
563
  }
520
564
  }
565
+
566
+ export function parseCommandInput(input: string): {command: string, parameters: unknown} {
567
+ // If input cannot be parsed as json, we assume it's the command name
568
+ // for a command without parameters. Otherwise, we expect an object
569
+ // with "command"/"method"/"cmd" and "parameters"/"params"/"args"/"arguments" attributes.
570
+ let json = null;
571
+ try {
572
+ json = JSON.parse(input);
573
+ } catch (err) {
574
+ }
575
+ const command = json ? json.command || json.method || json.cmd : input;
576
+ const parameters = json ? json.parameters || json.params || json.args || json.arguments : null;
577
+ return {command, parameters};
578
+ }
@@ -532,6 +532,7 @@ export class SplitWidget extends Common.ObjectWrapper.eventMixin<EventTypes, typ
532
532
  // This order of things is important.
533
533
  // 1. Resize main element early and force layout.
534
534
  this.contentElement.style.setProperty(animatedMarginPropertyName, marginFrom);
535
+ this.contentElement.style.setProperty('overflow', 'hidden');
535
536
  if (!reverse) {
536
537
  suppressUnused(this.mainElement.offsetWidth);
537
538
  suppressUnused(this.sidebarElementInternal.offsetWidth);
@@ -579,6 +580,7 @@ export class SplitWidget extends Common.ObjectWrapper.eventMixin<EventTypes, typ
579
580
  this.contentElement.style.removeProperty('margin-bottom');
580
581
  this.contentElement.style.removeProperty('margin-left');
581
582
  this.contentElement.style.removeProperty('transition');
583
+ this.contentElement.style.removeProperty('overflow');
582
584
 
583
585
  if (this.animationFrameHandle) {
584
586
  this.contentElement.window().cancelAnimationFrame(this.animationFrameHandle);
@@ -89,7 +89,7 @@ export class TextPrompt extends Common.ObjectWrapper.ObjectWrapper<EventTypes> i
89
89
  }
90
90
 
91
91
  initialize(
92
- completions: (this: null, arg1: string, arg2: string, arg3?: boolean|undefined) => Promise<Suggestion[]>,
92
+ completions: (this: null, expression: string, filter: string, force?: boolean|undefined) => Promise<Suggestion[]>,
93
93
  stopCharacters?: string, usesSuggestionBuilder?: boolean): void {
94
94
  this.loadCompletions = completions;
95
95
  this.completionStopCharacters = stopCharacters || ' =:[({;,!+-*/&|^<>.';
package/package.json CHANGED
@@ -55,5 +55,5 @@
55
55
  "unittest": "scripts/test/run_unittests.py --no-text-coverage",
56
56
  "watch": "vpython third_party/node/node.py --output scripts/watch_build.js"
57
57
  },
58
- "version": "1.0.1029149"
58
+ "version": "1.0.1030070"
59
59
  }