<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<!DOCTYPE bugzilla SYSTEM "https://bugs.webkit.org/page.cgi?id=bugzilla.dtd">

<bugzilla version="5.0.4.1"
          urlbase="https://bugs.webkit.org/"
          
          maintainer="admin@webkit.org"
>

    <bug>
          <bug_id>210920</bug_id>
          
          <creation_ts>2020-04-23 10:13:24 -0700</creation_ts>
          <short_desc>Improve API::SerializedScriptValue::deserialize to not allocate a new JSContext every second</short_desc>
          <delta_ts>2022-04-06 11:31:29 -0700</delta_ts>
          <reporter_accessible>1</reporter_accessible>
          <cclist_accessible>1</cclist_accessible>
          <classification_id>1</classification_id>
          <classification>Unclassified</classification>
          <product>WebKit</product>
          <component>WebKit API</component>
          <version>Safari 13</version>
          <rep_platform>All</rep_platform>
          <op_sys>All</op_sys>
          <bug_status>RESOLVED</bug_status>
          <resolution>FIXED</resolution>
          
          <see_also>https://bugs.webkit.org/show_bug.cgi?id=146416</see_also>
          <bug_file_loc></bug_file_loc>
          <status_whiteboard></status_whiteboard>
          <keywords>InRadar</keywords>
          <priority>P2</priority>
          <bug_severity>Enhancement</bug_severity>
          <target_milestone>---</target_milestone>
          
          
          <everconfirmed>1</everconfirmed>
          <reporter name="Simon Taylor">simontaylor1</reporter>
          <assigned_to name="Chris Dumez">cdumez</assigned_to>
          <cc>achristensen</cc>
    
    <cc>beidson</cc>
    
    <cc>cdumez</cc>
    
    <cc>darin</cc>
    
    <cc>ggaren</cc>
    
    <cc>guochongscut</cc>
    
    <cc>heycam</cc>
    
    <cc>mark.lam</cc>
    
    <cc>sam</cc>
    
    <cc>simontaylor1</cc>
    
    <cc>webkit-bug-importer</cc>
    
    <cc>ysuzuki</cc>
          

      

      

      

          <comment_sort_order>oldest_to_newest</comment_sort_order>  
          <long_desc isprivate="0" >
    <commentid>1644823</commentid>
    <comment_count>0</comment_count>
    <who name="Simon Taylor">simontaylor1</who>
    <bug_when>2020-04-23 10:13:24 -0700</bug_when>
    <thetext>In r186229 (related to bug 146416) a static API::SerializedScriptValue::deserialize() function was introduced.

This function converts from a SerializedScriptValue to an Objective C object, and is currently used in the implementation of these APIs that return results from the content process:
 - evaluateJavaScript:completionHandler: for WKWebView, and
 - userContentController:didReceiveScriptMessage: for WKScriptMessageHandler

SerializedScriptValue::deserialize uses a JSContext to do the conversion, with a SharedJSContext helper to cache this between calls so it does not need to create a completely fresh one each time (this was bug 146416).

However the SharedJSContext clears the cached JSContext one second after its initial creation due to this line:
https://trac.webkit.org/browser/webkit/trunk/Source/WebKit/UIProcess/API/Cocoa/APISerializedScriptValueCocoa.mm#L49

Any apps that make heavy use of passing data from the WKWebView to the native side therefore end up recreating the JSContext for the Objective C value conversion once per second.

The most annoying implication of this is when debugging - this only-for-conversion JSContext shows up in Safari&apos;s Develop menu, and makes the options to automatically show inspector and pause JSContexts essentially useless. It was digging into what those were that led to this entire adventure :)

There is also a small performance impact - from Instruments System Trace it looks like my iPod 7 spends around 1.5ms doing [[JSContext alloc] init]. It&apos;s only at most once per second, so not huge overall, but still would be nice to get rid of this cost.

Here&apos;s my initial thoughts for improvements:
 - Reset the timeout to clear the shared JSContext in every ensureContext() call (so active use of evaluateJavascript will keep it around indefinitely)
 - Increment a ref count on the shared context for each WKScriptMessageHandler attached

