| Index: safari/ext/background.js |
| =================================================================== |
| --- a/safari/ext/background.js |
| +++ b/safari/ext/background.js |
| @@ -181,45 +181,61 @@ |
| var pages = Object.create(null); |
| var pageCounter = 0; |
| var Page = function(id, tab, url) |
| { |
| this.id = id; |
| this._tab = tab; |
| this._frames = [{url: new URL(url), parent: null}]; |
| - |
| - if (tab.page) |
| - this._messageProxy = new ext._MessageProxy(tab.page); |
| - else |
| - // while the new tab page is shown on Safari 7, the 'page' property |
| - // of the tab is undefined, and we can't send messages to that page |
| - this._messageProxy = { |
| - handleRequest: function() {}, |
| - handleResponse: function() {}, |
| - sendMessage: function() {} |
| - }; |
| + this._messageProxy = null; |
| this.browserAction = new BrowserAction(this); |
| this.contextMenus = new ContextMenus(this); |
| }; |
| Page.prototype = { |
| get url() |
| { |
| return this._frames[0].url; |
| }, |
| sendMessage: function(message, responseCallback) |
| { |
| var documentIds = []; |
| for (var documentId in this._tab._documentLookup) |
| if (this._tab._documentLookup[documentId].pageId == this.id) |
| documentIds.push(documentId); |
| - this._messageProxy.sendMessage(message, responseCallback, |
| - {targetDocuments: documentIds}); |
| + var messageProxy = this._getMessageProxy(); |
| + if (messageProxy) |
| + { |
| + messageProxy.sendMessage(message, responseCallback, |
| + {targetDocuments: documentIds}); |
| + } |
| + }, |
| + _getMessageProxy: function() |
| + { |
| + // Instantiate the message proxy only if the page object is available. |
| + // For prerendered documents, the page object becomes available only once |
| + // the document is made visible. |
| + if (!this._messageProxy && this._tab.page) |
| + this._messageProxy = new ext._MessageProxy(this._tab.page); |
| + |
| + return this._messageProxy; |
| + }, |
| + _handleRequest: function(request, sender) |
| + { |
| + var messageProxy = this._getMessageProxy(); |
| + if (messageProxy) |
| + messageProxy.handleRequest(request, sender); |
| + }, |
| + _handleResponse: function(response) |
| + { |
| + var messageProxy = this._getMessageProxy(); |
| + if (messageProxy) |
| + messageProxy.handleResponse(response); |
| } |
| }; |
| ext.getPage = function(id) |
| { |
| return pages[id]; |
| }; |
| @@ -419,23 +435,23 @@ |
| ext.onMessage._dispatch(message.payload, sender, sendResponse); |
| event.message = response; |
| break; |
| } |
| break; |
| case "request": |
| - sender.page._messageProxy.handleRequest(message, sender); |
| + sender.page._handleRequest(message, sender); |
| break; |
| case "response": |
| // All documents within a page have the same pageId and that's all we |
| // care about here. |
| var pageId = tab._documentLookup[message.targetDocuments[0]].pageId; |
| - pages[pageId]._messageProxy.handleResponse(message); |
| + pages[pageId]._handleResponse(message); |
| break; |
| case "replaced": |
| // when a prerendered page is shown, forget the previous page |
| // associated with its tab, and reset the toolbar item if necessary. |
| // Note that it wouldn't be sufficient to do that when the old |
| // page is unloading, because Safari dispatches window.onunload |
| // only when reloading the page or following links, but not when |
| // the current page is replaced with a prerendered page. |