Diff
Modified: trunk/Source/WebKit2/ChangeLog (160276 => 160277)
--- trunk/Source/WebKit2/ChangeLog 2013-12-08 03:00:44 UTC (rev 160276)
+++ trunk/Source/WebKit2/ChangeLog 2013-12-08 05:22:02 UTC (rev 160277)
@@ -1,3 +1,33 @@
+2013-12-07 Sam Weinig <[email protected]>
+
+ [Cocoa] Make WKWebProcessPlugInBrowserContextController work with WKObject wrapping
+ https://bugs.webkit.org/show_bug.cgi?id=125403
+
+ Reviewed by Dan Bernstein.
+
+ * Shared/Cocoa/APIObject.mm:
+ (API::Object::newObject):
+ * Shared/mac/ObjCObjectGraphCoders.mm:
+ (WebKit::InjectedBundleObjCObjectGraphDecoderImpl::decode):
+ * WebProcess/InjectedBundle/API/mac/WKWebProcessPlugIn.mm:
+ (didCreatePage):
+ (willDestroyPage):
+ (setUpBundleClient):
+ (-[WKWebProcessPlugInController _initWithPrincipalClassInstance:bundle:]):
+ * WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextController.mm:
+ (-[WKWebProcessPlugInBrowserContextController dealloc]):
+ (-[WKWebProcessPlugInBrowserContextController mainFrameDocument]):
+ (-[WKWebProcessPlugInBrowserContextController selectedRange]):
+ (-[WKWebProcessPlugInBrowserContextController API::]):
+ (-[WKWebProcessPlugInBrowserContextController _bundlePageRef]):
+ (-[WKWebProcessPlugInBrowserContextController handle]):
+ (+[WKWebProcessPlugInBrowserContextController lookUpBrowsingContextFromHandle:]):
+ * WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextControllerInternal.h:
+ (WebKit::wrapper):
+ * WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInInternal.h:
+ * WebProcess/InjectedBundle/mac/InjectedBundleMac.mm:
+ (WebKit::InjectedBundle::load):
+
2013-12-07 Gustavo Noronha Silva <[email protected]>
Fix API test expectation following 160220.
Modified: trunk/Source/WebKit2/Shared/Cocoa/APIObject.mm (160276 => 160277)
--- trunk/Source/WebKit2/Shared/Cocoa/APIObject.mm 2013-12-08 03:00:44 UTC (rev 160276)
+++ trunk/Source/WebKit2/Shared/Cocoa/APIObject.mm 2013-12-08 05:22:02 UTC (rev 160277)
@@ -32,8 +32,8 @@
#import "WKBackForwardListItemInternal.h"
#import "WKBrowsingContextControllerInternal.h"
#import "WKBrowsingContextGroupInternal.h"
+#import "WKConnectionInternal.h"
#import "WKNSArray.h"
-#import "WKConnectionInternal.h"
#import "WKNSDictionary.h"
#import "WKNSError.h"
#import "WKNSString.h"
@@ -42,6 +42,7 @@
#import "WKNSURLProtectionSpace.h"
#import "WKNavigationDataInternal.h"
#import "WKProcessGroupInternal.h"
+#import "WKWebProcessPlugInBrowserContextControllerInternal.h"
namespace API {
@@ -80,6 +81,10 @@
wrapper = [WKBackForwardListItem alloc];
break;
+ case Type::BundlePage:
+ wrapper = [WKWebProcessPlugInBrowserContextController alloc];
+ break;
+
case Type::Connection:
wrapper = NSAllocateObject([WKConnection self], size, nullptr);
break;
Modified: trunk/Source/WebKit2/Shared/mac/ObjCObjectGraphCoders.mm (160276 => 160277)
--- trunk/Source/WebKit2/Shared/mac/ObjCObjectGraphCoders.mm 2013-12-08 03:00:44 UTC (rev 160276)
+++ trunk/Source/WebKit2/Shared/mac/ObjCObjectGraphCoders.mm 2013-12-08 05:22:02 UTC (rev 160277)
@@ -464,7 +464,7 @@
if (!webPage)
coder.m_root = [NSNull null];
else
- coder.m_root = [[WKWebProcessPlugInController _shared] _browserContextControllerForBundlePageRef:toAPI(webPage)];
+ coder.m_root = wrapper(*webPage);
break;
}
case WKTypeRefWrapperType: {
Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugIn.mm (160276 => 160277)
--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugIn.mm 2013-12-08 03:00:44 UTC (rev 160276)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugIn.mm 2013-12-08 05:22:02 UTC (rev 160277)
@@ -38,12 +38,9 @@
using namespace WebKit;
-typedef HashMap<WKBundlePageRef, RetainPtr<WKWebProcessPlugInBrowserContextController *>> BundlePageWrapperCache;
-
@interface WKWebProcessPlugInController () {
RetainPtr<id <WKWebProcessPlugIn>> _principalClassInstance;
RefPtr<InjectedBundle> _bundle;
- BundlePageWrapperCache _bundlePageWrapperCache;
RetainPtr<WKConnection *> _connectionWrapper;
}
@end
@@ -55,14 +52,8 @@
WKWebProcessPlugInController *plugInController = (WKWebProcessPlugInController *)clientInfo;
id<WKWebProcessPlugIn> principalClassInstance = plugInController->_principalClassInstance.get();
- if ([principalClassInstance respondsToSelector:@selector(webProcessPlugIn:didCreateBrowserContextController:)]) {
- ASSERT(!plugInController->_bundlePageWrapperCache.contains(page));
-
- WKWebProcessPlugInBrowserContextController* browserContextController = [[WKWebProcessPlugInBrowserContextController alloc] _initWithBundlePageRef:page];
- plugInController->_bundlePageWrapperCache.set(page, browserContextController);
-
- [principalClassInstance webProcessPlugIn:plugInController didCreateBrowserContextController:browserContextController];
- }
+ if ([principalClassInstance respondsToSelector:@selector(webProcessPlugIn:didCreateBrowserContextController:)])
+ [principalClassInstance webProcessPlugIn:plugInController didCreateBrowserContextController:wrapper(*toImpl(page))];
}
static void willDestroyPage(WKBundleRef bundle, WKBundlePageRef page, const void* clientInfo)
@@ -70,21 +61,11 @@
WKWebProcessPlugInController *plugInController = (WKWebProcessPlugInController *)clientInfo;
id<WKWebProcessPlugIn> principalClassInstance = plugInController->_principalClassInstance.get();
- // If we never added the bundle page to the cache, which can happen if webProcessPlugIn:didCreateBrowserContextController: is not implemented,
- // there is no reason to call webProcessPlugIn:willDestroyBrowserContextController:, so don't.
- BundlePageWrapperCache::iterator it = plugInController->_bundlePageWrapperCache.find(page);
- if (it == plugInController->_bundlePageWrapperCache.end()) {
- ASSERT(![principalClassInstance respondsToSelector:@selector(webProcessPlugIn:didCreateBrowserContextController:)]);
- return;
- }
-
if ([principalClassInstance respondsToSelector:@selector(webProcessPlugIn:willDestroyBrowserContextController:)])
- [principalClassInstance webProcessPlugIn:plugInController willDestroyBrowserContextController:it->value.get()];
-
- plugInController->_bundlePageWrapperCache.remove(it);
+ [principalClassInstance webProcessPlugIn:plugInController willDestroyBrowserContextController:wrapper(*toImpl(page))];
}
-static void setUpBundleClient(WKWebProcessPlugInController *plugInController, WKBundleRef bundleRef)
+static void setUpBundleClient(WKWebProcessPlugInController *plugInController, InjectedBundle& bundle)
{
WKBundleClientV1 bundleClient;
memset(&bundleClient, 0, sizeof(bundleClient));
@@ -94,7 +75,7 @@
bundleClient.didCreatePage = didCreatePage;
bundleClient.willDestroyPage = willDestroyPage;
- WKBundleSetClient(bundleRef, &bundleClient.base);
+ bundle.initializeClient(&bundleClient.base);
}
static WKWebProcessPlugInController *sharedInstance;
@@ -105,29 +86,23 @@
return sharedInstance;
}
-- (id)_initWithPrincipalClassInstance:(id<WKWebProcessPlugIn>)principalClassInstance bundleRef:(WKBundleRef)bundleRef
+- (id)_initWithPrincipalClassInstance:(id<WKWebProcessPlugIn>)principalClassInstance bundle:(InjectedBundle&)bundle
{
self = [super init];
if (!self)
return nil;
_principalClassInstance = principalClassInstance;
- _bundle = toImpl(bundleRef);
+ _bundle = &bundle;
ASSERT_WITH_MESSAGE(!sharedInstance, "WKWebProcessPlugInController initialized multiple times.");
sharedInstance = self;
- setUpBundleClient(self, bundleRef);
+ setUpBundleClient(self, *_bundle);
return self;
}
-- (WKWebProcessPlugInBrowserContextController *)_browserContextControllerForBundlePageRef:(WKBundlePageRef)pageRef
-{
- ASSERT(_bundlePageWrapperCache.contains(pageRef));
- return _bundlePageWrapperCache.get(pageRef).get();
-}
-
- (WKConnection *)connection
{
return wrapper(*_bundle->webConnectionToUIProcess());
Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextController.mm (160276 => 160277)
--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextController.mm 2013-12-08 03:00:44 UTC (rev 160276)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextController.mm 2013-12-08 05:22:02 UTC (rev 160277)
@@ -44,23 +44,19 @@
using namespace WebKit;
@implementation WKWebProcessPlugInBrowserContextController {
- WKRetainPtr<WKBundlePageRef> _bundlePageRef;
+ API::ObjectStorage<WebPage> _page;
}
-- (id)_initWithBundlePageRef:(WKBundlePageRef)bundlePageRef
+- (void)dealloc
{
- self = [super init];
- if (!self)
- return nil;
+ _page->~WebPage();
- _bundlePageRef = bundlePageRef;
-
- return self;
+ [super dealloc];
}
- (WKDOMDocument *)mainFrameDocument
{
- WebCore::Frame* webCoreMainFrame = toImpl(_bundlePageRef.get())->mainFrame();
+ Frame* webCoreMainFrame = _page->mainFrame();
if (!webCoreMainFrame)
return nil;
@@ -69,25 +65,32 @@
- (WKDOMRange *)selectedRange
{
- RefPtr<WebCore::Range> range = toImpl(_bundlePageRef.get())->currentSelectionAsRange();
+ RefPtr<Range> range = _page->currentSelectionAsRange();
if (!range)
return nil;
return toWKDOMRange(range.get());
}
+#pragma mark WKObject protocol implementation
+
+- (API::Object&)_apiObject
+{
+ return *_page;
+}
+
@end
@implementation WKWebProcessPlugInBrowserContextController (Private)
- (WKBundlePageRef)_bundlePageRef
{
- return _bundlePageRef.get();
+ return toAPI(_page.get());
}
- (WKBrowsingContextHandle *)handle
{
- return [[[WKBrowsingContextHandle alloc] _initWithPageID:toImpl(_bundlePageRef.get())->pageID()] autorelease];
+ return [[[WKBrowsingContextHandle alloc] _initWithPageID:_page->pageID()] autorelease];
}
+ (instancetype)lookUpBrowsingContextFromHandle:(WKBrowsingContextHandle *)handle
@@ -96,7 +99,7 @@
if (!webPage)
return nil;
- return [[WKWebProcessPlugInController _shared] _browserContextControllerForBundlePageRef:toAPI(webPage)];
+ return wrapper(*webPage);
}
@end
Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextControllerInternal.h (160276 => 160277)
--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextControllerInternal.h 2013-12-08 03:00:44 UTC (rev 160276)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInBrowserContextControllerInternal.h 2013-12-08 05:22:02 UTC (rev 160277)
@@ -24,14 +24,23 @@
*/
#import "WKWebProcessPlugInBrowserContextControllerPrivate.h"
-#import "WKBase.h"
#if WK_API_ENABLED
-@interface WKWebProcessPlugInBrowserContextController ()
+#import "WKObject.h"
+#import "WebPage.h"
-- (id)_initWithBundlePageRef:(WKBundlePageRef)bundlePageRef;
+namespace WebKit {
+inline WKWebProcessPlugInBrowserContextController *wrapper(WebPage& page)
+{
+ ASSERT([page.wrapper() isKindOfClass:[WKWebProcessPlugInBrowserContextController class]]);
+ return (WKWebProcessPlugInBrowserContextController *)page.wrapper();
+}
+
+}
+
+@interface WKWebProcessPlugInBrowserContextController () <WKObject>
@end
#endif // WK_API_ENABLED
Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInInternal.h (160276 => 160277)
--- trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInInternal.h 2013-12-08 03:00:44 UTC (rev 160276)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInInternal.h 2013-12-08 05:22:02 UTC (rev 160277)
@@ -27,13 +27,13 @@
#if WK_API_ENABLED
+#import "InjectedBundle.h"
+
@interface WKWebProcessPlugInController ()
+ (WKWebProcessPlugInController *)_shared;
-- (id)_initWithPrincipalClassInstance:(id<WKWebProcessPlugIn>)principalClassInstance bundleRef:(WKBundleRef)bundleRef;
+- (id)_initWithPrincipalClassInstance:(id<WKWebProcessPlugIn>)principalClassInstance bundle:(WebKit::InjectedBundle&)bundle;
-- (WKWebProcessPlugInBrowserContextController *)_browserContextControllerForBundlePageRef:(WKBundlePageRef)pageRef;
-
@end
#endif // WK_API_ENABLED
Modified: trunk/Source/WebKit2/WebProcess/InjectedBundle/mac/InjectedBundleMac.mm (160276 => 160277)
--- trunk/Source/WebKit2/WebProcess/InjectedBundle/mac/InjectedBundleMac.mm 2013-12-08 03:00:44 UTC (rev 160276)
+++ trunk/Source/WebKit2/WebProcess/InjectedBundle/mac/InjectedBundleMac.mm 2013-12-08 05:22:02 UTC (rev 160277)
@@ -105,7 +105,7 @@
}
// Create the shared WKWebProcessPlugInController.
- [[WKWebProcessPlugInController alloc] _initWithPrincipalClassInstance:instance bundleRef:toAPI(this)];
+ [[WKWebProcessPlugInController alloc] _initWithPrincipalClassInstance:instance bundle:*this];
if ([instance respondsToSelector:@selector(webProcessPlugIn:initializeWithObject:)]) {
RetainPtr<id> objCInitializationUserData;