From 5cdd8408951b033c164d6e2b6aa9b0ae608362e8 Mon Sep 17 00:00:00 2001 From: "weinig@apple.com" Date: Sun, 8 Dec 2013 06:17:18 +0000 Subject: [PATCH] [Cocoa] Make WKWebProcessPlugInController work with WKObject wrapping https://bugs.webkit.org/show_bug.cgi?id=125404 Reviewed by Dan Bernstein. * Shared/Cocoa/APIObject.mm: (API::Object::newObject): * Shared/mac/ObjCObjectGraphCoders.mm: * WebProcess/InjectedBundle/API/mac/WKWebProcessPlugIn.mm: (-[WKWebProcessPlugInController dealloc]): (didCreatePage): (willDestroyPage): (-[WKWebProcessPlugInController _setPrincipalClassInstance:]): (-[WKWebProcessPlugInController API::]): * WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInInternal.h: (WebKit::wrapper): * WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInPrivate.h: * WebProcess/InjectedBundle/mac/InjectedBundleMac.mm: (WebKit::InjectedBundle::load): git-svn-id: http://svn.webkit.org/repository/webkit/trunk@160280 268f45cc-cd09-0410-ab3c-d52691b4dbfc --- Source/WebKit2/ChangeLog | 24 ++++++++++- Source/WebKit2/Shared/Cocoa/APIObject.mm | 5 +++ .../Shared/mac/ObjCObjectGraphCoders.mm | 1 - .../API/mac/WKWebProcessPlugIn.mm | 43 ++++++++----------- .../API/mac/WKWebProcessPlugInInternal.h | 16 +++++-- .../API/mac/WKWebProcessPlugInPrivate.h | 2 +- .../InjectedBundle/mac/InjectedBundleMac.mm | 10 ++--- 7 files changed, 65 insertions(+), 36 deletions(-) diff --git a/Source/WebKit2/ChangeLog b/Source/WebKit2/ChangeLog index 58b6046bb130f..fb62a8660ae55 100644 --- a/Source/WebKit2/ChangeLog +++ b/Source/WebKit2/ChangeLog @@ -1,3 +1,25 @@ +2013-12-07 Sam Weinig + + [Cocoa] Make WKWebProcessPlugInController work with WKObject wrapping + https://bugs.webkit.org/show_bug.cgi?id=125404 + + Reviewed by Dan Bernstein. + + * Shared/Cocoa/APIObject.mm: + (API::Object::newObject): + * Shared/mac/ObjCObjectGraphCoders.mm: + * WebProcess/InjectedBundle/API/mac/WKWebProcessPlugIn.mm: + (-[WKWebProcessPlugInController dealloc]): + (didCreatePage): + (willDestroyPage): + (-[WKWebProcessPlugInController _setPrincipalClassInstance:]): + (-[WKWebProcessPlugInController API::]): + * WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInInternal.h: + (WebKit::wrapper): + * WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInPrivate.h: + * WebProcess/InjectedBundle/mac/InjectedBundleMac.mm: + (WebKit::InjectedBundle::load): + 2013-12-07 Dan Bernstein [Cocoa] WebData has a generic wrapper @@ -5,7 +27,7 @@ Reviewed by Sam Weinig. - Added WKNSData, an NSData subclass that confroms to WKObject and wraps a WebData. + Added WKNSData, an NSData subclass that conforms to WKObject and wraps a WebData. * Shared/Cocoa/APIObject.mm: (API::Object::newObject): Allocate a WKNSData if the API::Object is data. diff --git a/Source/WebKit2/Shared/Cocoa/APIObject.mm b/Source/WebKit2/Shared/Cocoa/APIObject.mm index 0b9edc0874391..23047867c074b 100644 --- a/Source/WebKit2/Shared/Cocoa/APIObject.mm +++ b/Source/WebKit2/Shared/Cocoa/APIObject.mm @@ -44,6 +44,7 @@ #import "WKNavigationDataInternal.h" #import "WKProcessGroupInternal.h" #import "WKWebProcessPlugInBrowserContextControllerInternal.h" +#import "WKWebProcessPlugInInternal.h" namespace API { @@ -82,6 +83,10 @@ wrapper = [WKBackForwardListItem alloc]; break; + case Type::Bundle: + wrapper = [WKWebProcessPlugInController alloc]; + break; + case Type::BundlePage: wrapper = [WKWebProcessPlugInBrowserContextController alloc]; break; diff --git a/Source/WebKit2/Shared/mac/ObjCObjectGraphCoders.mm b/Source/WebKit2/Shared/mac/ObjCObjectGraphCoders.mm index ba7e2dd649439..af7b0bbd7d9dd 100644 --- a/Source/WebKit2/Shared/mac/ObjCObjectGraphCoders.mm +++ b/Source/WebKit2/Shared/mac/ObjCObjectGraphCoders.mm @@ -40,7 +40,6 @@ #import "InjectedBundleUserMessageCoders.h" #import "WKBundleAPICast.h" #import "WKWebProcessPlugInBrowserContextControllerInternal.h" -#import "WKWebProcessPlugInBrowserContextControllerPrivate.h" #import "WKWebProcessPlugInInternal.h" #import "WebPage.h" #import "WebProcess.h" diff --git a/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugIn.mm b/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugIn.mm index b5be4e7c56d26..47ec072e8a2ce 100644 --- a/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugIn.mm +++ b/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugIn.mm @@ -28,7 +28,6 @@ #if WK_API_ENABLED -#import "InjectedBundle.h" #import "WKConnectionInternal.h" #import "WKBundle.h" #import "WKBundleAPICast.h" @@ -39,18 +38,24 @@ using namespace WebKit; @interface WKWebProcessPlugInController () { + API::ObjectStorage _bundle; RetainPtr> _principalClassInstance; - RefPtr _bundle; - RetainPtr _connectionWrapper; } @end @implementation WKWebProcessPlugInController +- (void)dealloc +{ + _bundle->~InjectedBundle(); + + [super dealloc]; +} + static void didCreatePage(WKBundleRef bundle, WKBundlePageRef page, const void* clientInfo) { WKWebProcessPlugInController *plugInController = (WKWebProcessPlugInController *)clientInfo; - id principalClassInstance = plugInController->_principalClassInstance.get(); + id principalClassInstance = plugInController->_principalClassInstance.get(); if ([principalClassInstance respondsToSelector:@selector(webProcessPlugIn:didCreateBrowserContextController:)]) [principalClassInstance webProcessPlugIn:plugInController didCreateBrowserContextController:wrapper(*toImpl(page))]; @@ -59,7 +64,7 @@ static void didCreatePage(WKBundleRef bundle, WKBundlePageRef page, const void* static void willDestroyPage(WKBundleRef bundle, WKBundlePageRef page, const void* clientInfo) { WKWebProcessPlugInController *plugInController = (WKWebProcessPlugInController *)clientInfo; - id principalClassInstance = plugInController->_principalClassInstance.get(); + id principalClassInstance = plugInController->_principalClassInstance.get(); if ([principalClassInstance respondsToSelector:@selector(webProcessPlugIn:willDestroyBrowserContextController:)]) [principalClassInstance webProcessPlugIn:plugInController willDestroyBrowserContextController:wrapper(*toImpl(page))]; @@ -78,29 +83,12 @@ static void setUpBundleClient(WKWebProcessPlugInController *plugInController, In bundle.initializeClient(&bundleClient.base); } -static WKWebProcessPlugInController *sharedInstance; - -+ (WKWebProcessPlugInController *)_shared -{ - ASSERT_WITH_MESSAGE(sharedInstance, "+[WKWebProcessPlugIn _shared] called without first initializing it."); - return sharedInstance; -} - -- (id)_initWithPrincipalClassInstance:(id)principalClassInstance bundle:(InjectedBundle&)bundle +- (void)_setPrincipalClassInstance:(id )principalClassInstance { - self = [super init]; - if (!self) - return nil; - + ASSERT(!_principalClassInstance); _principalClassInstance = principalClassInstance; - _bundle = &bundle; - - ASSERT_WITH_MESSAGE(!sharedInstance, "WKWebProcessPlugInController initialized multiple times."); - sharedInstance = self; setUpBundleClient(self, *_bundle); - - return self; } - (WKConnection *)connection @@ -108,6 +96,13 @@ - (WKConnection *)connection return wrapper(*_bundle->webConnectionToUIProcess()); } +#pragma mark WKObject protocol implementation + +- (API::Object&)_apiObject +{ + return *_bundle; +} + @end @implementation WKWebProcessPlugInController (Private) diff --git a/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInInternal.h b/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInInternal.h index dbb9bc6a4a1f9..dc8ea02ccd142 100644 --- a/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInInternal.h +++ b/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInInternal.h @@ -23,17 +23,25 @@ * THE POSSIBILITY OF SUCH DAMAGE. */ -#import "WKWebProcessPlugIn.h" +#import "WKWebProcessPlugInPrivate.h" #if WK_API_ENABLED #import "InjectedBundle.h" +#import "WKObject.h" -@interface WKWebProcessPlugInController () +namespace WebKit { -+ (WKWebProcessPlugInController *)_shared; -- (id)_initWithPrincipalClassInstance:(id)principalClassInstance bundle:(WebKit::InjectedBundle&)bundle; +inline WKWebProcessPlugInController *wrapper(InjectedBundle& bundle) +{ + ASSERT([bundle.wrapper() isKindOfClass:[WKWebProcessPlugInController class]]); + return (WKWebProcessPlugInController *)bundle.wrapper(); +} +} + +@interface WKWebProcessPlugInController () +- (void)_setPrincipalClassInstance:(id )principalClassInstance; @end #endif // WK_API_ENABLED diff --git a/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInPrivate.h b/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInPrivate.h index 3b619e50fdb95..302a742363803 100644 --- a/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInPrivate.h +++ b/Source/WebKit2/WebProcess/InjectedBundle/API/mac/WKWebProcessPlugInPrivate.h @@ -29,7 +29,7 @@ @interface WKWebProcessPlugInController (Private) -@property(readonly) WKBundleRef _bundleRef; +@property (readonly) WKBundleRef _bundleRef; @end diff --git a/Source/WebKit2/WebProcess/InjectedBundle/mac/InjectedBundleMac.mm b/Source/WebKit2/WebProcess/InjectedBundle/mac/InjectedBundleMac.mm index e64db960efcab..23910a7825693 100644 --- a/Source/WebKit2/WebProcess/InjectedBundle/mac/InjectedBundleMac.mm +++ b/Source/WebKit2/WebProcess/InjectedBundle/mac/InjectedBundleMac.mm @@ -98,24 +98,24 @@ - (CFBundleRef)_cfBundle; return false; } - id instance = (id)[[principalClass alloc] init]; + id instance = (id )[[principalClass alloc] init]; if (!instance) { WTFLogAlways("InjectedBundle::load failed - Could not initialize an instance of the principal class.\n"); return false; } - // Create the shared WKWebProcessPlugInController. - [[WKWebProcessPlugInController alloc] _initWithPrincipalClassInstance:instance bundle:*this]; + WKWebProcessPlugInController* plugInController = WebKit::wrapper(*this); + [plugInController _setPrincipalClassInstance:instance]; if ([instance respondsToSelector:@selector(webProcessPlugIn:initializeWithObject:)]) { RetainPtr objCInitializationUserData; if (initializationUserData && initializationUserData->type() == API::Object::Type::ObjCObjectGraph) objCInitializationUserData = static_cast(initializationUserData)->rootObject(); - [instance webProcessPlugIn:[WKWebProcessPlugInController _shared] initializeWithObject:objCInitializationUserData.get()]; + [instance webProcessPlugIn:plugInController initializeWithObject:objCInitializationUserData.get()]; } else if ([instance respondsToSelector:@selector(webProcessPlugInInitialize:)]) { #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" - [instance webProcessPlugInInitialize:[WKWebProcessPlugInController _shared]]; + [instance webProcessPlugInInitialize:plugInController]; #pragma clang diagnostic pop }