| Index: safari/ext/background.js | 
| diff --git a/safari/ext/background.js b/safari/ext/background.js | 
| index 2c3d5ec9aa8fd4b992efd1e8d38e493cc21b2ca5..ce6b8c8b65820cef23dbcd9e512ef61afc26095b 100644 | 
| --- a/safari/ext/background.js | 
| +++ b/safari/ext/background.js | 
| @@ -179,7 +179,7 @@ | 
|  | 
| var Page = function(id, tab, url) | 
| { | 
| -    this._id = id; | 
| +    this.id = id; | 
| this._tab = tab; | 
| this._frames = [{url: new URL(url), parent: null}]; | 
|  | 
| @@ -204,11 +204,11 @@ | 
| }, | 
| sendMessage: function(message, responseCallback) | 
| { | 
| -      this._messageProxy.sendMessage(message, responseCallback, {pageId: this._id}); | 
| +      this._messageProxy.sendMessage(message, responseCallback, {pageId: this.id}); | 
| } | 
| }; | 
|  | 
| -  ext._getPage = function(id) | 
| +  ext.getPage = function(id) | 
| { | 
| return pages[id]; | 
| }; | 
| @@ -222,6 +222,8 @@ | 
|  | 
| var forgetPage = function(id) | 
| { | 
| +    ext.pages.onRemoved._dispatch(id); | 
| + | 
| ext._removeFromAllPageMaps(id); | 
|  | 
| delete pages[id]._tab._pages[id]; | 
| @@ -235,7 +237,7 @@ | 
|  | 
| for (var id in tab._pages) | 
| { | 
| -      if (id != page._id) | 
| +      if (id != page.id) | 
| forgetPage(id); | 
| } | 
|  | 
| @@ -305,6 +307,7 @@ | 
| }, | 
| onLoading: new ext._EventTarget(), | 
| onActivated: new ext._EventTarget(), | 
| +    onRemoved: new ext._EventTarget() | 
| }; | 
|  | 
| safari.application.addEventListener("close", function(event) | 
| @@ -754,4 +757,15 @@ | 
|  | 
| ext.pages.open(optionsUrl, callback); | 
| }; | 
| + | 
| +  /* Windows */ | 
| +  ext.windows = { | 
| +    // Safari doesn't provide as rich a windows API as Chrome does, so instead | 
| +    // of chrome.windows.create we have to fall back to just opening a new tab. | 
| +    create: function(createData, callback) | 
| +    { | 
| +      if (createData) | 
| +        ext.pages.open(createData.url, callback); | 
| +    } | 
| +  }; | 
| })(); | 
|  |