Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 0 additions & 25 deletions BrowserKit/Tests/WebEngineTests/Mock/MockWKFrameInfo.swift

This file was deleted.

31 changes: 0 additions & 31 deletions BrowserKit/Tests/WebEngineTests/Mock/MockWKSecurityOrigin.swift

This file was deleted.

50 changes: 50 additions & 0 deletions BrowserKit/Tests/WebEngineTests/Utilities/WebKitTestHelpers.swift
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// 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/

import WebKit
import XCTest

/// Provides real `WKFrameInfo` and `WKSecurityOrigin` objects for tests.
/// These types can no longer be created or mocked safely, as WebKit now requires
/// fully initialized instances. This helper loads a lightweight `WKWebView`
/// navigation and captures the frame and origin values that WebKit supplies.
final class WebKitTestHelpers {
class FakeWKNavigationDelegate: NSObject, WKNavigationDelegate {
let expect: XCTestExpectation
var capturedFrame: WKFrameInfo?
var capturedOrigin: WKSecurityOrigin?

init(expect: XCTestExpectation) { self.expect = expect }

func webView(_ webView: WKWebView,
decidePolicyFor navigationAction: WKNavigationAction,
decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
let frame = navigationAction.targetFrame
capturedFrame = frame
capturedOrigin = frame?.securityOrigin
decisionHandler(.allow)
expect.fulfill()
return
}
}

// Loads a URL in a real WKWebView and returns the first valid
// WKFrameInfo and WKSecurityOrigin from a navigation action.
static func captureFrameAndOrigin(for url: URL, timeout: TimeInterval = 3.0) -> (WKFrameInfo, WKSecurityOrigin)? {
let webView = WKWebView(frame: .zero)
let expect = XCTestExpectation(description: "capture frame & origin")

let delegate = FakeWKNavigationDelegate(expect: expect)
webView.navigationDelegate = delegate

// load a real https URL (use example.com to be safe)
webView.load(URLRequest(url: url))

let waiter = XCTWaiter.wait(for: [expect], timeout: timeout)
if let frame = delegate.capturedFrame, let origin = delegate.capturedOrigin {
return (frame, origin)
}
return nil
}
}
34 changes: 23 additions & 11 deletions BrowserKit/Tests/WebEngineTests/WKUIHandlerTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -35,32 +35,40 @@ final class WKUIHandlerTests: XCTestCase {
func testRequestMediaCaptureSuccess() {
let subject = createSubject(isActive: true)

let expectation = expectation(description: "Wait for the decision handler to be called")
guard let (frame, origin) = WebKitTestHelpers.captureFrameAndOrigin(for: URL(string: "https://example.com")!) else {
XCTFail("Could not obtain WKFrameInfo")
return
}

let decisionHandler = { (decision: WKPermissionDecision) in
XCTAssertEqual(decision, .prompt)
expectation.fulfill()
}

let expectation = expectation(description: "Wait for the decision handler to be called")
subject.webView(MockWKWebView(),
requestMediaCapturePermissionFor: MockWKSecurityOrigin.new(nil),
initiatedByFrame: MockWKFrameInfo(),
requestMediaCapturePermissionFor: origin,
initiatedByFrame: frame,
type: .cameraAndMicrophone,
decisionHandler: decisionHandler
)
decisionHandler: decisionHandler)
wait(for: [expectation])
expectation.fulfill()
}

func testRequestMediaCaptureIsActiveFalse() {
let subject = createSubject(isActive: false)
let expectation = expectation(description: "Wait for the decision handler to be called")
guard let (frame, origin) = WebKitTestHelpers.captureFrameAndOrigin(for: URL(string: "https://example.com")!) else {
XCTFail("Could not obtain WKFrameInfo")
return
}

let expectation = expectation(description: "Wait for the decision handler to be called")
let decisionHandler = { (decision: WKPermissionDecision) in
XCTAssertEqual(decision, .deny)
expectation.fulfill()
}
subject.webView(MockWKWebView(),
requestMediaCapturePermissionFor: MockWKSecurityOrigin.new(nil),
initiatedByFrame: MockWKFrameInfo(),
requestMediaCapturePermissionFor: origin,
initiatedByFrame: frame,
type: .cameraAndMicrophone,
decisionHandler: decisionHandler
)
Expand All @@ -70,15 +78,19 @@ final class WKUIHandlerTests: XCTestCase {
func testRequestMediaCaptureDelegateReturnsFalse() {
sessionDelegate.hasMediaCapturePermission = false
let subject = createSubject(isActive: true)
guard let (frame, origin) = WebKitTestHelpers.captureFrameAndOrigin(for: URL(string: "https://example.com")!) else {
XCTFail("Could not obtain WKFrameInfo")
return
}
let expectation = expectation(description: "Wait for the decision handler to be called")

let decisionHandler = { (decision: WKPermissionDecision) in
XCTAssertEqual(decision, .deny)
expectation.fulfill()
}
subject.webView(MockWKWebView(),
requestMediaCapturePermissionFor: MockWKSecurityOrigin.new(nil),
initiatedByFrame: MockWKFrameInfo(),
requestMediaCapturePermissionFor: origin,
initiatedByFrame: frame,
type: .cameraAndMicrophone,
decisionHandler: decisionHandler
)
Expand Down