| 2021-06-11 Patrick Angle <pangle@apple.com> |
| |
| Web Inspector: Add instrumentation to node destruction for InspectorDOMAgent |
| https://bugs.webkit.org/show_bug.cgi?id=226624 |
| |
| Reviewed by Devin Rousso. |
| |
| Listen for the new `DOM.willDestroyDOMNode` event in order to cleanup and remaining references to that Node. |
| This work serves as a prelude to <https://webkit.org/b/189687> (Web Inspector: preserve DOM.NodeId if a node is |
| removed and re-added) to eventually only forget about nodes upon destruction, instead of removal from the DOM |
| tree. |
| |
| * UserInterface/Controllers/DOMManager.js: |
| (WI.DOMManager.prototype.willDestroyDOMNode): |
| * UserInterface/Protocol/DOMObserver.js: |
| (WI.DOMObserver.prototype.willDestroyDOMNode): |
| * UserInterface/Views/DOMTreeUpdater.js: |
| (WI.DOMTreeUpdater.prototype._nodeRemoved): |
| |
| 2021-06-08 Razvan Caliman <rcaliman@apple.com> |
| |
| Web Inspector: Styles panel slow to render when inspecting node with many inherited CSS variables |
| https://bugs.webkit.org/show_bug.cgi?id=225972 |
| <rdar://problem/78211185> |
| |
| Reviewed by Devin Rousso. |
| |
| Do not show unused inherited CSS variables in the Styles details sidebar. |
| |
| When aggregating styles for the selected node in `WI.DOMNodeStyles`, collect a list of names of CSS variables used in CSS property values. |
| In the Styles details sidebar, skip rendering declarations of inherited CSS variables that are not found in this list. |
| |
| Always show inherited variables that are used, either directly inherited or via reference (variables using other variables in their value). |
| Always show inherited variables used as values of inheritable properties like color, font-size, etc. |
| |
| When a CSS rule contains hidden inherited variables, offer a button to request disclosing them for that rule. |
| Option-click to show unused inherited variables in all matching rules. |
| |
| Clicking the "Go to variable" button automatically renders all the unused variables in the CSS rule where the target variable is declared. |
| |
| * Localizations/en.lproj/localizedStrings.js: |
| * UserInterface/Models/CSSProperty.js: |
| (WI.CSSProperty.findVariableNames): |
| * UserInterface/Models/DOMNodeStyles.js: |
| (WI.DOMNodeStyles): |
| (WI.DOMNodeStyles.prototype.get usedCSSVariables): |
| (WI.DOMNodeStyles.prototype._updateStyleCascade): |
| (WI.DOMNodeStyles.prototype._collectUsedCSSVariables): |
| * UserInterface/Views/SpreadsheetCSSStyleDeclarationEditor.css: |
| (.spreadsheet-style-declaration-editor .property): |
| (.spreadsheet-style-declaration-editor > .hidden-variables-button): |
| * UserInterface/Views/SpreadsheetCSSStyleDeclarationEditor.js: |
| (WI.SpreadsheetCSSStyleDeclarationEditor): |
| (WI.SpreadsheetCSSStyleDeclarationEditor.prototype.layout): |
| (WI.SpreadsheetCSSStyleDeclarationEditor.prototype.get propertiesToRender): |
| (WI.SpreadsheetCSSStyleDeclarationEditor.prototype.highlightProperty): |
| * UserInterface/Views/SpreadsheetCSSStyleDeclarationSection.js: |
| (WI.SpreadsheetCSSStyleDeclarationSection.prototype.set propertyVisibilityMode): |
| (WI.SpreadsheetCSSStyleDeclarationSection.prototype.spreadsheetCSSStyleDeclarationEditorSetAllPropertyVisibilityMode): |
| * UserInterface/Views/SpreadsheetRulesStyleDetailsPanel.js: |
| (WI.SpreadsheetRulesStyleDetailsPanel.prototype.spreadsheetCSSStyleDeclarationSectionSetAllPropertyVisibilityMode): |
| |
| 2021-06-04 Devin Rousso <drousso@apple.com> |
| |
| Web Inspector: cannot see experimental settings when inspecting `ServiceWorker` |
| https://bugs.webkit.org/show_bug.cgi?id=226666 |
| |
| Reviewed by Joseph Pecoraro. |
| |
| * UserInterface/Views/SettingsTabContentView.js: |
| (WI.SettingsTabContentView.prototype._createExperimentalSettingsView): |
| There are experimental settings that have nothing to do with preview features or CSS. Don't |
| limit the Experimental pane to only if those things exist. |
| |
| 2021-06-04 Devin Rousso <drousso@apple.com> |
| |
| Web Inspector: Uncaught Exception: undefined is not an object (evaluating 'InspectorBackend.Enum.Page.ResourceType') |
| https://bugs.webkit.org/show_bug.cgi?id=226664 |
| |
| Reviewed by Joseph Pecoraro. |
| |
| * UserInterface/Protocol/InspectorBackend.js: |
| (InspectorBackendClass.prototype.get Enum): |
| Use the list of all registered domains, not just the active domains, as only commands/events |
| are able to be filtered by target type. |
| |
| 2021-05-15 Said Abou-Hallawa <said@apple.com> |
| |
| Implement CanvasRenderingContext2D.createConicGradient |
| https://bugs.webkit.org/show_bug.cgi?id=225539 |
| |
| Reviewed by Sam Weinig. |
| |
| * UserInterface/Models/NativeFunctionParameters.js: |
| * UserInterface/Models/Recording.js: |
| (WI.Recording.prototype.async swizzle): |
| * UserInterface/Views/RecordingActionTreeElement.js: |
| (WI.RecordingActionTreeElement._classNameForAction): |
| |
| 2021-05-10 Devin Rousso <drousso@apple.com> |
| |
| Web Inspector: Network: rename "XHR" to "XHR/Fetch" |
| https://bugs.webkit.org/show_bug.cgi?id=224900 |
| |
| Reviewed by Timothy Hatcher. |
| |
| * UserInterface/Views/NetworkTableContentView.js: |
| (WI.NetworkTableContentView): |
| (WI.NetworkTableContentView.addScopeBarItem): Added. |
| (WI.NetworkTableContentView.displayNameForResource): |
| (WI.NetworkTableContentView.shortDisplayNameForResourceType): Deleted. |
| |
| * Localizations/en.lproj/localizedStrings.js: |
| |
| 2021-05-10 Nikita Vasilyev <nvasilyev@apple.com> |
| |
| Web Inspector: Layout panel "Grid Overlays" main checkbox has dead space (no interaction) between checkbox and label text |
| https://bugs.webkit.org/show_bug.cgi?id=225433 |
| <rdar://problem/77590883> |
| |
| Reviewed by Devin Rousso. |
| |
| Make the empty space between the checkbox and the label text clickable in: |
| - Everywhere in Settings tab |
| - Layout panel, Page Overlay Options |
| - Grid Overlay header |
| |
| * UserInterface/Main.html: |
| * UserInterface/Views/CSSGridSection.css: |
| (.css-grid-section .node-display-name): |
| (.css-grid-section .toggle-all): |
| (.css-grid-section :is(.setting-editor, .node-overlay-list-item-container, .heading) input[type="checkbox"]): |
| (.css-grid-section .setting-editor > input[type="checkbox"]): |
| (.css-grid-section .node-display-name,): Deleted. |
| Make all checkbox labels in the Grid section align vertically. |
| |
| * UserInterface/Views/CSSGridSection.js: |
| (WI.CSSGridSection.prototype.initialLayout): |
| * UserInterface/Views/SettingEditor.css: Copied from Source/WebInspectorUI/UserInterface/Views/CSSGridSection.css. |
| (.setting-editor input): |
| (.setting-editor > input[type="checkbox"]): |
| (.setting-editor > label): |
| |
| * UserInterface/Views/SettingEditor.js: |
| (WI.SettingEditor): |
| * UserInterface/Views/SettingsTabContentView.css: |
| (.content-view.tab.settings > .settings-view > .container > .editor-group > .setting-editor): |
| (.content-view.tab.settings > .settings-view > .container > .editor-group > .setting-editor:first-child > *): |
| (.content-view.tab.settings > .settings-view > .container > .editor-group > .setting-editor input[type="checkbox"]): |
| (.content-view.tab.settings > .settings-view > .container > .editor-group > .setting-editor select): |
| (.content-view.tab.settings > .settings-view > .container > .editor-group > .setting-editor input[type="number"]): |
| (.content-view.tab.settings > .settings-view > .container > .editor-group > .setting-editor input[type="text"]): |
| (.content-view.tab.settings > .settings-view > .container > .editor-group > .editor): Deleted. |
| (.content-view.tab.settings > .settings-view > .container > .editor-group > .editor:first-child > *): Deleted. |
| (.content-view.tab.settings > .settings-view > .container > .editor-group > .editor input): Deleted. |
| (.content-view.tab.settings > .settings-view > .container > .editor-group > .editor input[type="checkbox"]): Deleted. |
| (.content-view.tab.settings > .settings-view > .container > .editor-group > .editor select): Deleted. |
| (.content-view.tab.settings > .settings-view > .container > .editor-group > .editor input[type="number"]): Deleted. |
| (.content-view.tab.settings > .settings-view > .container > .editor-group > .editor input[type="text"]): Deleted. |
| Rename ".editor" to ".setting-editor" so it matches SettingEditor.css. |
| |
| 2021-05-10 Devin Rousso <drousso@apple.com> |
| |
| Web Inspector: add support for panning/zooming on images |
| https://bugs.webkit.org/show_bug.cgi?id=224655 |
| |
| Reviewed by Timothy Hatcher. |
| |
| * UserInterface/Controllers/GestureController.js: Added. |
| (WI.GestureController): |
| (WI.GestureController.prototype.get scale): |
| (WI.GestureController.prototype.set scale): |
| (WI.GestureController.prototype.get translate): |
| (WI.GestureController.prototype.set translate): |
| (WI.GestureController.prototype.reset): |
| (WI.GestureController.prototype._startScaleInteraction): |
| (WI.GestureController.prototype._updateScaleInteraction): |
| (WI.GestureController.prototype._endScaleInteraction): |
| (WI.GestureController.prototype._handleWheel): |
| (WI.GestureController.prototype._handleGestureStart): |
| (WI.GestureController.prototype._handleGestureChange): |
| (WI.GestureController.prototype._handleGestureEnd): |
| (WI.GestureController.prototype._handleMouseDown): |
| (WI.GestureController.prototype._handleMouseMove): |
| (WI.GestureController.prototype._handleMouseUp): |
| Add a general controller class that takes a `target` (and optionally a `container`) and adds |
| event listeners to handle various gestures: |
| - scale (both via trackpad and mouse wheel) |
| - transform (mouse click and drag) |
| |
| * UserInterface/Views/ImageResourceContentView.js: |
| (WI.ImageResourceContentView): |
| (WI.ImageResourceContentView.prototype.get navigationItems): |
| (WI.ImageResourceContentView.prototype.contentAvailable): |
| (WI.ImageResourceContentView.prototype.gestureControllerDidScale): Added. |
| (WI.ImageResourceContentView.prototype.gestureControllerDidTranslate): Added. |
| (WI.ImageResourceContentView.prototype._updateResetGestureButtonNavigationItemLabel): Added. |
| (WI.ImageResourceContentView.prototype._handleResetGestureButtonNavitationItemClicked): Added. |
| (WI.ImageResourceContentView.prototype._handleZoomOutGestureButtonNavitationItemClicked): Added. |
| (WI.ImageResourceContentView.prototype._handleZoomInGestureButtonNavitationItemClicked): Added. |
| * UserInterface/Views/ImageResourceContentView.css: |
| (.content-view.resource.image > .img-container): |
| (.navigation-bar > .item.image-gesture-reset): Added. |
| Add a `WI.GestureController` and manipulate the `scale` and `transform` of the `<img>`. |
| Add navigation items that show the current scale (clicking it will reset the gesture), zoom |
| in, and zoom out. |
| |
| * UserInterface/Views/LocalResourceOverrideLabelView.css: |
| (.local-resource-override-label-view): |
| Add a `z-index` so that zoomed images don't appear on top. |
| |
| * UserInterface/Views/ResourceCollectionContentView.js: |
| (WI.ResourceCollectionContentView.prototype.get contentViewConstructorOptions): |
| Don't create the `WI.GestureController` in collection views. |
| |
| * UserInterface/Main.html: |
| * UserInterface/Images/ZoomIn.svg: Added. |
| * UserInterface/Images/ZoomOut.svg: Added. |
| * Localizations/en.lproj/localizedStrings.js: |
| |
| 2021-05-07 Patrick Angle <pangle@apple.com> |
| |
| Web Inspector: Breakpoint action add/remove buttons are not vertically aligned with action dropdown |
| https://bugs.webkit.org/show_bug.cgi?id=225543 |
| |
| Reviewed by Devin Rousso. |
| |
| Change the breakpoint action add/remove button's `margin-top` to `margin-block-start`, and adjust the value to |
| properly vertically center the buttons with the action type menu. |
| |
| * UserInterface/Views/BreakpointActionView.css: |
| (:matches(.breakpoint-action-append-button, .breakpoint-action-remove-button)): |
| |
| 2021-05-07 Patrick Angle <pangle@apple.com> |
| |
| Web Inspector: Default source for new test cases is minified |
| https://bugs.webkit.org/show_bug.cgi?id=225546 |
| |
| Reviewed by Devin Rousso. |
| |
| Move the placeholder test code to `WI.DefaultAudits` as part of the non-minified sources so that new audit test |
| cases do not have their default placeholder script minified. This also allows us to remove |
| `WI.AuditTestCase.stringifyFunction` as it is no longer needed. |
| |
| * UserInterface/Models/AuditTestCase.js: |
| (WI.AuditTestCase.stringifyFunction): Deleted. |
| * UserInterface/NonMinified/DefaultAudits.js: |
| (WI.DefaultAudits.newAuditPlaceholder): |
| * UserInterface/Views/CreateAuditPopover.js: |
| (WI.CreateAuditPopover.prototype.dismiss): |
| (WI.CreateAuditPopover.prototype.dismiss.const.placeholderTestFunction): Deleted. |
| |
| 2021-05-04 Devin Rousso <drousso@apple.com> |
| |
| Web Inspector: add assertion for `WI.View` re-entrancy |
| https://bugs.webkit.org/show_bug.cgi?id=224678 |
| |
| Reviewed by Joseph Pecoraro. |
| |
| Add `console.assert` (which are removed from production builds) around each critical |
| `WI.View` subclass member function to prevent reentrancy. |
| - `initialLayout` |
| - `sizeDidChange` |
| - `layout` |
| - `didLayoutSubtree` |
| This is important because `WI.View.prototype._layoutSubtree` sets any related state after |
| calling any of the above (e.g. `_didInitialLayout` after `initialLayout`), meaning that any |
| checks for the related state (which sometimes control whether the function is called, such |
| as in the case of `initialLayout`) would think that the function hadn't been called yet. See |
| r276170 for an example of how this can happen and the potential problems it can cause. |
| |
| * UserInterface/Views/View.js: |
| (WI.View.prototype._layoutSubtree): |
| |
| * UserInterface/Base/Utilities.js: |
| (WI.setReentrantCheck): Added. |
| (WI.clearReentrantCheck): Added. |
| |
| 2021-05-04 Razvan Caliman <rcaliman@apple.com> |
| |
| Web Inspector: Sources: Inconsistent selection in source tree when grouped by path |
| https://bugs.webkit.org/show_bug.cgi?id=225317 |
| |
| Reviewed by Devin Rousso. |
| |
| Ensure origin tree elements for different domains in the Sources Tab behave as folder tree elements |
| in that they can be individually selected without triggering rendering of any resource. |
| |
| In essence, restore behavior prior to https://trac.webkit.org/changeset/248912/webkit |
| |
| The only exception is for document resources. Clicking on the origin tree element associated with a document resource, |
| triggers rendering of the corresponding document. |
| |
| * UserInterface/Views/OriginTreeElement.js: |
| (WI.OriginTreeElement): |
| * UserInterface/Views/SourcesNavigationSidebarPanel.js: |
| (WI.SourcesNavigationSidebarPanel.prototype._addResource): |
| |
| 2021-04-28 Razvan Caliman <rcaliman@apple.com> |
| |
| Web Inspector: CSS Grid - measure usage of grid overlay options |
| https://bugs.webkit.org/show_bug.cgi?id=225060 |
| <rdar://75843294> |
| |
| Reviewed by BJ Burg. |
| |
| Add telemetry instrumentation to track grid overlay configurations and time spent using them. |
| |
| * UserInterface/Base/Main.js: |
| (WI.contentLoaded): |
| * UserInterface/Controllers/GridOverlayConfigurationDiagnosticEventRecorder.js: Added. |
| (WI.GridOverlayConfigurationDiagnosticEventRecorder): |
| (WI.GridOverlayConfigurationDiagnosticEventRecorder.get eventSamplingInterval): |
| (WI.GridOverlayConfigurationDiagnosticEventRecorder.prototype.setup): |
| (WI.GridOverlayConfigurationDiagnosticEventRecorder.prototype.teardown): |
| (WI.GridOverlayConfigurationDiagnosticEventRecorder.prototype._handleGridOverlayShown): |
| (WI.GridOverlayConfigurationDiagnosticEventRecorder.prototype._handleGridOverlayHidden): |
| (WI.GridOverlayConfigurationDiagnosticEventRecorder.prototype.handleEvent): |
| (WI.GridOverlayConfigurationDiagnosticEventRecorder.prototype._startEventSamplingTimer): |
| (WI.GridOverlayConfigurationDiagnosticEventRecorder.prototype._stopEventSamplingTimer): |
| (WI.GridOverlayConfigurationDiagnosticEventRecorder.prototype._sampleCurrentOverlayConfiguration): |
| (WI.GridOverlayConfigurationDiagnosticEventRecorder.prototype._didObserveUserInteraction): |
| (WI.GridOverlayConfigurationDiagnosticEventRecorder.prototype._handleWindowFocus): |
| (WI.GridOverlayConfigurationDiagnosticEventRecorder.prototype._handleWindowBlur): |
| (WI.GridOverlayConfigurationDiagnosticEventRecorder.prototype._handleWindowKeyDown): |
| (WI.GridOverlayConfigurationDiagnosticEventRecorder.prototype._handleWindowMouseDown): |
| * UserInterface/Controllers/OverlayManager.js: |
| (WI.OverlayManager.prototype.hasVisibleGridOverlays): |
| * UserInterface/Main.html: |
| |
| 2021-04-27 Patrick Angle <pangle@apple.com> |
| |
| Web Inspector: Rename "Open in New Tab" context menu item to "Open in New Window" |
| https://bugs.webkit.org/show_bug.cgi?id=225125 |
| |
| Reviewed by BJ Burg. |
| |
| Update the context menu item label, as the "Open in..." context menu item opens the target item in a new window, |
| not a new tab. |
| |
| * Localizations/en.lproj/localizedStrings.js: |
| * UserInterface/Views/ContextMenuUtilities.js: |
| (WI.appendContextMenuItemsForURL): |
| |
| 2021-04-27 Patrick Angle <pangle@apple.com> |
| |
| Web Inspector: Default Audits script are minified in release builds |
| https://bugs.webkit.org/show_bug.cgi?id=225009 |
| |
| Reviewed by BJ Burg. |
| |
| Covered by new test: |
| - inspector/audit/non-minified-default-audits.html |
| |
| The default audits have been moved out of `AuditManager.js` and into a special `DefaultAudits.js` in the new |
| `NonMinified` directory, which contains JavaScript sources that should be included in `Main.js` and |
| `TestCombined.js`, but should not have whitespace stripped from their contents because the whitespace is |
| important to the script. For example, the source for the default audits are visible to the user, and therefore |
| we want to present well-formatted source in those contexts. |
| |
| * Scripts/combine-resources.pl: |
| - Added `NonMinified` directory to list of default `inputDirectoryPattern` exceptions for combining resources. |
| - Added `--skip-concatenate-tag` so that we don't add tags for script we will eventually append to another script. |
| * Scripts/copy-user-interface-resources.pl: |
| - Handle `NonMinified` directory for sources that will be appended to Main.js, but should not be minified. |
| - Handle `NonMinified` directory for sources that will be appended to TestCombined.js. |
| (combineOrStripResourcesForWebKitAdditions): |
| - Drive-by fix for typo in combineOrStripResourcesForWebKitAdditions that caused errors to be emitted during builds. |
| * UserInterface/Controllers/AuditManager.js: |
| (WI.AuditManager.prototype._addDefaultTests): |
| (WI.AuditManager): |
| (WI.AuditManager.prototype._addDefaultTests.const.levelPass): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.levelWarn): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.levelFail): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.levelError): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.levelUnsupported): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.dataDOMNodes): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.dataDOMAttributes): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.dataErrors): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.dataCustom): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.getElementsByComputedRole): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.getActiveDescendant): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.getChildNodes): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.getComputedProperties): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.getControlledNodes): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.getFlowedNodes): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.getMouseEventNode): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.getOwnedNodes): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.getParentNode): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.getSelectedChildNodes): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.hasEventListeners): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.hasEventListenersClick): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.getResources): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.getResourceContent): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.unsupported): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.hasChildWithRole): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testMenuRoleForRequiredChildren): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testGridRoleForRequiredChildren): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testForAriaLabelledBySpelling): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testForMultipleBanners): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testForLinkLabels): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testRowGroupRoleForRequiredChildren): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testTableRoleForRequiredChildren): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testForMultipleLiveRegions): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testListBoxRoleForRequiredChildren): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testImageLabels): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testForAriaHiddenFalse): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testTreeRoleForRequiredChildren): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testRadioGroupRoleForRequiredChildren): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testFeedRoleForRequiredChildren): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testTabListRoleForRequiredChildren): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testButtonLabels): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testRowRoleForRequiredChildren): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testListRoleForRequiredChildren): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testComboBoxRoleForRequiredChildren): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testForMultipleMainContentSections): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testDialogsForLabels): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.const.testForInvalidAriaHiddenValue): Deleted. |
| (WI.AuditManager.prototype._addDefaultTests.removeWhitespace): Deleted. |
| * UserInterface/Main.html: |
| * UserInterface/NonMinified/DefaultAudits.js: Added. |
| (WI.DefaultAudits.levelPass): |
| (WI.DefaultAudits.levelWarn): |
| (WI.DefaultAudits.levelFail): |
| (WI.DefaultAudits.levelError): |
| (WI.DefaultAudits.levelUnsupported): |
| (WI.DefaultAudits.dataDOMNodes): |
| (WI.DefaultAudits.dataDOMAttributes): |
| (WI.DefaultAudits.dataErrors): |
| (WI.DefaultAudits.dataCustom): |
| (WI.DefaultAudits.getElementsByComputedRole): |
| (WI.DefaultAudits.getActiveDescendant): |
| (WI.DefaultAudits.getChildNodes): |
| (WI.DefaultAudits.getComputedProperties): |
| (WI.DefaultAudits.getControlledNodes): |
| (WI.DefaultAudits.getFlowedNodes): |
| (WI.DefaultAudits.getMouseEventNode): |
| (WI.DefaultAudits.getOwnedNodes): |
| (WI.DefaultAudits.getParentNode): |
| (WI.DefaultAudits.getSelectedChildNodes): |
| (WI.DefaultAudits.hasEventListeners): |
| (WI.DefaultAudits.hasEventListenersClick): |
| (WI.DefaultAudits.getResources): |
| (WI.DefaultAudits.getResourceContent): |
| (WI.DefaultAudits.unsupported): |
| (hasChildWithRole): |
| (WI.DefaultAudits.testMenuRoleForRequiredChildren): |
| (WI.DefaultAudits.testGridRoleForRequiredChildren): |
| (WI.DefaultAudits.testForAriaLabelledBySpelling): |
| (WI.DefaultAudits.testForMultipleBanners): |
| (WI.DefaultAudits.testForLinkLabels): |
| (WI.DefaultAudits.testRowGroupRoleForRequiredChildren): |
| (WI.DefaultAudits.testTableRoleForRequiredChildren): |
| (WI.DefaultAudits.testForMultipleLiveRegions): |
| (WI.DefaultAudits.testListBoxRoleForRequiredChildren): |
| (WI.DefaultAudits.testImageLabels): |
| (WI.DefaultAudits.testForAriaHiddenFalse): |
| (WI.DefaultAudits.testTreeRoleForRequiredChildren): |
| (WI.DefaultAudits.testRadioGroupRoleForRequiredChildren): |
| (WI.DefaultAudits.testFeedRoleForRequiredChildren): |
| (WI.DefaultAudits.testTabListRoleForRequiredChildren): |
| (WI.DefaultAudits.testButtonLabels): |
| (WI.DefaultAudits.testRowRoleForRequiredChildren): |
| (WI.DefaultAudits.testListRoleForRequiredChildren): |
| (WI.DefaultAudits.testComboBoxRoleForRequiredChildren): |
| (WI.DefaultAudits.testForMultipleMainContentSections): |
| (WI.DefaultAudits.testDialogsForLabels): |
| (WI.DefaultAudits.testForInvalidAriaHiddenValue): |
| * UserInterface/Test.html: |
| |
| 2021-04-27 Don Olmstead <don.olmstead@sony.com> |
| |
| [CMake] Don't use FORWARDING_HEADERS_DIR for GTK WebKit headers |
| https://bugs.webkit.org/show_bug.cgi?id=225006 |
| |
| Reviewed by Michael Catanzaro. |
| |
| Use WebKit2Gtk_FRAMEWORK_HEADERS_DIR and WebKit2Gtk_DERIVED_SOURCES_DIR for WebKit2 GTK |
| headers instead of FORWARDING_HEADERS_DIR and DERIVED_SOURCES_DIR. |
| |
| * PlatformGTK.cmake: |
| |
| 2021-04-26 Nikita Vasilyev <nvasilyev@apple.com> |
| |
| Web Inspector: Audit Tab: Edits are not committed when leaving edit mode unless you first click into another text field |
| https://bugs.webkit.org/show_bug.cgi?id=224318 |
| <rdar://problem/76382755> |
| |
| Reviewed by Devin Rousso. |
| |
| Save test and setup code when pressing "Done" button. Don't rely on the blur event because it doesn't fire on |
| the focused element when it's removed from the DOM. |
| |
| * UserInterface/Models/AuditTestBase.js: |
| (WI.AuditTestBase.prototype.set setup): |
| * UserInterface/Models/AuditTestCase.js: |
| (WI.AuditTestCase.prototype.set test): |
| Allow setting `test` and `setup` after editing is finished. |
| |
| * UserInterface/Views/AuditTestCaseContentView.js: |
| (WI.AuditTestCaseContentView.prototype.layout): |
| (WI.AuditTestCaseContentView.prototype.saveEditedData): |
| * UserInterface/Views/AuditTestContentView.js: |
| (WI.AuditTestContentView.prototype.detached): |
| Saving test on `detached` saves it when selecting a different test in the navigation sidebar. |
| |
| (WI.AuditTestContentView.prototype.saveEditedData): |
| (WI.AuditTestContentView.prototype._createSetupEditor): |
| (WI.AuditTestContentView.prototype._handleEditingChanged): |
| (WI.AuditTestContentView): |
| |
| 2021-04-26 Devin Rousso <drousso@apple.com> |
| |
| Web Inspector: Audit: Uncaught Exception: Failed to execute 'delete' on 'IDBObjectStore': The parameter is not a valid key range. |
| https://bugs.webkit.org/show_bug.cgi?id=224993 |
| |
| Reviewed by BJ Burg. |
| |
| * UserInterface/Controllers/AuditManager.js: |
| (WI.AuditManager.prototype.async processJSON): |
| (WI.AuditManager.prototype.async addTest): |
| * UserInterface/Views/AuditNavigationSidebarPanel.js: |
| (WI.AuditNavigationSidebarPanel.prototype.willDismissPopover): |
| * UserInterface/Views/AuditTreeElement.js: |
| (WI.AuditTreeElement.prototype.populateContextMenu): |
| Make sure to save any newly created audits not already in `WI.objectStores.audits` immediately |
| so that if the developer tries to delete it before exiting Edit mode (which is normally when |
| everything is saved) an exception isn't thrown about it not being in `WI.objectStores.audits`. |
| |
| 2021-04-26 Razvan Caliman <rcaliman@apple.com> |
| |
| Web Inspector: REGRESSION(r270134) Elements Tab: Details Sidebar toggle is unexpectedly disabled after switching from Timelines tab |
| https://bugs.webkit.org/show_bug.cgi?id=224772 |
| <rdar://73470211> |
| |
| Reviewed by Devin Rousso. |
| |
| Ensure the logic for identifying and showing the represented object for the selected `DOMNode` |
| is not run unless the Elements Tab is visible. This guards agains the partial setting of state |
| when the Elements Tab is not the default tab while opening Web Inspector. |
| |
| * UserInterface/Views/ElementsTabContentView.js: |
| (WI.ElementsTabContentView): |
| (WI.ElementsTabContentView.prototype.showRepresentedObject): |
| (WI.ElementsTabContentView.prototype.attached): |
| (WI.ElementsTabContentView.prototype.detached): |
| (WI.ElementsTabContentView.prototype._showDOMTreeContentViewIfNeeded): |
| (WI.ElementsTabContentView.prototype._mainFrameDidChange): |
| (WI.ElementsTabContentView.prototype._mainResourceDidChange): |
| |
| 2021-04-25 Devin Rousso <drousso@apple.com> |
| |
| Web Inspector: Audit: REGRESSION(?): creating a new test in Edit mode causes the Results folder to appear |
| https://bugs.webkit.org/show_bug.cgi?id=224994 |
| |
| Reviewed by Darin Adler. |
| |
| * UserInterface/Views/AuditNavigationSidebarPanel.js: |
| (WI.AuditNavigationSidebarPanel.prototype._addTest): |
| |
| 2021-04-22 BJ Burg <bburg@apple.com> |
| |
| [Cocoa] re-enable test case WKInspectorDelegate.InspectorConfiguration |
| https://bugs.webkit.org/show_bug.cgi?id=224577 |
| <rdar://70505272> |
| |
| Reviewed by Devin Rousso. |
| |
| Adjust the CSP directive list in the <meta> tag to allow for customization |
| by WebKit ports. |
| |
| * UserInterface/Main.html: |
| - Remove `default-src 'self'` so as not to block custom scheme loads. |
| - Remove `connect-src * ws:` so as not to block custom scheme loads. |
| - Add `object-src 'none'` as we have no reason to allow <object>, <embed>, or <applet>. |
| |
| 2021-04-20 Razvan Caliman <rcaliman@apple.com> |
| |
| Web Inspector: Tree Outlines: `ondetach` can be called without `onattach` ever being called |
| https://bugs.webkit.org/show_bug.cgi?id=224652 |
| <rdar://problem/76746385> |
| |
| Reviewed by Devin Rousso. |
| |
| Ensure `TreeElement.ondetach()` cannot be called if the conditions |
| for previously calling `TreeElement.onattach()` have not been met. |
| |
| * UserInterface/Views/TreeElement.js: |
| (WI.TreeElement.prototype._detach): |
| |
| 2021-04-19 Patrick Angle <pangle@apple.com> |
| |
| REGRESSION (r268691 && r270134): Web Inspector: Clicking on go-to arrow in Computed panel no longer works |
| https://bugs.webkit.org/show_bug.cgi?id=224774 |
| |
| Reviewed by Devin Rousso. |
| |
| The Styles panel will not always be part of the same sidebar as the Computed panel as of r268691, so we should |
| look for the Styles panel in WI.detailsSidebar, which will report all of the panels it manages across multiple |
| sidebars. Additionally, as of r270134, there is no longer a private `_visible` property for |
| `WI.StyleDetailsPanel`, so it can not be used by `WI.SpreadsheetRulesStyleDetailsPanel`. Instead, visibility |
| should be determined by checking if the panel is attached and not pending layout. |
| |
| * UserInterface/Views/ComputedStyleDetailsSidebarPanel.js: |
| (WI.ComputedStyleDetailsSidebarPanel.prototype.computedStyleDetailsPanelShowProperty): |
| * UserInterface/Views/SpreadsheetRulesStyleDetailsPanel.js: |
| (WI.SpreadsheetRulesStyleDetailsPanel.prototype.scrollToSectionAndHighlightProperty): |
| |
| 2021-04-19 Devin Rousso <drousso@apple.com> |
| |
| Web Inspector: Graphics: add support for `steps()`/`spring()` CSS timing functions |
| https://bugs.webkit.org/show_bug.cgi?id=224654 |
| |
| Reviewed by BJ Burg. |
| |
| * UserInterface/Models/Geometry.js: |
| (WI.StepsFunction): Added. |
| (WI.StepsFunction.fromString): Added. |
| (WI.StepsFunction.prototype.get type): Added. |
| (WI.StepsFunction.prototype.get count): Added. |
| (WI.StepsFunction.prototype.copy): Added. |
| (WI.StepsFunction.prototype.toString): Added. |
| Create a model object for `steps()` CSS timing function. |
| |
| * UserInterface/Models/Animation.js: |
| (WI.Animation.prototype._updateEffect): |
| Also support `effect.timingFunction`/`keyframe.easing` being a `steps()`/`spring()` CSS timing function. |
| |
| * UserInterface/Views/AnimationContentView.js: |
| (WI.AnimationContentView.prototype._refreshPreview): |
| Create a UI for `steps()`/`spring()` CSS timing functions. |
| |
| 2021-04-19 Devin Rousso <drousso@apple.com> |
| |
| Web Inspector: REGRESSION(?): Network: Request (Object Tree) is sometimes empty |
| https://bugs.webkit.org/show_bug.cgi?id=224768 |
| <rdar://problem/76783636> |
| |
| Reviewed by BJ Burg. |
| |
| * UserInterface/Views/LocalJSONContentView.js: |
| (WI.LocalJSONContentView.prototype.renderRemoteObject): |
| If the `WI.RemoteObject` is simple enough to be rendered inline, `WI.ObjectTreeView` won't |
| show a `WI.TreeOutline` by default. We have to tell it to use a `WI.TreeOutline` by passing |
| `forceExpanding = true` into the constructor. |
| |
| * UserInterface/Views/ObjectTreeView.js: |
| (WI.ObjectTreeView.prototype.showOnlyJSON): |
| Add some `console.assert` to help prevent this from happening again. |
| |
| 2021-04-19 Kimmo Kinnunen <kkinnunen@apple.com> |
| |
| Enable -Wthread-safety, add attributes to custom lock classes, and provide macros to declare guards |
| https://bugs.webkit.org/show_bug.cgi?id=221614 |
| <rdar://problem/74396781> |
| |
| Reviewed by David Kilzer. |
| |
| Add -Wthread-safety to compile flags. |
| |
| * Configurations/Base.xcconfig: |
| |
| 2021-04-16 Devin Rousso <drousso@apple.com> |
| |
| Web Inspector: REGRESSION(?): Graphics: dropping a recording leaves behind a drop zone view |
| https://bugs.webkit.org/show_bug.cgi?id=224648 |
| |
| Reviewed by BJ Burg. |
| |
| * UserInterface/Views/GraphicsTabContentView.js: |
| (WI.GraphicsTabContentView.prototype.initialLayout): |
| It appears that it's possible for re-entrancy issues in the `WI.View` system since the |
| `_didInitialLayout` flag isn't set until _after_ `initialLayout` returns, meaning that if |
| the logic inside `initialLayout` triggers a synchronous `layout` then that second `layout` |
| won't know that it's already in the middle of an `initialLayout`. In this case, showing the |
| `WI.GraphicsOverviewContentView` causes the navigation sidebar to be shown, which forces a |
| synchronous `layout` from handling `WI.Sidebar.Event.WidthDidChange`. For now, there's no |
| "rush" to show the `WI.GraphicsOverviewContentView` so we delay it by one event loop turn. |
| |
| * UserInterface/Views/CanvasContentView.js: |
| (WI.CanvasContentView.prototype.initialLayout): |
| (WI.CanvasContentView.prototype.dropZoneShouldAppearForDragEvent): Deleted. |
| (WI.CanvasContentView.prototype.dropZoneHandleDrop): Deleted. |
| There's no reason to have another `WI.DropZoneView` here since there's already one that |
| covers the entire tab. |
| |
| 2021-04-16 Devin Rousso <drousso@apple.com> |
| |
| Web Inspector: Uncaught Exception: null is not an object (evaluating 'this._listeners.get') |
| https://bugs.webkit.org/show_bug.cgi?id=224651 |
| |
| Reviewed by BJ Burg. |
| |
| * UserInterface/Base/Object.js: |
| (WI.Object.removeEventListener): |
| Add early-return checks just in case `_listeners` or `listenersForEventType` is falsy. While |
| ideally it would be the case that these would never be falsy, the logic of Web Inspector is |
| complex and far reaching, so better safe than sorry. |
| |
| * UserInterface/Views/TreeElement.js: |
| (WI.TreeElement.prototype._detach): |
| * UserInterface/Views/AuditTreeElement.js: |
| (WI.AuditTreeElement.prototype.ondetach): |
| * UserInterface/Views/BootstrapScriptTreeElement.js: |
| (WI.BootstrapScriptTreeElement.prototype.ondetach): |
| * UserInterface/Views/BreakpointTreeElement.js: |
| (WI.BreakpointTreeElement.prototype.ondetach): |
| * UserInterface/Views/DOMTreeElement.js: |
| (WI.DOMTreeElement.prototype.ondetach): |
| * UserInterface/Views/FrameTreeElement.js: |
| (WI.FrameTreeElement.prototype.ondetach): |
| * UserInterface/Views/JavaScriptBreakpointTreeElement.js: |
| (WI.JavaScriptBreakpointTreeElement.prototype.ondetach): |
| * UserInterface/Views/LocalResourceOverrideTreeElement.js: |
| (WI.LocalResourceOverrideTreeElement.prototype.ondetach): |
| * UserInterface/Views/ShaderProgramTreeElement.js: |
| (WI.ShaderProgramTreeElement.prototype.ondetach): |
| * UserInterface/Views/WebSocketResourceTreeElement.js: |
| (WI.WebSocketResourceTreeElement.prototype.ondetach): |
| Add FIXME comments warning of this issue so that future changes can take it into account. |
| <https://webkit.org/b/224652> (Web Inspector: Tree Outlines: `ondetach` can be called without `onattach` ever being called) |
| |
| 2021-04-16 Devin Rousso <drousso@apple.com> |
| |
| Web Inspector: Sources: don't show the create local override contextmenu if the navigation item is disabled |
| https://bugs.webkit.org/show_bug.cgi?id=224647 |
| |
| Reviewed by BJ Burg. |
| |
| * UserInterface/Views/ResourceContentView.js: |
| (WI.ResourceContentView.prototype._populateCreateLocalResourceOverrideContextMenu): |
| |
| 2021-04-13 BJ Burg <bburg@apple.com> |
| |
| Web Inspector: add setting to allow inspecting Web Inspector |
| https://bugs.webkit.org/show_bug.cgi?id=224082 |
| <rdar://75695002> |
| |
| Reviewed by Devin Rousso. |
| |
| Instead of telling curious users to set the WebKitDeveloperExtras default, |
| expose an experimental setting that does the same thing. |
| |
| * UserInterface/Base/Main.js: |
| (WI.loaded): |
| * UserInterface/Base/Setting.js: |
| * UserInterface/Views/SettingsTabContentView.js: |
| |
| 2021-04-06 BJ Burg <bburg@apple.com> |
| |
| Web Inspector: remove duplicate Box Model section from Layout panel in Elements Tab |
| https://bugs.webkit.org/show_bug.cgi?id=224206 |
| <rdar://problem/76235731> |
| |
| Reviewed by Devin Rousso. |
| |
| For now, remove it from Layout panel. It may go back there |
| when it is able to show used values. It currently only shows computed. |
| |
| * UserInterface/Views/LayoutDetailsSidebarPanel.js: |
| (WI.LayoutDetailsSidebarPanel.prototype.initialLayout): |
| (WI.LayoutDetailsSidebarPanel.prototype.layout): |
| (WI.LayoutDetailsSidebarPanel.prototype.get minimumWidth): Deleted. |
| |
| 2021-04-06 Razvan Caliman <rcaliman@apple.com> |
| |
| Web Inspector: Layout sidebar grid overlay color swatch tooltip shouldn't include "switch format" hint |
| https://bugs.webkit.org/show_bug.cgi?id=223418 |
| <rdar://problem/75825793> |
| |
| Reviewed by BJ Burg. |
| |
| * UserInterface/Views/CSSGridSection.js: |
| (WI.CSSGridSection.prototype.layout): |
| * UserInterface/Views/InlineSwatch.js: |
| (WI.InlineSwatch): |
| (WI.InlineSwatch.prototype.set shiftClickColorEnabled): |
| (WI.InlineSwatch.prototype._updateSwatch): |
| (WI.InlineSwatch.prototype._allowChangingColorFormats): |
| |
| 2021-03-31 Patrick Angle <pangle@apple.com> |
| |
| Web Inspector: Regression (r270134) Timeline recordings 2 and beyond do not show a timescale. |
| https://bugs.webkit.org/show_bug.cgi?id=222930 |
| |
| Reviewed by Devin Rousso. |
| |
| When a new `TimelineOverview` is created, it calls `TimelineOverview.prototype._viewModeDidChange` inside the |
| constructor, which in turn called `updateLayout`. This was problematic in that a `TimelineRuler` would have |
| `sizeDidChange` invoked before it was attached to the DOM, which meant that there was no width to cache. Because |
| `sizeDidChange` is only invoked during the first layout and on resize events, the cached width is not updated |
| when the ruler is attached to the view hierarchy, having already performed an early initial layout. |
| |
| This patch now checks if the `TimelineOverview` has performed its initial layout before updating the layout |
| inside `_viewModeDidChange`, which means that the initial layout on the child `TimelineRuler` will be done while |
| attached, thus producing a valid width value to cache. |
| |
| * UserInterface/Views/TimelineOverview.js: |
| (WI.TimelineRuler.prototype._viewModeDidChange): |
| |
| 2021-03-31 Nikita Vasilyev <nvasilyev@apple.com> |
| |
| Web Inspector: Autocomplete experimental CSS Color values (hwb, lch, lab, color-mix, color-contrast) |
| https://bugs.webkit.org/show_bug.cgi?id=224010 |
| <rdar://problem/76065217> |
| |
| Reviewed by BJ Burg. |
| |
| * UserInterface/Models/CSSKeywordCompletions.js: |
| |
| 2021-03-28 Sam Weinig <weinig@apple.com> |
| |
| Remove ENABLE_INDEXED_DATABASE & ENABLE_INDEXED_DATABASE_IN_WORKERS, it seems like it is on for all ports |
| https://bugs.webkit.org/show_bug.cgi?id=223810 |
| |
| Reviewed by Simon Fraser. |
| |
| * Versions/Inspector-iOS-14.0.json: |
| * Versions/Inspector-iOS-14.5.json: |
| Update for removed ENABLE_INDEXED_DATABASE conditional. |
| |
| 2021-03-26 Jessie Berlin <jberlin@webkit.org> |
| |
| Update the BEFORE/SINCE, SYSTEM_VERSION_PREFIX, and MACOSX_DEPLOYMENT_TARGET flags |
| https://bugs.webkit.org/show_bug.cgi?id=223779 |
| |
| Reviewed by Tim Horton. |
| |
| * Configurations/DebugRelease.xcconfig: |
| * Configurations/Version.xcconfig: |
| |
| 2021-03-25 Jessie Berlin <jberlin@webkit.org> |
| |
| Remove 10.13 DEPLOYMENT_TARGETs and SYSTEM_VERSION_PREFIXs |
| https://bugs.webkit.org/show_bug.cgi?id=223765 |
| |
| Reviewed by Tim Horton. |
| |
| * Configurations/Base.xcconfig: |
| * Configurations/DebugRelease.xcconfig: |
| * Configurations/Version.xcconfig: |
| |
| 2021-03-25 Razvan Caliman <rcaliman@apple.com> |
| |
| REGRESSION (r270134) Web Inspector: Audit: Results are stacked on top of each other. |
| https://bugs.webkit.org/show_bug.cgi?id=223381 |
| <rdar://problem/75528374> |
| |
| Reviewed by Devin Rousso. |
| |
| Ensure pre-existing `ContentView`s are removed when navigating back/forward |
| even when the incoming `ContentView` is already attached. |
| |
| For example, `AuditTestContentView` instances for individual tests are already attached |
| when shown as part of a test group `AuditTestGroupContentView`. |
| Navigating from the group to the individual test view must remove the group view. |
| |
| * UserInterface/Views/ContentViewContainer.js: |
| (WI.ContentViewContainer.prototype.showBackForwardEntryForIndex): |
| |
| 2021-03-24 Razvan Caliman <rcaliman@apple.com> |
| |
| Web Inspector: REGRESSION (r269359): Timelines: TypeError: this.deselect is not a function |
| https://bugs.webkit.org/show_bug.cgi?id=223698 |
| <rdar://problem/75790983> |
| |
| Reviewed by BJ Burg. |
| |
| Ensure individual timeline views can be closed to return to the Timelines overview. |
| |
| * UserInterface/Views/TimelineTreeElement.js: |
| (WI.TimelineTreeElement.prototype._showCloseButton): |
| |
| 2021-03-19 BJ Burg <bburg@apple.com> |
| |
| Uncaught Exception: RangeError: Array size is not a small enough positive integer. |
| https://bugs.webkit.org/show_bug.cgi?id=223532 |
| <rdar://problem/75635080> |
| |
| Reviewed by Devin Rousso. |
| |
| This patch fixes the broken CPU instrument when viewing a JSON timeline recordng. |
| |
| This exception is thrown when viewing a timeline recording that has been |
| imported from JSON file. Aside from the exception, the code is functionally |
| broken in this situation since passing a negative number to Array() doesn't work. |
| |
| I tested this change manually and selection ranges now behave as expected, and |
| have not regressed in other instruments / UI. |
| |
| * UserInterface/Views/CPUTimelineView.js: |
| Based on my investigation, the visibleEndTime is incorrectly computed when |
| showing a JSON timeline recording because the currentTime property is always '0'. |
| If this is the case, then let's assume that the entire range should be displayed. |
| |
| == Rolled over to ChangeLog-2021-03-18 == |