Skip to content

Commit

Permalink
refactor: consolidate all events in Events.js (#3772)
Browse files Browse the repository at this point in the history
This will allow us to break all dependency cycles that were forcing
us to put many things in a single file (e.g. ExecutionContext and
ElementHandle).
  • Loading branch information
aslushnikov committed Jan 15, 2019
1 parent 71edfc7 commit 4e9e3bc
Show file tree
Hide file tree
Showing 17 changed files with 181 additions and 151 deletions.
39 changes: 12 additions & 27 deletions lib/Browser.js
Expand Up @@ -18,7 +18,7 @@ const { helper, assert } = require('./helper');
const {Target} = require('./Target');
const EventEmitter = require('events');
const {TaskQueue} = require('./TaskQueue');
const {Connection} = require('./Connection');
const {Events} = require('./Events');

class Browser extends EventEmitter {
/**
Expand Down Expand Up @@ -46,7 +46,7 @@ class Browser extends EventEmitter {

/** @type {Map<string, Target>} */
this._targets = new Map();
this._connection.on(Connection.Events.Disconnected, () => this.emit(Browser.Events.Disconnected));
this._connection.on(Events.Connection.Disconnected, () => this.emit(Events.Browser.Disconnected));
this._connection.on('Target.targetCreated', this._targetCreated.bind(this));
this._connection.on('Target.targetDestroyed', this._targetDestroyed.bind(this));
this._connection.on('Target.targetInfoChanged', this._targetInfoChanged.bind(this));
Expand Down Expand Up @@ -118,8 +118,8 @@ class Browser extends EventEmitter {
this._targets.set(event.targetInfo.targetId, target);

if (await target._initializedPromise) {
this.emit(Browser.Events.TargetCreated, target);
context.emit(BrowserContext.Events.TargetCreated, target);
this.emit(Events.Browser.TargetCreated, target);
context.emit(Events.BrowserContext.TargetCreated, target);
}
}

Expand All @@ -132,8 +132,8 @@ class Browser extends EventEmitter {
this._targets.delete(event.targetId);
target._closedCallback();
if (await target._initializedPromise) {
this.emit(Browser.Events.TargetDestroyed, target);
target.browserContext().emit(BrowserContext.Events.TargetDestroyed, target);
this.emit(Events.Browser.TargetDestroyed, target);
target.browserContext().emit(Events.BrowserContext.TargetDestroyed, target);
}
}

Expand All @@ -147,8 +147,8 @@ class Browser extends EventEmitter {
const wasInitialized = target._isInitialized;
target._targetInfoChanged(event.targetInfo);
if (wasInitialized && previousURL !== target.url()) {
this.emit(Browser.Events.TargetChanged, target);
target.browserContext().emit(BrowserContext.Events.TargetChanged, target);
this.emit(Events.Browser.TargetChanged, target);
target.browserContext().emit(Events.BrowserContext.TargetChanged, target);
}
}

Expand Down Expand Up @@ -206,15 +206,15 @@ class Browser extends EventEmitter {
return existingTarget;
let resolve;
const targetPromise = new Promise(x => resolve = x);
this.on(Browser.Events.TargetCreated, check);
this.on(Browser.Events.TargetChanged, check);
this.on(Events.Browser.TargetCreated, check);
this.on(Events.Browser.TargetChanged, check);
try {
if (!timeout)
return await targetPromise;
return await helper.waitWithTimeout(targetPromise, 'target', timeout);
} finally {
this.removeListener(Browser.Events.TargetCreated, check);
this.removeListener(Browser.Events.TargetChanged, check);
this.removeListener(Events.Browser.TargetCreated, check);
this.removeListener(Events.Browser.TargetChanged, check);
}

/**
Expand Down Expand Up @@ -268,14 +268,6 @@ class Browser extends EventEmitter {
}
}

/** @enum {string} */
Browser.Events = {
TargetCreated: 'targetcreated',
TargetDestroyed: 'targetdestroyed',
TargetChanged: 'targetchanged',
Disconnected: 'disconnected'
};

class BrowserContext extends EventEmitter {
/**
* @param {!Puppeteer.Connection} connection
Expand Down Expand Up @@ -381,13 +373,6 @@ class BrowserContext extends EventEmitter {
}
}

/** @enum {string} */
BrowserContext.Events = {
TargetCreated: 'targetcreated',
TargetDestroyed: 'targetdestroyed',
TargetChanged: 'targetchanged',
};

helper.tracePublicAPI(BrowserContext);
helper.tracePublicAPI(Browser);

Expand Down
13 changes: 3 additions & 10 deletions lib/Connection.js
Expand Up @@ -14,6 +14,7 @@
* limitations under the License.
*/
const {helper, assert} = require('./helper');
const {Events} = require('./Events');
const debugProtocol = require('debug')('puppeteer:protocol');
const debugSession = require('debug')('puppeteer:session');
const EventEmitter = require('events');
Expand Down Expand Up @@ -120,7 +121,7 @@ class Connection extends EventEmitter {
for (const session of this._sessions.values())
session._onClosed();
this._sessions.clear();
this.emit(Connection.Events.Disconnected);
this.emit(Events.Connection.Disconnected);
}

dispose() {
Expand All @@ -140,10 +141,6 @@ class Connection extends EventEmitter {
}
}

Connection.Events = {
Disconnected: Symbol('Connection.Events.Disconnected'),
};

class CDPSession extends EventEmitter {
/**
* @param {!Connection|!CDPSession} connection
Expand Down Expand Up @@ -228,7 +225,7 @@ class CDPSession extends EventEmitter {
callback.reject(rewriteError(callback.error, `Protocol error (${callback.method}): Target closed.`));
this._callbacks.clear();
this._connection = null;
this.emit(CDPSession.Events.Disconnected);
this.emit(Events.CDPSession.Disconnected);
}

/**
Expand All @@ -242,10 +239,6 @@ class CDPSession extends EventEmitter {
}
}

CDPSession.Events = {
Disconnected: Symbol('CDPSession.Events.Disconnected'),
};

helper.tracePublicAPI(CDPSession);

/**
Expand Down
80 changes: 80 additions & 0 deletions lib/Events.js
@@ -0,0 +1,80 @@
/**
* Copyright 2019 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/

const Events = {
Page: {
Close: 'close',
Console: 'console',
Dialog: 'dialog',
DOMContentLoaded: 'domcontentloaded',
Error: 'error',
// Can't use just 'error' due to node.js special treatment of error events.
// @see https://nodejs.org/api/events.html#events_error_events
PageError: 'pageerror',
Request: 'request',
Response: 'response',
RequestFailed: 'requestfailed',
RequestFinished: 'requestfinished',
FrameAttached: 'frameattached',
FrameDetached: 'framedetached',
FrameNavigated: 'framenavigated',
Load: 'load',
Metrics: 'metrics',
Popup: 'popup',
WorkerCreated: 'workercreated',
WorkerDestroyed: 'workerdestroyed',
},

Browser: {
TargetCreated: 'targetcreated',
TargetDestroyed: 'targetdestroyed',
TargetChanged: 'targetchanged',
Disconnected: 'disconnected'
},

BrowserContext: {
TargetCreated: 'targetcreated',
TargetDestroyed: 'targetdestroyed',
TargetChanged: 'targetchanged',
},

NetworkManager: {
Request: Symbol('Events.NetworkManager.Request'),
Response: Symbol('Events.NetworkManager.Response'),
RequestFailed: Symbol('Events.NetworkManager.RequestFailed'),
RequestFinished: Symbol('Events.NetworkManager.RequestFinished'),
},

FrameManager: {
FrameAttached: Symbol('Events.FrameManager.FrameAttached'),
FrameNavigated: Symbol('Events.FrameManager.FrameNavigated'),
FrameDetached: Symbol('Events.FrameManager.FrameDetached'),
LifecycleEvent: Symbol('Events.FrameManager.LifecycleEvent'),
FrameNavigatedWithinDocument: Symbol('Events.FrameManager.FrameNavigatedWithinDocument'),
ExecutionContextCreated: Symbol('Events.FrameManager.ExecutionContextCreated'),
ExecutionContextDestroyed: Symbol('Events.FrameManager.ExecutionContextDestroyed'),
},

Connection: {
Disconnected: Symbol('Events.Connection.Disconnected'),
},

CDPSession: {
Disconnected: Symbol('Events.CDPSession.Disconnected'),
},
};

module.exports = { Events };
38 changes: 13 additions & 25 deletions lib/FrameManager.js
Expand Up @@ -17,10 +17,9 @@
const fs = require('fs');
const EventEmitter = require('events');
const {helper, assert} = require('./helper');
const {Events} = require('./Events');
const {ExecutionContext} = require('./ExecutionContext');
const {TimeoutError} = require('./Errors');
const {NetworkManager} = require('./NetworkManager');
const {CDPSession} = require('./Connection');

const readFileAsync = helper.promisify(fs.readFile);

Expand Down Expand Up @@ -142,7 +141,7 @@ class FrameManager extends EventEmitter {
if (!frame)
return;
frame._onLifecycleEvent(event.loaderId, event.name);
this.emit(FrameManager.Events.LifecycleEvent, frame);
this.emit(Events.FrameManager.LifecycleEvent, frame);
}

/**
Expand All @@ -153,7 +152,7 @@ class FrameManager extends EventEmitter {
if (!frame)
return;
frame._onLoadingStopped();
this.emit(FrameManager.Events.LifecycleEvent, frame);
this.emit(Events.FrameManager.LifecycleEvent, frame);
}

/**
Expand Down Expand Up @@ -210,7 +209,7 @@ class FrameManager extends EventEmitter {
const parentFrame = this._frames.get(parentFrameId);
const frame = new Frame(this, this._client, parentFrame, frameId);
this._frames.set(frame._id, frame);
this.emit(FrameManager.Events.FrameAttached, frame);
this.emit(Events.FrameManager.FrameAttached, frame);
}

/**
Expand Down Expand Up @@ -244,7 +243,7 @@ class FrameManager extends EventEmitter {
// Update frame payload.
frame._navigated(framePayload);

this.emit(FrameManager.Events.FrameNavigated, frame);
this.emit(Events.FrameManager.FrameNavigated, frame);
}

/**
Expand All @@ -256,8 +255,8 @@ class FrameManager extends EventEmitter {
if (!frame)
return;
frame._navigatedWithinDocument(url);
this.emit(FrameManager.Events.FrameNavigatedWithinDocument, frame);
this.emit(FrameManager.Events.FrameNavigated, frame);
this.emit(Events.FrameManager.FrameNavigatedWithinDocument, frame);
this.emit(Events.FrameManager.FrameNavigated, frame);
}

/**
Expand Down Expand Up @@ -317,21 +316,10 @@ class FrameManager extends EventEmitter {
this._removeFramesRecursively(child);
frame._detach();
this._frames.delete(frame._id);
this.emit(FrameManager.Events.FrameDetached, frame);
this.emit(Events.FrameManager.FrameDetached, frame);
}
}

/** @enum {string} */
FrameManager.Events = {
FrameAttached: 'frameattached',
FrameNavigated: 'framenavigated',
FrameDetached: 'framedetached',
LifecycleEvent: 'lifecycleevent',
FrameNavigatedWithinDocument: 'framenavigatedwithindocument',
ExecutionContextCreated: 'executioncontextcreated',
ExecutionContextDestroyed: 'executioncontextdestroyed',
};

/**
* @unrestricted
*/
Expand Down Expand Up @@ -1180,11 +1168,11 @@ class LifecycleWatcher {
/** @type {?Puppeteer.Request} */
this._navigationRequest = null;
this._eventListeners = [
helper.addEventListener(frameManager._client, CDPSession.Events.Disconnected, () => this._terminate(new Error('Navigation failed because browser has disconnected!'))),
helper.addEventListener(this._frameManager, FrameManager.Events.LifecycleEvent, this._checkLifecycleComplete.bind(this)),
helper.addEventListener(this._frameManager, FrameManager.Events.FrameNavigatedWithinDocument, this._navigatedWithinDocument.bind(this)),
helper.addEventListener(this._frameManager, FrameManager.Events.FrameDetached, this._onFrameDetached.bind(this)),
helper.addEventListener(this._networkManager, NetworkManager.Events.Request, this._onRequest.bind(this)),
helper.addEventListener(frameManager._client, Events.CDPSession.Disconnected, () => this._terminate(new Error('Navigation failed because browser has disconnected!'))),
helper.addEventListener(this._frameManager, Events.FrameManager.LifecycleEvent, this._checkLifecycleComplete.bind(this)),
helper.addEventListener(this._frameManager, Events.FrameManager.FrameNavigatedWithinDocument, this._navigatedWithinDocument.bind(this)),
helper.addEventListener(this._frameManager, Events.FrameManager.FrameDetached, this._onFrameDetached.bind(this)),
helper.addEventListener(this._networkManager, Events.NetworkManager.Request, this._onRequest.bind(this)),
];

this._sameDocumentNavigationPromise = new Promise(fulfill => {
Expand Down
20 changes: 7 additions & 13 deletions lib/NetworkManager.js
Expand Up @@ -15,6 +15,7 @@
*/
const EventEmitter = require('events');
const {helper, assert, debugError} = require('./helper');
const {Events} = require('./Events');
const Multimap = require('./Multimap');

class NetworkManager extends EventEmitter {
Expand Down Expand Up @@ -206,7 +207,7 @@ class NetworkManager extends EventEmitter {
const frame = event.frameId && this._frameManager ? this._frameManager.frame(event.frameId) : null;
const request = new Request(this._client, frame, interceptionId, this._userRequestInterceptionEnabled, event, redirectChain);
this._requestIdToRequest.set(event.requestId, request);
this.emit(NetworkManager.Events.Request, request);
this.emit(Events.NetworkManager.Request, request);
}


Expand All @@ -230,8 +231,8 @@ class NetworkManager extends EventEmitter {
response._bodyLoadedPromiseFulfill.call(null, new Error('Response body is unavailable for redirect responses'));
this._requestIdToRequest.delete(request._requestId);
this._attemptedAuthentications.delete(request._interceptionId);
this.emit(NetworkManager.Events.Response, response);
this.emit(NetworkManager.Events.RequestFinished, request);
this.emit(Events.NetworkManager.Response, response);
this.emit(Events.NetworkManager.RequestFinished, request);
}

/**
Expand All @@ -244,7 +245,7 @@ class NetworkManager extends EventEmitter {
return;
const response = new Response(this._client, request, event.response);
request._response = response;
this.emit(NetworkManager.Events.Response, response);
this.emit(Events.NetworkManager.Response, response);
}

/**
Expand All @@ -263,7 +264,7 @@ class NetworkManager extends EventEmitter {
request.response()._bodyLoadedPromiseFulfill.call(null);
this._requestIdToRequest.delete(request._requestId);
this._attemptedAuthentications.delete(request._interceptionId);
this.emit(NetworkManager.Events.RequestFinished, request);
this.emit(Events.NetworkManager.RequestFinished, request);
}

/**
Expand All @@ -281,7 +282,7 @@ class NetworkManager extends EventEmitter {
response._bodyLoadedPromiseFulfill.call(null);
this._requestIdToRequest.delete(request._requestId);
this._attemptedAuthentications.delete(request._interceptionId);
this.emit(NetworkManager.Events.RequestFailed, request);
this.emit(Events.NetworkManager.RequestFailed, request);
}
}

Expand Down Expand Up @@ -732,13 +733,6 @@ class SecurityDetails {
}
}

NetworkManager.Events = {
Request: 'request',
Response: 'response',
RequestFailed: 'requestfailed',
RequestFinished: 'requestfinished',
};

const statusTexts = {
'100': 'Continue',
'101': 'Switching Protocols',
Expand Down

0 comments on commit 4e9e3bc

Please sign in to comment.