File: GeckoSessionHandler.swift

package info (click to toggle)
firefox 149.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 4,767,760 kB
  • sloc: cpp: 7,416,064; javascript: 6,752,859; ansic: 3,774,850; python: 1,250,473; xml: 641,578; asm: 439,191; java: 186,617; sh: 56,634; makefile: 18,856; objc: 13,092; perl: 12,763; pascal: 5,960; yacc: 4,583; cs: 3,846; lex: 1,720; ruby: 1,002; php: 436; lisp: 258; awk: 105; sql: 66; sed: 53; csh: 10; exp: 6
file content (69 lines) | stat: -rw-r--r-- 2,324 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
// 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/.

protocol GeckoSessionHandlerCommon: EventListener {
    var moduleName: String { get }
    var events: [String] { get }
    var enabled: Bool { get }
}

class GeckoSessionHandler<Delegate, Event: CaseIterable & RawRepresentable<String>>:
    GeckoSessionHandlerCommon
{
    let moduleName: String
    let handle: @MainActor (GeckoSession, Delegate?, Event, [String: Any?]?) async throws -> Any?

    private(set) weak var session: GeckoSession?
    private var registeredListeners: Bool = false
    var delegate: Delegate? {
        didSet {
            if let session {
                if !registeredListeners && delegate != nil {
                    for event in events {
                        session.dispatcher.addListener(type: event, listener: self)
                    }
                    registeredListeners = true
                }

                // If session is not open, we will update module state during session opening.
                if !session.isOpen() {
                    return
                }

                let message: [String: Any] = [
                    "module": moduleName,
                    "enabled": delegate != nil,
                ]
                session.dispatcher.dispatch(type: "GeckoView:UpdateModuleState", message: message)
            }
        }
    }

    var events: [String] {
        Event.allCases.map { $0.rawValue }
    }
    var enabled: Bool {
        delegate != nil
    }

    init(
        moduleName: String, session: GeckoSession,
        handle: @escaping @MainActor (GeckoSession, Delegate?, Event, [String: Any?]?) async throws
            ->
            Any?
    ) {
        self.moduleName = moduleName
        self.session = session
        self.handle = handle
    }

    func handleMessage(type: String, message: [String: Any?]?) async throws -> Any? {
        guard let event = Event(rawValue: type) else {
            throw HandlerError("unknown message \(type)")
        }
        guard let session else { throw HandlerError("session has been destroyed") }

        return try await self.handle(session, delegate, event, message)
    }
}