Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1276)

Unified Diff: content/browser/renderer_host/render_widget_helper.h

Issue 9980016: Delete background tab IOSurfaces on Mac. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fixed auto-resize and fullscreen toggle Created 8 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: content/browser/renderer_host/render_widget_helper.h
diff --git a/content/browser/renderer_host/render_widget_helper.h b/content/browser/renderer_host/render_widget_helper.h
index a57f0e6b00cb8b94fab837138b149ae634efc5ea..b2c4de5cc44b7b1ae54599d0b28960fe867a57fe 100644
--- a/content/browser/renderer_host/render_widget_helper.h
+++ b/content/browser/renderer_host/render_widget_helper.h
@@ -15,6 +15,7 @@
#include "base/process.h"
#include "base/synchronization/lock.h"
#include "base/synchronization/waitable_event.h"
+#include "content/public/browser/browser_thread.h"
#include "content/public/browser/content_browser_client.h"
#include "content/public/common/window_container_type.h"
#include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupType.h"
@@ -47,44 +48,51 @@ struct ViewMsg_SwapOut_Params;
//
// RenderWidgetHelper is used to implement optimized resize. When the
// RenderWidgetHost is resized, it sends a Resize message to its RenderWidget
-// counterpart in the renderer process. The RenderWidget generates a
-// UpdateRect message in response to the Resize message, and it sets the
-// IS_RESIZE_ACK flag in the UpdateRect message to true.
+// counterpart in the renderer process. In response to the Resize message,
+// the RenderWidget generates a new BackingStore and sends an UpdateRect
+// message (or BuffersSwapped via the GPU process in the case of accelerated
+// compositing), and it sets the IS_RESIZE_ACK flag in the UpdateRect message
+// to true. In the accelerated case, an UpdateRect is still sent from the
+// renderer to the browser with acks and plugin moves even though the GPU
+// BackingStore was sent earlier in the BuffersSwapped message. "BackingStore
+// message" is used throughout this code and documentation to mean either a
+// software UpdateRect or GPU BuffersSwapped message.
//
// Back in the browser process, when the RenderProcessHost's MessageFilter
-// sees a UpdateRect message, it directs it to the RenderWidgetHelper by
-// calling the DidReceiveUpdateMsg method. That method stores the data for
-// the UpdateRect message in a map, where it can be directly accessed by the
-// RenderWidgetHost on the UI thread during a call to RenderWidgetHost's
-// GetBackingStore method.
+// sees an UpdateRect message (or when the GpuProcessHost sees a
+// BuffersSwapped message), it directs it to the RenderWidgetHelper by calling
+// the DidReceiveBackingStoreMsg method. That method stores the data for the
+// message in a map, where it can be directly accessed by the RenderWidgetHost
+// on the UI thread during a call to RenderWidgetHost's GetBackingStore
+// method.
//
// When the RenderWidgetHost's GetBackingStore method is called, it first
// checks to see if it is waiting for a resize ack. If it is, then it calls
-// the RenderWidgetHelper's WaitForUpdateMsg to check if there is already a
-// resulting UpdateRect message (or to wait a short amount of time for one to
-// arrive). The main goal of this mechanism is to short-cut the usual way in
-// which IPC messages are proxied over to the UI thread via InvokeLater.
-// This approach is necessary since window resize is followed up immediately
-// by a request to repaint the window.
+// the RenderWidgetHelper's WaitForBackingStoreMsg to check if there is
+// already a resulting BackingStore message (or to wait a short amount of time
+// for one to arrive). The main goal of this mechanism is to short-cut the
+// usual way in which IPC messages are proxied over to the UI thread via
+// InvokeLater. This approach is necessary since window resize is followed up
+// immediately by a request to repaint the window.
//
//
// OPTIMIZED TAB SWITCHING
//
// When a RenderWidgetHost is in a background tab, it is flagged as hidden.
-// This causes the corresponding RenderWidget to stop sending UpdateRect
+// This causes the corresponding RenderWidget to stop sending BackingStore
// messages. The RenderWidgetHost also discards its backingstore when it is
// hidden, which helps free up memory. As a result, when a RenderWidgetHost
-// is restored, it can be momentarily without a backingstore. (Restoring a
+// is restored, it can be momentarily be without a backingstore. (Restoring a
// RenderWidgetHost results in a WasRestored message being sent to the
-// RenderWidget, which triggers a full UpdateRect message.) This can lead to
-// an observed rendering glitch as the WebContentsImpl will just have to fill
-// white overtop the RenderWidgetHost until the RenderWidgetHost receives a
-// UpdateRect message to refresh its backingstore.
+// RenderWidget, which triggers a full BackingStore message.) This can lead
+// to an observed rendering glitch as the WebContentsImpl will just have to
+// fill white overtop the RenderWidgetHost until the RenderWidgetHost receives
+// a BackingStore message to refresh its backingstore.
//
// To avoid this 'white flash', the RenderWidgetHost again makes use of the
-// RenderWidgetHelper's WaitForUpdateMsg method. When the RenderWidgetHost's
-// GetBackingStore method is called, it will call WaitForUpdateMsg if it has
-// no backingstore.
+// RenderWidgetHelper's WaitForBackingStoreMsg method. When the
+// RenderWidgetHost's GetBackingStore method is called, it will call
+// WaitForBackingStoreMsg if it has no backingstore.
//
// TRANSPORT DIB CREATION
//
@@ -96,7 +104,8 @@ struct ViewMsg_SwapOut_Params;
// renderers can refer to.
//
class RenderWidgetHelper
- : public base::RefCountedThreadSafe<RenderWidgetHelper> {
+ : public base::RefCountedThreadSafe<
+ RenderWidgetHelper, content::BrowserThread::DeleteOnIOThread> {
public:
RenderWidgetHelper();
@@ -106,6 +115,12 @@ class RenderWidgetHelper
// Gets the next available routing id. This is thread safe.
int GetNextRoutingID();
+ // IO THREAD ONLY -----------------------------------------------------------
+
+ // Lookup the RenderWidgetHelper from the render_process_host_id. Returns NULL
+ // if not found. NOTE: The raw pointer is for temporary use only. To retain,
+ // store in a scoped_refptr.
+ static RenderWidgetHelper* FromProcessHostID(int render_process_host_id);
// UI THREAD ONLY -----------------------------------------------------------
@@ -114,9 +129,9 @@ class RenderWidgetHelper
// for documentation.
void CancelResourceRequests(int render_widget_id);
void SimulateSwapOutACK(const ViewMsg_SwapOut_Params& params);
- bool WaitForUpdateMsg(int render_widget_id,
- const base::TimeDelta& max_delay,
- IPC::Message* msg);
+ bool WaitForBackingStoreMsg(int render_widget_id,
+ const base::TimeDelta& max_delay,
+ IPC::Message* msg);
#if defined(OS_MACOSX)
// Given the id of a transport DIB, return a mapping to it or NULL on error.
@@ -125,8 +140,8 @@ class RenderWidgetHelper
// IO THREAD ONLY -----------------------------------------------------------
- // Called on the IO thread when a UpdateRect message is received.
- void DidReceiveUpdateMsg(const IPC::Message& msg);
+ // Called on the IO thread when a BackingStore message is received.
+ void DidReceiveBackingStoreMsg(const IPC::Message& msg);
void CreateNewWindow(const ViewHostMsg_CreateWindow_Params& params,
bool no_javascript_access,
@@ -156,21 +171,25 @@ class RenderWidgetHelper
private:
// A class used to proxy a paint message. PaintMsgProxy objects are created
// on the IO thread and destroyed on the UI thread.
- class UpdateMsgProxy;
- friend class UpdateMsgProxy;
+ class BackingStoreMsgProxy;
+ friend class BackingStoreMsgProxy;
friend class base::RefCountedThreadSafe<RenderWidgetHelper>;
+ friend struct content::BrowserThread::DeleteOnThread<
+ content::BrowserThread::IO>;
+ friend class base::DeleteHelper<RenderWidgetHelper>;
- typedef std::deque<UpdateMsgProxy*> UpdateMsgProxyQueue;
+ typedef std::deque<BackingStoreMsgProxy*> BackingStoreMsgProxyQueue;
// Map from render_widget_id to a queue of live PaintMsgProxy instances.
- typedef base::hash_map<int, UpdateMsgProxyQueue > UpdateMsgProxyMap;
+ typedef base::hash_map<int, BackingStoreMsgProxyQueue >
+ BackingStoreMsgProxyMap;
~RenderWidgetHelper();
// Called on the UI thread to discard a paint message.
- void OnDiscardUpdateMsg(UpdateMsgProxy* proxy);
+ void OnDiscardBackingStoreMsg(BackingStoreMsgProxy* proxy);
// Called on the UI thread to dispatch a paint message if necessary.
- void OnDispatchUpdateMsg(UpdateMsgProxy* proxy);
+ void OnDispatchBackingStoreMsg(BackingStoreMsgProxy* proxy);
// Called on the UI thread to finish creating a window.
void OnCreateWindowOnUI(const ViewHostMsg_CreateWindow_Params& params,
@@ -205,14 +224,15 @@ class RenderWidgetHelper
#endif
// A map of live paint messages. Must hold pending_paints_lock_ to access.
- // The UpdateMsgProxy objects are not owned by this map. (See UpdateMsgProxy
- // for details about how the lifetime of instances are managed.)
- UpdateMsgProxyMap pending_paints_;
+ // The BackingStoreMsgProxy objects are not owned by this map. (See
+ // BackingStoreMsgProxy for details about how the lifetime of instances are
+ // managed.)
+ BackingStoreMsgProxyMap pending_paints_;
base::Lock pending_paints_lock_;
int render_process_id_;
- // Event used to implement WaitForUpdateMsg.
+ // Event used to implement WaitForBackingStoreMsg.
base::WaitableEvent event_;
// The next routing id to use.
« no previous file with comments | « content/browser/renderer_host/render_process_host_impl.cc ('k') | content/browser/renderer_host/render_widget_helper.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698