diff --git a/ConsentViewController/Classes/Views/iOS/SPWebMessageViewController.swift b/ConsentViewController/Classes/Views/iOS/SPWebMessageViewController.swift index 7cf6f9b8c..05c11fb1c 100644 --- a/ConsentViewController/Classes/Views/iOS/SPWebMessageViewController.swift +++ b/ConsentViewController/Classes/Views/iOS/SPWebMessageViewController.swift @@ -289,7 +289,9 @@ import WebKit func onMessageReady() { timeoutWorkItem.cancel() webview?.evaluateJavaScript("window.spLegislation=\"\(self.campaignType.rawValue)\"") - messageUIDelegate?.loaded(self) + if !isBeingPresented, view.window == nil { // make sure current ViewController is not being presented + messageUIDelegate?.loaded(self) + } } func onPmReady() { diff --git a/Example/ConsentViewController_ExampleTests/GenericWebMessageViewControllerSpec.swift b/Example/ConsentViewController_ExampleTests/GenericWebMessageViewControllerSpec.swift index f63dda709..91082622f 100644 --- a/Example/ConsentViewController_ExampleTests/GenericWebMessageViewControllerSpec.swift +++ b/Example/ConsentViewController_ExampleTests/GenericWebMessageViewControllerSpec.swift @@ -66,6 +66,26 @@ class RenderingAppMock: WKWebView { } } +class DuplicatedShowMessageRenderingAppMock: WKWebView { + override func load(_ request: URLRequest) -> WKNavigation? { + loadHTMLString(""" + +
+ +
+ + + """, baseURL: URL(string: "https://example.com")!) + } +} + func loadMessage( with RenderingAppClass: WKWebView.Type, delegate: SPMessageUIDelegate, @@ -139,5 +159,12 @@ class GenericWebMessageViewControllerSpec: QuickSpec { } } } + + describe("when rendering app dispatches sp.showMessage multiple times") { + it("calls onMessageReady only once") { + loadMessage(with: DuplicatedShowMessageRenderingAppMock.self, delegate: delegate) + expect(delegate.loadedCallCount).toEventually(equal(1), timeout: .seconds(10)) + } + } } } diff --git a/Example/ConsentViewController_ExampleTests/MessageUIDelegateMock.swift b/Example/ConsentViewController_ExampleTests/MessageUIDelegateMock.swift index 37702cd53..abaeae428 100644 --- a/Example/ConsentViewController_ExampleTests/MessageUIDelegateMock.swift +++ b/Example/ConsentViewController_ExampleTests/MessageUIDelegateMock.swift @@ -9,14 +9,22 @@ import Foundation @testable import ConsentViewController +class MockedGenericWebMessageViewController: GenericWebMessageViewController { + var mockIsBeingPresented = false + override var isBeingPresented: Bool { mockIsBeingPresented } +} + class MessageUIDelegateSpy: SPMessageUIDelegate { + var loadedCallCount: Int = 0 var loadedWasCalled = false var onErrorWasCalled = false var actionCalledWith: SPAction? var onLoaded: ((UIViewController?) -> Void)? func loaded(_ controller: UIViewController) { + (controller as? MockedGenericWebMessageViewController)?.mockIsBeingPresented = true loadedWasCalled = true + loadedCallCount += 1 onLoaded?(controller) }