mirror of
https://github.com/cypress-io/cypress.git
synced 2026-04-23 23:49:43 -05:00
0547d65a2a
* remove experimentalSkipDomainInjection, add and deprecate injectDocumentDomain * remove experimentalSkipDomainInjection, add injectDocumentDomain * begin rethreading domain injection * complete document domain transition * move some cookie specs to separate test run * origin and privileged commands with default docdom inject * fix privileged channel when injecting document domain * rm unnecessary .getOrigin abstraction in cors lib * move remote-states in prep for refactor Replace Conditional with Polymorphism * refactor remote states to strategy pattern * cookie commands work as expected w cross origin bridge on different origins * some origin tests updated * run tests with document domain enabled * run tests actually * use correct config, swap conditional * check-ts * inject documetn domain for webkit tests * do not exec injectDocumetnDomain in parallel * fix ServerBase construction in tests to include cfg now * pass cfg to ServerBase * improved integration tests * remove document domain checks for all server integration specs - will add injectDocumentDomain cases * tests for injecting document domain when configured to * square away server integration tests * ensure cookies are set correctly, potentially * errors pkg snapshots * fix config tests * fixing config tests * somewhat improves tests for cors policies in packages/network * fix ts err in server-base * enable injectDocumentDomain for cy in cy tests * fix Policy type ref * refactor cypress-schematic ct spec to be less prone to timeouts * run vite-dev-server tests with injectDocumentDomain * rm document domain assertion from page_loading system test * add system tests that test with injectDocumentDomain and others that test with cy.origin * fix results_spec snapshot * update experimentalSkipDomainInjection system test * different behavior for certain net_stubbing tests based on injectDocumentDomain or not * fix ts * extract origin key logic from remote states, for now * move server-base and response-middleware over to new pattern * WIP - reentry * fix build, remove console.log * check-ts * fix spec frame injection * remove injection for localhost * mostly fix vite-dev-server app integration tests * fix codeframe in certain cases in chrome * drop internal stack frames from stacks intended for determining code frame data * some improvements to vite ct error codeframes * fix proxy unit tests to use document domain injection util class * rm .only * fix all vite ct error specs * rm console.log * slight refactor to util class to make easier to test * fix refactor - missing rename in files.js * several tests do not set testingtype in config, so just check against component instead of checking for e2e * revert changes to getInvocationDetails to see if that breaks tests * re-enable stack stripping in invocation details for chrome * new snapshots with more accurate invocation details * test for same-site cross-origin cookie behavior * ignore window.top ts errors * revert forcing injectDocumentDomain in vite-dev-server cy config * fix normalized whitespace for firefox "loading_failed" error * always trim trailing wsp from stack before appending additional content * force normalization of whitespace to three \n when adding additional stack details * normalize wsp between stack and additional stack to "\n \n" in firefox * remove stack_utils attempt at normalizing wsp * various cleanup: remove commented console logs, add more detailed comments * add on links to error messages * remove experimentalSkipDomainInjection from exported type defs * Update system-tests/test/experimental_skip_domain_injection_spec.ts Co-authored-by: Bill Glesias <bglesias@gmail.com> * Update packages/driver/cypress/e2e/e2e/origin/cookie_misc.cy.ts Co-authored-by: Bill Glesias <bglesias@gmail.com> * no need to coerce a boolean value to a booleanc * export base config from primary cypress config in driver for use in inject-document-domain test subset * lift experimentalSkipDomainInjection breaking option to root * rollback config/options changes * rm invalid comment * use hostname instead of origin to create cookie from automation cookie * clarify stack regex in results_spec * lint * take a stab at the changelog entries for this * Update cli/CHANGELOG.md Co-authored-by: Ryan Manuel <ryanm@cypress.io> * Update cli/CHANGELOG.md Co-authored-by: Ryan Manuel <ryanm@cypress.io> * reenable locally-failing test * changelog * snapshot updatesfor experimental skip domain injection err msg * remove packageManager declaration in package.json --------- Co-authored-by: Bill Glesias <bglesias@gmail.com> Co-authored-by: Jennifer Shehane <jennifer@cypress.io> Co-authored-by: Ryan Manuel <ryanm@cypress.io>
86 lines
3.5 KiB
TypeScript
86 lines
3.5 KiB
TypeScript
/*
|
|
utility to help determine if document.domain should be injected, or related logic invoked
|
|
this class isn't necessarily network related, but it is used from a wide ranging number
|
|
of packages. It should probably be its own ./package. for now, it's sort of a facade for all
|
|
of this logic, which should help inform a subsequent refactor strategy.
|
|
|
|
behaviors controlled:
|
|
- how to key origins of RemoteStates (server/lib/remote_states)
|
|
- whether to inject document.domain in the server render of top (server/lib/controllers/files)
|
|
- whether to inject document.domain in proxied files (proxy/lib/http/response-middleware)
|
|
- how to verify stack traces of privileged commands in chrome
|
|
*/
|
|
import Debug from 'debug'
|
|
import { isString, isEqual } from 'lodash'
|
|
import { getSuperDomainOrigin, getSuperDomain, parseUrlIntoHostProtocolDomainTldPort } from './cors'
|
|
import type { ParsedHostWithProtocolAndHost } from './types'
|
|
|
|
const debug = Debug('cypress:network:document-domain-injection')
|
|
|
|
export abstract class DocumentDomainInjection {
|
|
public static InjectionBehavior (config: { injectDocumentDomain?: boolean, testingType?: 'e2e' | 'component'}): DocumentDomainInjection {
|
|
debug('Determining injection behavior for config values: %o', {
|
|
injectDocumentDomain: config.injectDocumentDomain,
|
|
testingType: config.testingType,
|
|
})
|
|
|
|
if (config.injectDocumentDomain && config.testingType !== 'component') {
|
|
debug('Returning document domain injection behavior')
|
|
|
|
return new DocumentDomainBehavior()
|
|
}
|
|
|
|
debug('Returning origin behavior - no document domain injection')
|
|
|
|
return new OriginBehavior()
|
|
}
|
|
|
|
public abstract getOrigin (url: string): string
|
|
public abstract getHostname (url: string): string
|
|
public abstract urlsMatch (frameUrl: string | ParsedHostWithProtocolAndHost, topUrl: string | ParsedHostWithProtocolAndHost): boolean
|
|
public abstract shouldInjectDocumentDomain (url: string | undefined): boolean
|
|
}
|
|
|
|
export class DocumentDomainBehavior implements DocumentDomainInjection {
|
|
public getOrigin (url: string) {
|
|
return getSuperDomainOrigin(url)
|
|
}
|
|
public getHostname (url: string): string {
|
|
return getSuperDomain(url)
|
|
}
|
|
public urlsMatch (frameUrl: string | ParsedHostWithProtocolAndHost, topUrl: string | ParsedHostWithProtocolAndHost): boolean {
|
|
const frameProps = isString(frameUrl) ? parseUrlIntoHostProtocolDomainTldPort(frameUrl) : frameUrl
|
|
const topProps = isString(topUrl) ? parseUrlIntoHostProtocolDomainTldPort(topUrl) : topUrl
|
|
|
|
const { subdomain: frameSubdomain, ...parsedFrameUrl } = frameProps
|
|
const { subdomain: topSubdomain, ...parsedTopUrl } = topProps
|
|
|
|
return isEqual(parsedFrameUrl, parsedTopUrl)
|
|
}
|
|
public shouldInjectDocumentDomain (url: string | undefined) {
|
|
debug('document-domain behavior: should inject document domain -> true')
|
|
|
|
return !!url
|
|
}
|
|
}
|
|
|
|
export class OriginBehavior implements DocumentDomainInjection {
|
|
public getOrigin (url: string) {
|
|
return new URL(url).origin
|
|
}
|
|
public getHostname (url: string): string {
|
|
return new URL(url).hostname
|
|
}
|
|
public urlsMatch (frameUrl: string | ParsedHostWithProtocolAndHost, topUrl: string | ParsedHostWithProtocolAndHost): boolean {
|
|
const frameProps = isString(frameUrl) ? parseUrlIntoHostProtocolDomainTldPort(frameUrl) : frameUrl
|
|
const topProps = isString(topUrl) ? parseUrlIntoHostProtocolDomainTldPort(topUrl) : topUrl
|
|
|
|
return isEqual(frameProps, topProps)
|
|
}
|
|
public shouldInjectDocumentDomain (url: string | undefined) {
|
|
debug('origin-behavior: should inject document domain -> false')
|
|
|
|
return false
|
|
}
|
|
}
|