Skip to content

New bid adapter: Adswag - #15487

Open
westerschmal wants to merge 2 commits into
prebid:masterfrom
adswag:new-adswag-bid-adapter
Open

New bid adapter: Adswag#15487
westerschmal wants to merge 2 commits into
prebid:masterfrom
adswag:new-adswag-bid-adapter

Conversation

@westerschmal

@westerschmal westerschmal commented Aug 13, 2026

Copy link
Copy Markdown
Contributor

Type of change

  • New bidder adapter

Description of change

Adds the Adswag bid adapter: banner, video (instream + publisher-rendered outstream) and audio, including mixed-format ad units, for Adswag's directly-integrated European supply. EU-hosted endpoint (https://bid.adswag.ai/prebid/bid), TCF-first (IAB Europe GVL vendor 1417, gvlid declared), GPP forwarded, consentless traffic served contextually. DSA transparency supported. The adapter is fail-open in every path: any error degrades to a clean no-bid.

Test parameters for validating bids (live, evergreen test campaign — bids €2.50 EUR):

{
  bidder: 'adswag',
  params: {
    publisherId: 'prebid-test',
    placementId: 'prebid-test-display'  // display; use 'prebid-test-video' / 'prebid-test-audio' for video/audio ad units
  }
}

Display test slot must include size 300x250 (the test campaign's display creative size). Video: instream, mimes: ['video/mp4'], playerSize 640x360. Audio: mediaTypes.audio with mimes: ['audio/mpeg', 'audio/mp4']. placementId is optional — the endpoint also discovers the placement from GPID/adUnitCode. Verified against production on 2026-08-13 (single ad units and a mixed banner+video+audio page all return bids).

Unit tests: 112 specs for the adapter (gulp test-only --file test/spec/modules/adswagBidAdapter_spec.js), lint and gulp build --modules=adswagBidAdapter pass. Integration checked with the Hello World sample page against the live endpoint.

Other information

Docs PR: prebid/prebid.github.io#6702. Prebid Server (Go and Java) adapter submissions follow separately.

@github-actions

github-actions Bot commented Aug 13, 2026

Copy link
Copy Markdown

This PR introduces changes that may not work on all browsers. According to Babel, the following polyfills may be needed, and they are not automatically included:

  • Changes to modules/adswagBidAdapter.ts may need:
    • es.array.push
    • es.iterator.constructor
    • es.iterator.filter
    • es.iterator.map
    • es.json.stringify
    • es.set.difference.v2
    • es.set.intersection.v2
    • es.set.is-disjoint-from.v2
    • es.set.is-subset-of.v2
    • es.set.is-superset-of.v2
    • es.set.symmetric-difference.v2
    • es.set.union.v2
    • esnext.iterator.constructor
    • esnext.iterator.filter
    • esnext.iterator.map
    • esnext.json.parse
    • esnext.set.difference.v2
    • esnext.set.intersection.v2
    • esnext.set.is-disjoint-from.v2
    • esnext.set.is-subset-of.v2
    • esnext.set.is-superset-of.v2
    • esnext.set.symmetric-difference.v2
    • esnext.set.union.v2
    • web.url-search-params.delete
    • web.url-search-params.has
    • web.url-search-params.size
  • Changes to test/spec/modules/adswagBidAdapter_spec.js may need:
    • es.array.push
    • es.iterator.constructor
    • es.iterator.find
    • es.iterator.flat-map
    • es.iterator.for-each
    • es.iterator.map
    • es.iterator.some
    • esnext.iterator.constructor
    • esnext.iterator.find
    • esnext.iterator.flat-map
    • esnext.iterator.for-each
    • esnext.iterator.map
    • esnext.iterator.some
    • esnext.json.parse

The best way to address this is to provide good test coverage, as normal PR checks run unit tests on older browsers.

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds the new Adswag bidder adapter to Prebid.js, implementing OpenRTB request/response mapping for banner, video, and (feature-gated) audio, plus consent-aware identity forwarding, user syncs, and lifecycle hooks.

Changes:

  • Introduces modules/adswagBidAdapter.ts implementing bid validation, request construction, response interpretation, user syncs, and win-notice firing.
  • Adds a comprehensive unit test suite in test/spec/modules/adswagBidAdapter_spec.js covering validation, request mapping, consent/identity behavior, and response mapping.
  • Adds adapter documentation in modules/adswagBidAdapter.md with parameters, test setup, and GDPR/TCF notes.

Reviewed changes

Copilot reviewed 3 out of 3 changed files in this pull request and generated 4 comments.

File Description
test/spec/modules/adswagBidAdapter_spec.js Adds unit tests validating request/response mapping, consent gating, identity waterfall, and lifecycle callbacks.
modules/adswagBidAdapter.ts Implements the Adswag bidder adapter (OpenRTB 2.6 POST) with consent-aware identity handling, mixed-format imps, user syncs, and win notice firing.
modules/adswagBidAdapter.md Documents the Adswag adapter’s purpose, bid parameters, test parameters, user sync behavior, and GDPR/TCF posture.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment on lines +369 to +372
expect(body.user.ext.consent).to.equal("C");
expect(body.user.eids).to.be.undefined;
expect(body.user.eids).to.be.undefined;
});

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in f87fa6e — duplicate assertion removed.

