我正在使用Ubuntu 14.04。
我安装了Pipelight - 这个NPAPI浏览器插件允许我查看Silverlight& Firefox中新的基于Flash的东西。
然而,这有一个不幸的副作用 - 支持NPAPI插件的所有Web浏览器(如WebKit)也会加载此插件。
以编程方式,我想在创建WebKit.WebView时禁用所有浏览器插件 - 因此我的问题。我该怎么做?
调查:
我已经看过使用WebKit2 - 这确实可行,因为WebKit2没有NPAPI支持。但是我不能使用这种方法,因为默认情况下Rhythmbox有另一个本机插件,即WebKit,即我正在创建另一个Rhythmbox插件。当我尝试同时加载WebKit.WebView和WebKit2.WebView时,进程挂起。
我已经查看了使用WebKit.WebSettings及其enable-plugins属性,但看起来您在创建WebView之前无法应用新的WebSettings实例(因此已经加载了管道光浏览器插件)。
再次 - 我尝试通过构造函数分配新的WebSettings实例,但没有快乐:x = WebKit.WebView(settings=webkit_settings)
安装了管道灯后,像这样的简单测试程序(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.
我已经向Pipelight开发人员提出了这个question,他们表示我需要通过WebKit引擎禁用插件。正如你所看到的 - 我认为WebKit2是我的解决方案,但我不能如上所述使用它。
我已经看过这个stackoverflow question但是我在禁用特定插件后并不是真的 - 至少我不这么认为 - 只是想禁用所有外部插件
我是用Python3编写的,但是我不认为python版本是问题所在,因为我使用python和python3解释器运行测试程序,并且可以看到相同的结果。
答案 0 :(得分:0)
我通过编写自己的access()函数来攻击它 调用strstr(pathname," / plugins /");如果返回非null function将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);
}