标签: javascriptcore

如何在JavaScriptCore中向WebWorker的上下文添加新的本机类?

我有一个应用程序,它通过JavaScriptCore在webkit-gtk浏览器中扩展JavaScript.现在我有几个类,我添加到全局上下文,如下所示:

void create_js(gpointer context, char* className, JSClassDefinition clasDefinition) {
    JSClassRef classDef = JSClassCreate(&clasDefinition);
    JSObjectRef classObj = JSObjectMake(context, classDef, context);
    JSObjectRef globalObj = JSContextGetGlobalObject(context);
    JSStringRef str = JSStringCreateWithUTF8CString(className);
    JSObjectSetProperty(context, globalObj, str, classObj, kJSPropertyAttributeNone, NULL);
    JSStringRelease(str);
}
Run Code Online (Sandbox Code Playgroud)

现在,我还想将这些类添加到WebWorker的上下文中,因此我可以从JS中实例化的worker中调用它们.

我试过Worker这样的对象:

JSStringRef workerStr = JSStringCreateWithUTF8CString("Worker");
JSObjectRef worker = JSObjectGetProperty(context, globalObj, workerStr, NULL);
JSObjectSetProperty(context, worker, str, classObj, kJSPropertyAttributeNone, NULL);
JSStringRelease(workerStr);
Run Code Online (Sandbox Code Playgroud)

但是这会将它添加到WorkerConstructor对象中,并且当new Worker()调用a时,这些类不可用.

javascript customization webkit web-worker javascriptcore

101
推荐指数
1
解决办法
1817
查看次数

JavaScriptCore嵌套"调用"性能问题

如果我定义一个函数

inc = function(x) { return x + 1 }
Run Code Online (Sandbox Code Playgroud)

并对其进行嵌套调用

inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(inc(1)))))))))))))))))))))
Run Code Online (Sandbox Code Playgroud)

这将导致价值22.如果我修改嵌套表达式而不是使用call,传入nullfor this,as

inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, 1)))))))))))))))))))))
Run Code Online (Sandbox Code Playgroud)

这也将产生价值22.

但是,在JavaScriptCore上,第二种形式似乎消耗O(2 ^ n)内存,其中n是嵌套调用的数量.如果我在Firefox或Chrome中尝试使用此JavaScript,则情况并非如此,因此它似乎与JavaScriptCore隔离.

我的JavaScript经验非常少(几乎没有).我不了解各种JavaScript实现可能做出的权衡,也不了解示例代码在某些实现中是否合理(为闭包或某些实现提供通用支持),而在其他实现中是有效的.

我的问题是:这段代码本身存在问题吗?是否应该以不同的方式重写?或者代码很好 - JavaScriptCore只是有一个bug吗?

我做了一些实验,重构一些内部调用临时工作将"截断"内存倍增行为

var temp1 = inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, 1)))))));

