Navigation Menu

Skip to content

Commit

Permalink
[Cocoa] Make WKWebProcessPlugInController work with WKObject wrapping
Browse files Browse the repository at this point in the history
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
  • Loading branch information
weinig@apple.com committed Dec 8, 2013
1 parent d1a9740 commit 5cdd840
Show file tree
Hide file tree
Showing 7 changed files with 65 additions and 36 deletions.
24 changes: 23 additions & 1 deletion Source/WebKit2/ChangeLog
@@ -1,11 +1,33 @@
2013-12-07 Sam Weinig <sam@webkit.org>

[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 <mitz@apple.com>

[Cocoa] WebData has a generic wrapper
https://bugs.webkit.org/show_bug.cgi?id=125402

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.
Expand Down
5 changes: 5 additions & 0 deletions Source/WebKit2/Shared/Cocoa/APIObject.mm
Expand Up @@ -44,6 +44,7 @@
#import "WKNavigationDataInternal.h"
#import "WKProcessGroupInternal.h"
#import "WKWebProcessPlugInBrowserContextControllerInternal.h"
#import "WKWebProcessPlugInInternal.h"

namespace API {

Expand Down Expand Up @@ -82,6 +83,10 @@
wrapper = [WKBackForwardListItem alloc];
break;

case Type::Bundle:
wrapper = [WKWebProcessPlugInController alloc];
break;

case Type::BundlePage:
wrapper = [WKWebProcessPlugInBrowserContextController alloc];
break;
Expand Down
1 change: 0 additions & 1 deletion Source/WebKit2/Shared/mac/ObjCObjectGraphCoders.mm
Expand Up @@ -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"
Expand Down
Expand Up @@ -28,7 +28,6 @@

#if WK_API_ENABLED

#import "InjectedBundle.h"
#import "WKConnectionInternal.h"
#import "WKBundle.h"
#import "WKBundleAPICast.h"
Expand All @@ -39,18 +38,24 @@
using namespace WebKit;

@interface WKWebProcessPlugInController () {
API::ObjectStorage<InjectedBundle> _bundle;
RetainPtr<id <WKWebProcessPlugIn>> _principalClassInstance;
RefPtr<InjectedBundle> _bundle;
RetainPtr<WKConnection *> _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<WKWebProcessPlugIn> principalClassInstance = plugInController->_principalClassInstance.get();
id <WKWebProcessPlugIn> principalClassInstance = plugInController->_principalClassInstance.get();

if ([principalClassInstance respondsToSelector:@selector(webProcessPlugIn:didCreateBrowserContextController:)])
[principalClassInstance webProcessPlugIn:plugInController didCreateBrowserContextController:wrapper(*toImpl(page))];
Expand All @@ -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<WKWebProcessPlugIn> principalClassInstance = plugInController->_principalClassInstance.get();
id <WKWebProcessPlugIn> principalClassInstance = plugInController->_principalClassInstance.get();

if ([principalClassInstance respondsToSelector:@selector(webProcessPlugIn:willDestroyBrowserContextController:)])
[principalClassInstance webProcessPlugIn:plugInController willDestroyBrowserContextController:wrapper(*toImpl(page))];
Expand All @@ -78,36 +83,26 @@ 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<WKWebProcessPlugIn>)principalClassInstance bundle:(InjectedBundle&)bundle
- (void)_setPrincipalClassInstance:(id <WKWebProcessPlugIn>)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
{
return wrapper(*_bundle->webConnectionToUIProcess());
}

#pragma mark WKObject protocol implementation

- (API::Object&)_apiObject
{
return *_bundle;
}

@end

@implementation WKWebProcessPlugInController (Private)
Expand Down
Expand Up @@ -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<WKWebProcessPlugIn>)principalClassInstance bundle:(WebKit::InjectedBundle&)bundle;
inline WKWebProcessPlugInController *wrapper(InjectedBundle& bundle)
{
ASSERT([bundle.wrapper() isKindOfClass:[WKWebProcessPlugInController class]]);
return (WKWebProcessPlugInController *)bundle.wrapper();
}

}

@interface WKWebProcessPlugInController () <WKObject>
- (void)_setPrincipalClassInstance:(id <WKWebProcessPlugIn>)principalClassInstance;
@end

#endif // WK_API_ENABLED
Expand Up @@ -29,7 +29,7 @@

@interface WKWebProcessPlugInController (Private)

@property(readonly) WKBundleRef _bundleRef;
@property (readonly) WKBundleRef _bundleRef;

@end

Expand Down
Expand Up @@ -98,24 +98,24 @@ - (CFBundleRef)_cfBundle;
return false;
}

id<WKWebProcessPlugIn> instance = (id<WKWebProcessPlugIn>)[[principalClass alloc] init];
id <WKWebProcessPlugIn> instance = (id <WKWebProcessPlugIn>)[[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<id> objCInitializationUserData;
if (initializationUserData && initializationUserData->type() == API::Object::Type::ObjCObjectGraph)
objCInitializationUserData = static_cast<ObjCObjectGraph*>(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
}

Expand Down

0 comments on commit 5cdd840

Please sign in to comment.