@@ -8,6 +8,7 @@ import Interception from './index.js'
88import type { Matches , MockOverwrite , MockResponseParams } from './types.js'
99import { containsHeaderObject } from '../index.js'
1010import { ERROR_REASON } from '../../constants.js'
11+ import { CDP_SESSIONS , SESSION_MOCKS } from '../../commands/browser/mock.js'
1112
1213const log = logger ( 'webdriverio' )
1314
@@ -31,6 +32,8 @@ type Event = {
3132type ExpectParameter < T > = ( ( param : T ) => boolean ) | T ;
3233
3334export default class DevtoolsInterception extends Interception {
35+ private restored = false
36+
3437 static handleRequestInterception ( client : CDPSession , mocks : Set < Interception > ) : ( event : Event ) => Promise < void | ClientResponse > {
3538 return async ( event ) => {
3639 // responseHeaders and responseStatusCode are only present in Response stage
@@ -220,10 +223,27 @@ export default class DevtoolsInterception extends Interception {
220223 /**
221224 * Does everything that `mock.clear()` does, and also
222225 * removes any mocked return values or implementations.
226+ * Restored mock does not emit events and could not mock responses
223227 */
224- restore ( ) {
228+ async restore ( sessionMocks = SESSION_MOCKS , cdpSessions = CDP_SESSIONS ) {
225229 this . clear ( )
226230 this . respondOverwrites = [ ]
231+ this . restored = true
232+ const handle = await this . browser . getWindowHandle ( )
233+
234+ log . trace ( `Restoring mock for ${ handle } ` )
235+ sessionMocks [ handle ] . delete ( this )
236+
237+ if ( sessionMocks [ handle ] . size ) {
238+ return
239+ }
240+
241+ log . trace ( `Disabling fetch domain for ${ handle } ` )
242+ return cdpSessions [ handle ] . send ( 'Fetch.disable' )
243+ . then ( ( ) => {
244+ delete sessionMocks [ handle ]
245+ delete cdpSessions [ handle ]
246+ } ) . catch ( /* istanbul ignore next */ logFetchError )
227247 }
228248
229249 /**
@@ -232,6 +252,7 @@ export default class DevtoolsInterception extends Interception {
232252 * @param {* } params additional respond parameters to overwrite
233253 */
234254 respond ( overwrite : MockOverwrite , params : MockResponseParams = { } ) {
255+ this . ensureNotRestored ( )
235256 this . respondOverwrites . push ( { overwrite, params, sticky : true } )
236257 }
237258
@@ -241,6 +262,7 @@ export default class DevtoolsInterception extends Interception {
241262 * @param {* } params additional respond parameters to overwrite
242263 */
243264 respondOnce ( overwrite : MockOverwrite , params : MockResponseParams = { } ) {
265+ this . ensureNotRestored ( )
244266 this . respondOverwrites . push ( { overwrite, params } )
245267 }
246268
@@ -249,6 +271,7 @@ export default class DevtoolsInterception extends Interception {
249271 * @param {string } errorCode error code of the response
250272 */
251273 abort ( errorReason : Protocol . Network . ErrorReason , sticky : boolean = true ) {
274+ this . ensureNotRestored ( )
252275 if ( typeof errorReason !== 'string' || ! ERROR_REASON . includes ( errorReason ) ) {
253276 throw new Error ( `Invalid value for errorReason, allowed are: ${ ERROR_REASON . join ( ', ' ) } ` )
254277 }
@@ -262,6 +285,12 @@ export default class DevtoolsInterception extends Interception {
262285 abortOnce ( errorReason : Protocol . Network . ErrorReason ) {
263286 this . abort ( errorReason , false )
264287 }
288+
289+ private ensureNotRestored ( ) {
290+ if ( this . restored ) {
291+ throw new Error ( 'This can\'t be done on restored mock' )
292+ }
293+ }
265294}
266295
267296const filterMethod = ( method : string , expected ?: ExpectParameter < string > ) => {
0 commit comments