var temp2 = inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, inc.call(null, …
Run Code Online (Sandbox Code Playgroud)

javascript javascriptcore

52
推荐指数
1
解决办法
3733
查看次数

在iOS Safari上避免使用JavaScript构造/模式?

我有一个包含大量生成的JavaScript的Web应用程序.与UIWebView在(更新的)iPad上运行Web应用程序相比,在桌面上运行Chrome应用程序之间的内存消耗相差6倍.

我应该避免哪些构造或模式使iOS上的内存消耗与Chrome的内存消耗相同?

生成的JavaScript的特征:

  • 代码由Haxe生成.
  • 代码是"面向对象的",因为它大量使用prototype,但是以文明的方式.
  • 该代码大量使用JavaScript对象上的命名索引来实现哈希表.
  • 有很多字符串,但几乎没有任何字符串连接.

似乎没有任何内存泄漏; 在构建(固定的)Javascript对象时,iOS上的内存消耗过多.

javascript v8 haxe ios javascriptcore

28
推荐指数
1
解决办法
769
查看次数

如何从WKWebView获取JSContext

在UIWebView中,我可以JSContext通过:

[webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]
Run Code Online (Sandbox Code Playgroud)

同样的方式在WKWebView和应用程序崩溃到达这行代码时不起作用.

有没有办法在WKWebView中获取JSContext?

提前致谢.

webkit uiwebview javascriptcore ios8 wkwebview

26
推荐指数
1
解决办法
1万
查看次数

如何将TVML/JavaScriptCore与UIKit/Objective-C(Swift)联系起来?

到目前为止,tvOS支持两种制作电视应用程序的方法,TVML和UIKit,并且没有正式提及如何混合使用TVML(基本上是XML)用户界面和应用程序逻辑的本机计数器部分和I/O(如播放,流媒体,iCloud持久性等).

那么,哪个是混合TVMLUIKit在新tvOS应用中的最佳解决方案?

在下面我尝试了一个解决方案,遵循从Apple论坛改编的代码片段以及关于JavaScriptCore到ObjC/Swift绑定的相关问题.这是Swift项目中的一个简单的包装类.

import UIKit
import TVMLKit
@objc protocol MyJSClass : JSExport {
    func getItem(key:String) -> String?
    func setItem(key:String, data:String)
}
class MyClass: NSObject, MyJSClass {
    func getItem(key: String) -> String? {
        return "String value"
    }

    func setItem(key: String, data: String) {
        print("Set key:\(key) value:\(data)")
    }
}
Run Code Online (Sandbox Code Playgroud)

代表必须遵守TVApplicationControllerDelegate:

typealias TVApplicationDelegate = AppDelegate
extension TVApplicationDelegate : TVApplicationControllerDelegate {

    func appController(appController: TVApplicationController, evaluateAppJavaScriptInContext jsContext: JSContext) {
        let myClass: MyClass = MyClass();
        jsContext.setObject(myClass, …
Run Code Online (Sandbox Code Playgroud)

objective-c javascriptcore tvos

19
推荐指数
2
解决办法
4310
查看次数

UIWebView JavaScript失去对iOS JSContext名称空间(对象)的引用

我一直在研究一个概念验证应用程序,它利用WebKit JavaScriptCore框架利用Objective C(iOS 7)和JavaScript之间的双向通信.我终于能够按预期工作了,但是遇到了UIWebView失去对我通过JSContext创建的iOS对象的引用的情况.

该应用程序有点复杂,以下是基础知识:

  • 我正在iOS设备上运行Web服务器(CocoaHTTPServer)
  • UIWebView最初加载远程URL,稍后重定向回localhost作为应用程序流的一部分(想想OAuth)
  • 应用程序托管的HTML页面(在localhost上)具有应该与我的iOS代码通信的JavaScript

这是iOS方面,我的ViewController .h:

#import <UIKit/UIKit.h>
#import <JavaScriptCore/JavaScriptCore.h>

// These methods will be exposed to JS
@protocol DemoJSExports <JSExport>
-(void)jsLog:(NSString*)msg;
@end

@interface Demo : UIViewController <UserInfoJSExports, UIWebViewDelegate>
@property (nonatomic, readwrite, strong) JSContext *js;
@property (strong, nonatomic) IBOutlet UIWebView *webView;
@end
Run Code Online (Sandbox Code Playgroud)

以及ViewController的相关部分.m:

-(void)viewDidLoad {
    [super viewDidLoad];

    // Retrieve and initialize our JS context
    NSLog(@"Initializing JavaScript context");
    self.js = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];

    // Provide an object for JS to access our …
Run Code Online (Sandbox Code Playgroud)

javascript objective-c uiwebview ios javascriptcore

18
推荐指数
1
解决办法
2万
查看次数

有没有办法在JSContext对象中停止或暂停执行Javascript?

我正在开发一个使用JavascriptCore具有脚本功能的iOS 7应用程序.

我想有办法暂停或完全停止当前在JSContext上运行的代码.JavascriptCore没有很好的文档,所以我找不到答案.

我有一些想法:

  • 从上下文中删除用于与我的应用程序交互的桥接对象,并让任何代码仍然运行失败.
  • 获取JSContext的JSGlobalContextRef并使用JSGlobalContextRelease释放它并重新创建要使用的JSContext.

但希望有更好的方法.

任何帮助,将不胜感激.谢谢!

javascript cocoa webkit ios javascriptcore

17
推荐指数
1
解决办法
787
查看次数


如何实现JavaScriptCore调试器?

JavaScriptCore包含用c ++编写的调试器包.这是调试器包的链接.

我们可以使用此调试器从eclipse或xocde调试java脚本,任何参考或示例实现都会有所帮助.谢谢

javascript xcode javascriptcore

14
推荐指数
1
解决办法
2695
查看次数

iOS 12+内存泄漏 - WKWebView和UIWebView

这不是一个问题,但我在这里张贴,希望能够拯救别人的理智(我只花了一天的时间来解决这个问题).我已经发现了iOS 12.0+中出现的内存泄漏,它影响了WKWebView和UIWebView.只要您实例化2个Web视图中的任何一个,就会出现泄漏.Instruments将漏洞识别为来自JavaScriptCore,我猜这是为什么它同样会影响两个webview.

当我决定尝试更旧的iOS版本(11.4 - 12.0之前的版本)时,我试图弄清楚我做错了什么,我注意到泄漏已经消失了.我每次都可以重现这一点.

要重现,您需要做的就是在类上分配webview的实例.

let webview = WKWebView()
Run Code Online (Sandbox Code Playgroud)

要么

let webview = UIWebView()
Run Code Online (Sandbox Code Playgroud)

马上,您会注意到iOS 12.0/12.1上有4个泄漏,如果您在iOS 11.4上运行代码,这些泄漏将不再存在.有4个单独的泄漏; 3 x 96字节和1 x 128字节.

泄漏WKWebView

我通过BugReporter向Apple提交了一个错误,在Openradar上重复:https://openradar.appspot.com/radar id = 6132657108811776

memory-leaks uiwebview javascriptcore wkwebview ios12

14
推荐指数
1
解决办法
1939
查看次数