Index: safari/ext/content.js |
=================================================================== |
--- a/safari/ext/content.js |
+++ b/safari/ext/content.js |
@@ -21,15 +21,17 @@ |
/* Background page proxy */ |
+ |
+ var beforeLoadEvent = document.createEvent("Event"); |
+ beforeLoadEvent.initEvent("beforeload"); |
+ |
var proxy = { |
objects: [], |
callbacks: [], |
send: function(message) |
{ |
- var evt = document.createEvent("Event"); |
- evt.initEvent("beforeload"); |
- return safari.self.tab.canLoad(evt, {type: "proxy", payload: message}); |
+ return safari.self.tab.canLoad(beforeLoadEvent, {type: "proxy", payload: message}); |
}, |
checkResult: function(result) |
{ |
@@ -43,7 +45,7 @@ |
}, |
serialize: function(obj, memo) |
{ |
- var objectId = this.objects.indexOf(obj); |
+ var objectId = this.getObjectId(obj); |
if (objectId != -1) |
return {type: "hosted", objectId: objectId}; |
@@ -55,15 +57,19 @@ |
{ |
callbackId = this.callbacks.push(obj) - 1; |
- safari.self.addEventListener("message", function(event) |
+ if (callbackId == 0) |
Wladimir Palant
2014/01/15 16:21:01
This is non-obvious and needs a short explanation
|
{ |
- if (event.name == "proxyCallback") |
- if (event.message.callbackId == callbackId) |
- obj.apply( |
- this.getObject(event.message.contextId), |
- this.deserializeSequence(event.message.args) |
- ); |
- }.bind(this)); |
+ safari.self.addEventListener("message", function(event) |
+ { |
+ if (event.name == "proxyCallback") |
+ { |
+ this.callbacks[event.message.callbackId].apply( |
+ this.getObject(event.message.contextId), |
+ this.deserializeSequence(event.message.args) |
+ ); |
+ } |
+ }.bind(this)); |
+ } |
} |
return {type: "callback", callbackId: callbackId}; |
@@ -201,7 +207,8 @@ |
); |
}; |
}, |
- getObject: function(objectId) { |
+ getObject: function(objectId) |
+ { |
var objectInfo = this.send({ |
type: "inspectObject", |
objectId: objectId |
@@ -233,7 +240,10 @@ |
else |
{ |
if (objectInfo.isFunction) |
+ { |
ignored = Object.getOwnPropertyNames(function() {}); |
+ ignored.splice(ignored.indexOf("prototype"), 1); |
+ } |
else |
ignored = []; |
@@ -244,13 +254,19 @@ |
} |
for (var property in objectInfo.properties) |
- if (ignored.indexOf(property) == -1) |
+ { |
+ if (ignored.indexOf(property) != -1) |
+ continue; |
+ |
+ if (!Object.hasOwnProperty(obj, property) || Object.getOwnPropertyDescriptor(obj, property).configurable) |
+ { |
Object.defineProperty(obj, property, this.createProperty( |
property, objectInfo.properties[property].enumerable |
)); |
- |
- if (objectInfo.isFunction) |
- obj.prototype = this.getProperty(objectId, "prototype"); |
+ } |
+ else |
+ obj[property] = this.getProperty(objectId, property); |
+ } |
return obj; |
} |
@@ -263,24 +279,24 @@ |
{ |
var type; |
- switch(event.target.nodeName) |
+ switch(event.target.localName) |
{ |
- case "FRAME": |
- case "IFRAME": |
+ case "frame": |
+ case "iframe": |
type = "frame"; |
break; |
- case "IMG": |
+ case "img": |
type = "image"; |
break; |
- case "OBJECT": |
- case "EMBED": |
+ case "object": |
+ case "embed": |
type = "object"; |
break; |
- case "SCRIPT": |
+ case "script": |
type = "script"; |
break; |
- case "LINK": |
- if (/(^|\s)stylesheet($|\s)/i.test(event.target.rel)) |
+ case "link": |
+ if (/\bstylesheet\b/i.test(event.target.rel)) |
{ |
type = "stylesheet"; |
break; |