[Cocoa] WKWebProcessPlugInLoadDelegate can’t tell what type of same-document navigati...
authormitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 16 Dec 2014 17:45:13 +0000 (17:45 +0000)
committermitz@apple.com <mitz@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Tue, 16 Dec 2014 17:45:13 +0000 (17:45 +0000)
https://bugs.webkit.org/show_bug.cgi?id=139669

Reviewed by Anders Carlsson.

* Shared/API/Cocoa/_WKSameDocumentNavigationType.h: Added. Moved the
_WKSameDocumentNavigationType type definition here from WKNavigationDelegatePrivate.h.
* Shared/API/Cocoa/_WKSameDocumentNavigationTypeInternal.h: Added.
(WebKit::toWKSameDocumentNavigationType): Moved from NavigationState.mm.

* Shared/API/c/WKSharedAPICast.h:
(WebKit::toSameDocumentNavigationType): Added this conversion helper.

* UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h: Added #import.

* UIProcess/Cocoa/NavigationState.mm:
(WebKit::toWKSameDocumentNavigationType): Deleted.

* WebKit2.xcodeproj/project.pbxproj: Updated for added headers.

* WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInLoadDelegate.h: Declared new
delegate method that take a navigation type parameter.

* WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextController.mm:
(didSameDocumentNavigationForFrame): Changed to call the new delegate method, passing the
navigation type.

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@177362 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/WebKit2/ChangeLog
Source/WebKit2/Shared/API/Cocoa/_WKSameDocumentNavigationType.h [new file with mode: 0644]
Source/WebKit2/Shared/API/Cocoa/_WKSameDocumentNavigationTypeInternal.h [new file with mode: 0644]
Source/WebKit2/Shared/API/c/WKSharedAPICast.h
Source/WebKit2/UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h
Source/WebKit2/UIProcess/Cocoa/NavigationState.mm
Source/WebKit2/WebKit2.xcodeproj/project.pbxproj
Source/WebKit2/WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInLoadDelegate.h
Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextController.mm

index c9e72db..c84819b 100644 (file)
@@ -1,3 +1,32 @@
+2014-12-16  Dan Bernstein  <mitz@apple.com>
+
+        [Cocoa] WKWebProcessPlugInLoadDelegate can’t tell what type of same-document navigation has happened
+        https://bugs.webkit.org/show_bug.cgi?id=139669
+
+        Reviewed by Anders Carlsson.
+
+        * Shared/API/Cocoa/_WKSameDocumentNavigationType.h: Added. Moved the
+        _WKSameDocumentNavigationType type definition here from WKNavigationDelegatePrivate.h.
+        * Shared/API/Cocoa/_WKSameDocumentNavigationTypeInternal.h: Added.
+        (WebKit::toWKSameDocumentNavigationType): Moved from NavigationState.mm.
+
+        * Shared/API/c/WKSharedAPICast.h:
+        (WebKit::toSameDocumentNavigationType): Added this conversion helper.
+
+        * UIProcess/API/Cocoa/WKNavigationDelegatePrivate.h: Added #import.
+
+        * UIProcess/Cocoa/NavigationState.mm:
+        (WebKit::toWKSameDocumentNavigationType): Deleted.
+
+        * WebKit2.xcodeproj/project.pbxproj: Updated for added headers.
+
+        * WebProcess/InjectedBundle/API/Cocoa/WKWebProcessPlugInLoadDelegate.h: Declared new
+        delegate method that take a navigation type parameter.
+
+        * WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextController.mm:
+        (didSameDocumentNavigationForFrame): Changed to call the new delegate method, passing the
+        navigation type.
+
 2014-12-16  Carlos Garcia Campos  <cgarcia@igalia.com>
 
         Unreviewed. Update OptionsGTK.cmake and NEWS for 2.7.3 release.
diff --git a/Source/WebKit2/Shared/API/Cocoa/_WKSameDocumentNavigationType.h b/Source/WebKit2/Shared/API/Cocoa/_WKSameDocumentNavigationType.h
new file mode 100644 (file)
index 0000000..e9ecdc6
--- /dev/null
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import <WebKit/WKFoundation.h>
+
+#if WK_API_ENABLED
+
+typedef NS_ENUM(NSInteger, _WKSameDocumentNavigationType) {
+    _WKSameDocumentNavigationTypeAnchorNavigation,
+    _WKSameDocumentNavigationTypeSessionStatePush,
+    _WKSameDocumentNavigationTypeSessionStateReplace,
+    _WKSameDocumentNavigationTypeSessionStatePop,
+} WK_AVAILABLE(10_10, 8_0);
+
+#endif
diff --git a/Source/WebKit2/Shared/API/Cocoa/_WKSameDocumentNavigationTypeInternal.h b/Source/WebKit2/Shared/API/Cocoa/_WKSameDocumentNavigationTypeInternal.h
new file mode 100644 (file)
index 0000000..15b7ebe
--- /dev/null
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) 2014 Apple Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+ * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#import "SameDocumentNavigationType.h"
+#import "_WKSameDocumentNavigationType.h"
+
+namespace WebKit {
+
+static _WKSameDocumentNavigationType toWKSameDocumentNavigationType(SameDocumentNavigationType navigationType)
+{
+    switch (navigationType) {
+    case SameDocumentNavigationAnchorNavigation:
+        return _WKSameDocumentNavigationTypeAnchorNavigation;
+    case SameDocumentNavigationSessionStatePush:
+        return _WKSameDocumentNavigationTypeSessionStatePush;
+    case SameDocumentNavigationSessionStateReplace:
+        return _WKSameDocumentNavigationTypeSessionStateReplace;
+    case SameDocumentNavigationSessionStatePop:
+        return _WKSameDocumentNavigationTypeSessionStatePop;
+    }
+
+    ASSERT_NOT_REACHED();
+    return _WKSameDocumentNavigationTypeAnchorNavigation;
+}
+
+}
index 026ba1a..5a665a3 100644 (file)
@@ -804,6 +804,28 @@ inline WKSameDocumentNavigationType toAPI(SameDocumentNavigationType type)
     return wkType;
 }
 
+inline SameDocumentNavigationType toSameDocumentNavigationType(WKSameDocumentNavigationType wkType)
+{
+    SameDocumentNavigationType type = SameDocumentNavigationAnchorNavigation;
+
+    switch (wkType) {
+    case kWKSameDocumentNavigationAnchorNavigation:
+        type = SameDocumentNavigationAnchorNavigation;
+        break;
+    case kWKSameDocumentNavigationSessionStatePush:
+        type = SameDocumentNavigationSessionStatePush;
+        break;
+    case kWKSameDocumentNavigationSessionStateReplace:
+        type = SameDocumentNavigationSessionStateReplace;
+        break;
+    case kWKSameDocumentNavigationSessionStatePop:
+        type = SameDocumentNavigationSessionStatePop;
+        break;
+    }
+    
+    return type;
+}
+
 inline WKLayoutMilestones toWKLayoutMilestones(WebCore::LayoutMilestones milestones)
 {
     unsigned wkMilestones = 0;
index 5fedca2..71dafd1 100644 (file)
@@ -27,6 +27,7 @@
 
 #import <WebKit/WKFrameInfo.h>
 #import <WebKit/WKWebViewPrivate.h>
+#import <WebKit/_WKSameDocumentNavigationType.h>
 
 #if WK_API_ENABLED
 
@@ -34,13 +35,6 @@ static const WKNavigationActionPolicy _WKNavigationActionPolicyDownload = (WKNav
 
 static const WKNavigationResponsePolicy _WKNavigationResponsePolicyBecomeDownload = (WKNavigationResponsePolicy)(WKNavigationResponsePolicyAllow + 1);
 
-typedef NS_ENUM(NSInteger, _WKSameDocumentNavigationType) {
-    _WKSameDocumentNavigationTypeAnchorNavigation,
-    _WKSameDocumentNavigationTypeSessionStatePush,
-    _WKSameDocumentNavigationTypeSessionStateReplace,
-    _WKSameDocumentNavigationTypeSessionStatePop,
-} WK_AVAILABLE(10_10, 8_0);
-
 @protocol WKNavigationDelegatePrivate <WKNavigationDelegate>
 
 @optional
index 13f2658..8056005 100644 (file)
@@ -56,6 +56,7 @@
 #import "WebProtectionSpace.h"
 #import "_WKErrorRecoveryAttempting.h"
 #import "_WKFrameHandleInternal.h"
+#import "_WKSameDocumentNavigationTypeInternal.h"
 #import <WebCore/Credential.h>
 #import <wtf/NeverDestroyed.h>
 
@@ -621,23 +622,6 @@ void NavigationState::LoaderClient::didFailLoadWithErrorForFrame(WebPageProxy*,
     [navigationDelegate webView:m_navigationState.m_webView didFailNavigation:navigation withError:errorWithRecoveryAttempter.get()];
 }
 
-static _WKSameDocumentNavigationType toWKSameDocumentNavigationType(SameDocumentNavigationType navigationType)
-{
-    switch (navigationType) {
-    case SameDocumentNavigationAnchorNavigation:
-        return _WKSameDocumentNavigationTypeAnchorNavigation;
-    case SameDocumentNavigationSessionStatePush:
-        return _WKSameDocumentNavigationTypeSessionStatePush;
-    case SameDocumentNavigationSessionStateReplace:
-        return _WKSameDocumentNavigationTypeSessionStateReplace;
-    case SameDocumentNavigationSessionStatePop:
-        return _WKSameDocumentNavigationTypeSessionStatePop;
-    }
-
-    ASSERT_NOT_REACHED();
-    return _WKSameDocumentNavigationTypeAnchorNavigation;
-}
-
 void NavigationState::LoaderClient::didSameDocumentNavigationForFrame(WebPageProxy*, WebFrameProxy* webFrameProxy, uint64_t navigationID, SameDocumentNavigationType navigationType, API::Object*)
 {
     if (!webFrameProxy->isMainFrame())
index 416652b..df2ef90 100644 (file)
                3760881F150413E900FC82C7 /* WebRenderObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 3760881D150413E900FC82C7 /* WebRenderObject.h */; };
                37608822150414F700FC82C7 /* WKRenderObject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 37608820150414F700FC82C7 /* WKRenderObject.cpp */; };
                37608823150414F700FC82C7 /* WKRenderObject.h in Headers */ = {isa = PBXBuildFile; fileRef = 37608821150414F700FC82C7 /* WKRenderObject.h */; settings = {ATTRIBUTES = (Private, ); }; };
+               376311FD1A3FB5F7005A2E51 /* _WKSameDocumentNavigationType.h in Headers */ = {isa = PBXBuildFile; fileRef = 376311F81A3FB30B005A2E51 /* _WKSameDocumentNavigationType.h */; settings = {ATTRIBUTES = (Private, ); }; };
+               376311FE1A3FB600005A2E51 /* _WKSameDocumentNavigationTypeInternal.h in Headers */ = {isa = PBXBuildFile; fileRef = 376311FA1A3FB38B005A2E51 /* _WKSameDocumentNavigationTypeInternal.h */; };
                3766F9EE189A1241003CF19B /* JavaScriptCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AA1C7DE100E846E0078DEBC /* JavaScriptCore.framework */; };
                3766F9EF189A1244003CF19B /* QuartzCore.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1AA1CC5C100FA1A10078DEBC /* QuartzCore.framework */; };
                3766F9F1189A1254003CF19B /* libicucore.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = BC87DFA91018101400564216 /* libicucore.dylib */; };
                3760881D150413E900FC82C7 /* WebRenderObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebRenderObject.h; sourceTree = "<group>"; };
                37608820150414F700FC82C7 /* WKRenderObject.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKRenderObject.cpp; sourceTree = "<group>"; };
                37608821150414F700FC82C7 /* WKRenderObject.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKRenderObject.h; sourceTree = "<group>"; };
+               376311F81A3FB30B005A2E51 /* _WKSameDocumentNavigationType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKSameDocumentNavigationType.h; sourceTree = "<group>"; };
+               376311FA1A3FB38B005A2E51 /* _WKSameDocumentNavigationTypeInternal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKSameDocumentNavigationTypeInternal.h; sourceTree = "<group>"; };
                3769079818F31CB2001DFF04 /* APIInjectedBundlePageUIClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = APIInjectedBundlePageUIClient.h; path = API/APIInjectedBundlePageUIClient.h; sourceTree = "<group>"; };
                3769079C18F340A2001DFF04 /* APIInjectedBundleFormClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = APIInjectedBundleFormClient.h; sourceTree = "<group>"; };
                376C51171957452E0007B0FA /* _WKSecurityOrigin.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = _WKSecurityOrigin.mm; sourceTree = "<group>"; };
                                1A9E329C1822FEDD00F5D04C /* WKRemoteObjectCoder.mm */,
                                1F604BA61889FA7400EE0395 /* WKRenderingProgressEvents.h */,
                                1F604BA71889FA7400EE0395 /* WKRenderingProgressEventsInternal.h */,
+                               376311F81A3FB30B005A2E51 /* _WKSameDocumentNavigationType.h */,
+                               376311FA1A3FB38B005A2E51 /* _WKSameDocumentNavigationTypeInternal.h */,
                        );
                        path = Cocoa;
                        sourceTree = "<group>";
                                BC5D24C716CD73C5007D5461 /* WKBundleRangeHandlePrivate.h in Headers */,
                                BC14DF9F120B635F00826C0C /* WKBundleScriptWorld.h in Headers */,
                                1AF4CEF018BC481800BC2D34 /* VisitedLinkTableController.h in Headers */,
+                               376311FD1A3FB5F7005A2E51 /* _WKSameDocumentNavigationType.h in Headers */,
                                E4436ECC1A0D040B00EAD204 /* NetworkCache.h in Headers */,
                                BC4075F6124FF0270068F20A /* WKCertificateInfo.h in Headers */,
                                BC407627124FF0400068F20A /* WKCertificateInfoMac.h in Headers */,
                                37C4C08918149F23003688B9 /* WKBackForwardListItemInternal.h in Headers */,
                                51D0D437183B353D0097041D /* DatabaseProcessIDBConnectionMessages.h in Headers */,
                                BCBAACED145225E30053F82F /* WKProcessGroupPrivate.h in Headers */,
