diff options
Diffstat (limited to 'testing/raptor/browsertime/utils')
-rw-r--r-- | testing/raptor/browsertime/utils/NetworkThrottlingUtils.js | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/testing/raptor/browsertime/utils/NetworkThrottlingUtils.js b/testing/raptor/browsertime/utils/NetworkThrottlingUtils.js new file mode 100644 index 0000000000..8a0f78150e --- /dev/null +++ b/testing/raptor/browsertime/utils/NetworkThrottlingUtils.js @@ -0,0 +1,85 @@ +/* This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ + +const lazy = {}; + +ChromeUtils.defineESModuleGetters(lazy, { + NetworkObserver: + "resource://devtools/shared/network-observer/NetworkObserver.sys.mjs", +}); + +/** + * The NetworkThrottler uses the dev tools NetworkObserver to provide api to throttle all network activity. + * This can be used to fix network conditions in browsertime pageload tests. + * + */ + +// A minimal struct for onNetworkEvent handling +class NetworkEventRecord { + addRequestPostData() {} + addResponseStart() {} + addSecurityInfo() {} + addEventTimings() {} + addResponseCache() {} + addResponseContent() {} + addServerTimings() {} + addServiceWorkerTimings() {} +} + +class NetworkThrottler { + #devtoolsNetworkObserver; + #throttling; + + constructor() { + this.#throttling = false; + } + + destroy() { + this.stop(); + } + + start(throttleData) { + if (this.#throttling) { + console.error("NetworkThrottler already started"); + return; + } + + this.#devtoolsNetworkObserver = new lazy.NetworkObserver({ + ignoreChannelFunction: this.#ignoreChannelFunction, + onNetworkEvent: this.#onNetworkEvent, + }); + + this.#devtoolsNetworkObserver.setThrottleData(throttleData); + + this.#throttling = true; + } + + stop() { + if (!this.#throttling) { + return; + } + + this.#devtoolsNetworkObserver.destroy(); + this.#devtoolsNetworkObserver = null; + + this.#throttling = false; + } + + #ignoreChannelFunction = channel => { + // Ignore chrome-privileged or DevTools-initiated requests + if ( + channel.loadInfo?.loadingDocument === null && + (channel.loadInfo.loadingPrincipal === + Services.scriptSecurityManager.getSystemPrincipal() || + channel.loadInfo.isInDevToolsContext) + ) { + return true; + } + return false; + }; + + #onNetworkEvent = (networkEvent, channel) => { + return new NetworkEventRecord(networkEvent, channel, this); + }; +} |