Index: background.js
===================================================================
--- a/background.js
+++ b/background.js
@@ -86,15 +86,9 @@
   // due to loading filters or saving filter changes
   if (action == "load" || action == "save")
   {
-    ext.windows.getAll(function(windows)
+    ext.pages.query({}, function(pages)
     {
-      for (var i = 0; i < windows.length; i++)
-      {
-        windows[i].getAllTabs(function(tabs)
-        {
-          tabs.forEach(refreshIconAndContextMenu);
-        });
-      }
+      pages.forEach(refreshIconAndContextMenu);
     });
   }
 });
@@ -119,24 +113,25 @@
 var activeNotification = null;
 
 // Adds or removes browser action icon according to options.
-function refreshIconAndContextMenu(tab)
+function refreshIconAndContextMenu(page)
 {
-  var whitelisted = isWhitelisted(tab.url);
+  var whitelisted = isWhitelisted(page.url);
 
   var iconFilename;
   if (whitelisted && require("info").platform != "safari")
-    // There is no grayscale version of the icon for whitelisted tabs
+    // There is no grayscale version of the icon for whitelisted pages
     // when using Safari, because icons are grayscale already and icons
-    // aren't per tab in Safari.
+    // aren't per page in Safari.
     iconFilename = "icons/abp-$size-whitelisted.png";
   else
     iconFilename = "icons/abp-$size.png";
 
-  tab.browserAction.setIcon(iconFilename);
-  iconAnimation.registerTab(tab, iconFilename);
+  page.browserAction.setIcon(iconFilename);
+  iconAnimation.registerPage(page, iconFilename);
 
-  // Set context menu status according to whether current tab has whitelisted domain
-  if (whitelisted || !/^https?:/.test(tab.url))
+  // show or hide the context menu entry dependent on whether
+  // adblocking is active on that page
+  if (whitelisted || !/^https?:/.test(page.url))
     ext.contextMenus.hideMenuItems();
   else
     ext.contextMenus.showMenuItems();
@@ -234,10 +229,7 @@
 
   function notifyUser()
   {
-    ext.windows.getLastFocused(function(win)
-    {
-      win.openTab(ext.getURL("firstRun.html"));
-    });
+    ext.pages.open(ext.getURL("firstRun.html"));
   }
 
   if (addSubscription)
@@ -272,10 +264,10 @@
   if (Prefs.shouldShowBlockElementMenu)
   {
     // Register context menu item
-    ext.contextMenus.addMenuItem(ext.i18n.getMessage("block_element"), ["image", "video", "audio"], function(srcUrl, tab)
+    ext.contextMenus.addMenuItem(ext.i18n.getMessage("block_element"), ["image", "video", "audio"], function(srcUrl, page)
     {
       if (srcUrl)
-        tab.sendMessage({type: "clickhide-new-filter", filter: srcUrl});
+        page.sendMessage({type: "clickhide-new-filter", filter: srcUrl});
     });
   }
   else
@@ -290,34 +282,29 @@
 setContextMenu();
 
 /**
-  * Opens options tab or focuses an existing one, within the last focused window.
+  * Opens options page or focuses an existing one, within the last focused window.
   * @param {Function} callback  function to be called with the
-                                Tab object of the options tab
+                                Page object of the options page
   */
 function openOptions(callback)
 {
-  ext.windows.getLastFocused(function(win)
+  ext.pages.query({lastFocusedWindow: true}, function(pages)
   {
-    win.getAllTabs(function(tabs)
+    var optionsUrl = ext.getURL("options.html");
+
+    for (var i = 0; i < pages.length; i++)
     {
-      var optionsUrl = ext.getURL("options.html");
+      var page = pages[i];
+      if (page.url == optionsUrl)
+      {
+        page.activate();
+        if (callback)
+          callback(page);
+        return;
+      }
+    }
 
-      for (var i = 0; i < tabs.length; i++)
-      {
-        if (tabs[i].url == optionsUrl)
-        {
-          tabs[i].activate();
-          if (callback)
-            callback(tabs[i]);
-          return;
-        }
-      }
-
-      win.openTab(optionsUrl, callback && function(tab)
-      {
-        tab.onCompleted.addListener(callback);
-      });
-    });
+    ext.pages.open(optionsUrl, callback);
   });
 }
 
@@ -498,8 +485,8 @@
     case "get-selectors":
       var selectors = null;
 
-      if (!isFrameWhitelisted(sender.tab, sender.frame, "DOCUMENT") &&
-          !isFrameWhitelisted(sender.tab, sender.frame, "ELEMHIDE"))
+      if (!isFrameWhitelisted(sender.page, sender.frame, "DOCUMENT") &&
+          !isFrameWhitelisted(sender.page, sender.frame, "ELEMHIDE"))
       {
         var noStyleRules = false;
         var host = extractHostFromURL(sender.frame.url);
@@ -525,7 +512,7 @@
       sendResponse(selectors);
       break;
     case "should-collapse":
-      if (isFrameWhitelisted(sender.tab, sender.frame, "DOCUMENT"))
+      if (isFrameWhitelisted(sender.page, sender.frame, "DOCUMENT"))
       {
         sendResponse(false);
         break;
@@ -548,9 +535,9 @@
     case "get-domain-enabled-state":
       // Returns whether this domain is in the exclusion list.
       // The browser action popup asks us this.
-      if(sender.tab)
+      if(sender.page)
       {
-        sendResponse({enabled: !isWhitelisted(sender.tab.url)});
+        sendResponse({enabled: !isWhitelisted(sender.page.url)});
         return;
       }
       break;
@@ -562,18 +549,18 @@
       }
       break;
     case "add-subscription":
-      openOptions(function(tab)
+      openOptions(function(page)
       {
-        tab.sendMessage(msg);
+        page.sendMessage(msg);
       });
       break;
     case "add-key-exception":
-      processKeyException(msg.token, sender.tab, sender.frame);
+      processKeyException(msg.token, sender.page, sender.frame);
       break;
     case "forward":
-      if (sender.tab)
+      if (sender.page)
       {
-        sender.tab.sendMessage(msg.payload, sendResponse);
+        sender.page.sendMessage(msg.payload, sendResponse);
         // Return true to indicate that we want to call
         // sendResponse asynchronously
         return true;
@@ -585,11 +572,11 @@
   }
 });
 
-// Update icon if a tab changes location
-ext.tabs.onLoading.addListener(function(tab)
+// update icon when page changes location
+ext.pages.onLoading.addListener(function(page)
 {
-  tab.sendMessage({type: "clickhide-deactivate"});
-  refreshIconAndContextMenu(tab);
+  page.sendMessage({type: "clickhide-deactivate"});
+  refreshIconAndContextMenu(page);
 });
 
 setTimeout(function()