+                               376311FE1A3FB600005A2E51 /* _WKSameDocumentNavigationTypeInternal.h in Headers */,
                                512F58FC12A88A5400629530 /* WKProtectionSpace.h in Headers */,
                                518ACAEA12AEE6BB00B04B83 /* WKProtectionSpaceTypes.h in Headers */,
                                37948409150C4B9700E52CE9 /* WKRenderLayer.h in Headers */,
index 0f5c940..1897dba 100644 (file)
@@ -24,6 +24,7 @@
  */
 #import <Foundation/Foundation.h>
 #import <WebKit/WKRenderingProgressEvents.h>
+#import <WebKit/_WKSameDocumentNavigationType.h>
 
 @class WKWebProcessPlugInBrowsingContextController;
 @class WKWebProcessPlugInFrame;
@@ -40,7 +41,7 @@
 - (void)webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController*)controller didFinishDocumentLoadForFrame:(WKWebProcessPlugInFrame *)frame;
 - (void)webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController*)controller didFailLoadWithErrorForFrame:(WKWebProcessPlugInFrame *)frame error:(NSError *)error;
 - (void)webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController*)controller didFinishLoadForFrame:(WKWebProcessPlugInFrame *)frame;
-- (void)webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController*)controller didSameDocumentNavigationForFrame:(WKWebProcessPlugInFrame *)frame;
+- (void)webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController*)controller didSameDocumentNavigation:(_WKSameDocumentNavigationType)navigationType forFrame:(WKWebProcessPlugInFrame *)frame;
 - (void)webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController*)controller globalObjectIsAvailableForFrame:(WKWebProcessPlugInFrame *)frame inScriptWorld:(WKWebProcessPlugInScriptWorld *)scriptWorld;
 - (void)webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController *)controller didRemoveFrameFromHierarchy:(WKWebProcessPlugInFrame *)frame;
 - (void)webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController *)controller didHandleOnloadEventsForFrame:(WKWebProcessPlugInFrame *)frame;
index b0f2d06..c20d068 100644 (file)
@@ -56,6 +56,7 @@
 #import "WebPage.h"
 #import "WebProcess.h"
 #import "_WKRemoteObjectRegistryInternal.h"
+#import "_WKSameDocumentNavigationTypeInternal.h"
 #import <WebCore/Document.h>
 #import <WebCore/Frame.h>
 #import <WebCore/HTMLFormElement.h>
 using namespace WebCore;
 using namespace WebKit;
 
+@interface NSObject (WKDeprecatedDelegateMethods)
+- (void)webProcessPlugInBrowserContextController:(WKWebProcessPlugInBrowserContextController *)controller didSameDocumentNavigationForFrame:(WKWebProcessPlugInFrame *)frame;
+@end
+
 @implementation WKWebProcessPlugInBrowserContextController {
     API::ObjectStorage<WebPage> _page;
     WeakObjCPtr<id <WKWebProcessPlugInLoadDelegate>> _loadDelegate;
@@ -150,8 +155,13 @@ static void didSameDocumentNavigationForFrame(WKBundlePageRef page, WKBundleFram
     WKWebProcessPlugInBrowserContextController *pluginContextController = (WKWebProcessPlugInBrowserContextController *)clientInfo;
     auto loadDelegate = pluginContextController->_loadDelegate.get();
 
-    if ([loadDelegate respondsToSelector:@selector(webProcessPlugInBrowserContextController:didSameDocumentNavigationForFrame:)])
-        [loadDelegate webProcessPlugInBrowserContextController:pluginContextController didSameDocumentNavigationForFrame:wrapper(*toImpl(frame))];
+    if ([loadDelegate respondsToSelector:@selector(webProcessPlugInBrowserContextController:didSameDocumentNavigation:forFrame:)])
+        [loadDelegate webProcessPlugInBrowserContextController:pluginContextController didSameDocumentNavigation:toWKSameDocumentNavigationType(toSameDocumentNavigationType(type)) forFrame:wrapper(*toImpl(frame))];
+    else {
+        // FIXME: Remove this once clients switch to implementing the above delegate method.
+        if ([loadDelegate respondsToSelector:@selector(webProcessPlugInBrowserContextController:didSameDocumentNavigationForFrame:)])
+            [(NSObject *)loadDelegate webProcessPlugInBrowserContextController:pluginContextController didSameDocumentNavigationForFrame:wrapper(*toImpl(frame))];
+    }
 }
 
 static void didLayoutForFrame(WKBundlePageRef page, WKBundleFrameRef frame, const void* clientInfo)