Source code
Revision control
Copy as Markdown
Other Tools
// 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
public protocol ProgressDelegate {
/// A View has started loading content from the network.
func onPageStart(session: GeckoSession, url: String)
/// A View has finished loading content from the network.
func onPageStop(session: GeckoSession, success: Bool)
/// Page loading has progressed.
func onProgressChange(session: GeckoSession, progress: Int)
/// The security status has been updated.
// FIXME: Implement onSecurityChange & SecurityInformation
// func onSecurityChange(session: GeckoSession, securityInfo: SecurityInformation)
/// The browser session state has changed. This can happen in response to navigation, scrolling,
/// or form data changes; the session state passed includes the most up to date information on
/// all of these.
// FIXME: Implement onSessionStateChange & SessionState
// func onSessionStateChange(session: GeckoSession, sessionState: SessionState)
}
// All methods on ProgressDelegate are optional, provide default implementations.
extension ProgressDelegate {
public func onPageStart(session: GeckoSession, url: String) {}
public func onPageStop(session: GeckoSession, success: Bool) {}
public func onProgressChange(session: GeckoSession, progress: Int) {}
// func onSecurityChange(session: GeckoSession, securityInfo: SecurityInformation) {}
// func onSessionStateChange(session: GeckoSession, sessionState: SessionState) {}
}
enum ProgressEvents: String, CaseIterable {
case pageStart = "GeckoView:PageStart"
case pageStop = "GeckoView:PageStop"
case progressChanged = "GeckoView:ProgressChanged"
case securityChanged = "GeckoView:SecurityChanged"
case stateUpdated = "GeckoView:StateUpdated"
}
func newProgressHandler(_ session: GeckoSession) -> GeckoSessionHandler<
ProgressDelegate, ProgressEvents
> {
GeckoSessionHandler(moduleName: "GeckoViewProgress", session: session) {
@MainActor session, delegate, event, message in
switch event {
case .pageStart:
delegate?.onPageStart(session: session, url: message!["uri"] as! String)
return nil
case .pageStop:
delegate?.onPageStop(session: session, success: message!["success"] as! Bool)
return nil
case .progressChanged:
delegate?.onProgressChange(session: session, progress: message!["progress"] as! Int)
return nil
case .securityChanged:
// TODO: Implement
return nil
case .stateUpdated:
// TODO: Implement
return nil
}
}
}