I don&apos;t know the memory cost of the shared JSContext, but attaching a WKScriptMessageHandler is a pretty clear signal the developer expects messages to be coming back from the WebView, so I&apos;d argue keeping the shared context around in this case makes sense.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1852957</commentid>
    <comment_count>1</comment_count>
    <who name="chad">guochongscut</who>
    <bug_when>2022-03-19 03:16:18 -0700</bug_when>
    <thetext>Looks like a solution for this issue: WebKit::WebUserContentControllerProxy::didReceiveMessage spents long time on JSContext initailization. https://developer.apple.com/forums/thread/702626</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1858824</commentid>
    <comment_count>2</comment_count>
      <attachid>456819</attachid>
    <who name="Chris Dumez">cdumez</who>
    <bug_when>2022-04-06 07:53:01 -0700</bug_when>
    <thetext>Created attachment 456819
Patch</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1858901</commentid>
    <comment_count>3</comment_count>
      <attachid>456819</attachid>
    <who name="Geoffrey Garen">ggaren</who>
    <bug_when>2022-04-06 10:39:03 -0700</bug_when>
    <thetext>Comment on attachment 456819
Patch

r=me</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1858940</commentid>
    <comment_count>4</comment_count>
    <who name="EWS">ews-feeder</who>
    <bug_when>2022-04-06 11:30:53 -0700</bug_when>
    <thetext>Committed r292483 (249334@main): &lt;https://commits.webkit.org/249334@main&gt;

All reviewed patches have been landed. Closing bug and clearing flags on attachment 456819.</thetext>
  </long_desc><long_desc isprivate="0" >
    <commentid>1858942</commentid>
    <comment_count>5</comment_count>
    <who name="Radar WebKit Bug Importer">webkit-bug-importer</who>
    <bug_when>2022-04-06 11:31:29 -0700</bug_when>
    <thetext>&lt;rdar://problem/91366573&gt;</thetext>
  </long_desc>
      
          <attachment
              isobsolete="0"
              ispatch="1"
              isprivate="0"
          >
            <attachid>456819</attachid>
            <date>2022-04-06 07:53:01 -0700</date>
            <delta_ts>2022-04-06 11:30:55 -0700</delta_ts>
            <desc>Patch</desc>
            <filename>bug-210920-20220406075300.patch</filename>
            <type>text/plain</type>
            <size>3077</size>
            <attacher name="Chris Dumez">cdumez</attacher>
            
              <data encoding="base64">U3VidmVyc2lvbiBSZXZpc2lvbjogMjkyNDYzCmRpZmYgLS1naXQgYS9Tb3VyY2UvV2ViS2l0L0No
