Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code

Unified Diff: safari/ext/content.js

Issue 29338621: Issue 3788 - Keep track of Safari tabs without canLoad (Closed)
Patch Set: Created March 18, 2016, 2:21 p.m.
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View side-by-side diff with in-line comments
Download patch
« safari/ext/background.js ('K') | « safari/ext/common.js ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: safari/ext/content.js
diff --git a/safari/ext/content.js b/safari/ext/content.js
index 65724808bea88cdcd58574e9e44da00b210bde7a..9bcc74a01228a52e196b1cdcb858264dfc8092c6 100644
--- a/safari/ext/content.js
+++ b/safari/ext/content.js
@@ -31,22 +31,24 @@
var isTopLevel = window == window.top;
var isPrerendered = document.visibilityState == "prerender";
- var documentInfo = safari.self.tab.canLoad(
- beforeLoadEvent,
- {
- category: "loading",
- url: window.location.href,
- referrer: document.referrer,
- isTopLevel: isTopLevel,
- isPrerendered: isPrerendered
- }
- );
+ // Notify the background page that this frame is loading, generating ourselves
+ // a random documentId while we're at it. That way the background page can
+ // communicate with us reliably, despite limitations in Safari's extension
+ // API.
+ var documentId = Math.random().toString();
Sebastian Noack 2016/03/18 19:32:51 Nit: It's not important for the logic, but more an
kzar 2016/03/18 19:53:38 Done.
+ safari.self.tab.dispatchMessage("loading", {
+ url: window.location.href,
+ referrer: document.referrer,
+ isTopLevel: isTopLevel,
+ isPrerendered: isPrerendered,
+ documentId: documentId
+ });
if (isTopLevel && isPrerendered)
{
var onVisibilitychange = function()
{
- safari.self.tab.dispatchMessage("replaced", {pageId: documentInfo.pageId});
+ safari.self.tab.dispatchMessage("replaced", {documentId: documentId});
document.removeEventListener("visibilitychange", onVisibilitychange);
};
document.addEventListener("visibilitychange", onVisibilitychange);
@@ -96,15 +98,11 @@
break;
}
- if (!safari.self.tab.canLoad(
- event, {
+ if (!safari.self.tab.canLoad(event, {
category: "webRequest",
url: event.url,
type: type,
- pageId: documentInfo.pageId,
- frameId: documentInfo.frameId
- }
- ))
+ documentId: documentId}))
{
event.preventDefault();
@@ -129,7 +127,7 @@
{
var element = event.srcElement;
safari.self.tab.setContextMenuEventUserInfo(event, {
- pageId: documentInfo.pageId,
+ documentId: documentId,
tagName: element.localName
});
});
@@ -144,7 +142,7 @@
send: function(message)
{
message.category = "proxy";
- message.pageId = documentInfo.pageId;
+ message.documentId = documentId;
return safari.self.tab.canLoad(beforeLoadEvent, message);
},
@@ -176,7 +174,8 @@
Object.defineProperty(obj, "__proxyCallbackId", {value: callbackId});
}
- return {type: "callback", callbackId: callbackId, frameId: documentInfo.frameId};
+ return {type: "callback", callbackId: callbackId,
+ documentId: documentId};
}
if (obj.constructor != Date && obj.constructor != RegExp)
@@ -382,7 +381,8 @@
ext.backgroundPage = {
sendMessage: function(message, responseCallback)
{
- messageProxy.sendMessage(message, responseCallback, documentInfo);
+ messageProxy.sendMessage(message, responseCallback,
+ {documentId: documentId});
},
sendMessageSync: function(message)
{
@@ -390,8 +390,7 @@
beforeLoadEvent,
{
category: "request",
- pageId: documentInfo.pageId,
- frameId: documentInfo.frameId,
+ documentId: documentId,
payload: message
}
);
@@ -409,25 +408,26 @@
safari.self.addEventListener("message", function(event)
{
- if (event.message.pageId == documentInfo.pageId)
+ if (event.name == "requestDocumentId" && isTopLevel)
{
- if (event.name == "request")
- {
- messageProxy.handleRequest(event.message, {});
- return;
- }
-
- if (event.message.frameId == documentInfo.frameId)
+ safari.self.tab.dispatchMessage("documentId", {
+ pageId: event.message.pageId,
+ documentId: documentId
+ });
+ }
+ else if (event.message.targetDocuments.indexOf(documentId) != -1)
+ {
+ switch (event.name)
{
- switch (event.name)
- {
- case "response":
- messageProxy.handleResponse(event.message);
- break;
- case "proxyCallback":
- backgroundPageProxy.handleCallback(event.message);
- break;
- }
+ case "request":
+ messageProxy.handleRequest(event.message, {});
+ break;
+ case "response":
+ messageProxy.handleResponse(event.message);
+ break;
+ case "proxyCallback":
+ backgroundPageProxy.handleCallback(event.message);
+ break;
}
}
});
« safari/ext/background.js ('K') | « safari/ext/common.js ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld