Skip to content
This repository was archived by the owner on Jan 30, 2025. It is now read-only.

Commit 7987816

Browse files
committed
Add more checks for getting execution contexts
Resolves #129 (comment) Resolves #129 (comment)
1 parent 48f591c commit 7987816

File tree

2 files changed

+40
-23
lines changed

2 files changed

+40
-23
lines changed

common/browser.go

Lines changed: 30 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -198,76 +198,84 @@ func (b *Browser) initEvents() error {
198198
}
199199

200200
func (b *Browser) onAttachedToTarget(ev *target.EventAttachedToTarget) {
201+
evti := ev.TargetInfo
202+
201203
b.contextsMu.RLock()
202204
browserCtx := b.defaultContext
203-
bctx, ok := b.contexts[ev.TargetInfo.BrowserContextID]
205+
bctx, ok := b.contexts[evti.BrowserContextID]
204206
if ok {
205207
browserCtx = bctx
206208
}
207-
b.logger.Debugf("Browser:onAttachedToTarget", "sid:%v tid:%v bctxid:%v bctx nil:%t", ev.SessionID, ev.TargetInfo.TargetID, ev.TargetInfo.BrowserContextID, bctx == nil)
208209
b.contextsMu.RUnlock()
209210

211+
b.logger.Debugf("Browser:onAttachedToTarget", "sid:%v tid:%v bctxid:%v bctx nil:%t",
212+
ev.SessionID, evti.TargetID, evti.BrowserContextID, browserCtx == nil)
213+
210214
// We're not interested in the top-level browser target, other targets or DevTools targets right now.
211-
isDevTools := strings.HasPrefix(ev.TargetInfo.URL, "devtools://devtools")
212-
if ev.TargetInfo.Type == "browser" || ev.TargetInfo.Type == "other" || isDevTools {
213-
b.logger.Debugf("Browser:onAttachedToTarget:return", "sid:%v tid:%v (devtools)", ev.SessionID, ev.TargetInfo.TargetID)
215+
isDevTools := strings.HasPrefix(evti.URL, "devtools://devtools")
216+
if evti.Type == "browser" || evti.Type == "other" || isDevTools {
217+
b.logger.Debugf("Browser:onAttachedToTarget:return", "sid:%v tid:%v (devtools)", ev.SessionID, evti.TargetID)
214218
return
215219
}
216220

217-
switch ev.TargetInfo.Type {
221+
switch evti.Type {
218222
case "background_page":
219-
p, err := NewPage(b.ctx, b.conn.getSession(ev.SessionID), browserCtx, ev.TargetInfo.TargetID, nil, false, b.logger)
223+
p, err := NewPage(b.ctx, b.conn.getSession(ev.SessionID), browserCtx, evti.TargetID, nil, false, b.logger)
220224
if err != nil {
221225
isRunning := atomic.LoadInt64(&b.state) == BrowserStateOpen && b.IsConnected() //b.conn.isConnected()
222226
if _, ok := err.(*websocket.CloseError); !ok && !isRunning {
223227
// If we're no longer connected to browser, then ignore WebSocket errors
224228
b.logger.Debugf("Browser:onAttachedToTarget:background_page:return", "sid:%v tid:%v websocket err:%v",
225-
ev.SessionID, ev.TargetInfo.TargetID, err)
229+
ev.SessionID, evti.TargetID, err)
226230
return
227231
}
228232
k6Throw(b.ctx, "cannot create NewPage for background_page event: %w", err)
229233
}
230234

231235
b.pagesMu.Lock()
232-
b.logger.Debugf("Browser:onAttachedToTarget:background_page:addTid", "sid:%v tid:%v", ev.SessionID, ev.TargetInfo.TargetID)
233-
b.pages[ev.TargetInfo.TargetID] = p
236+
b.logger.Debugf("Browser:onAttachedToTarget:background_page:addTid", "sid:%v tid:%v", ev.SessionID, evti.TargetID)
237+
b.pages[evti.TargetID] = p
234238
b.pagesMu.Unlock()
235239

236240
b.sessionIDtoTargetIDMu.Lock()
237-
b.logger.Debugf("Browser:onAttachedToTarget:background_page:addSid", "sid:%v tid:%v", ev.SessionID, ev.TargetInfo.TargetID)
238-
b.sessionIDtoTargetID[ev.SessionID] = ev.TargetInfo.TargetID
241+
b.logger.Debugf("Browser:onAttachedToTarget:background_page:addSid", "sid:%v tid:%v", ev.SessionID, evti.TargetID)
242+
b.sessionIDtoTargetID[ev.SessionID] = evti.TargetID
239243
b.sessionIDtoTargetIDMu.Unlock()
240244
case "page":
241245
var opener *Page = nil
242246
b.pagesMu.RLock()
243-
if t, ok := b.pages[ev.TargetInfo.OpenerID]; ok {
247+
if t, ok := b.pages[evti.OpenerID]; ok {
244248
opener = t
245249
}
246-
b.logger.Debugf("Browser:onAttachedToTarget:page", "sid:%v tid:%v opener nil:%t", ev.SessionID, ev.TargetInfo.TargetID, opener == nil)
250+
b.logger.Debugf("Browser:onAttachedToTarget:page", "sid:%v tid:%v opener nil:%t", ev.SessionID, evti.TargetID, opener == nil)
247251
b.pagesMu.RUnlock()
248-
p, err := NewPage(b.ctx, b.conn.getSession(ev.SessionID), browserCtx, ev.TargetInfo.TargetID, opener, true, b.logger)
252+
253+
p, err := NewPage(b.ctx, b.conn.getSession(ev.SessionID), browserCtx, evti.TargetID, opener, true, b.logger)
249254
if err != nil {
250255
isRunning := atomic.LoadInt64(&b.state) == BrowserStateOpen && b.IsConnected() //b.conn.isConnected()
251256
if _, ok := err.(*websocket.CloseError); !ok && !isRunning {
252257
// If we're no longer connected to browser, then ignore WebSocket errors
253-
b.logger.Debugf("Browser:onAttachedToTarget:page:return", "sid:%v tid:%v websocket err:", ev.SessionID, ev.TargetInfo.TargetID)
258+
b.logger.Debugf("Browser:onAttachedToTarget:page:return", "sid:%v tid:%v websocket err:", ev.SessionID, evti.TargetID)
254259
return
255260
}
256261
k6Throw(b.ctx, "cannot create NewPage for page event: %w", err)
257262
}
263+
258264
b.pagesMu.Lock()
259-
b.logger.Debugf("Browser:onAttachedToTarget:page:addTarget", "sid:%v tid:%v", ev.SessionID, ev.TargetInfo.TargetID)
260-
b.pages[ev.TargetInfo.TargetID] = p
265+
b.logger.Debugf("Browser:onAttachedToTarget:page:addTarget", "sid:%v tid:%v", ev.SessionID, evti.TargetID)
266+
b.pages[evti.TargetID] = p
261267
b.pagesMu.Unlock()
268+
262269
b.sessionIDtoTargetIDMu.Lock()
263-
b.logger.Debugf("Browser:onAttachedToTarget:page:sidToTid", "sid:%v tid:%v", ev.SessionID, ev.TargetInfo.TargetID)
264-
b.sessionIDtoTargetID[ev.SessionID] = ev.TargetInfo.TargetID
270+
b.logger.Debugf("Browser:onAttachedToTarget:page:sidToTid", "sid:%v tid:%v", ev.SessionID, evti.TargetID)
271+
b.sessionIDtoTargetID[ev.SessionID] = evti.TargetID
265272
b.sessionIDtoTargetIDMu.Unlock()
273+
266274
browserCtx.emit(EventBrowserContextPage, p)
267275
default:
268276
b.logger.Warnf(
269-
"Browser:onAttachedToTarget", "sid:%v tid:%v bctxid:%v bctx nil:%t, warning: unknownTargetType",
270-
ev.SessionID, ev.TargetInfo.TargetID, ev.TargetInfo.BrowserContextID, bctx == nil)
277+
"Browser:onAttachedToTarget", "sid:%v tid:%v bctxid:%v bctx nil:%t, unknown target type: %q",
278+
ev.SessionID, evti.TargetID, evti.BrowserContextID, browserCtx == nil, evti.Type)
271279
}
272280
}
273281

common/frame.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -567,7 +567,13 @@ func (f *Frame) waitForSelector(selector string, opts *FrameWaitForSelectorOptio
567567
f.executionContextMu.RLock()
568568
defer f.executionContextMu.RUnlock()
569569

570-
if ec := f.executionContexts[mainWorld]; handle.execCtx != ec {
570+
ec := f.executionContexts[mainWorld]
571+
if ec == nil {
572+
return nil, fmt.Errorf("cannot find execution context: %q", mainWorld)
573+
}
574+
// an element should belong to the current execution context.
575+
// otherwise, we should adopt it to this execution context.
576+
if ec != handle.execCtx {
571577
defer handle.Dispose()
572578
if handle, err = ec.adoptElementHandle(handle); err != nil {
573579
return nil, err
@@ -741,6 +747,9 @@ func (f *Frame) EvaluateHandle(pageFunc goja.Value, args ...goja.Value) (handle
741747
f.executionContextMu.RLock()
742748
{
743749
ec := f.executionContexts[mainWorld]
750+
if ec == nil {
751+
k6common.Throw(rt, fmt.Errorf("cannot find execution context: %q", mainWorld))
752+
}
744753
handle, err = ec.EvaluateHandle(f.ctx, pageFunc, args...)
745754
}
746755
f.executionContextMu.RUnlock()

0 commit comments

Comments
 (0)