@@ -20,6 +20,7 @@ const { BrowsingContextInfo } = require('./browsingContextTypes')
2020const { SerializationOptions, ReferenceValue, RemoteValue } = require ( './protocolValue' )
2121const { WebElement } = require ( '../lib/webdriver' )
2222const { CaptureScreenshotParameters } = require ( './captureScreenshotParameters' )
23+ const { CreateContextParameters } = require ( './createContextParameters' )
2324
2425class Locator {
2526 static Type = Object . freeze ( {
@@ -79,34 +80,53 @@ class BrowsingContext {
7980 return this . _id
8081 }
8182
82- async init ( { browsingContextId, type, referenceContext } ) {
83+ async init ( { browsingContextId = undefined , type = undefined , createParameters = undefined } ) {
8384 if ( ! ( await this . _driver . getCapabilities ( ) ) . get ( 'webSocketUrl' ) ) {
8485 throw Error ( 'WebDriver instance must support BiDi protocol' )
8586 }
8687
88+ if ( browsingContextId === undefined && type === undefined && createParameters === undefined ) {
89+ throw Error ( 'Either BrowsingContextId or Type or CreateParameters must be provided' )
90+ }
91+
92+ if ( type === undefined && createParameters !== undefined ) {
93+ throw Error ( 'Type must be provided with CreateParameters' )
94+ }
95+
8796 if ( type !== undefined && ! [ 'window' , 'tab' ] . includes ( type ) ) {
8897 throw Error ( `Valid types are 'window' & 'tab'. Received: ${ type } ` )
8998 }
9099
91100 this . bidi = await this . _driver . getBidi ( )
92101 this . _id =
93102 browsingContextId === undefined
94- ? ( await this . create ( type , referenceContext ) ) [ 'result' ] [ 'context' ]
103+ ? ( await this . create ( type , createParameters ) ) [ 'result' ] [ 'context' ]
95104 : browsingContextId
96105 }
97106
98107 /**
99- * Creates a browsing context for the given type and referenceContext
108+ * Creates a browsing context for the given type with the given parameters
100109 */
101- async create ( type , referenceContext ) {
110+ async create ( type , createParameters = undefined ) {
111+ if ( createParameters !== undefined && ( ! createParameters ) instanceof CreateContextParameters ) {
112+ throw Error ( `Pass in the instance of CreateContextParameters. Received: ${ createParameters } ` )
113+ }
114+
115+ let parameters = new Map ( )
116+ parameters . set ( 'type' , type )
117+
118+ if ( createParameters !== undefined ) {
119+ createParameters . asMap ( ) . forEach ( ( value , key ) => {
120+ parameters . set ( key , value )
121+ } )
122+ }
123+
102124 const params = {
103125 method : 'browsingContext.create' ,
104- params : {
105- type : type ,
106- referenceContext : referenceContext ,
107- } ,
126+ params : Object . fromEntries ( parameters ) ,
108127 }
109- return await this . bidi . send ( params )
128+ const res = await this . bidi . send ( params )
129+ return res
110130 }
111131
112132 /**
@@ -484,12 +504,15 @@ class PrintResult {
484504 * @param driver
485505 * @param browsingContextId The browsing context of current window/tab
486506 * @param type "window" or "tab"
487- * @param referenceContext To get a browsing context for this reference if passed
507+ * @param createParameters The parameters for creating a new browsing context
488508 * @returns {Promise<BrowsingContext> }
489509 */
490- async function getBrowsingContextInstance ( driver , { browsingContextId, type, referenceContext } ) {
510+ async function getBrowsingContextInstance (
511+ driver ,
512+ { browsingContextId = undefined , type = undefined , createParameters = undefined } ,
513+ ) {
491514 let instance = new BrowsingContext ( driver )
492- await instance . init ( { browsingContextId, type, referenceContext } )
515+ await instance . init ( { browsingContextId, type, createParameters } )
493516 return instance
494517}
495518
0 commit comments