Comment on lines +972 to +976
const cpm = typeof bid.cpm === "number" && isFinite(bid.cpm) ? String(bid.cpm) : "";
// Regex literal rather than a plain string: upstream eslint's
// no-template-curly-in-string flags "${...}" inside string literals.
triggerPixel(bid.burl.replace(/\$\{AUCTION_PRICE\}/, cpm));
} catch (e) {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in f87fa6e — switched to a global regex so every ${AUCTION_PRICE} occurrence in burl is expanded; added a spec covering a burl with multiple occurrences.

Comment on lines +988 to +992
// as its Device Storage Disclosure URL; consumed by Prebid's metadata
// pipeline.
disclosureURL: "https://content.adswag.ai/iab/vendorjson.json",
supportedMediaTypes: [BANNER, VIDEO, AUDIO],
isBidRequestValid,

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in f87fa6esupportedMediaTypes now declares AUDIO only when FEATURES.AUDIO is enabled (a compile-time constant in real builds), so audio-less builds advertise exactly what they can bid on, matching the existing audioEnabled() gating in validation and imp building.

Comment on lines +24 to +30
| Name | Scope | Type | Description | Example |
|---------------|----------|--------|-----------------------------------------------------------------------------------------------|-----------------------|
| `publisherId` | required | String | Adswag publisher id (issued at onboarding). Resolves the canonical publisher at the edge. | `"pub-nl-news-1"` |
| `placementId` | optional | String | Explicit placement override. Omit to let Adswag discover the placement from GPID/adUnitCode. | `"plc-homepage-mrec"` |
| `bidFloor` | optional | Number | Static floor (EUR) used only when the Prebid Price Floors module is not configured. | `0.50` |
| `video` | optional | Object | Overrides for `mediaTypes.video` ad-unit params (Prebid video-params convention). | `{ maxduration: 15 }` |

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in f87fa6e — documented endpoint in the Bid Parameters table plus a paragraph with the exact constraint the code enforces: the override (per-bid params.endpoint or global pbjs.setConfig({ adswag: { endpoint } })) is honored only for hosts on the adswag.ai domain (adswag.ai or *.adswag.ai); any other host is ignored and the request goes to the built-in production endpoint. It exists for Adswag-operated test/staging environments only — publishers never need to set it.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 3dca93ad12

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread modules/adswagBidAdapter.ts Outdated
Comment on lines +716 to +718
const size =
(isAudio ? null : isVideo ? req.videoSize : req.bannerSize) ||
[undefined, undefined];

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Use response dimensions before backfilling size

On multi-size banner impressions this ignores the OpenRTB bid's w/h and always backfills the first requested size from imp.banner.format. If the server wins a later size such as 300x600 after a request that also included 300x250, Prebid will emit the wrong width/height and hb_size, which can route the win to a mismatched ad-server creative; use b.w/b.h when present before falling back to the requested size.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in f87fa6einterpretResponse now prefers the response's explicit bid.w/bid.h (positive integers) and only backfills from the requested primary size when they are absent. For context: the server currently omits w/h on all bids (verified against production today), so the backfill remains the live path — but the adapter now honors explicit dimensions whenever the server starts setting them. Added specs for the multi-size preference and the malformed-dimensions fallback.

const res = bid.getFloor({
currency: DEFAULT_CURRENCY,
mediaType,
size: sizes.length === 1 ? sizes[0] : "*",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Pass video playerSize to getFloor

When the requestable media type is video, the sizes argument is still only getBannerSizes(bid), so video-only bids call the floors module with size: '*' instead of the mediaTypes.video.playerSize. Publishers with video floor rules keyed to 640x360 or 640x480 can therefore get a lower/default floor in imp.bidfloor; pass the video player size into getFloor for video bids.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in f87fa6e — video-only impressions now call getFloor with the playerSize; audio deliberately keeps size: '*' (audio is a sizeless media type), and mixed-format units keep '*' as before. Specs updated to assert the size passed per media type.

Comment thread modules/adswagBidAdapter.ts Outdated
Comment on lines +494 to +498
typeof navigator !== "undefined" &&
navigator &&
isNonEmptyStr(navigator.userAgent)
) {
return navigator.userAgent;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Use shared UA access instead of navigator

When ortb2.device.ua is absent, this new vendor adapter reads navigator.userAgent directly. The repo review rules require vendor modules to go through common libraries or methods for navigator access, so this should use the existing UA utility/core-enriched device path instead of introducing a direct navigator read.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in f87fa6e — dropped the direct navigator.userAgent fallback entirely. The adapter now passes core-enriched ortb2.device through verbatim; core's FPD enrichment always populates device.ua (plus sua/w/h/language), so the fallback was redundant as well as against the repo rules.

Comment thread modules/adswagBidAdapter.ts Outdated
const cpm = typeof bid.cpm === "number" && isFinite(bid.cpm) ? String(bid.cpm) : "";
// Regex literal rather than a plain string: upstream eslint's
// no-template-curly-in-string flags "${...}" inside string literals.
triggerPixel(bid.burl.replace(/\$\{AUCTION_PRICE\}/, cpm));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Send win notices with keepalive

On display wins, this fires the win notice with an Image pixel. The adapter comments say this notice is the only way display wins are observed, so navigations or page teardown can undercount wins; repo guidance asks low-priority calls to use ajax/fetch with keepalive instead of triggerPixel when avoidable.

Useful? React with 👍 / 👎.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in f87fa6e — the win notice now fires through ajax from src/ajax.js as a GET with keepalive: true (via a small exported dep indirection so the spec can stub the transport), replacing the Image pixel. The notice now survives page teardown/navigation.

@westerschmal
westerschmal force-pushed the new-adswag-bid-adapter branch 2 times, most recently from 8015a99 to a3637cc Compare August 13, 2026 12:25
@barecheck

barecheck Bot commented Aug 13, 2026

Copy link
Copy Markdown

Barecheck - Code coverage report

Total: 91.21%

Your code coverage diff: 0.05% ▴

Uncovered files and lines
FileLines
modules/adswagBidAdapter.ts295, 324-325, 357, 432, 635, 716, 825, 872, 967, 971

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated no new comments.

Suppressed comments (2)

test/spec/modules/adswagBidAdapter_spec.js:379

  • Duplicate assertion: expect(body.user.eids).to.be.undefined; is repeated twice, which is redundant and can be removed to keep the test concise.
      expect(body.user.ext.consent).to.equal("C");
      expect(body.user.eids).to.be.undefined;
      expect(body.user.eids).to.be.undefined;

modules/adswagBidAdapter.ts:468

  • buildImp() always resolves floors using banner sizes, even for video-only requests. This means bid.getFloor() will receive size: '*' instead of the ad unit's playerSize, so publishers configuring floors by video size may get an incorrect / missing bidfloor on video imps. Consider passing the video player size when the imp is video-only.
  const floorMediaType = types.length === 1 ? types[0] : "*";
  const floor = resolveFloor(bid, sizes, floorMediaType);
  if (floor) {

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 3 out of 3 changed files in this pull request and generated 1 comment.

Suppressed comments (3)

modules/adswagBidAdapter.ts:412

  • Forward the Price Floors result without rounding it to two decimals. The floors module deliberately rounds up to four decimals (modules/priceFloors.ts:368-371); for example, this converts 1.3334 to 1.33, weakening the publisher's configured floor and allowing below-floor bids.
        return { floor: round2(res.floor), currency: res.currency || DEFAULT_CURRENCY };

modules/adswagBidAdapter.ts:635

  • The linked documentation PR states that publisher ortb2.user FPD objects are forwarded, but this code only reads user.eids/user.ext.eids; fields such as user.data, keywords, or other non-EID FPD are dropped. Either merge the permitted user FPD into the request (while retaining the consent gates for identifiers) or correct the documentation before merge.
    for (const list of [
      deepAccess(validBidRequests[0], "userIdAsEids"),
      deepAccess(ortb2, "user.ext.eids"),
      deepAccess(ortb2, "user.eids"),
    ]) {

modules/adswagBidAdapter.ts:390

  • The documented pbjs.setConfig({ adswag: { endpoint } }) namespace has no TypeScript Config augmentation, which is why this value remains unknown and needs a cast. Add an AdswagConfig type and augment ../src/config, following modules/yaleoBidAdapter.ts:38-42, so this public configuration surface is typed consistently with repository guidance.
  // Cast: Prebid core types getConfig as unknown for custom namespaces.
  const cfg = config.getConfig("adswag") as { endpoint?: unknown } | undefined;
  if (cfg && isNonEmptyStr(cfg.endpoint) && isPermittedEndpoint(cfg.endpoint)) {
    return cfg.endpoint;

Comment thread modules/adswagBidAdapter.ts Outdated
Comment on lines +808 to +810
// the publisher never opted into). All bids ride one request/URL, so
// resolving once against bids[0] mirrors the url assignment below.
const endpoint = resolveEndpoint(bids[0]);

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fixed in 658c5d6 — good catch, and it was a money bug: with two ad units under different publisherId every impression was reported under whichever publisher account came first, so the wrong publisher would be credited.

buildRequests now groups the biddable bids by (resolved endpoint, publisherId) and emits one ServerRequest per group. Per group: its own imp array, its own site.publisher.id, its own url, and its own client-side bidRequests meta array so interpretResponse still resolves media types and backfills sizes from the right ad units. Everything else (device / consent / identity / schain / source.tid / tmax) is request-level and is applied to every group.

Request ids: Prebid hands the adapter a single bidderRequestId, so the first group keeps it — the single-group case, which is nearly all real traffic, is byte-identical to before — and each further group gets a fresh generateUUID(), since two concurrent requests must not claim the same OpenRTB request id. source.tid is unchanged on every group and remains the shared auction correlator, so the differing ids cost nothing in tracing. The rule is commented at the call site.

Also made the no-endpoint no-bid per group rather than global: a bid whose endpoint does not resolve now drops on its own instead of silencing every sibling Adswag unit on the page, which is the correct reading of fail-open (per ad unit, not per page).

Specs added for two ad units under different publisherId asserting two ServerRequests with the correct per-group site.publisher.id and disjoint imp ids, unique per-group request ids, request-level fields present on every group, same-publisher units staying in one request, splitting on a differing endpoint, the per-group meta array, interpretResponse resolving each group against its own request, and the sibling-survival case. All verified failing against the pre-fix module. Suite is 126/126.

@westerschmal
westerschmal force-pushed the new-adswag-bid-adapter branch from f87fa6e to 658c5d6 Compare August 13, 2026 15:22
@westerschmal

Copy link
Copy Markdown
Contributor Author

Round-2 follow-up for the three suppressed comments (no inline threads, so addressing each by file:line). All fixed or answered in 658c5d6; the inline comment on modules/adswagBidAdapter.ts:810 has its own reply above.

modules/adswagBidAdapter.ts:412 — do not re-round the floors-module result. Fixed. You are right that this weakened publisher floors: the Price Floors module rounds up to four decimals on purpose (modules/priceFloors.ts:368-371), so round2 turned 1.3334 into 1.33 and admitted bids the floor existed to reject. The floors result is now forwarded verbatim.

I also removed the rounding from the static params.bidFloor path on the next branch, which your comment did not name. Same argument: round2 moves a publisher-typed number in either direction (0.45670.46 raises the floor, 1.3341.33 lowers it), and the adapter has no business silently altering a money input the publisher configured. Forwarding both verbatim also leaves one rule instead of two. round2 is now unused and deleted. Our endpoint carries bidfloor as a float, so four-decimal floors need nothing on the server side. Specs added for both paths.

modules/adswagBidAdapter.ts:635 — docs claim ortb2.user FPD is forwarded. Taking your second option: the documentation was wrong, and it is now corrected (docs PR prebid/prebid.github.io#6702, fork commit 39a6bf5). The code is deliberately unchanged, because our endpoint's OpenRTB user model carries only EIDs and the consent string — it does not consume user.data, user.keywords, user.yob, user.gender or any other non-EID user field. Forwarding them would move publisher audience data across a consent-gated boundary for fields nothing on the receiving side reads, which is exactly the kind of quiet data flow we do not want to ship.

The docs page now states plainly that site/device/regs/ortb2Imp FPD is forwarded, that from ortb2.user only consent-gated EIDs are, and that other user FPD is not sent. fpd_supported: true and userId: all in the front matter both remain accurate. The code-PR modules/adswagBidAdapter.md never made the claim, so it is unchanged. If Adswag ever consumes user-level FPD, that is an additive change to both the endpoint and the adapter with the consent gates designed in, not a silent passthrough today.

modules/adswagBidAdapter.ts:390 — no Config augmentation for the adswag namespace. Fixed, and thank you for the pointer to modules/yaleoBidAdapter.ts:38-42 — followed that idiom exactly. Added an exported AdswagConfig interface and declare module "../src/config" alongside the existing ../src/adUnits augmentation, so config.getConfig(BIDDER_CODE) now resolves to AdswagConfig | undefined and the cast plus its apologetic comment are gone. Verified the augmentation actually types the value rather than leaving it unknown: config.getConfig("adswag")?.endpoint is now string | undefined under tsc.

Verification for all of the above: eslint clean with zero warnings on the module and spec, gulp test-only --file test/spec/modules/adswagBidAdapter_spec.js 126/126 in ChromeHeadless, gulp build --modules=adswagBidAdapter OK. Still exactly three files in the PR.

One note in the interest of not overclaiming: the multi-publisher grouping from the inline comment is proven by unit tests, not by a live bid. Our documented evergreen test placement is seeded with a single publisher, so a two-publisher page is not something I can demonstrate against production; the test params in adswagBidAdapter.md continue to return live bids as before (display, video, audio and the multi-imp unit all re-verified after this change).

@westerschmal
westerschmal force-pushed the new-adswag-bid-adapter branch 2 times, most recently from d3f56a1 to 63bb30b Compare August 17, 2026 08:13
Adds the Adswag bid adapter (banner, video, audio) for directly-integrated European supply. GVL vendor 1417; EU-hosted endpoint (bid.adswag.ai). Includes bidder docs and unit tests.
@westerschmal
westerschmal force-pushed the new-adswag-bid-adapter branch from 63bb30b to d575e2e Compare August 17, 2026 13:28
@westerschmal

westerschmal commented Aug 17, 2026

Copy link
Copy Markdown
Contributor Author

Pushed one more change, d575e2e: an outstream renderer.

Outstream was the gap in this adapter — an in-article slot has no player, so a winning video bid there quietly did not render unless the publisher had brought their own. The adapter now installs a renderer on outstream video wins only. Nothing is downloaded unless such a bid wins, so page weight on every other auction is unchanged, and there are no new dependencies. The script is served from our own CDN.

Publisher renderers keep precedence as usual, with one deliberate nuance: a renderer declaring backupOnly: true means "use the bidder's, fall back to mine", and core resolves that same order in auction.js, so we do attach in that case. Non-backupOnly renderers on the ad unit or on mediaTypes.video win and we attach nothing.

One thing worth flagging since it is visible in the diff: the renderer URL is a channel alias rather than a version-pinned path. That is deliberate — a pinned player version here would mean every player-side fix needs a new Prebid PR and release to reach publishers. The path segment versions the adapter-to-renderer contract, so a breaking change on our side becomes a new path and a new PR here, which is the part that should be slow.

Also included: an "Outstream Video" section in adswagBidAdapter.md, and eight unit tests (attached for outstream, not for instream or banner, both publisher-override paths, the backupOnly case, the render hand-off, and graceful degradation if the script loads without its API). Full suite green locally: 140 tests, gulp lint clean, gulp build --modules=adswagBidAdapter clean. Verified end-to-end against our production bid path on the evergreen test placement: outstream unit bids, renderer loads, VAST plays, quartile beacons fire, slot collapses on completion.

The docs PR (prebid/prebid.github.io#6702) is updated with the matching outstream note.


Note on the three red checks that came up after this push, so nobody has to dig: two are GitHub infrastructure (429 Too Many Requests downloading actions/github-script and browserstack/github-actions — the jobs never got as far as running any test), and the firefox E2E failure is test/spec/e2e/triplelift_banner/basic_banner_ad.spec.js, a third-party live-endpoint spec. The outstream E2E spec passed in that same job. A re-run should clear all three; I do not have permission to trigger one.

@westerschmal

Copy link
Copy Markdown
Contributor Author

The three failing checks on the previous run were infrastructure failures from the Aug 17 GitHub incident, not test failures: the Unit ChromeHeadless chunk 3 and Unit EdgeHeadless chunk 3 jobs failed while downloading their GitHub Actions (codeload 429/500s, zero tests ran), and the E2E Firefox job failed at geckodriver session creation before any spec executed. The adapter's banner/instream specs passed wherever a browser session started. I've pushed an empty commit (5850128) to re-run the checks — no code changes.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants