Diff
Modified: trunk/Source/WebKit2/ChangeLog (191830 => 191831)
--- trunk/Source/WebKit2/ChangeLog 2015-10-30 23:59:28 UTC (rev 191830)
+++ trunk/Source/WebKit2/ChangeLog 2015-10-31 00:12:28 UTC (rev 191831)
@@ -1,3 +1,31 @@
+2015-10-30 Anders Carlsson <[email protected]>
+
+ Begin work on supporting reply blocks in _WKRemoteObjectRegistry
+ https://bugs.webkit.org/show_bug.cgi?id=150739
+
+ Reviewed by Tim Horton.
+
+ * Platform/spi/Cocoa/BlockSPI.h:
+ Add SPI header.
+
+ * Shared/API/Cocoa/RemoteObjectInvocation.h:
+ (WebKit::RemoteObjectInvocation::ReplyInfo::ReplyInfo):
+ (WebKit::RemoteObjectInvocation::replyInfo):
+ * Shared/API/Cocoa/RemoteObjectInvocation.mm:
+ (WebKit::RemoteObjectInvocation::RemoteObjectInvocation):
+ (WebKit::RemoteObjectInvocation::encode):
+ (WebKit::RemoteObjectInvocation::decode):
+ Add an optional ReplyInfo struct to RemoteObjectInvocation.
+
+ * Shared/API/Cocoa/_WKRemoteObjectRegistry.mm:
+ (generateReplyIdentifier):
+ Helper function to generate a reply identifier.
+
+ (-[_WKRemoteObjectRegistry _sendInvocation:interface:]):
+ Do some block parameter validation.
+
+ * WebKit2.xcodeproj/project.pbxproj:
+
2015-10-30 Beth Dakin <[email protected]>
Link preview doesn't work on XHTML pages with Content-Type header as
Copied: trunk/Source/WebKit2/Platform/spi/Cocoa/BlockSPI.h (from rev 191830, trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/RemoteObjectRegistry.h) (0 => 191831)
--- trunk/Source/WebKit2/Platform/spi/Cocoa/BlockSPI.h (rev 0)
+++ trunk/Source/WebKit2/Platform/spi/Cocoa/BlockSPI.h 2015-10-31 00:12:28 UTC (rev 191831)
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2015 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.
+ */
+
+#if USE(APPLE_INTERNAL_SDK)
+
+#import <Block_private.h>
+
+#else
+
+#import <Block.h>
+
+BLOCK_EXPORT const char* _Block_signature(void*);
+
+#endif
Modified: trunk/Source/WebKit2/Shared/API/Cocoa/RemoteObjectInvocation.h (191830 => 191831)
--- trunk/Source/WebKit2/Shared/API/Cocoa/RemoteObjectInvocation.h 2015-10-30 23:59:28 UTC (rev 191830)
+++ trunk/Source/WebKit2/Shared/API/Cocoa/RemoteObjectInvocation.h 2015-10-31 00:12:28 UTC (rev 191831)
@@ -38,11 +38,22 @@
class RemoteObjectInvocation {
public:
+ struct ReplyInfo {
+ ReplyInfo(uint64_t replyID, String&& blockSignature)
+ : replyID(replyID)
+ , blockSignature(WTF::move(blockSignature))
+ {
+ }
+
+ const uint64_t replyID;
+ const String blockSignature;
+ };
RemoteObjectInvocation();
- RemoteObjectInvocation(const String& interfaceIdentifier, RefPtr<API::Dictionary>&& encodedInvocation);
+ RemoteObjectInvocation(const String& interfaceIdentifier, RefPtr<API::Dictionary>&& encodedInvocation, std::unique_ptr<ReplyInfo>&&);
const String& interfaceIdentifier() const { return m_interfaceIdentifier; }
const API::Dictionary* encodedInvocation() const { return m_encodedInvocation.get(); }
+ const ReplyInfo* replyInfo() const { return m_replyInfo.get(); }
void encode(IPC::ArgumentEncoder&) const;
static bool decode(IPC::ArgumentDecoder&, RemoteObjectInvocation&);
@@ -50,6 +61,7 @@
private:
String m_interfaceIdentifier;
RefPtr<API::Dictionary> m_encodedInvocation;
+ std::unique_ptr<ReplyInfo> m_replyInfo;
};
}
Modified: trunk/Source/WebKit2/Shared/API/Cocoa/RemoteObjectInvocation.mm (191830 => 191831)
--- trunk/Source/WebKit2/Shared/API/Cocoa/RemoteObjectInvocation.mm 2015-10-30 23:59:28 UTC (rev 191830)
+++ trunk/Source/WebKit2/Shared/API/Cocoa/RemoteObjectInvocation.mm 2015-10-31 00:12:28 UTC (rev 191831)
@@ -35,9 +35,10 @@
{
}
-RemoteObjectInvocation::RemoteObjectInvocation(const String& interfaceIdentifier, RefPtr<API::Dictionary>&& encodedInvocation)
+RemoteObjectInvocation::RemoteObjectInvocation(const String& interfaceIdentifier, RefPtr<API::Dictionary>&& encodedInvocation, std::unique_ptr<ReplyInfo>&& replyInfo)
: m_interfaceIdentifier(interfaceIdentifier)
, m_encodedInvocation(WTF::move(encodedInvocation))
+ , m_replyInfo(WTF::move(replyInfo))
{
}
@@ -45,6 +46,11 @@
{
encoder << m_interfaceIdentifier;
UserData::encode(encoder, m_encodedInvocation.get());
+ if (m_replyInfo) {
+ encoder << true;
+ encoder << m_replyInfo->replyID;
+ encoder << m_replyInfo->blockSignature;
+ }
}
bool RemoteObjectInvocation::decode(IPC::ArgumentDecoder& decoder, RemoteObjectInvocation& result)
@@ -61,6 +67,22 @@
result.m_encodedInvocation = static_cast<API::Dictionary*>(encodedInvocation.get());
+ bool hasReplyInfo;
+ if (!decoder.decode(hasReplyInfo))
+ return false;
+
+ if (hasReplyInfo) {
+ uint64_t replyID;
+ if (!decoder.decode(replyID))
+ return false;
+
+ String blockSignature;
+ if (!decoder.decode(blockSignature))
+ return false;
+
+ result.m_replyInfo = std::make_unique<ReplyInfo>(replyID, WTF::move(blockSignature));
+ }
+
return true;
}
Modified: trunk/Source/WebKit2/Shared/API/Cocoa/_WKRemoteObjectRegistry.mm (191830 => 191831)
--- trunk/Source/WebKit2/Shared/API/Cocoa/_WKRemoteObjectRegistry.mm 2015-10-30 23:59:28 UTC (rev 191830)
+++ trunk/Source/WebKit2/Shared/API/Cocoa/_WKRemoteObjectRegistry.mm 2015-10-31 00:12:28 UTC (rev 191831)
@@ -29,6 +29,7 @@
#if WK_API_ENABLED
#import "APIDictionary.h"
+#import "BlockSPI.h"
#import "Connection.h"
#import "RemoteObjectInvocation.h"
#import "RemoteObjectRegistry.h"
@@ -94,15 +95,52 @@
_remoteObjectRegistry = nullptr;
}
+static uint64_t generateReplyIdentifier()
+{
+ static uint64_t identifier;
+
+ return ++identifier;
+}
+
- (void)_sendInvocation:(NSInvocation *)invocation interface:(_WKRemoteObjectInterface *)interface
{
- auto encoder = adoptNS([[WKRemoteObjectEncoder alloc] init]);
+ std::unique_ptr<RemoteObjectInvocation::ReplyInfo> replyInfo;
+
+ NSMethodSignature *methodSignature = invocation.methodSignature;
+ for (NSUInteger i = 0, count = methodSignature.numberOfArguments; i < count; ++i) {
+ const char *type = [methodSignature getArgumentTypeAtIndex:i];
+
+ if (strcmp(type, "@?"))
+ continue;
+
+ if (replyInfo)
+ [NSException raise:NSInvalidArgumentException format:@"Only one reply block is allowed per message send. (%s)", sel_getName(invocation.selector)];
+
+ id block = nullptr;
+ [invocation getArgument:&block atIndex:i];
+ if (!block)
+ [NSException raise:NSInvalidArgumentException format:@"A NULL reply block was passed into a message. (%s)", sel_getName(invocation.selector)];
+
+ const char* replyBlockSignature = _Block_signature(block);
+
+ if (strcmp([NSMethodSignature signatureWithObjCTypes:replyBlockSignature].methodReturnType, "v"))
+ [NSException raise:NSInvalidArgumentException format:@"Return value of block argument must be 'void'. (%s)", sel_getName(invocation.selector)];
+
+ replyInfo = std::make_unique<RemoteObjectInvocation::ReplyInfo>(generateReplyIdentifier(), replyBlockSignature);
+
+ // Replace the block object so we won't try to encode it.
+ id null = nullptr;
+ [invocation setArgument:&null atIndex:i];
+ }
+
+ RetainPtr<WKRemoteObjectEncoder> encoder = adoptNS([[WKRemoteObjectEncoder alloc] init]);
+
[encoder encodeObject:invocation forKey:invocationKey];
if (!_remoteObjectRegistry)
return;
- _remoteObjectRegistry->sendInvocation(RemoteObjectInvocation(interface.identifier, [encoder rootObjectDictionary]));
+ _remoteObjectRegistry->sendInvocation(RemoteObjectInvocation(interface.identifier, [encoder rootObjectDictionary], WTF::move(replyInfo)));
}
- (WebKit::RemoteObjectRegistry&)remoteObjectRegistry
Modified: trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj (191830 => 191831)
--- trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj 2015-10-30 23:59:28 UTC (rev 191830)
+++ trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj 2015-10-31 00:12:28 UTC (rev 191831)
@@ -269,6 +269,7 @@
1A5704F81BE01FF400874AF1 /* _WKContextMenuElementInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A5704F61BE01FF400874AF1 /* _WKContextMenuElementInfo.h */; settings = {ATTRIBUTES = (Private, ); }; };
1A5704FB1BE1751100874AF1 /* RemoteObjectInvocation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1A5704F91BE1751100874AF1 /* RemoteObjectInvocation.mm */; };
1A5704FC1BE1751100874AF1 /* RemoteObjectInvocation.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A5704FA1BE1751100874AF1 /* RemoteObjectInvocation.h */; };
+ 1A5705111BE410E600874AF1 /* BlockSPI.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A5705101BE410E500874AF1 /* BlockSPI.h */; };
1A57109E1ABA0027002FABBE /* WKWebsiteDataStoreRef.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A57109C1ABA0027002FABBE /* WKWebsiteDataStoreRef.cpp */; };
1A57109F1ABA0027002FABBE /* WKWebsiteDataStoreRef.h in Headers */ = {isa = PBXBuildFile; fileRef = 1A57109D1ABA0027002FABBE /* WKWebsiteDataStoreRef.h */; settings = {ATTRIBUTES = (Private, ); }; };
1A5B1C501898606F004FCF9B /* WKNavigation.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1A5B1C4E1898606F004FCF9B /* WKNavigation.mm */; };
@@ -2394,6 +2395,7 @@
1A5704F61BE01FF400874AF1 /* _WKContextMenuElementInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = _WKContextMenuElementInfo.h; sourceTree = "<group>"; };
1A5704F91BE1751100874AF1 /* RemoteObjectInvocation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = RemoteObjectInvocation.mm; sourceTree = "<group>"; };
1A5704FA1BE1751100874AF1 /* RemoteObjectInvocation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RemoteObjectInvocation.h; sourceTree = "<group>"; };
+ 1A5705101BE410E500874AF1 /* BlockSPI.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = BlockSPI.h; sourceTree = "<group>"; };
1A57109C1ABA0027002FABBE /* WKWebsiteDataStoreRef.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WKWebsiteDataStoreRef.cpp; sourceTree = "<group>"; };
1A57109D1ABA0027002FABBE /* WKWebsiteDataStoreRef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WKWebsiteDataStoreRef.h; sourceTree = "<group>"; };
1A5B1C4E1898606F004FCF9B /* WKNavigation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WKNavigation.mm; sourceTree = "<group>"; };
@@ -5329,6 +5331,7 @@
3754D5411B3A2998003A4C7F /* Cocoa */ = {
isa = PBXGroup;
children = (
+ 1A5705101BE410E500874AF1 /* BlockSPI.h */,
3754D5441B3A29FD003A4C7F /* NSInvocationSPI.h */,
);
path = Cocoa;
@@ -7774,6 +7777,7 @@
BC204EE311C83E98008F3375 /* InjectedBundle.h in Headers */,
935EEBA2127761D0003322B8 /* InjectedBundleBackForwardList.h in Headers */,
935EEBA4127761D6003322B8 /* InjectedBundleBackForwardListItem.h in Headers */,
+ 1A5705111BE410E600874AF1 /* BlockSPI.h in Headers */,
BCEE7DC5128B645D009827DA /* InjectedBundleClient.h in Headers */,
7CBB811D1AA0F8B1006B1942 /* InjectedBundleFileHandle.h in Headers */,
BC498618124D10E200D834E1 /* InjectedBundleHitTestResult.h in Headers */,
Modified: trunk/Tools/ChangeLog (191830 => 191831)
--- trunk/Tools/ChangeLog 2015-10-30 23:59:28 UTC (rev 191830)
+++ trunk/Tools/ChangeLog 2015-10-31 00:12:28 UTC (rev 191831)
@@ -1,3 +1,18 @@
+2015-10-30 Anders Carlsson <[email protected]>
+
+ Begin work on supporting reply blocks in _WKRemoteObjectRegistry
+ https://bugs.webkit.org/show_bug.cgi?id=150739
+
+ Reviewed by Tim Horton.
+
+ Add a test. We only test the encoding right now.
+
+ * TestWebKitAPI/Tests/WebKit2Cocoa/RemoteObjectRegistry.h:
+ * TestWebKitAPI/Tests/WebKit2Cocoa/RemoteObjectRegistry.mm:
+ (TEST):
+ * TestWebKitAPI/Tests/WebKit2Cocoa/RemoteObjectRegistryPlugIn.mm:
+ (-[RemoteObjectRegistryPlugIn sayHello:completionHandler:]):
+
2015-10-30 Lucas Forschler <[email protected]>
Add CMAke builder to build.webkit.org
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/RemoteObjectRegistry.h (191830 => 191831)
--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/RemoteObjectRegistry.h 2015-10-30 23:59:28 UTC (rev 191830)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/RemoteObjectRegistry.h 2015-10-31 00:12:28 UTC (rev 191831)
@@ -30,6 +30,7 @@
@protocol RemoteObjectProtocol <NSObject>
- (void)sayHello:(NSString *)hello;
+- (void)sayHello:(NSString *)hello completionHandler:(void (^)(NSString *))completionHandler;
@end
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/RemoteObjectRegistry.mm (191830 => 191831)
--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/RemoteObjectRegistry.mm 2015-10-30 23:59:28 UTC (rev 191830)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/RemoteObjectRegistry.mm 2015-10-31 00:12:28 UTC (rev 191831)
@@ -58,8 +58,11 @@
EXPECT_WK_STREQ(result, @"Hello, World!");
isDone = true;
}];
+ TestWebKitAPI::Util::run(&isDone);
- TestWebKitAPI::Util::run(&isDone);
+ [object sayHello:@"Hello Again!" completionHandler:^(NSString *) {
+ // FIXME: Check the string here.
+ }];
}
}
Modified: trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/RemoteObjectRegistryPlugIn.mm (191830 => 191831)
--- trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/RemoteObjectRegistryPlugIn.mm 2015-10-30 23:59:28 UTC (rev 191830)
+++ trunk/Tools/TestWebKitAPI/Tests/WebKit2Cocoa/RemoteObjectRegistryPlugIn.mm 2015-10-31 00:12:28 UTC (rev 191831)
@@ -62,6 +62,12 @@
[jsContext setObject:helloString forKeyedSubscript:@"helloString"];
}
+- (void)sayHello:(NSString *)hello completionHandler:(void (^)(NSString *))completionHandler
+{
+ // FIXME: Actually call this.
+ // completionHandler([NSString stringWithFormat:@"Your string was '%@'", hello]);
+}
+
@end
#endif // WK_API_ENABLED