Changeset 186229 in webkit


Ignore:
Timestamp:
Jul 2, 2015 11:38:22 AM (9 years ago)
Author:
mark.lam@apple.com
Message:

WKWebView evaluateJavaScript:completionHandler: should reuse its JSContext instance.
https://bugs.webkit.org/show_bug.cgi?id=146416

Reviewed by Anders Carlsson.

The core issue here is that we need to be able to deserialized an
API::SerializedScriptValue instance into an ObjC object graph. We'll solve this
by introducing a API::SerializedScriptValue::deserialize() functions that does
the job. The deserialize() function will will use a SharedJSContext to provide
the needed JSContext for doing this work.

Also updated ScriptMessageHandlerDelegate::didPostMessage() to use this new
deserialize() function.

  • Shared/API/APISerializedScriptValue.h:

(API::SerializedScriptValue::deserialize):
(API::SerializedScriptValue::internalRepresentation):

  • Changed to return a WebCore::SerializedScriptValue*. This makes it friendlier to use in the 2 places that need it.
  • UIProcess/API/Cocoa/APISerializedScriptValueCocoa.mm: Added.

(API::SharedJSContext::SharedJSContext):
(API::SharedJSContext::ensureContext):
(API::SharedJSContext::releaseContext):
(API::SerializedScriptValue::deserialize):

  • UIProcess/API/Cocoa/WKUserContentController.mm:
  • UIProcess/API/Cocoa/WKWebView.mm:

(-[WKWebView evaluateJavaScript:completionHandler:]):

  • UIProcess/API/gtk/WebKitWebView.cpp:

(webkitWebViewRunJavaScriptCallback):

  • Removed a now unnecessary cast.
  • WebKit2.xcodeproj/project.pbxproj:
