真实用户操作和以编程方式生成的有什么区别?

时间:2013-09-05 14:34:41

标签: javascript google-chrome webkit chromium

我正在使用Chrome上的webkit通知。 方法window.webkitNotifications.requestPermission只能通过用户操作(单击等)调用。在其他地方调用它将没有任何效果,不会抛出任何错误。

由于某些原因,我需要稍后在另一个事件上运行它,最初是通过真正的点击生成的。

我尝试通过生成如下点击来运行此方法:

var a = document.createElement('a');
a.addEventListener('click', function () {
  window.webkitNotifications.requestPermission()
});
var evt = document.createEvent("MouseEvents");
evt.initMouseEvent("click", true, true, window, 1, 0, 0, 0, 0,
false, false, false, false, 0, null);
a.dispatchEvent(evt);

但正如预期的那样,该方法无效。 这让我想知道Chrome如何真正检测到用户操作? 生成的事件与真实用户操作生成的事件之间有什么区别?

我还尝试保留对原始点击事件的引用,并在需要调用此方法时将其传回,但它不起作用。

我创造了一个小提琴来说明我的问题:http://jsfiddle.net/arnaudbreton/B38yJ/1/

1 个答案:

答案 0 :(得分:1)

用户生成的所有点击操作都将具有一个secret属性,用于指示事件是否是由用户创建的。它对开发人员不可见,但是底层的javascript引擎是可用的。

有必要防止恶意代码在用户的浏览器上运行,例如,当您偶然访问恶意网站时。

一个常见的例子是,您无法通过在input[type=file]上触发点击事件来打开文件浏览器对话框。用户创建了一个真正的点击事件来打开文件浏览器。

另一件事是所有事件侦听器必须同步才能触发安全敏感函数,如上例所示。

总之,虚假事件无法调用安全敏感的浏览器API。