From 16da7d936ddf7b801de91c5417304cdbdebe0d68 Mon Sep 17 00:00:00 2001 From: fancy Date: Tue, 10 Mar 2026 12:28:54 +0800 Subject: [PATCH 1/2] fix(page-controller): honor viewportExpansion in DOM extraction --- packages/page-controller/src/PageController.ts | 5 ++--- packages/page-controller/src/constants.ts | 4 ++++ packages/page-controller/src/dom/index.ts | 7 +++++-- 3 files changed, 11 insertions(+), 5 deletions(-) diff --git a/packages/page-controller/src/PageController.ts b/packages/page-controller/src/PageController.ts index d168e4d..3e79145 100644 --- a/packages/page-controller/src/PageController.ts +++ b/packages/page-controller/src/PageController.ts @@ -14,7 +14,7 @@ import { scrollVertically, selectOptionElement, } from './actions' -import { VIEWPORT_EXPANSION } from './constants' +import { resolveViewportExpansion } from './constants' import * as dom from './dom' import type { FlatDomTree, InteractiveElementDomNode } from './dom/dom_tree/type' import { getPageInfo } from './dom/getPageInfo' @@ -24,7 +24,6 @@ import { patchReact } from './patches/react' * Configuration for PageController */ export interface PageControllerConfig extends dom.DomConfig { - viewportExpansion?: number /** Enable visual mask overlay during operations (default: false) */ enableMask?: boolean } @@ -131,7 +130,7 @@ export class PageController extends EventTarget { const url = window.location.href const title = document.title const pi = getPageInfo() - const viewportExpansion = this.config.viewportExpansion ?? VIEWPORT_EXPANSION + const viewportExpansion = resolveViewportExpansion(this.config.viewportExpansion) await this.updateTree() diff --git a/packages/page-controller/src/constants.ts b/packages/page-controller/src/constants.ts index ebe131e..41a7e7d 100644 --- a/packages/page-controller/src/constants.ts +++ b/packages/page-controller/src/constants.ts @@ -14,3 +14,7 @@ */ // export const VIEWPORT_EXPANSION = 100 export const VIEWPORT_EXPANSION = -1 + +export function resolveViewportExpansion(viewportExpansion?: number): number { + return viewportExpansion ?? VIEWPORT_EXPANSION +} diff --git a/packages/page-controller/src/dom/index.ts b/packages/page-controller/src/dom/index.ts index f8e2608..7235f33 100644 --- a/packages/page-controller/src/dom/index.ts +++ b/packages/page-controller/src/dom/index.ts @@ -1,4 +1,4 @@ -import { VIEWPORT_EXPANSION } from '../constants' +import { resolveViewportExpansion } from '../constants' import domTree from './dom_tree/index.js' import { ElementDomNode, @@ -8,6 +8,7 @@ import { } from './dom_tree/type' export interface DomConfig { + viewportExpansion?: number interactiveBlacklist?: (Element | (() => Element))[] interactiveWhitelist?: (Element | (() => Element))[] includeAttributes?: string[] @@ -21,6 +22,8 @@ export interface DomConfig { const newElementsCache = new WeakMap() export function getFlatTree(config: DomConfig): FlatDomTree { + const viewportExpansion = resolveViewportExpansion(config.viewportExpansion) + const interactiveBlacklist = [] as Element[] for (const item of config.interactiveBlacklist || []) { if (typeof item === 'function') { @@ -43,7 +46,7 @@ export function getFlatTree(config: DomConfig): FlatDomTree { doHighlightElements: true, debugMode: true, focusHighlightIndex: -1, - viewportExpansion: VIEWPORT_EXPANSION, + viewportExpansion, interactiveBlacklist, interactiveWhitelist, highlightOpacity: config.highlightOpacity ?? 0.0, From 1c354ab5d32236f4c48a1bff7eca3641ac578b1e Mon Sep 17 00:00:00 2001 From: fancy Date: Tue, 10 Mar 2026 15:34:24 +0800 Subject: [PATCH 2/2] refactor(page-controller): remove viewportExpansion constants module --- .../page-controller/src/PageController.ts | 3 +-- packages/page-controller/src/constants.ts | 20 ------------------- packages/page-controller/src/dom/index.ts | 16 ++++++++++++++- 3 files changed, 16 insertions(+), 23 deletions(-) delete mode 100644 packages/page-controller/src/constants.ts diff --git a/packages/page-controller/src/PageController.ts b/packages/page-controller/src/PageController.ts index 3e79145..c30f508 100644 --- a/packages/page-controller/src/PageController.ts +++ b/packages/page-controller/src/PageController.ts @@ -14,7 +14,6 @@ import { scrollVertically, selectOptionElement, } from './actions' -import { resolveViewportExpansion } from './constants' import * as dom from './dom' import type { FlatDomTree, InteractiveElementDomNode } from './dom/dom_tree/type' import { getPageInfo } from './dom/getPageInfo' @@ -130,7 +129,7 @@ export class PageController extends EventTarget { const url = window.location.href const title = document.title const pi = getPageInfo() - const viewportExpansion = resolveViewportExpansion(this.config.viewportExpansion) + const viewportExpansion = dom.resolveViewportExpansion(this.config.viewportExpansion) await this.updateTree() diff --git a/packages/page-controller/src/constants.ts b/packages/page-controller/src/constants.ts deleted file mode 100644 index 41a7e7d..0000000 --- a/packages/page-controller/src/constants.ts +++ /dev/null @@ -1,20 +0,0 @@ -/** - * Copyright (C) 2025 Alibaba Group Holding Limited - * All rights reserved. - */ - -/** - * Viewport expansion for DOM tree extraction. - * -1 means full page (no viewport restriction) - * 0 means viewport only - * positive values expand the viewport by that many pixels - * - * @note Since isTopElement depends on elementFromPoint, - * it returns null when out of viewport, this feature has no practical use, only differ between -1 and 0 - */ -// export const VIEWPORT_EXPANSION = 100 -export const VIEWPORT_EXPANSION = -1 - -export function resolveViewportExpansion(viewportExpansion?: number): number { - return viewportExpansion ?? VIEWPORT_EXPANSION -} diff --git a/packages/page-controller/src/dom/index.ts b/packages/page-controller/src/dom/index.ts index 7235f33..2968c0c 100644 --- a/packages/page-controller/src/dom/index.ts +++ b/packages/page-controller/src/dom/index.ts @@ -1,4 +1,3 @@ -import { resolveViewportExpansion } from '../constants' import domTree from './dom_tree/index.js' import { ElementDomNode, @@ -7,6 +6,21 @@ import { TextDomNode, } from './dom_tree/type' +/** + * Viewport expansion for DOM tree extraction. + * -1 means full page (no viewport restriction) + * 0 means viewport only + * positive values expand the viewport by that many pixels + * + * @note Since isTopElement depends on elementFromPoint, + * it returns null when out of viewport, this feature has no practical use, only differ between -1 and 0 + */ +const DEFAULT_VIEWPORT_EXPANSION = -1 + +export function resolveViewportExpansion(viewportExpansion?: number): number { + return viewportExpansion ?? DEFAULT_VIEWPORT_EXPANSION +} + export interface DomConfig { viewportExpansion?: number interactiveBlacklist?: (Element | (() => Element))[]