<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><meta http-equiv="content-type" content="text/html; charset=utf-8" />
<title>[202670] trunk/Source/JavaScriptCore</title>
</head>
<body>

<style type="text/css"><!--
#msg dl.meta { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; }
#msg dl.meta dt { float: left; width: 6em; font-weight: bold; }
#msg dt:after { content:':';}
#msg dl, #msg dt, #msg ul, #msg li, #header, #footer, #logmsg { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt;  }
#msg dl a { font-weight: bold}
#msg dl a:link    { color:#fc3; }
#msg dl a:active  { color:#ff0; }
#msg dl a:visited { color:#cc6; }
h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; }
#msg pre { overflow: auto; background: #ffc; border: 1px #fa0 solid; padding: 6px; }
#logmsg { background: #ffc; border: 1px #fa0 solid; padding: 1em 1em 0 1em; }
#logmsg p, #logmsg pre, #logmsg blockquote { margin: 0 0 1em 0; }
#logmsg p, #logmsg li, #logmsg dt, #logmsg dd { line-height: 14pt; }
#logmsg h1, #logmsg h2, #logmsg h3, #logmsg h4, #logmsg h5, #logmsg h6 { margin: .5em 0; }
#logmsg h1:first-child, #logmsg h2:first-child, #logmsg h3:first-child, #logmsg h4:first-child, #logmsg h5:first-child, #logmsg h6:first-child { margin-top: 0; }
#logmsg ul, #logmsg ol { padding: 0; list-style-position: inside; margin: 0 0 0 1em; }
#logmsg ul { text-indent: -1em; padding-left: 1em; }#logmsg ol { text-indent: -1.5em; padding-left: 1.5em; }
#logmsg > ul, #logmsg > ol { margin: 0 0 1em 0; }
#logmsg pre { background: #eee; padding: 1em; }
#logmsg blockquote { border: 1px solid #fa0; border-left-width: 10px; padding: 1em 1em 0 1em; background: white;}
#logmsg dl { margin: 0; }
#logmsg dt { font-weight: bold; }
#logmsg dd { margin: 0; padding: 0 0 0.5em 0; }
#logmsg dd:before { content:'\00bb';}
#logmsg table { border-spacing: 0px; border-collapse: collapse; border-top: 4px solid #fa0; border-bottom: 1px solid #fa0; background: #fff; }
#logmsg table th { text-align: left; font-weight: normal; padding: 0.2em 0.5em; border-top: 1px dotted #fa0; }
#logmsg table td { text-align: right; border-top: 1px dotted #fa0; padding: 0.2em 0.5em; }
#logmsg table thead th { text-align: center; border-bottom: 1px solid #fa0; }
#logmsg table th.Corner { text-align: left; }
#logmsg hr { border: none 0; border-top: 2px dashed #fa0; height: 1px; }
#header, #footer { color: #fff; background: #636; border: 1px #300 solid; padding: 6px; }
#patch { width: 100%; }
#patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;}
#patch .propset h4, #patch .binary h4 {margin:0;}
#patch pre {padding:0;line-height:1.2em;margin:0;}
#patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;}
#patch .propset .diff, #patch .binary .diff  {padding:10px 0;}
#patch span {display:block;padding:0 10px;}
#patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;}
#patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;}
#patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;}
#patch .lines, .info {color:#888;background:#fff;}
--></style>
<div id="msg">
<dl class="meta">
<dt>Revision</dt> <dd><a href="http://trac.webkit.org/projects/webkit/changeset/202670">202670</a></dd>
<dt>Author</dt> <dd>msaboff@apple.com</dd>
<dt>Date</dt> <dd>2016-06-29 21:46:51 -0700 (Wed, 29 Jun 2016)</dd>
</dl>

<h3>Log Message</h3>
<pre>REGRESSION(200114): Netflix app does not see ChromeCast
https://bugs.webkit.org/show_bug.cgi?id=159287

Reviewed by Benjamin Poulain.

Change set 200114 changed the behavior of how we check for whether or not we
wrap Objective C init methods in JavaScript constructors.  The prior method
checked the version of JavaScriptCore that was linked with the application.
If the application was not directly linked with JavaScriptCore the prior
method indicated that we shouldn't create constructors.  The new method uses
the SDK the application was compiled with.  Using the new method, an
application compiled with iOS SDK 8.0 or greater would create constructors
and not export init methods to JavaScript.  The problem is that an existing
application that hasn't been recompiled will get a different answer using
the new method.  We need to come up with a method that works in a compatible
way with existing programs, but provides a newly compiled program with the
&quot;is built with SDK N or greater&quot; check.
        
Added back the prior check of the version of JavaScriptCore the program was
directly linked against.  However we only use this check if we directly linked
with JavaScriptCore.  Otherwise we fall through to check against the SDK the
program was built with.  Changed the iOS SDK version we check
against to be the new version of iOS, iOS 10.

This provides compatible behavior for existing programs.  It may be the case
that some of those programs may require changes when they are rebuilt with the
iOS 10 SDK or later.

* API/JSWrapperMap.mm:
(supportsInitMethodConstructors):</pre>

<h3>Modified Paths</h3>
<ul>
<li><a href="#trunkSourceJavaScriptCoreAPIJSWrapperMapmm">trunk/Source/JavaScriptCore/API/JSWrapperMap.mm</a></li>
<li><a href="#trunkSourceJavaScriptCoreChangeLog">trunk/Source/JavaScriptCore/ChangeLog</a></li>
</ul>

