| 8 | } |
| 9 | |
| 10 | export class TargetObserver implements TokenListObserverDelegate { |
| 11 | readonly context: Context |
| 12 | readonly delegate: TargetObserverDelegate |
| 13 | readonly targetsByName: Multimap<string, Element> |
| 14 | private tokenListObserver?: TokenListObserver |
| 15 | |
| 16 | constructor(context: Context, delegate: TargetObserverDelegate) { |
| 17 | this.context = context |
| 18 | this.delegate = delegate |
| 19 | this.targetsByName = new Multimap() |
| 20 | } |
| 21 | |
| 22 | start() { |
| 23 | if (!this.tokenListObserver) { |
| 24 | this.tokenListObserver = new TokenListObserver(this.element, this.attributeName, this) |
| 25 | this.tokenListObserver.start() |
| 26 | } |
| 27 | } |
| 28 | |
| 29 | stop() { |
| 30 | if (this.tokenListObserver) { |
| 31 | this.disconnectAllTargets() |
| 32 | this.tokenListObserver.stop() |
| 33 | delete this.tokenListObserver |
| 34 | } |
| 35 | } |
| 36 | |
| 37 | // Token list observer delegate |
| 38 | |
| 39 | tokenMatched({ element, content: name }: Token) { |
| 40 | if (this.scope.containsElement(element)) { |
| 41 | this.connectTarget(element, name) |
| 42 | } |
| 43 | } |
| 44 | |
| 45 | tokenUnmatched({ element, content: name }: Token) { |
| 46 | this.disconnectTarget(element, name) |
| 47 | } |
| 48 | |
| 49 | // Target management |
| 50 | |
| 51 | connectTarget(element: Element, name: string) { |
| 52 | if (!this.targetsByName.has(name, element)) { |
| 53 | this.targetsByName.add(name, element) |
| 54 | this.tokenListObserver?.pause(() => this.delegate.targetConnected(element, name)) |
| 55 | } |
| 56 | } |
| 57 | |
| 58 | disconnectTarget(element: Element, name: string) { |
| 59 | if (this.targetsByName.has(name, element)) { |
| 60 | this.targetsByName.delete(name, element) |
| 61 | this.tokenListObserver?.pause(() => this.delegate.targetDisconnected(element, name)) |
| 62 | } |
| 63 | } |
| 64 | |
| 65 | disconnectAllTargets() { |
| 66 | for (const name of this.targetsByName.keys) { |
| 67 | for (const element of this.targetsByName.getValuesForKey(name)) { |
nothing calls this directly
no outgoing calls
no test coverage detected
searching dependent graphs…