diff --git a/chrome/content/browser.js b/chrome/content/browser.js
--- a/chrome/content/browser.js
+++ b/chrome/content/browser.js
@@ -1356,16 +1356,24 @@ Browser.MainDragger = function MainDragg
   this.draggedFrame = null;
   this.contentScrollbox = null;
 };
 
 Browser.MainDragger.prototype = {
   isDraggable: function isDraggable(target, scroller) { return true; },
 
   dragStart: function dragStart(clientX, clientY, target, scroller) {
+    this.bv.pauseRendering();
+
+    // XXX shouldn't know about observer
+    // adding pause in pauseRendering isn't so great, because tiles will hardly ever prefetch while
+    // loading state is going (and already, the idle timer is bigger during loading so it doesn't fit
+    // into the aggressive flag).
+    this.bv._idleServiceObserver.pause();
+
     let [x, y] = Browser.transformClientToBrowser(clientX, clientY);
     let element = Browser.elementFromPoint(x, y);
 
     this.draggedFrame = null;
     this.contentScrollbox = null;
 
     // Check if we are in a scrollable HTML element
     let htmlElement = element;
@@ -1409,24 +1417,16 @@ Browser.MainDragger.prototype = {
           this.contentScrollbox = wrapper.scrollBoxObject || wrapper.boxObject.QueryInterface(Ci.nsIScrollBoxObject);
           return;
         }
       }
     }
 
     if (element)
       this.draggedFrame = element.ownerDocument.defaultView;
-
-    this.bv.pauseRendering();
-
-    // XXX shouldn't know about observer
-    // adding pause in pauseRendering isn't so great, because tiles will hardly ever prefetch while
-    // loading state is going (and already, the idle timer is bigger during loading so it doesn't fit
-    // into the aggressive flag).
-    this.bv._idleServiceObserver.pause();
   },
 
   dragStop: function dragStop(dx, dy, scroller) {
     this.draggedFrame = null;
     this.dragMove(Browser.snapSidebars(), 0, scroller);
 
     Browser.tryUnfloatToolbar();
 
@@ -3232,71 +3232,66 @@ PluginObserver.prototype = {
     if (browser) {
       browser.removeEventListener("ZoomChanged", this, false);
       browser.removeEventListener("MozAfterPaint", this, false);
     }
   },
 
   /** Observe listens for plugin change events and maintains an embed cache. */
   observe: function observe(subject, topic, data) {
-    let doc = subject.ownerDocument.defaultView.top.document;
-    if (data == "init") {
-      if (doc.pluginCache === undefined)
-        doc.pluginCache = [];
-      doc.pluginCache.push(subject);
-    } else if (data == "reflow") {
+    if (data == "reflow")
       this.updateCurrentBrowser();
-    } else if (data == "destroy") {
-      if (doc.pluginCache) {
-        let index = doc.pluginCache.indexOf(subject);
-        if (index != -1)
-          doc.pluginCache.splice(index, 1);
-      }
-    }
   },
 
   /** Update flash objects */
   handleEvent: function handleEvent(ev) {
     if (ev.type == "TabSelect") {
       if (ev.lastTab) {
         let browser = ev.lastTab.browser;
         let oldDoc = browser.contentDocument;
+
+        let start = Date.now();
+        let pluginCache = oldDoc.querySelectorAll("embed,object");
+
         browser.removeEventListener("ZoomChanged", this, false);
         browser.removeEventListener("MozAfterPaint", this, false);
-        if (oldDoc.pluginCache)
-          this.updateEmbedRegions(oldDoc.pluginCache, this._emptyRect);
+        this.updateEmbedRegions(pluginCache, this._emptyRect);
       }
 
       let browser = Browser.selectedBrowser;
       browser.addEventListener("ZoomChanged", this, false);
       browser.addEventListener("MozAfterPaint", this, false);
     }
 
     this.updateCurrentBrowser();
   },
 
   /** Update the current browser's flash objects. */
   updateCurrentBrowser: function updateCurrentBrowser() {
     let doc = Browser.selectedTab.browser.contentDocument;
-    if (!doc.pluginCache)
+
+    let rect = this.getCriticalRect();
+    if (rect == this._emptyRect && !this._isRendering)
       return;
 
-    let rect = this.getCriticalRect();
+    let start = Date.now();
+    let pluginCache = doc.querySelectorAll("embed,object");
+
     if (this._isRendering) {
       // Update immediately if not just starting to render
       if (rect == this._emptyRect)
         this._isRendering = false;
-      this.updateEmbedRegions(doc.pluginCache, rect);
+      this.updateEmbedRegions(pluginCache, rect);
     } else {
       // Wait a moment so that any chrome redraws occur first.
       let self = this;
       setTimeout(function() {
         self._isRendering = true;
         // Recalculate critical rect so we don't render when we ought not to.
-        self.updateEmbedRegions(doc.pluginCache, self.getCriticalRect());
+        self.updateEmbedRegions(pluginCache, self.getCriticalRect());
       }, 0);
     }
   },
 
   /** More accurate version of finding the current visible region. Returns client coords. */
   getCriticalRect: function getCriticalRect() {
     let bv = this._bv;
     if (!bv.isRendering())