</div>
<div id="patch">
<h3>Diff</h3>
<a id="trunkSourceJavaScriptCoreAPIJSWrapperMapmm"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/API/JSWrapperMap.mm (202669 => 202670)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/API/JSWrapperMap.mm        2016-06-30 04:46:45 UTC (rev 202669)
+++ trunk/Source/JavaScriptCore/API/JSWrapperMap.mm        2016-06-30 04:46:51 UTC (rev 202670)
</span><span class="lines">@@ -27,7 +27,6 @@
</span><span class="cx"> #import &quot;JavaScriptCore.h&quot;
</span><span class="cx"> 
</span><span class="cx"> #if JSC_OBJC_API_ENABLED
</span><del>-
</del><span class="cx"> #import &quot;APICast.h&quot;
</span><span class="cx"> #import &quot;JSAPIWrapperObject.h&quot;
</span><span class="cx"> #import &quot;JSCInlines.h&quot;
</span><span class="lines">@@ -46,11 +45,14 @@
</span><span class="cx"> #include &lt;mach-o/dyld.h&gt;
</span><span class="cx"> 
</span><span class="cx"> #if PLATFORM(APPLETV)
</span><del>-#elif PLATFORM(IOS)
-static const uint32_t firstSDKVersionWithInitConstructorSupport = 0x80000; // iOS 8.0.0
</del><ins>+#else
+static const int32_t firstJavaScriptCoreVersionWithInitConstructorSupport = 0x21A0400; // 538.4.0
+#if PLATFORM(IOS)
+static const uint32_t firstSDKVersionWithInitConstructorSupport = DYLD_IOS_VERSION_10_0;
</ins><span class="cx"> #elif PLATFORM(MAC)
</span><span class="cx"> static const uint32_t firstSDKVersionWithInitConstructorSupport = 0xA0A00; // OSX 10.10.0
</span><span class="cx"> #endif
</span><ins>+#endif
</ins><span class="cx"> 
</span><span class="cx"> @class JSObjCClassInfo;
</span><span class="cx"> 
</span><span class="lines">@@ -657,9 +659,20 @@
</span><span class="cx">     // There are no old clients on Apple TV, so there's no need for backwards compatibility.
</span><span class="cx">     return true;
</span><span class="cx"> #else
</span><ins>+    // First check to see the version of JavaScriptCore we directly linked against.
+    static int32_t versionOfLinkTimeJavaScriptCore = 0;
+    if (!versionOfLinkTimeJavaScriptCore)
+        versionOfLinkTimeJavaScriptCore = NSVersionOfLinkTimeLibrary(&quot;JavaScriptCore&quot;);
+    // Only do the link time version comparison if we linked directly with JavaScriptCore
+    if (versionOfLinkTimeJavaScriptCore != -1)
+        return versionOfLinkTimeJavaScriptCore &gt;= firstJavaScriptCoreVersionWithInitConstructorSupport;
+
+    // If we didn't link directly with JavaScriptCore,
+    // base our check on what SDK was used to build the application.
</ins><span class="cx">     static uint32_t programSDKVersion = 0;
</span><span class="cx">     if (!programSDKVersion)
</span><span class="cx">         programSDKVersion = dyld_get_program_sdk_version();
</span><ins>+
</ins><span class="cx">     return programSDKVersion &gt;= firstSDKVersionWithInitConstructorSupport;
</span><span class="cx"> #endif
</span><span class="cx"> }
</span></span></pre></div>
<a id="trunkSourceJavaScriptCoreChangeLog"></a>
<div class="modfile"><h4>Modified: trunk/Source/JavaScriptCore/ChangeLog (202669 => 202670)</h4>
<pre class="diff"><span>
<span class="info">--- trunk/Source/JavaScriptCore/ChangeLog        2016-06-30 04:46:45 UTC (rev 202669)
+++ trunk/Source/JavaScriptCore/ChangeLog        2016-06-30 04:46:51 UTC (rev 202670)
</span><span class="lines">@@ -1,3 +1,36 @@
</span><ins>+2016-06-29  Michael Saboff  &lt;msaboff@apple.com&gt;
+
+        REGRESSION(200114): Netflix app does not see ChromeCast
+        https://bugs.webkit.org/show_bug.cgi?id=159287
+
+        Reviewed by Benjamin Poulain.
+
+        Change set 200114 changed the behavior of how we check for whether or not we
+        wrap Objective C init methods in JavaScript constructors.  The prior method
+        checked the version of JavaScriptCore that was linked with the application.
+        If the application was not directly linked with JavaScriptCore the prior
+        method indicated that we shouldn't create constructors.  The new method uses
+        the SDK the application was compiled with.  Using the new method, an
+        application compiled with iOS SDK 8.0 or greater would create constructors
+        and not export init methods to JavaScript.  The problem is that an existing
+        application that hasn't been recompiled will get a different answer using
+        the new method.  We need to come up with a method that works in a compatible
+        way with existing programs, but provides a newly compiled program with the
+        &quot;is built with SDK N or greater&quot; check.
+        
+        Added back the prior check of the version of JavaScriptCore the program was
+        directly linked against.  However we only use this check if we directly linked
+        with JavaScriptCore.  Otherwise we fall through to check against the SDK the
+        program was built with.  Changed the iOS SDK version we check
+        against to be the new version of iOS, iOS 10.
+
+        This provides compatible behavior for existing programs.  It may be the case
+        that some of those programs may require changes when they are rebuilt with the
+        iOS 10 SDK or later.
+
+        * API/JSWrapperMap.mm:
+        (supportsInitMethodConstructors):
+
</ins><span class="cx"> 2016-06-29  Benjamin Poulain  &lt;bpoulain@apple.com&gt;
</span><span class="cx"> 
</span><span class="cx">         [JSC] Minor TypedArray fixes
</span></span></pre>
</div>
</div>

</body>
</html>