YW5nZUxvZyBiL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCmluZGV4IDdiN2Y1ZTBiMzEwNzIxYTIw
NjZlNmRiMDg2OTQwYTg2NjM3ZTQ4YzkuLmI0YzYxNTBiODIwZjM0MzdkOWU4MGRhMzVmNjNkZDg0
MzBlNDliMGYgMTAwNjQ0Ci0tLSBhL1NvdXJjZS9XZWJLaXQvQ2hhbmdlTG9nCisrKyBiL1NvdXJj
ZS9XZWJLaXQvQ2hhbmdlTG9nCkBAIC0xLDMgKzEsMTkgQEAKKzIwMjItMDQtMDYgIENocmlzIER1
bWV6ICA8Y2R1bWV6QGFwcGxlLmNvbT4KKworICAgICAgICBJbXByb3ZlIEFQSTo6U2VyaWFsaXpl
ZFNjcmlwdFZhbHVlOjpkZXNlcmlhbGl6ZSB0byBub3QgYWxsb2NhdGUgYSBuZXcgSlNDb250ZXh0
IGV2ZXJ5IHNlY29uZAorICAgICAgICBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5j
Z2k/aWQ9MjEwOTIwCisKKyAgICAgICAgUmV2aWV3ZWQgYnkgTk9CT0RZIChPT1BTISkuCisKKyAg
ICAgICAgSW5zdGVhZCBvZiBmb3JjaW5nIHRoZSBsaWZldGltZSBvZiB0aGUgc2hhcmVkIEpTQ29u
dGV4dCB0byAxIHNlY29uZCwgd2Ugbm93IHVzZSBhIGh5c3RlcmVzaXMKKyAgICAgICAgbG9naWMg
c28gdGhhdCBpdCBjYW4gc3RheSBhbGl2ZSBhcyBsb25nIGFzIGl0IGlzIHVzZWQgYXQgbGVhc3Qg
ZXZlcnkgMTAgc2Vjb25kcy4KKworICAgICAgICAqIFVJUHJvY2Vzcy9BUEkvQ29jb2EvQVBJU2Vy
aWFsaXplZFNjcmlwdFZhbHVlQ29jb2EubW06CisgICAgICAgIChBUEk6OlNoYXJlZEpTQ29udGV4
dDo6U2hhcmVkSlNDb250ZXh0KToKKyAgICAgICAgKEFQSTo6U2hhcmVkSlNDb250ZXh0OjplbnN1
cmVDb250ZXh0KToKKyAgICAgICAgKEFQSTo6U2hhcmVkSlNDb250ZXh0OjpyZWxlYXNlQ29udGV4
dElmTmVjZXNzYXJ5KToKKyAgICAgICAgKEFQSTo6U2hhcmVkSlNDb250ZXh0OjpyZWxlYXNlQ29u
dGV4dCk6IERlbGV0ZWQuCisKIDIwMjItMDQtMDYgIEtpbW1vIEtpbm51bmVuICA8a2tpbm51bmVu
QGFwcGxlLmNvbT4KIAogICAgICAgICBNZWRpYSBhbmQgV2ViUlRDIGNvZGUgdXNlcyBUaHJlYWRN
ZXNzYWdlUmVjZWl2ZXJSZWZDb3VudGVkIHdpdGggV29ya1F1ZXVlcwpkaWZmIC0tZ2l0IGEvU291
cmNlL1dlYktpdC9VSVByb2Nlc3MvQVBJL0NvY29hL0FQSVNlcmlhbGl6ZWRTY3JpcHRWYWx1ZUNv
Y29hLm1tIGIvU291cmNlL1dlYktpdC9VSVByb2Nlc3MvQVBJL0NvY29hL0FQSVNlcmlhbGl6ZWRT
Y3JpcHRWYWx1ZUNvY29hLm1tCmluZGV4IDg5NTUwNjExMzM0NDY1N2Q0NWViNTIyNzRjNDBhMjky
ZjYxZjIzYzkuLjM4ZGMxNGIxODk3NzA0MWFhZDk5NmFjZDMzYWU2OGFjYjQ3YmMwNDQgMTAwNjQ0
Ci0tLSBhL1NvdXJjZS9XZWJLaXQvVUlQcm9jZXNzL0FQSS9Db2NvYS9BUElTZXJpYWxpemVkU2Ny
aXB0VmFsdWVDb2NvYS5tbQorKysgYi9Tb3VyY2UvV2ViS2l0L1VJUHJvY2Vzcy9BUEkvQ29jb2Ev
QVBJU2VyaWFsaXplZFNjcmlwdFZhbHVlQ29jb2EubW0KQEAgLTM2LDM0ICszNiw0NSBAQAogCiBu
YW1lc3BhY2UgQVBJIHsKIAorc3RhdGljIGNvbnN0ZXhwciBhdXRvIHNoYXJlZEpTQ29udGV4dE1h
eElkbGVUaW1lID0gMTBfczsKKwogY2xhc3MgU2hhcmVkSlNDb250ZXh0IHsKIHB1YmxpYzoKICAg
ICBTaGFyZWRKU0NvbnRleHQoKQotICAgICAgICA6IG1fdGltZXIoUnVuTG9vcDo6bWFpbigpLCB0
aGlzLCAmU2hhcmVkSlNDb250ZXh0OjpyZWxlYXNlQ29udGV4dCkKKyAgICAgICAgOiBtX3RpbWVy
KFJ1bkxvb3A6Om1haW4oKSwgdGhpcywgJlNoYXJlZEpTQ29udGV4dDo6cmVsZWFzZUNvbnRleHRJ
Zk5lY2Vzc2FyeSkKICAgICB7CiAgICAgfQogCiAgICAgSlNDb250ZXh0KiBlbnN1cmVDb250ZXh0
KCkKICAgICB7CisgICAgICAgIG1fbGFzdFVzZVRpbWUgPSBNb25vdG9uaWNUaW1lOjpub3coKTsK
ICAgICAgICAgaWYgKCFtX2NvbnRleHQpIHsKICAgICAgICAgICAgIGJvb2wgcHJldmlvdXMgPSBK
U1JlbW90ZUluc3BlY3RvckdldEluc3BlY3Rpb25FbmFibGVkQnlEZWZhdWx0KCk7CiAgICAgICAg
ICAgICBKU1JlbW90ZUluc3BlY3RvclNldEluc3BlY3Rpb25FbmFibGVkQnlEZWZhdWx0KGZhbHNl
KTsKICAgICAgICAgICAgIG1fY29udGV4dCA9IGFkb3B0TlMoW1tKU0NvbnRleHQgYWxsb2NdIGlu
aXRdKTsKICAgICAgICAgICAgIEpTUmVtb3RlSW5zcGVjdG9yU2V0SW5zcGVjdGlvbkVuYWJsZWRC
eURlZmF1bHQocHJldmlvdXMpOwogCi0gICAgICAgICAgICBtX3RpbWVyLnN0YXJ0T25lU2hvdCgx
X3MpOworICAgICAgICAgICAgbV90aW1lci5zdGFydE9uZVNob3Qoc2hhcmVkSlNDb250ZXh0TWF4
SWRsZVRpbWUpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtX2NvbnRleHQuZ2V0KCk7CiAg
ICAgfQogCi0gICAgdm9pZCByZWxlYXNlQ29udGV4dCgpCisgICAgdm9pZCByZWxlYXNlQ29udGV4
dElmTmVjZXNzYXJ5KCkKICAgICB7CisgICAgICAgIGF1dG8gaWRsZVRpbWUgPSBNb25vdG9uaWNU
aW1lOjpub3coKSAtIG1fbGFzdFVzZVRpbWU7CisgICAgICAgIGlmIChpZGxlVGltZSA8IHNoYXJl
ZEpTQ29udGV4dE1heElkbGVUaW1lKSB7CisgICAgICAgICAgICAvLyBXZSBsYXppbHkgcmVzdGFy
dCB0aGUgdGltZXIgaWYgbmVlZGVkIGV2ZXJ5IDEwIHNlY29uZHMgaW5zdGVhZCBvZiBkb2luZyBz
byBldmVyeSB0aW1lIGVuc3VyZUNvbnRleHQoKQorICAgICAgICAgICAgLy8gaXMgY2FsbGVkLCBm
b3IgcGVyZm9ybWFuY2UgcmVhc29ucy4KKyAgICAgICAgICAgIG1fdGltZXIuc3RhcnRPbmVTaG90
KHNoYXJlZEpTQ29udGV4dE1heElkbGVUaW1lIC0gaWRsZVRpbWUpOworICAgICAgICAgICAgcmV0
dXJuOworICAgICAgICB9CiAgICAgICAgIG1fY29udGV4dC5jbGVhcigpOwogICAgIH0KIAogcHJp
dmF0ZToKICAgICBSZXRhaW5QdHI8SlNDb250ZXh0PiBtX2NvbnRleHQ7CiAgICAgUnVuTG9vcDo6
VGltZXI8U2hhcmVkSlNDb250ZXh0PiBtX3RpbWVyOworICAgIE1vbm90b25pY1RpbWUgbV9sYXN0
VXNlVGltZTsKIH07CiAKIHN0YXRpYyBTaGFyZWRKU0NvbnRleHQmIHNoYXJlZENvbnRleHQoKQo=
</data>

          </attachment>
      

    </bug>

</bugzilla>