REGRESSION(200114): Netflix app does not see ChromeCast
authormsaboff@apple.com <msaboff@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 30 Jun 2016 04:46:51 +0000 (04:46 +0000)
committermsaboff@apple.com <msaboff@apple.com@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Thu, 30 Jun 2016 04:46:51 +0000 (04:46 +0000)
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
"is built with SDK N or greater" 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):

git-svn-id: https://svn.webkit.org/repository/webkit/trunk@202670 268f45cc-cd09-0410-ab3c-d52691b4dbfc

Source/JavaScriptCore/API/JSWrapperMap.mm
Source/JavaScriptCore/ChangeLog

index 23e4799..ef7ec47 100644 (file)
@@ -27,7 +27,6 @@
 #import "JavaScriptCore.h"
 
 #if JSC_OBJC_API_ENABLED
-
 #import "APICast.h"
 #import "JSAPIWrapperObject.h"
 #import "JSCInlines.h"
 #include <mach-o/dyld.h>
 
 #if PLATFORM(APPLETV)
-#elif PLATFORM(IOS)
-static const uint32_t firstSDKVersionWithInitConstructorSupport = 0x80000; // iOS 8.0.0
+#else
+static const int32_t firstJavaScriptCoreVersionWithInitConstructorSupport = 0x21A0400; // 538.4.0
+#if PLATFORM(IOS)
+static const uint32_t firstSDKVersionWithInitConstructorSupport = DYLD_IOS_VERSION_10_0;
 #elif PLATFORM(MAC)
 static const uint32_t firstSDKVersionWithInitConstructorSupport = 0xA0A00; // OSX 10.10.0
 #endif
+#endif
 
 @class JSObjCClassInfo;
 
@@ -657,9 +659,20 @@ bool supportsInitMethodConstructors()
     // There are no old clients on Apple TV, so there's no need for backwards compatibility.
     return true;
 #else
+    // First check to see the version of JavaScriptCore we directly linked against.
+    static int32_t versionOfLinkTimeJavaScriptCore = 0;
+    if (!versionOfLinkTimeJavaScriptCore)
+        versionOfLinkTimeJavaScriptCore = NSVersionOfLinkTimeLibrary("JavaScriptCore");
+    // Only do the link time version comparison if we linked directly with JavaScriptCore
+    if (versionOfLinkTimeJavaScriptCore != -1)
+        return versionOfLinkTimeJavaScriptCore >= firstJavaScriptCoreVersionWithInitConstructorSupport;
+
+    // If we didn't link directly with JavaScriptCore,
+    // base our check on what SDK was used to build the application.
     static uint32_t programSDKVersion = 0;
     if (!programSDKVersion)
         programSDKVersion = dyld_get_program_sdk_version();
+
     return programSDKVersion >= firstSDKVersionWithInitConstructorSupport;
 #endif
 }
index e14b939..79458a0 100644 (file)
@@ -1,3 +1,36 @@
+2016-06-29  Michael Saboff  <msaboff@apple.com>
+
+        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
+        "is built with SDK N or greater" 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):
+
 2016-06-29  Benjamin Poulain  <bpoulain@apple.com>
 
         [JSC] Minor TypedArray fixes