diff --git a/eslint.config.mjs b/eslint.config.mjs index f6eae0b86e..6634d6ce31 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -380,7 +380,7 @@ export default [ }, { files: [ - "packages/playwright-core/src/server/injected/**/*.ts", + "packages/injected/src/**/*.ts", "packages/playwright-core/src/server/pageBinding.ts", "packages/playwright-core/src/server/storageScript.ts", ], diff --git a/packages/playwright-core/src/server/injected/DEPS.list b/packages/injected/src/DEPS.list similarity index 72% rename from packages/playwright-core/src/server/injected/DEPS.list rename to packages/injected/src/DEPS.list index 7c5f41d8c9..2d8a11218b 100644 --- a/packages/playwright-core/src/server/injected/DEPS.list +++ b/packages/injected/src/DEPS.list @@ -1,4 +1,3 @@ # Files in this folder are used in browser environment, they can only depend on isomorphic files. [*] -../isomorphic/ -../../utils/isomorphic +@isomorphic/** diff --git a/packages/injected/src/README.md b/packages/injected/src/README.md new file mode 100644 index 0000000000..68f722935e --- /dev/null +++ b/packages/injected/src/README.md @@ -0,0 +1,5 @@ +# Injected + +This directory contains helper sources which are injected into the page. + +These sources are bundled with the ebuild into `src/generated` as compile-time source constants. See `utils/generate_injected` for details. diff --git a/packages/playwright-core/src/server/injected/ariaSnapshot.ts b/packages/injected/src/ariaSnapshot.ts similarity index 99% rename from packages/playwright-core/src/server/injected/ariaSnapshot.ts rename to packages/injected/src/ariaSnapshot.ts index 8e80809512..892b017d2f 100644 --- a/packages/playwright-core/src/server/injected/ariaSnapshot.ts +++ b/packages/injected/src/ariaSnapshot.ts @@ -21,7 +21,7 @@ import * as roleUtils from './roleUtils'; import { yamlEscapeKeyIfNeeded, yamlEscapeValueIfNeeded } from './yaml'; import type { AriaProps, AriaRegex, AriaRole, AriaTemplateNode, AriaTemplateRoleNode, AriaTemplateTextNode } from '@isomorphic/ariaSnapshot'; -import type { Builtins } from '../../utils/isomorphic/builtins'; +import type { Builtins } from '@isomorphic/builtins'; export type AriaNode = AriaProps & { role: AriaRole | 'fragment' | 'iframe'; diff --git a/packages/playwright-core/src/server/injected/clock.ts b/packages/injected/src/clock.ts similarity index 99% rename from packages/playwright-core/src/server/injected/clock.ts rename to packages/injected/src/clock.ts index 0ea788015f..fec36974eb 100644 --- a/packages/playwright-core/src/server/injected/clock.ts +++ b/packages/injected/src/clock.ts @@ -10,9 +10,9 @@ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -import { ensureBuiltins } from '../../utils/isomorphic/builtins'; +import { ensureBuiltins } from '@isomorphic/builtins'; -import type { Builtins } from '../../utils/isomorphic/builtins'; +import type { Builtins } from '@isomorphic/builtins'; export type ClockMethods = { Date: DateConstructor; diff --git a/packages/playwright-core/src/server/injected/consoleApi.ts b/packages/injected/src/consoleApi.ts similarity index 95% rename from packages/playwright-core/src/server/injected/consoleApi.ts rename to packages/injected/src/consoleApi.ts index 159686d90c..4b458254b1 100644 --- a/packages/playwright-core/src/server/injected/consoleApi.ts +++ b/packages/injected/src/consoleApi.ts @@ -14,13 +14,13 @@ * limitations under the License. */ -import { asLocator } from '../../utils/isomorphic/locatorGenerators'; -import { getByAltTextSelector, getByLabelSelector, getByPlaceholderSelector, getByRoleSelector, getByTestIdSelector, getByTextSelector, getByTitleSelector } from '../../utils/isomorphic/locatorUtils'; -import { escapeForTextSelector } from '../../utils/isomorphic/stringUtils'; +import { asLocator } from '@isomorphic/locatorGenerators'; +import { getByAltTextSelector, getByLabelSelector, getByPlaceholderSelector, getByRoleSelector, getByTestIdSelector, getByTextSelector, getByTitleSelector } from '@isomorphic/locatorUtils'; +import { escapeForTextSelector } from '@isomorphic/stringUtils'; import type { InjectedScript } from './injectedScript'; -import type { Language } from '../../utils/isomorphic/locatorGenerators'; -import type { ByRoleOptions } from '../../utils/isomorphic/locatorUtils'; +import type { Language } from '@isomorphic/locatorGenerators'; +import type { ByRoleOptions } from '@isomorphic/locatorUtils'; const selectorSymbol = Symbol('selector'); diff --git a/packages/playwright-core/src/server/injected/domUtils.ts b/packages/injected/src/domUtils.ts similarity index 100% rename from packages/playwright-core/src/server/injected/domUtils.ts rename to packages/injected/src/domUtils.ts diff --git a/packages/playwright-core/src/server/injected/highlight.css b/packages/injected/src/highlight.css similarity index 100% rename from packages/playwright-core/src/server/injected/highlight.css rename to packages/injected/src/highlight.css diff --git a/packages/playwright-core/src/server/injected/highlight.ts b/packages/injected/src/highlight.ts similarity index 96% rename from packages/playwright-core/src/server/injected/highlight.ts rename to packages/injected/src/highlight.ts index 58bb0fa072..400f52625d 100644 --- a/packages/playwright-core/src/server/injected/highlight.ts +++ b/packages/injected/src/highlight.ts @@ -14,13 +14,14 @@ * limitations under the License. */ -import highlightCSS from './highlight.css?inline'; -import { asLocator } from '../../utils/isomorphic/locatorGenerators'; -import { stringifySelector } from '../../utils/isomorphic/selectorParser'; +import { asLocator } from '@isomorphic/locatorGenerators'; +import { stringifySelector } from '@isomorphic/selectorParser'; +import highlightCSS from './highlight.css?inline'; + +import type { Language } from '@isomorphic/locatorGenerators'; +import type { ParsedSelector } from '@isomorphic/selectorParser'; import type { InjectedScript } from './injectedScript'; -import type { Language } from '../../utils/isomorphic/locatorGenerators'; -import type { ParsedSelector } from '../../utils/isomorphic/selectorParser'; type RenderedHighlightEntry = { diff --git a/packages/playwright-core/src/server/injected/injectedScript.ts b/packages/injected/src/injectedScript.ts similarity index 98% rename from packages/playwright-core/src/server/injected/injectedScript.ts rename to packages/injected/src/injectedScript.ts index be52d43afa..717aa67f71 100644 --- a/packages/playwright-core/src/server/injected/injectedScript.ts +++ b/packages/injected/src/injectedScript.ts @@ -15,36 +15,35 @@ */ import { parseAriaSnapshot } from '@isomorphic/ariaSnapshot'; +import { ensureBuiltins } from '@isomorphic/builtins'; +import { asLocator } from '@isomorphic/locatorGenerators'; +import { parseAttributeSelector, parseSelector, stringifySelector, visitAllSelectorParts } from '@isomorphic/selectorParser'; +import { cacheNormalizedWhitespaces, normalizeWhiteSpace, trimStringWithEllipsis } from '@isomorphic/stringUtils'; -import { ensureBuiltins } from '../../utils/isomorphic/builtins'; import { generateAriaTree, getAllByAria, matchesAriaTree, renderAriaTree } from './ariaSnapshot'; import { enclosingShadowRootOrDocument, isElementVisible, isInsideScope, parentElementOrShadowHost, setBrowserName } from './domUtils'; import { Highlight } from './highlight'; -import { kLayoutSelectorNames, layoutSelectorScore } from './layoutSelectorUtils'; +import { kLayoutSelectorNames, layoutSelectorScore } from './layoutSelectorUtils'; import { createReactEngine } from './reactSelectorEngine'; import { createRoleEngine } from './roleSelectorEngine'; import { getAriaDisabled, getAriaRole, getCheckedAllowMixed, getCheckedWithoutMixed, getElementAccessibleDescription, getElementAccessibleErrorMessage, getElementAccessibleName, getReadonly } from './roleUtils'; import { SelectorEvaluatorImpl, sortInDOMOrder } from './selectorEvaluator'; -import { generateSelector } from './selectorGenerator'; -import { elementMatchesText, elementText, getElementLabels } from './selectorUtils'; +import { generateSelector } from './selectorGenerator'; +import { elementMatchesText, elementText, getElementLabels } from './selectorUtils'; import { createVueEngine } from './vueSelectorEngine'; import { XPathEngine } from './xpathSelectorEngine'; -import { asLocator } from '../../utils/isomorphic/locatorGenerators'; -import { parseAttributeSelector } from '../../utils/isomorphic/selectorParser'; -import { parseSelector, stringifySelector, visitAllSelectorParts } from '../../utils/isomorphic/selectorParser'; -import { cacheNormalizedWhitespaces, normalizeWhiteSpace, trimStringWithEllipsis } from '../../utils/isomorphic/stringUtils'; +import type { AriaTemplateNode } from '@isomorphic/ariaSnapshot'; +import type { Builtins } from '@isomorphic/builtins'; +import type { CSSComplexSelectorList } from '@isomorphic/cssParser'; +import type { Language } from '@isomorphic/locatorGenerators'; +import type { NestedSelectorBody, ParsedSelector, ParsedSelectorPart } from '@isomorphic/selectorParser'; +import type * as channels from '@protocol/channels'; import type { AriaSnapshot } from './ariaSnapshot'; -import type { Builtins } from '../../utils/isomorphic/builtins'; import type { LayoutSelectorName } from './layoutSelectorUtils'; import type { SelectorEngine, SelectorRoot } from './selectorEngine'; import type { GenerateSelectorOptions } from './selectorGenerator'; import type { ElementText, TextMatcher } from './selectorUtils'; -import type { CSSComplexSelectorList } from '../../utils/isomorphic/cssParser'; -import type { Language } from '../../utils/isomorphic/locatorGenerators'; -import type { NestedSelectorBody, ParsedSelector, ParsedSelectorPart } from '../../utils/isomorphic/selectorParser'; -import type { AriaTemplateNode } from '@isomorphic/ariaSnapshot'; -import type * as channels from '@protocol/channels'; export type FrameExpectParams = Omit & { expectedValue?: any }; diff --git a/packages/playwright-core/src/server/injected/layoutSelectorUtils.ts b/packages/injected/src/layoutSelectorUtils.ts similarity index 100% rename from packages/playwright-core/src/server/injected/layoutSelectorUtils.ts rename to packages/injected/src/layoutSelectorUtils.ts diff --git a/packages/playwright-core/src/server/injected/reactSelectorEngine.ts b/packages/injected/src/reactSelectorEngine.ts similarity index 98% rename from packages/playwright-core/src/server/injected/reactSelectorEngine.ts rename to packages/injected/src/reactSelectorEngine.ts index 1a868921df..86896159aa 100644 --- a/packages/playwright-core/src/server/injected/reactSelectorEngine.ts +++ b/packages/injected/src/reactSelectorEngine.ts @@ -14,12 +14,13 @@ * limitations under the License. */ +import { parseAttributeSelector } from '@isomorphic/selectorParser'; + import { isInsideScope } from './domUtils'; import { matchesComponentAttribute } from './selectorUtils'; -import { parseAttributeSelector } from '../../utils/isomorphic/selectorParser'; +import type { Builtins } from '@isomorphic/builtins'; import type { SelectorEngine, SelectorRoot } from './selectorEngine'; -import type { Builtins } from '../../utils/isomorphic/builtins'; type ComponentNode = { key?: any, diff --git a/packages/playwright-core/src/server/injected/recorder/DEPS.list b/packages/injected/src/recorder/DEPS.list similarity index 100% rename from packages/playwright-core/src/server/injected/recorder/DEPS.list rename to packages/injected/src/recorder/DEPS.list diff --git a/packages/playwright-core/src/server/injected/recorder/clipPaths.ts b/packages/injected/src/recorder/clipPaths.ts similarity index 100% rename from packages/playwright-core/src/server/injected/recorder/clipPaths.ts rename to packages/injected/src/recorder/clipPaths.ts diff --git a/packages/playwright-core/src/server/injected/recorder/icons/check.svg b/packages/injected/src/recorder/icons/check.svg similarity index 100% rename from packages/playwright-core/src/server/injected/recorder/icons/check.svg rename to packages/injected/src/recorder/icons/check.svg diff --git a/packages/playwright-core/src/server/injected/recorder/icons/circle-large-filled.svg b/packages/injected/src/recorder/icons/circle-large-filled.svg similarity index 100% rename from packages/playwright-core/src/server/injected/recorder/icons/circle-large-filled.svg rename to packages/injected/src/recorder/icons/circle-large-filled.svg diff --git a/packages/playwright-core/src/server/injected/recorder/icons/close.svg b/packages/injected/src/recorder/icons/close.svg similarity index 100% rename from packages/playwright-core/src/server/injected/recorder/icons/close.svg rename to packages/injected/src/recorder/icons/close.svg diff --git a/packages/playwright-core/src/server/injected/recorder/icons/eye.svg b/packages/injected/src/recorder/icons/eye.svg similarity index 100% rename from packages/playwright-core/src/server/injected/recorder/icons/eye.svg rename to packages/injected/src/recorder/icons/eye.svg diff --git a/packages/playwright-core/src/server/injected/recorder/icons/gist.svg b/packages/injected/src/recorder/icons/gist.svg similarity index 100% rename from packages/playwright-core/src/server/injected/recorder/icons/gist.svg rename to packages/injected/src/recorder/icons/gist.svg diff --git a/packages/playwright-core/src/server/injected/recorder/icons/gripper.svg b/packages/injected/src/recorder/icons/gripper.svg similarity index 100% rename from packages/playwright-core/src/server/injected/recorder/icons/gripper.svg rename to packages/injected/src/recorder/icons/gripper.svg diff --git a/packages/playwright-core/src/server/injected/recorder/icons/inspect.svg b/packages/injected/src/recorder/icons/inspect.svg similarity index 100% rename from packages/playwright-core/src/server/injected/recorder/icons/inspect.svg rename to packages/injected/src/recorder/icons/inspect.svg diff --git a/packages/playwright-core/src/server/injected/recorder/icons/pass.svg b/packages/injected/src/recorder/icons/pass.svg similarity index 100% rename from packages/playwright-core/src/server/injected/recorder/icons/pass.svg rename to packages/injected/src/recorder/icons/pass.svg diff --git a/packages/playwright-core/src/server/injected/recorder/icons/symbol-constant.svg b/packages/injected/src/recorder/icons/symbol-constant.svg similarity index 100% rename from packages/playwright-core/src/server/injected/recorder/icons/symbol-constant.svg rename to packages/injected/src/recorder/icons/symbol-constant.svg diff --git a/packages/playwright-core/src/server/injected/recorder/icons/whole-word.svg b/packages/injected/src/recorder/icons/whole-word.svg similarity index 100% rename from packages/playwright-core/src/server/injected/recorder/icons/whole-word.svg rename to packages/injected/src/recorder/icons/whole-word.svg diff --git a/packages/playwright-core/src/server/injected/recorder/pollingRecorder.ts b/packages/injected/src/recorder/pollingRecorder.ts similarity index 100% rename from packages/playwright-core/src/server/injected/recorder/pollingRecorder.ts rename to packages/injected/src/recorder/pollingRecorder.ts diff --git a/packages/playwright-core/src/server/injected/recorder/recorder.ts b/packages/injected/src/recorder/recorder.ts similarity index 99% rename from packages/playwright-core/src/server/injected/recorder/recorder.ts rename to packages/injected/src/recorder/recorder.ts index eff1c997ef..9294d73167 100644 --- a/packages/playwright-core/src/server/injected/recorder/recorder.ts +++ b/packages/injected/src/recorder/recorder.ts @@ -16,14 +16,14 @@ import clipPaths from './clipPaths'; -import type { Point } from '../../../utils/isomorphic/types'; +import type { Point } from '@isomorphic/types'; import type { Highlight, HighlightEntry } from '../highlight'; import type { InjectedScript } from '../injectedScript'; import type { ElementText } from '../selectorUtils'; import type * as actions from '@recorder/actions'; import type { ElementInfo, Mode, OverlayState, UIState } from '@recorder/recorderTypes'; import type { Language } from '@isomorphic/locatorGenerators'; -import type { Builtins } from '../../../utils/isomorphic/builtins'; +import type { Builtins } from '@isomorphic/builtins'; const HighlightColors = { multiple: '#f6b26b7f', diff --git a/packages/playwright-core/src/server/injected/roleSelectorEngine.ts b/packages/injected/src/roleSelectorEngine.ts similarity index 96% rename from packages/playwright-core/src/server/injected/roleSelectorEngine.ts rename to packages/injected/src/roleSelectorEngine.ts index bbcde562f4..26d663c362 100644 --- a/packages/playwright-core/src/server/injected/roleSelectorEngine.ts +++ b/packages/injected/src/roleSelectorEngine.ts @@ -14,14 +14,15 @@ * limitations under the License. */ +import { parseAttributeSelector } from '@isomorphic/selectorParser'; +import { normalizeWhiteSpace } from '@isomorphic/stringUtils'; + import { beginAriaCaches, endAriaCaches, getAriaChecked, getAriaDisabled, getAriaExpanded, getAriaLevel, getAriaPressed, getAriaRole, getAriaSelected, getElementAccessibleName, isElementHiddenForAria, kAriaCheckedRoles, kAriaExpandedRoles, kAriaLevelRoles, kAriaPressedRoles, kAriaSelectedRoles } from './roleUtils'; import { matchesAttributePart } from './selectorUtils'; -import { parseAttributeSelector } from '../../utils/isomorphic/selectorParser'; -import { normalizeWhiteSpace } from '../../utils/isomorphic/stringUtils'; -import type { Builtins } from '../../utils/isomorphic/builtins'; +import type { Builtins } from '@isomorphic/builtins'; +import type { AttributeSelectorOperator, AttributeSelectorPart } from '@isomorphic/selectorParser'; import type { SelectorEngine, SelectorRoot } from './selectorEngine'; -import type { AttributeSelectorOperator, AttributeSelectorPart } from '../../utils/isomorphic/selectorParser'; type RoleEngineOptions = { role: string; diff --git a/packages/playwright-core/src/server/injected/roleUtils.ts b/packages/injected/src/roleUtils.ts similarity index 99% rename from packages/playwright-core/src/server/injected/roleUtils.ts rename to packages/injected/src/roleUtils.ts index 1da1e522c7..2e4482ca95 100644 --- a/packages/playwright-core/src/server/injected/roleUtils.ts +++ b/packages/injected/src/roleUtils.ts @@ -17,7 +17,7 @@ import { closestCrossShadow, elementSafeTagName, enclosingShadowRootOrDocument, getElementComputedStyle, isElementStyleVisibilityVisible, isVisibleTextNode, parentElementOrShadowHost } from './domUtils'; import type { AriaRole } from '@isomorphic/ariaSnapshot'; -import type { Builtins } from '../../utils/isomorphic/builtins'; +import type { Builtins } from '@isomorphic/builtins'; function hasExplicitAccessibleName(e: Element) { return e.hasAttribute('aria-label') || e.hasAttribute('aria-labelledby'); diff --git a/packages/playwright-core/src/server/injected/selectorEngine.ts b/packages/injected/src/selectorEngine.ts similarity index 100% rename from packages/playwright-core/src/server/injected/selectorEngine.ts rename to packages/injected/src/selectorEngine.ts diff --git a/packages/playwright-core/src/server/injected/selectorEvaluator.ts b/packages/injected/src/selectorEvaluator.ts similarity index 98% rename from packages/playwright-core/src/server/injected/selectorEvaluator.ts rename to packages/injected/src/selectorEvaluator.ts index b470128a93..2f78972fc5 100644 --- a/packages/playwright-core/src/server/injected/selectorEvaluator.ts +++ b/packages/injected/src/selectorEvaluator.ts @@ -14,16 +14,17 @@ * limitations under the License. */ -import { isElementVisible, parentElementOrShadowHost } from './domUtils'; -import { layoutSelectorScore } from './layoutSelectorUtils'; -import { elementMatchesText, elementText, shouldSkipForTextMatching } from './selectorUtils'; -import { customCSSNames } from '../../utils/isomorphic/selectorParser'; -import { normalizeWhiteSpace } from '../../utils/isomorphic/stringUtils'; +import { customCSSNames } from '@isomorphic/selectorParser'; +import { normalizeWhiteSpace } from '@isomorphic/stringUtils'; +import { isElementVisible, parentElementOrShadowHost } from './domUtils'; +import { layoutSelectorScore } from './layoutSelectorUtils'; +import { elementMatchesText, elementText, shouldSkipForTextMatching } from './selectorUtils'; + +import type { Builtins } from '@isomorphic/builtins'; +import type { CSSComplexSelector, CSSComplexSelectorList, CSSFunctionArgument, CSSSimpleSelector } from '@isomorphic/cssParser'; import type { LayoutSelectorName } from './layoutSelectorUtils'; import type { ElementText } from './selectorUtils'; -import type { CSSComplexSelector, CSSComplexSelectorList, CSSFunctionArgument, CSSSimpleSelector } from '../../utils/isomorphic/cssParser'; -import type { Builtins } from '../../utils/isomorphic/builtins'; type QueryContext = { scope: Element | Document; diff --git a/packages/playwright-core/src/server/injected/selectorGenerator.ts b/packages/injected/src/selectorGenerator.ts similarity index 99% rename from packages/playwright-core/src/server/injected/selectorGenerator.ts rename to packages/injected/src/selectorGenerator.ts index 9d46cf2331..9f178768a7 100644 --- a/packages/playwright-core/src/server/injected/selectorGenerator.ts +++ b/packages/injected/src/selectorGenerator.ts @@ -14,13 +14,14 @@ * limitations under the License. */ +import { cssEscape, escapeForAttributeSelector, escapeForTextSelector, escapeRegExp, quoteCSSAttributeValue } from '@isomorphic/stringUtils'; + import { closestCrossShadow, isElementVisible, isInsideScope, parentElementOrShadowHost } from './domUtils'; import { beginAriaCaches, endAriaCaches, getAriaRole, getElementAccessibleName } from './roleUtils'; import { elementText, getElementLabels } from './selectorUtils'; -import { cssEscape, escapeForAttributeSelector, escapeForTextSelector, escapeRegExp, quoteCSSAttributeValue } from '../../utils/isomorphic/stringUtils'; +import type { Builtins } from '@isomorphic/builtins'; import type { InjectedScript } from './injectedScript'; -import type { Builtins } from '../../utils/isomorphic/builtins'; type SelectorToken = { engine: string; diff --git a/packages/playwright-core/src/server/injected/selectorUtils.ts b/packages/injected/src/selectorUtils.ts similarity index 96% rename from packages/playwright-core/src/server/injected/selectorUtils.ts rename to packages/injected/src/selectorUtils.ts index 1410b81413..e7128c6049 100644 --- a/packages/playwright-core/src/server/injected/selectorUtils.ts +++ b/packages/injected/src/selectorUtils.ts @@ -14,11 +14,12 @@ * limitations under the License. */ -import { getAriaLabelledByElements } from './roleUtils'; -import { normalizeWhiteSpace } from '../../utils/isomorphic/stringUtils'; +import { normalizeWhiteSpace } from '@isomorphic/stringUtils'; -import type { AttributeSelectorPart } from '../../utils/isomorphic/selectorParser'; -import type { Builtins } from '../../utils/isomorphic/builtins'; +import { getAriaLabelledByElements } from './roleUtils'; + +import type { Builtins } from '@isomorphic/builtins'; +import type { AttributeSelectorPart } from '@isomorphic/selectorParser'; export function matchesComponentAttribute(obj: any, attr: AttributeSelectorPart) { for (const token of attr.jsonPath) { diff --git a/packages/playwright-core/src/server/injected/utilityScript.ts b/packages/injected/src/utilityScript.ts similarity index 93% rename from packages/playwright-core/src/server/injected/utilityScript.ts rename to packages/injected/src/utilityScript.ts index a66d9ded8b..ffe60dcbc5 100644 --- a/packages/playwright-core/src/server/injected/utilityScript.ts +++ b/packages/injected/src/utilityScript.ts @@ -14,10 +14,10 @@ * limitations under the License. */ -import { ensureBuiltins } from '../../utils/isomorphic/builtins'; -import { source } from '../../utils/isomorphic/utilityScriptSerializers'; +import { ensureBuiltins } from '@isomorphic/builtins'; +import { source } from '@isomorphic/utilityScriptSerializers'; -import type { Builtins } from '../../utils/isomorphic/builtins'; +import type { Builtins } from '@isomorphic/builtins'; export class UtilityScript { constructor(isUnderTest: boolean) { diff --git a/packages/playwright-core/src/server/injected/vueSelectorEngine.ts b/packages/injected/src/vueSelectorEngine.ts similarity index 98% rename from packages/playwright-core/src/server/injected/vueSelectorEngine.ts rename to packages/injected/src/vueSelectorEngine.ts index af928b43a3..8d662aea97 100644 --- a/packages/playwright-core/src/server/injected/vueSelectorEngine.ts +++ b/packages/injected/src/vueSelectorEngine.ts @@ -14,12 +14,13 @@ * limitations under the License. */ +import { parseAttributeSelector } from '@isomorphic/selectorParser'; + import { isInsideScope } from './domUtils'; import { matchesComponentAttribute } from './selectorUtils'; -import { parseAttributeSelector } from '../../utils/isomorphic/selectorParser'; +import type { Builtins } from '@isomorphic/builtins'; import type { SelectorEngine, SelectorRoot } from './selectorEngine'; -import type { Builtins } from '../../utils/isomorphic/builtins'; type ComponentNode = { name: string, diff --git a/packages/playwright-core/src/server/injected/webSocketMock.ts b/packages/injected/src/webSocketMock.ts similarity index 99% rename from packages/playwright-core/src/server/injected/webSocketMock.ts rename to packages/injected/src/webSocketMock.ts index 67bac5e236..2daed84cc7 100644 --- a/packages/playwright-core/src/server/injected/webSocketMock.ts +++ b/packages/injected/src/webSocketMock.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { ensureBuiltins } from '../../utils/isomorphic/builtins'; +import { ensureBuiltins } from '@isomorphic/builtins'; export type WebSocketMessage = string | ArrayBufferLike | Blob | ArrayBufferView; export type WSData = { data: string, isBase64: boolean }; diff --git a/packages/playwright-core/src/server/injected/xpathSelectorEngine.ts b/packages/injected/src/xpathSelectorEngine.ts similarity index 100% rename from packages/playwright-core/src/server/injected/xpathSelectorEngine.ts rename to packages/injected/src/xpathSelectorEngine.ts diff --git a/packages/playwright-core/src/server/injected/yaml.ts b/packages/injected/src/yaml.ts similarity index 100% rename from packages/playwright-core/src/server/injected/yaml.ts rename to packages/injected/src/yaml.ts diff --git a/packages/playwright-core/.npmignore b/packages/playwright-core/.npmignore index c8c43feeb1..e574cbd699 100644 --- a/packages/playwright-core/.npmignore +++ b/packages/playwright-core/.npmignore @@ -12,7 +12,7 @@ !lib/**/*.ttf !lib/utilsBundleImpl/xdg-open # Exclude injected files. A preprocessed version of these is included via lib/generated. -# See src/server/injected/README.md. +# See packages/injected/src/README.md. lib/**/injected/ # Include all binaries that we ship with the package. !bin/**/* diff --git a/packages/playwright-core/src/server/DEPS.list b/packages/playwright-core/src/server/DEPS.list index fa67d86bed..724f460fbf 100644 --- a/packages/playwright-core/src/server/DEPS.list +++ b/packages/playwright-core/src/server/DEPS.list @@ -6,7 +6,6 @@ ../utilsBundle.ts ../zipBundle.ts ./ -./injected/ ./isomorphic/ ./har/ ./recorder/ diff --git a/packages/playwright-core/src/server/dispatchers/webSocketRouteDispatcher.ts b/packages/playwright-core/src/server/dispatchers/webSocketRouteDispatcher.ts index b85aae5b3f..c56102c625 100644 --- a/packages/playwright-core/src/server/dispatchers/webSocketRouteDispatcher.ts +++ b/packages/playwright-core/src/server/dispatchers/webSocketRouteDispatcher.ts @@ -25,7 +25,7 @@ import { eventsHelper } from '../utils/eventsHelper'; import type { BrowserContextDispatcher } from './browserContextDispatcher'; import type { BrowserContext } from '../browserContext'; import type { Frame } from '../frames'; -import type * as ws from '../injected/webSocketMock'; +import type * as ws from '@injected/webSocketMock'; import type * as channels from '@protocol/channels'; export class WebSocketRouteDispatcher extends Dispatcher<{ guid: string }, channels.WebSocketRouteChannel, PageDispatcher | BrowserContextDispatcher> implements channels.WebSocketRouteChannel { diff --git a/packages/playwright-core/src/server/dom.ts b/packages/playwright-core/src/server/dom.ts index fbea38b814..610daa2381 100644 --- a/packages/playwright-core/src/server/dom.ts +++ b/packages/playwright-core/src/server/dom.ts @@ -24,7 +24,7 @@ import { isSessionClosedError } from './protocolError'; import * as injectedScriptSource from '../generated/injectedScriptSource'; import type * as frames from './frames'; -import type { ElementState, HitTargetInterceptionResult, InjectedScript } from './injected/injectedScript'; +import type { ElementState, HitTargetInterceptionResult, InjectedScript } from '@injected/injectedScript'; import type { CallMetadata } from './instrumentation'; import type { Page } from './page'; import type { Progress } from './progress'; diff --git a/packages/playwright-core/src/server/frameSelectors.ts b/packages/playwright-core/src/server/frameSelectors.ts index c375b0b52a..14e0774ed0 100644 --- a/packages/playwright-core/src/server/frameSelectors.ts +++ b/packages/playwright-core/src/server/frameSelectors.ts @@ -19,7 +19,7 @@ import { InvalidSelectorError, splitSelectorByFrame, stringifySelector, visitAl import type { ElementHandle, FrameExecutionContext } from './dom'; import type { Frame } from './frames'; -import type { InjectedScript } from './injected/injectedScript'; +import type { InjectedScript } from '@injected/injectedScript'; import type { JSHandle } from './javascript'; import type * as types from './types'; import type { ParsedSelector } from '../utils/isomorphic/selectorParser'; diff --git a/packages/playwright-core/src/server/frames.ts b/packages/playwright-core/src/server/frames.ts index d1e97d9194..1ca9d26edb 100644 --- a/packages/playwright-core/src/server/frames.ts +++ b/packages/playwright-core/src/server/frames.ts @@ -37,7 +37,7 @@ import { compressCallLog } from './callLog'; import type { ConsoleMessage } from './console'; import type { Dialog } from './dialog'; -import type { ElementStateWithoutStable, FrameExpectParams, InjectedScript } from './injected/injectedScript'; +import type { ElementStateWithoutStable, FrameExpectParams, InjectedScript } from '@injected/injectedScript'; import type { CallMetadata } from './instrumentation'; import type { Progress } from './progress'; import type { ScreenshotOptions } from './screenshotter'; diff --git a/packages/playwright-core/src/server/injected/README.md b/packages/playwright-core/src/server/injected/README.md deleted file mode 100644 index 6f04dbcd29..0000000000 --- a/packages/playwright-core/src/server/injected/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Injected - -This directory contains helper sources which are injected into the page. - -These sources are bundled with webpack to `src/generated` to be used as a compile-time source constants. See `*.webpack.config.js` for configs. diff --git a/packages/playwright-core/src/server/javascript.ts b/packages/playwright-core/src/server/javascript.ts index b6cea5d6af..068969ea5e 100644 --- a/packages/playwright-core/src/server/javascript.ts +++ b/packages/playwright-core/src/server/javascript.ts @@ -22,7 +22,7 @@ import { source } from '../utils/isomorphic/utilityScriptSerializers'; import { LongStandingScope } from '../utils/isomorphic/manualPromise'; import type * as dom from './dom'; -import type { UtilityScript } from './injected/utilityScript'; +import type { UtilityScript } from '@injected/utilityScript'; interface TaggedAsJSHandle { __jshandle: T; diff --git a/packages/trace-viewer/tsconfig.json b/packages/trace-viewer/tsconfig.json index fd0046d7b5..f2303555a1 100644 --- a/packages/trace-viewer/tsconfig.json +++ b/packages/trace-viewer/tsconfig.json @@ -16,7 +16,7 @@ "jsx": "react-jsx", "baseUrl": ".", "paths": { - "@injected/*": ["../playwright-core/src/server/injected/*"], + "@injected/*": ["../injected/src/*"], "@isomorphic/*": ["../playwright-core/src/utils/isomorphic/*"], "@protocol/*": ["../protocol/src/*"], "@recorder/*": ["../recorder/src/*"], diff --git a/packages/trace-viewer/vite.config.ts b/packages/trace-viewer/vite.config.ts index 0f7615149a..071cfee623 100644 --- a/packages/trace-viewer/vite.config.ts +++ b/packages/trace-viewer/vite.config.ts @@ -33,7 +33,7 @@ export default defineConfig({ }, resolve: { alias: { - '@injected': path.resolve(__dirname, '../playwright-core/src/server/injected'), + '@injected': path.resolve(__dirname, '../injected/src'), '@isomorphic': path.resolve(__dirname, '../playwright-core/src/utils/isomorphic'), '@protocol': path.resolve(__dirname, '../protocol/src'), '@testIsomorphic': path.resolve(__dirname, '../playwright/src/isomorphic'), diff --git a/tests/library/unit/clock.spec.ts b/tests/library/unit/clock.spec.ts index 18a0db8212..e31e0693ea 100644 --- a/tests/library/unit/clock.spec.ts +++ b/tests/library/unit/clock.spec.ts @@ -15,8 +15,8 @@ */ import { test, expect } from '@playwright/test'; -import { createClock as rawCreateClock, install as rawInstall } from '../../../packages/playwright-core/src/server/injected/clock'; -import type { InstallConfig, ClockController, ClockMethods } from '../../../packages/playwright-core/src/server/injected/clock'; +import { createClock as rawCreateClock, install as rawInstall } from '../../../packages/injected/src/clock'; +import type { InstallConfig, ClockController, ClockMethods } from '../../../packages/injected/src/clock'; const createClock = (now?: number): ClockController & ClockMethods => { const { clock, api } = rawCreateClock(globalThis); diff --git a/tsconfig.json b/tsconfig.json index acb0e0d63d..1fb09a13a0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -11,7 +11,7 @@ - .../lib/* means require dependency */ "@html-reporter/*": ["./packages/html-reporter/src/*"], - "@injected/*": ["./packages/playwright-core/src/server/injected/*"], + "@injected/*": ["./packages/injected/src/*"], "@isomorphic/*": ["./packages/playwright-core/src/utils/isomorphic/*"], "@protocol/*": ["./packages/protocol/src/*"], "@recorder/*": ["./packages/recorder/src/*"], diff --git a/utils/build/build.js b/utils/build/build.js index 9e1fdfbe69..175055a838 100644 --- a/utils/build/build.js +++ b/utils/build/build.js @@ -255,7 +255,6 @@ for (const pkg of workspace.packages()) { ...(withSourceMaps ? ['--source-maps'] : []), '--extensions', '.ts', '--out-dir', quotePath(path.join(pkg.path, 'lib')), - '--ignore', '"packages/playwright-core/src/server/injected/**/*"', quotePath(path.join(pkg.path, 'src')), ], shell: true, @@ -370,7 +369,7 @@ if (watchMode) { // Generate injected. onChanges.push({ inputs: [ - 'packages/playwright-core/src/server/injected/**', + 'packages/injected/src/**', 'packages/playwright-core/src/third_party/**', 'packages/playwright-ct-core/src/injected/**', 'packages/playwright-core/src/utils/isomorphic/**', diff --git a/utils/check_deps.js b/utils/check_deps.js index 79eca03062..4a14aad616 100644 --- a/utils/check_deps.js +++ b/utils/check_deps.js @@ -27,7 +27,7 @@ const packagesDir = path.resolve(path.join(__dirname, '..', 'packages')); const packages = new Map(); packages.set('web', packagesDir + '/web/src/'); -packages.set('injected', packagesDir + '/playwright-core/src/server/injected/'); +packages.set('injected', packagesDir + '/injected/src/'); packages.set('isomorphic', packagesDir + '/playwright-core/src/utils/isomorphic/'); packages.set('testIsomorphic', packagesDir + '/playwright/src/isomorphic/'); @@ -43,6 +43,7 @@ async function checkDeps() { await innerCheckDeps(path.join(packagesDir, 'trace-viewer')); await innerCheckDeps(path.join(packagesDir, 'trace')); await innerCheckDeps(path.join(packagesDir, 'web')); + await innerCheckDeps(path.join(packagesDir, 'injected')); const corePackageJson = await innerCheckDeps(path.join(packagesDir, 'playwright-core')); const playwrightPackageJson = await innerCheckDeps(path.join(packagesDir, 'playwright')); diff --git a/utils/generate_clip_paths.js b/utils/generate_clip_paths.js index 184b71d36a..210a840581 100644 --- a/utils/generate_clip_paths.js +++ b/utils/generate_clip_paths.js @@ -51,8 +51,8 @@ const HEADER = `/* import type { SvgJson } from './recorder'; `; -const iconsDir = path.join(ROOT, 'packages', 'playwright-core', 'src', 'server', 'injected', 'recorder', 'icons'); -const outFile = path.join(ROOT, 'packages', 'playwright-core', 'src', 'server', 'injected', 'recorder', 'clipPaths.ts'); +const iconsDir = path.join(ROOT, 'packages', 'injected', 'src', 'recorder', 'icons'); +const outFile = path.join(ROOT, 'packages', 'injected', 'src', 'recorder', 'clipPaths.ts'); const iconNames = [ 'gripper', diff --git a/utils/generate_injected.js b/utils/generate_injected.js index bffef1cfaa..839d7b486b 100644 --- a/utils/generate_injected.js +++ b/utils/generate_injected.js @@ -27,37 +27,37 @@ const esbuild = require('esbuild'); */ const injectedScripts = [ [ - path.join(ROOT, 'packages', 'playwright-core', 'src', 'server', 'injected', 'utilityScript.ts'), + path.join(ROOT, 'packages', 'injected', 'src', 'utilityScript.ts'), path.join(ROOT, 'packages', 'playwright-core', 'lib', 'server', 'injected', 'packed'), path.join(ROOT, 'packages', 'playwright-core', 'src', 'generated'), true, ], [ - path.join(ROOT, 'packages', 'playwright-core', 'src', 'server', 'injected', 'injectedScript.ts'), + path.join(ROOT, 'packages', 'injected', 'src', 'injectedScript.ts'), path.join(ROOT, 'packages', 'playwright-core', 'lib', 'server', 'injected', 'packed'), path.join(ROOT, 'packages', 'playwright-core', 'src', 'generated'), true, ], [ - path.join(ROOT, 'packages', 'playwright-core', 'src', 'server', 'injected', 'consoleApi.ts'), + path.join(ROOT, 'packages', 'injected', 'src', 'consoleApi.ts'), path.join(ROOT, 'packages', 'playwright-core', 'lib', 'server', 'injected', 'packed'), path.join(ROOT, 'packages', 'playwright-core', 'src', 'generated'), true, ], [ - path.join(ROOT, 'packages', 'playwright-core', 'src', 'server', 'injected', 'recorder', 'pollingRecorder.ts'), + path.join(ROOT, 'packages', 'injected', 'src', 'recorder', 'pollingRecorder.ts'), path.join(ROOT, 'packages', 'playwright-core', 'lib', 'server', 'injected', 'packed'), path.join(ROOT, 'packages', 'playwright-core', 'src', 'generated'), true, ], [ - path.join(ROOT, 'packages', 'playwright-core', 'src', 'server', 'injected', 'clock.ts'), + path.join(ROOT, 'packages', 'injected', 'src', 'clock.ts'), path.join(ROOT, 'packages', 'playwright-core', 'lib', 'server', 'injected', 'packed'), path.join(ROOT, 'packages', 'playwright-core', 'src', 'generated'), true, ], [ - path.join(ROOT, 'packages', 'playwright-core', 'src', 'server', 'injected', 'webSocketMock.ts'), + path.join(ROOT, 'packages', 'injected', 'src', 'webSocketMock.ts'), path.join(ROOT, 'packages', 'playwright-core', 'lib', 'server', 'injected', 'packed'), path.join(ROOT, 'packages', 'playwright-core', 'src', 'generated'), true,