Skip to content

Commit 770d414

Browse files
danilsomsikovDevtools-frontend LUCI CQ
authored andcommitted
Don't record impressions for hidden content within collapsed <details> elements
Bug: 412621009 Change-Id: I55a6656db1200a2a85c8d65879a023029d667de8 Reviewed-on: https://chromium-review.googlesource.com/c/devtools/devtools-frontend/+/6842296 Reviewed-by: Ergün Erdoğmuş <[email protected]> Auto-Submit: Danil Somsikov <[email protected]> Commit-Queue: Ergün Erdoğmuş <[email protected]>
1 parent 592e645 commit 770d414

File tree

3 files changed

+46
-18
lines changed

3 files changed

+46
-18
lines changed

front_end/ui/visual_logging/LoggingDriver.test.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,6 +147,36 @@ describe('LoggingDriver', () => {
147147
await assertImpressionRecordedDeferred();
148148
});
149149

150+
it('does not log impressions for content in closed details element but does when opened', async () => {
151+
await VisualLoggingTesting.LoggingDriver.startLogging({processingThrottler: throttler});
152+
153+
const details = document.createElement('details');
154+
details.style.width = '100px';
155+
details.style.height = '100px';
156+
details.innerHTML = '<div id="details-content" jslog="TreeItem" style="width: 100px; height: 100px;"></div>';
157+
renderElementIntoDOM(details);
158+
159+
let [work] = await expectCalled(throttle);
160+
await work();
161+
// This will fail with the bug, as an impression will be recorded.
162+
sinon.assert.notCalled(recordImpression);
163+
164+
throttle.resetHistory();
165+
recordImpression.resetHistory();
166+
167+
details.open = true;
168+
// Opening details will trigger mutation observer.
169+
[work] = await expectCalled(throttle);
170+
await work();
171+
sinon.assert.calledOnce(recordImpression);
172+
assert.sameDeepMembers(recordImpression.firstCall.firstArg.impressions, [{
173+
id: getVeId('#details-content'),
174+
type: 1,
175+
width: 100,
176+
height: 100,
177+
}]);
178+
});
179+
150180
it('logs impressions on mutation in additional document', async () => {
151181
const iframe = document.createElement('iframe');
152182
renderElementIntoDOM(iframe);

front_end/ui/visual_logging/LoggingDriver.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,8 @@ export async function process(): Promise<void> {
153153
if (!loggingState.impressionLogged) {
154154
const overlap = visibleOverlap(element, viewportRectFor(element));
155155
const visibleSelectOption = element.tagName === 'OPTION' && loggingState.parent?.selectOpen;
156-
const visible = overlap && (!parent || loggingState.parent?.impressionLogged);
156+
const visible = overlap && element.checkVisibility({checkVisibilityCSS: true}) &&
157+
(!parent || loggingState.parent?.impressionLogged);
157158
if (visible || visibleSelectOption) {
158159
if (overlap) {
159160
loggingState.size = overlap;

test/e2e/helpers/visual-logging-helpers.ts

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,7 @@ export function veImpression(ve: string, context?: string, children?: TestImpres
4848
return {impressions: [key, ...veImpressionsUnder(key, children || []).impressions]};
4949
}
5050

51-
function veImpressionForTabHeader(panel: string, options?: {closable: boolean}) {
52-
if (options?.closable) {
53-
return veImpression('PanelTabHeader', panel, [veImpression('Close')]);
54-
}
51+
function veImpressionForTabHeader(panel: string) {
5552
return veImpression('PanelTabHeader', panel);
5653
}
5754

@@ -60,15 +57,18 @@ export function veImpressionForMainToolbar(options?: {
6057
expectClosedPanels?: string[],
6158
dockable?: boolean,
6259
}) {
63-
const regularPanels = ['elements', 'console', 'sources', 'network'];
60+
const panels = [
61+
'elements',
62+
'console',
63+
'sources',
64+
'network',
65+
];
6466
if (!options?.dockable) {
65-
regularPanels.push('timeline', 'heap-profiler', 'resources', 'lighthouse');
67+
panels.push('security', 'chrome-recorder', 'timeline', 'heap-profiler', 'resources', 'lighthouse');
6668
}
6769

68-
const closablePanels =
69-
options?.dockable ? [] : ['security', 'chrome-recorder'].filter(p => !options?.expectClosedPanels?.includes(p));
70-
if (options?.selectedPanel && !regularPanels.includes(options?.selectedPanel)) {
71-
closablePanels.push(options.selectedPanel);
70+
if (options?.selectedPanel && !panels.includes(options?.selectedPanel)) {
71+
panels.push(options.selectedPanel);
7272
}
7373

7474
const dockableItems = options?.dockable ?
@@ -80,8 +80,7 @@ export function veImpressionForMainToolbar(options?: {
8080
[];
8181

8282
return veImpression('Toolbar', 'main', [
83-
...regularPanels.map(panel => veImpressionForTabHeader(panel)),
84-
...closablePanels.map(panel => veImpressionForTabHeader(panel, {closable: true})),
83+
...panels.map(panel => veImpressionForTabHeader(panel)),
8584
veImpression('Toggle', 'elements.toggle-element-search'),
8685
veImpression('Action', 'settings.show'),
8786
veImpression('DropDown', 'main-menu'),
@@ -108,12 +107,10 @@ export function veImpressionForElementsPanel(options?: {dockable?: boolean}) {
108107
veImpression('Pane', 'styles', [
109108
veImpression('Section', 'style-properties', [veImpression('CSSRuleHeader', 'selector')]),
110109
veImpression('Section', 'style-properties', [
111-
veImpression('Action', 'elements.new-style-rule'),
112110
veImpression('CSSRuleHeader', 'selector'),
113111
veImpression('Tree', undefined, [
114-
veImpression('TreeItem', 'display', [veImpression('Toggle'), veImpression('Key'), veImpression('Value')]),
112+
veImpression('TreeItem', 'display', [/* veImpression('Toggle'), */veImpression('Key'), veImpression('Value')]),
115113
veImpression('TreeItem', 'margin', [
116-
veImpression('Toggle'),
117114
veImpression('Key'),
118115
veImpression('Expand'),
119116
veImpression('Value'),
@@ -134,10 +131,10 @@ export function veImpressionForElementsPanel(options?: {dockable?: boolean}) {
134131
export function veImpressionForDrawerToolbar(options?: {
135132
selectedPanel?: string,
136133
}) {
137-
const closeablePanels = options?.selectedPanel ? [options?.selectedPanel] : [];
134+
const panels = options?.selectedPanel ? [options?.selectedPanel] : [];
138135
return veImpression('Toolbar', 'drawer', [
139136
veImpressionForTabHeader('console'),
140-
...closeablePanels.map(panel => veImpressionForTabHeader(panel, {closable: true})),
137+
...panels.map(panel => veImpressionForTabHeader(panel)),
141138
veImpression('DropDown', 'more-tabs'),
142139
veImpression('Close'),
143140
]);

0 commit comments

Comments
 (0)