【问题标题】:how to disable all webkit browser plugins?如何禁用所有 webkit 浏览器插件?
【发布时间】:2015-03-16 12:40:45
【问题描述】:

我使用的是 Ubuntu 14.04。

我已经安装了Pipelight - 这个 NPAPI 浏览器插件允许我在 Firefox 中查看 Silverlight 和基于 Flash 的新内容。

然而,这有一个不幸的副作用 - 所有支持 NPAPI 插件(如 WebKit)的网络浏览器也会加载此插件。

以编程方式,我想在创建 WebKit.WebView 时禁用所有浏览器插件 - 因此是我的问题。我该怎么做?


调查:

我已经研究过使用 WebKit2 - 这确实有效,可能是因为 WebKit2 不支持 NPAPI。但是我不能使用这种方法,因为默认情况下 Rhythmbox 有另一个本机插件,即 WebKit,即我正在创建另一个 Rhythmbox 插件。当我尝试同时加载 WebKit.WebView 和 WebKit2.WebView 时,进程挂起。

我查看了使用 WebKit.WebSettings 及其 enable-plugins 属性,但似乎在创建 WebView 之后才能应用新的 WebSettings 实例(因此 pipelight 浏览器插件已经加载)。

再次 - 我尝试通过构造函数分配新的 WebSettings 实例,但没有任何乐趣:x = WebKit.WebView(settings=webkit_settings)

当您安装了 pipelight 的简单测试程序 (web.py) 时,如下所示:

from gi.repository import WebKit

webkit_settings = WebKit.WebSettings.new()
webkit_settings.props.enable_plugins=False
x = WebKit.WebView.new()
x.set_settings(webkit_settings)

然后运行python web.py 会显示一个示例输出

[PIPELIGHT:LIN:unknown] attached to process.
[PIPELIGHT:LIN:unknown] checking environment variable PIPELIGHT_SILVERLIGHT5_0_CONFIG.
[PIPELIGHT:LIN:unknown] searching for config file pipelight-silverlight5.0.
[PIPELIGHT:LIN:unknown] trying to load config file from '/home/foss/.config/pipelight-silverlight5.0'.
[PIPELIGHT:LIN:unknown] unrecognized configuration key 'diagnosticmode'.
[PIPELIGHT:LIN:unknown] sandbox not found or not installed!
[PIPELIGHT:LIN:silverlight5.0] using wine prefix directory /home/foss/.wine-pipelight.

我已将此question 提交给 Pipelight 开发人员,他们表示我需要通过 WebKit 引擎禁用插件。如您所见 - 我认为 WebKit2 是我的解决方案,但我不能如上所述使用它。

我已经看到了这个stackoverflow question,但我并没有真正禁用特定插件 - 至少我不这么认为 - 只是想禁用所有外部插件

我正在使用 Python3 编写此代码,但我认为这里的问题不是 python 版本,因为我已经使用 python 和 python3 解释器运行了测试程序,并且看到了相同的结果。

【问题讨论】:

    标签: python webview webkit


    【解决方案1】:

    我通过编写自己的 access() 函数破解了这个问题 调用 strstr(pathname, "/plugins/");如果这返回非空 函数将 errno 设置为 ENOENT 并返回 -1。

    否则我的 access() 会调用原来的 access()(系统调用包装器) 来自 c 库。

    在c程序中可以实现这样的功能,对于其他程序 可以使用单独的c模块和LD_PRELOAD...

    像这样:

    static void * dlsym_next(const char * symbol)
    {
        void * sym = dlsym(RTLD_NEXT, symbol);
        char * str = dlerror();
    
        if (str != null)
            exit(1);
    
        return sym;
    }
    #define set_next(name) *(void**)(&name##_next) = dlsym_next(#name)
    
    int access(const char * pathname, int mode)
    {
        static int (*access_next)(const char *, int) = NULL;
        if (! access_next)
            set_next(access);
    
        if (strstr(pathname, "/plugins/") != NULL) {
            errno = ENOENT;
            return -1;
        }
        return access_next(pathname, mode);
    }
    

    【讨论】:

      猜你喜欢
      • 2015-06-08
      • 2010-10-29
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 2013-08-13
      • 2013-03-04
      • 2012-10-25
      相关资源
      最近更新 更多