summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--chrome/renderer/webplugin_delegate_proxy.cc52
-rw-r--r--chrome/renderer/webplugin_delegate_proxy.h14
2 files changed, 24 insertions, 42 deletions
diff --git a/chrome/renderer/webplugin_delegate_proxy.cc b/chrome/renderer/webplugin_delegate_proxy.cc
index c46b56c..5ff3e68 100644
--- a/chrome/renderer/webplugin_delegate_proxy.cc
+++ b/chrome/renderer/webplugin_delegate_proxy.cc
@@ -188,15 +188,13 @@ WebPluginDelegateProxy::~WebPluginDelegateProxy() {
for (OldTransportDIBMap::iterator iterator = old_transport_dibs_.begin();
iterator != old_transport_dibs_.end();
++iterator) {
- ReleaseTransportDIB(iterator->second.backing_store.get());
- ReleaseTransportDIB(iterator->second.transport_store.get());
- ReleaseTransportDIB(iterator->second.background_store.get());
+ ReleaseTransportDIB(iterator->second.get());
}
// Ask the browser to release the "live" TransportDIB objects.
ReleaseTransportDIB(backing_store_.get());
ReleaseTransportDIB(transport_store_.get());
- ReleaseTransportDIB(background_store_.get());
+ DCHECK(!background_store_.get());
#endif
}
@@ -556,14 +554,14 @@ void WebPluginDelegateProxy::UpdateGeometry(const gfx::Rect& window_rect,
// preserves transparency information (and does the compositing itself)
// so plugins don't need access to the page background.
needs_background_store = false;
- if (backing_store_.get()) {
+ if (transport_store_.get()) {
// ResetWindowlessBitmaps inserts the old TransportDIBs into
- // old_transport_dibs_ using the backing store's file descriptor as
+ // old_transport_dibs_ using the transport store's file descriptor as
// the key. The constraints on the keys are that -1 is reserved
// to mean "no ACK required," and in-flight keys must be unique.
// File descriptors will never be -1, and because they won't be closed
// until receipt of the ACK, they're unique.
- param.ack_key = backing_store_->handle().fd;
+ param.ack_key = transport_store_->handle().fd;
}
#endif
@@ -619,34 +617,32 @@ void WebPluginDelegateProxy::UpdateGeometry(const gfx::Rect& window_rect,
void WebPluginDelegateProxy::ResetWindowlessBitmaps() {
#if defined(OS_MACOSX)
- if (backing_store_.get()) {
- int ack_key = backing_store_->handle().fd;
+ ReleaseTransportDIB(backing_store_.get());
+ DCHECK(!background_store_.get());
+ // The Mac TransportDIB implementation uses base::SharedMemory, which
+ // cannot be disposed of if an in-flight UpdateGeometry message refers to
+ // the shared memory file descriptor. The old_transport_dibs_ map holds
+ // old TransportDIBs waiting to die, keyed by the |ack_key| values used in
+ // UpdateGeometry messages. When an UpdateGeometry_ACK message arrives,
+ // the associated TransportDIB can be released.
+ if (transport_store_.get()) {
+ int ack_key = transport_store_->handle().fd;
DCHECK_NE(ack_key, -1);
// DCHECK_EQ does not work with base::hash_map.
DCHECK(old_transport_dibs_.find(ack_key) == old_transport_dibs_.end());
- // Stash the old TransportDIBs in the map. They'll be released when an
+ // Stash the old TransportDIB in the map. It'll be released when an
// ACK message comes in.
- RelatedTransportDIBs old_dibs;
- old_dibs.backing_store =
- linked_ptr<TransportDIB>(backing_store_.release());
- old_dibs.transport_store =
+ old_transport_dibs_[ack_key] =
linked_ptr<TransportDIB>(transport_store_.release());
- old_dibs.background_store =
- linked_ptr<TransportDIB>(background_store_.release());
-
- old_transport_dibs_[ack_key] = old_dibs;
- } else {
- DCHECK(!transport_store_.get());
- DCHECK(!background_store_.get());
}
#else
- backing_store_.reset();
transport_store_.reset();
background_store_.reset();
#endif
+ backing_store_.reset();
backing_store_canvas_.reset();
transport_store_canvas_.reset();
@@ -1457,13 +1453,11 @@ void WebPluginDelegateProxy::OnUpdateGeometry_ACK(int ack_key) {
// DCHECK_NE does not work with base::hash_map.
DCHECK(iterator != old_transport_dibs_.end());
- // Now that the ACK has been received, the TransportDIBs that were used
- // prior to the UpdateGeometry message now being acknowledged are known to
- // be no longer needed. Release them, and take the stale entry out of the
- // map.
- ReleaseTransportDIB(iterator->second.backing_store.get());
- ReleaseTransportDIB(iterator->second.transport_store.get());
- ReleaseTransportDIB(iterator->second.background_store.get());
+ // Now that the ACK has been received, the TransportDIB that was used
+ // prior to the UpdateGeometry message now being acknowledged is known to
+ // be no longer needed. Release it, and take the stale entry out of the
+ // map.;
+ ReleaseTransportDIB(iterator->second.get());
old_transport_dibs_.erase(iterator);
}
diff --git a/chrome/renderer/webplugin_delegate_proxy.h b/chrome/renderer/webplugin_delegate_proxy.h
index ae5b4f1..6d7b731 100644
--- a/chrome/renderer/webplugin_delegate_proxy.h
+++ b/chrome/renderer/webplugin_delegate_proxy.h
@@ -196,19 +196,7 @@ class WebPluginDelegateProxy
// plug-in.
bool BindFakePluginWindowHandle(bool opaque);
- // The Mac TransportDIB implementation uses base::SharedMemory, which
- // cannot be disposed of if an in-flight UpdateGeometry message refers to
- // the shared memory file descriptor. The old_transport_dibs_ map holds
- // old TransportDIBs waiting to die. It's keyed by the |ack_key| values
- // used in UpdateGeometry messages. When an UpdateGeometry_ACK message
- // arrives, the associated RelatedTransportDIBs can be released.
- struct RelatedTransportDIBs {
- linked_ptr<TransportDIB> backing_store;
- linked_ptr<TransportDIB> transport_store;
- linked_ptr<TransportDIB> background_store;
- };
-
- typedef base::hash_map<int, RelatedTransportDIBs> OldTransportDIBMap;
+ typedef base::hash_map<int, linked_ptr<TransportDIB> > OldTransportDIBMap;
OldTransportDIBMap old_transport_dibs_;
#endif // OS_MACOSX