Location:
trunk/Source/WebKit2
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebKit2/ChangeLog

    r186226 r186229  
     12015-07-02  Mark Lam  <mark.lam@apple.com>
     2
     3        WKWebView evaluateJavaScript:completionHandler: should reuse its JSContext instance.
     4        https://bugs.webkit.org/show_bug.cgi?id=146416
     5
     6        Reviewed by Anders Carlsson.
     7
     8        The core issue here is that we need to be able to deserialized an
     9        API::SerializedScriptValue instance into an ObjC object graph.  We'll solve this
     10        by introducing a API::SerializedScriptValue::deserialize() functions that does
     11        the job.  The deserialize() function will will use a SharedJSContext to provide
     12        the needed JSContext for doing this work.
     13
     14        Also updated ScriptMessageHandlerDelegate::didPostMessage() to use this new
     15        deserialize() function.
     16
     17        * Shared/API/APISerializedScriptValue.h:
     18        (API::SerializedScriptValue::deserialize):
     19        (API::SerializedScriptValue::internalRepresentation):
     20        - Changed to return a WebCore::SerializedScriptValue*.  This makes it friendlier
     21          to use in the 2 places that need it.
     22
     23        * UIProcess/API/Cocoa/APISerializedScriptValueCocoa.mm: Added.
     24        (API::SharedJSContext::SharedJSContext):
     25        (API::SharedJSContext::ensureContext):
     26        (API::SharedJSContext::releaseContext):
     27        (API::SerializedScriptValue::deserialize):
     28        * UIProcess/API/Cocoa/WKUserContentController.mm:
     29        * UIProcess/API/Cocoa/WKWebView.mm:
     30        (-[WKWebView evaluateJavaScript:completionHandler:]):
     31        * UIProcess/API/gtk/WebKitWebView.cpp:
     32        (webkitWebViewRunJavaScriptCallback):
     33        - Removed a now unnecessary cast.
     34        * WebKit2.xcodeproj/project.pbxproj:
     35
    1362015-07-02  Dan Bernstein  <mitz@apple.com>
    237
  • trunk/Source/WebKit2/Shared/API/APISerializedScriptValue.h

    r185637 r186229  
    5959        return m_serializedScriptValue->deserialize(context, exception);
    6060    }
     61   
     62#if PLATFORM(COCOA) && defined(__OBJC__)
     63    static id deserialize(WebCore::SerializedScriptValue&, JSValueRef* exception);
     64#endif
    6165
    6266    IPC::DataReference dataReference() const { return m_serializedScriptValue->data(); }
    6367
    64     void* internalRepresentation() { return m_serializedScriptValue.get(); }
     68    WebCore::SerializedScriptValue* internalRepresentation() { return m_serializedScriptValue.get(); }
    6569
    6670private:
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKUserContentController.mm

    r186017 r186229  
    2929#if WK_API_ENABLED
    3030
     31#import "APISerializedScriptValue.h"
    3132#import "SecurityOriginData.h"
    3233#import "WKFrameInfoInternal.h"
     
    3940#import "WebUserContentControllerProxy.h"
    4041#import "_WKUserContentFilterInternal.h"
    41 #import <JavaScriptCore/JSContext.h>
    42 #import <JavaScriptCore/JSValue.h>
    4342#import <WebCore/SerializedScriptValue.h>
    44 #import <wtf/MainThread.h>
    4543
    4644@implementation WKUserContentController
     
    9189        @autoreleasepool {
    9290            RetainPtr<WKFrameInfo> frameInfo = wrapper(API::FrameInfo::create(frame, securityOriginData.securityOrigin()));
    93 
    94             ASSERT(isUIThread());
    95             static JSContext* context = [[JSContext alloc] init];
    96 
    97             JSValueRef valueRef = serializedScriptValue.deserialize([context JSGlobalContextRef], 0);
    98             JSValue *value = [JSValue valueWithJSValueRef:valueRef inContext:context];
    99             id body = value.toObject;
    100 
     91            id body = API::SerializedScriptValue::deserialize(serializedScriptValue, 0);
    10192            auto message = adoptNS([[WKScriptMessage alloc] _initWithBody:body webView:fromWebPageProxy(page) frameInfo:frameInfo.get() name:m_name.get()]);
    10293       
  • trunk/Source/WebKit2/UIProcess/API/Cocoa/WKWebView.mm

    r186194 r186229  
    7777#import "_WKSessionStateInternal.h"
    7878#import "_WKVisitedLinkProviderInternal.h"
    79 #import <JavaScriptCore/JSContext.h>
    80 #import <JavaScriptCore/JSValue.h>
    8179#import <WebCore/IOSurface.h>
    8280#import <wtf/HashMap.h>
     
    638636        }
    639637
    640         auto context = adoptNS([[JSContext alloc] init]);
    641         JSValueRef valueRef = serializedScriptValue->deserialize([context JSGlobalContextRef], 0);
    642         JSValue *value = [JSValue valueWithJSValueRef:valueRef inContext:context.get()];
    643 
    644         rawHandler([value toObject], nil);
     638        id body = API::SerializedScriptValue::deserialize(*serializedScriptValue->internalRepresentation(), 0);
     639        rawHandler(body, nil);
    645640    });
    646641}
  • trunk/Source/WebKit2/UIProcess/API/gtk/WebKitWebView.cpp

    r185879 r186229  
    29872987    WebKitWebView* webView = WEBKIT_WEB_VIEW(g_task_get_source_object(task));
    29882988    g_task_return_pointer(task, webkitJavascriptResultCreate(webView,
    2989         *static_cast<WebCore::SerializedScriptValue*>(wkSerializedScriptValue->internalRepresentation())),
     2989        *wkSerializedScriptValue->internalRepresentation()),
    29902990        reinterpret_cast<GDestroyNotify>(webkit_javascript_result_unref));
    29912991}
  • trunk/Source/WebKit2/WebKit2.xcodeproj/project.pbxproj

    r186226 r186229  
    17911791                F6A90813133C20510082C3F4 /* WebCookieManagerMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6A90811133C1F3D0082C3F4 /* WebCookieManagerMac.mm */; };
    17921792                F6D632BC133D198200743D77 /* WebCookieManagerProxyMac.mm in Sources */ = {isa = PBXBuildFile; fileRef = F6D632BA133D181B00743D77 /* WebCookieManagerProxyMac.mm */; };
     1793                FED3C1DC1B447EAC00E0EB7F /* APISerializedScriptValueCocoa.mm in Sources */ = {isa = PBXBuildFile; fileRef = FED3C1DA1B447AE800E0EB7F /* APISerializedScriptValueCocoa.mm */; };
    17931794/* End PBXBuildFile section */
    17941795
     
    40244025                F6A90811133C1F3D0082C3F4 /* WebCookieManagerMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebCookieManagerMac.mm; sourceTree = "<group>"; };
    40254026                F6D632BA133D181B00743D77 /* WebCookieManagerProxyMac.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebCookieManagerProxyMac.mm; sourceTree = "<group>"; };
     4027                FED3C1DA1B447AE800E0EB7F /* APISerializedScriptValueCocoa.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = APISerializedScriptValueCocoa.mm; sourceTree = "<group>"; };
    40264028/* End PBXFileReference section */
    40274029
     
    53105312                                1A81B37E18BD66AD0007FDAC /* _WKVisitedLinkProvider.mm */,
    53115313                                1A81B38418BD673A0007FDAC /* _WKVisitedLinkProviderInternal.h */,
     5314                                FED3C1DA1B447AE800E0EB7F /* APISerializedScriptValueCocoa.mm */,
    53125315                                7CEFA9601AC0999300B910FD /* APIUserContentExtensionStoreCocoa.mm */,
    53135316                                1A3635AB1A3145E500ED6197 /* APIWebsiteDataStoreCocoa.mm */,
     
    96429645                                1ZZ417EF12C00D87002BE67B /* TextCheckerCompletion.cpp in Sources */,
    96439646                                2DA944AD1884E9BA00ED86DB /* TextCheckerIOS.mm in Sources */,
     9647                                FED3C1DC1B447EAC00E0EB7F /* APISerializedScriptValueCocoa.mm in Sources */,
    96449648                                1AA417EF12C00D87002BE67B /* TextCheckerMac.mm in Sources */,
    96459649                                1AAF263814687C39004A1E8A /* TiledCoreAnimationDrawingArea.mm in Sources */,
Note: See TracChangeset for help on using the changeset viewer.