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

Side by Side Diff: chrome/browser/renderer_host/render_widget_helper.cc

Issue 342068: Third patch in getting rid of caching MessageLoop pointers and always using C... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 1 month 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/renderer_host/render_widget_helper.h" 5 #include "chrome/browser/renderer_host/render_widget_helper.h"
6 6
7 #include "base/eintr_wrapper.h" 7 #include "base/eintr_wrapper.h"
8 #include "base/thread.h" 8 #include "base/thread.h"
9 #include "chrome/browser/browser_process.h" 9 #include "chrome/browser/chrome_thread.h"
10 #include "chrome/browser/renderer_host/render_process_host.h" 10 #include "chrome/browser/renderer_host/render_process_host.h"
11 #include "chrome/browser/renderer_host/render_view_host.h" 11 #include "chrome/browser/renderer_host/render_view_host.h"
12 #include "chrome/browser/renderer_host/resource_dispatcher_host.h" 12 #include "chrome/browser/renderer_host/resource_dispatcher_host.h"
13 #include "chrome/common/render_messages.h" 13 #include "chrome/common/render_messages.h"
14 14
15 // A Task used with InvokeLater that we hold a pointer to in pending_paints_. 15 // A Task used with InvokeLater that we hold a pointer to in pending_paints_.
16 // Instances are deleted by MessageLoop after it calls their Run method. 16 // Instances are deleted by MessageLoop after it calls their Run method.
17 class RenderWidgetHelper::PaintMsgProxy : public Task { 17 class RenderWidgetHelper::PaintMsgProxy : public Task {
18 public: 18 public:
19 PaintMsgProxy(RenderWidgetHelper* h, const IPC::Message& m) 19 PaintMsgProxy(RenderWidgetHelper* h, const IPC::Message& m)
(...skipping 18 matching lines...) Expand all
38 38
39 scoped_refptr<RenderWidgetHelper> helper; 39 scoped_refptr<RenderWidgetHelper> helper;
40 IPC::Message message; 40 IPC::Message message;
41 bool cancelled; // If true, then the message will not be dispatched. 41 bool cancelled; // If true, then the message will not be dispatched.
42 42
43 DISALLOW_COPY_AND_ASSIGN(PaintMsgProxy); 43 DISALLOW_COPY_AND_ASSIGN(PaintMsgProxy);
44 }; 44 };
45 45
46 RenderWidgetHelper::RenderWidgetHelper() 46 RenderWidgetHelper::RenderWidgetHelper()
47 : render_process_id_(-1), 47 : render_process_id_(-1),
48 ui_loop_(MessageLoop::current()),
49 #if defined(OS_WIN) 48 #if defined(OS_WIN)
50 event_(CreateEvent(NULL, FALSE /* auto-reset */, FALSE, NULL)), 49 event_(CreateEvent(NULL, FALSE /* auto-reset */, FALSE, NULL)),
51 #elif defined(OS_POSIX) 50 #elif defined(OS_POSIX)
52 event_(false /* auto-reset */, false), 51 event_(false /* auto-reset */, false),
53 #endif 52 #endif
54 resource_dispatcher_host_(NULL) { 53 resource_dispatcher_host_(NULL) {
55 } 54 }
56 55
57 RenderWidgetHelper::~RenderWidgetHelper() { 56 RenderWidgetHelper::~RenderWidgetHelper() {
58 // The elements of pending_paints_ each hold an owning reference back to this 57 // The elements of pending_paints_ each hold an owning reference back to this
(...skipping 10 matching lines...) Expand all
69 ResourceDispatcherHost* resource_dispatcher_host) { 68 ResourceDispatcherHost* resource_dispatcher_host) {
70 render_process_id_ = render_process_id; 69 render_process_id_ = render_process_id;
71 resource_dispatcher_host_ = resource_dispatcher_host; 70 resource_dispatcher_host_ = resource_dispatcher_host;
72 } 71 }
73 72
74 int RenderWidgetHelper::GetNextRoutingID() { 73 int RenderWidgetHelper::GetNextRoutingID() {
75 return next_routing_id_.GetNext() + 1; 74 return next_routing_id_.GetNext() + 1;
76 } 75 }
77 76
78 void RenderWidgetHelper::CancelResourceRequests(int render_widget_id) { 77 void RenderWidgetHelper::CancelResourceRequests(int render_widget_id) {
79 if (g_browser_process->io_thread() && render_process_id_ != -1) { 78 if (render_process_id_ == -1)
80 g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE, 79 return;
81 NewRunnableMethod(this, 80
82 &RenderWidgetHelper::OnCancelResourceRequests, 81 ChromeThread::PostTask(
83 render_widget_id)); 82 ChromeThread::IO, FROM_HERE,
84 } 83 NewRunnableMethod(this,
84 &RenderWidgetHelper::OnCancelResourceRequests,
85 render_widget_id));
85 } 86 }
86 87
87 void RenderWidgetHelper::CrossSiteClosePageACK( 88 void RenderWidgetHelper::CrossSiteClosePageACK(
88 const ViewMsg_ClosePage_Params& params) { 89 const ViewMsg_ClosePage_Params& params) {
89 if (g_browser_process->io_thread()) { 90 ChromeThread::PostTask(
90 g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE, 91 ChromeThread::IO, FROM_HERE,
91 NewRunnableMethod(this, 92 NewRunnableMethod(this,
92 &RenderWidgetHelper::OnCrossSiteClosePageACK, 93 &RenderWidgetHelper::OnCrossSiteClosePageACK,
93 params)); 94 params));
94 }
95 } 95 }
96 96
97 bool RenderWidgetHelper::WaitForPaintMsg(int render_widget_id, 97 bool RenderWidgetHelper::WaitForPaintMsg(int render_widget_id,
98 const base::TimeDelta& max_delay, 98 const base::TimeDelta& max_delay,
99 IPC::Message* msg) { 99 IPC::Message* msg) {
100 base::TimeTicks time_start = base::TimeTicks::Now(); 100 base::TimeTicks time_start = base::TimeTicks::Now();
101 101
102 for (;;) { 102 for (;;) {
103 PaintMsgProxy* proxy = NULL; 103 PaintMsgProxy* proxy = NULL;
104 { 104 {
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
154 154
155 result.first->second = (proxy = new PaintMsgProxy(this, msg)); 155 result.first->second = (proxy = new PaintMsgProxy(this, msg));
156 } 156 }
157 157
158 // Notify anyone waiting on the UI thread that there is a new entry in the 158 // Notify anyone waiting on the UI thread that there is a new entry in the
159 // proxy map. If they don't find the entry they are looking for, then they 159 // proxy map. If they don't find the entry they are looking for, then they
160 // will just continue waiting. 160 // will just continue waiting.
161 event_.Signal(); 161 event_.Signal();
162 162
163 // The proxy will be deleted when it is run as a task. 163 // The proxy will be deleted when it is run as a task.
164 ui_loop_->PostTask(FROM_HERE, proxy); 164 ChromeThread::PostTask(ChromeThread::UI, FROM_HERE, proxy);
165 } 165 }
166 166
167 void RenderWidgetHelper::OnDiscardPaintMsg(PaintMsgProxy* proxy) { 167 void RenderWidgetHelper::OnDiscardPaintMsg(PaintMsgProxy* proxy) {
168 const IPC::Message& msg = proxy->message; 168 const IPC::Message& msg = proxy->message;
169 169
170 // Remove the proxy from the map now that we are going to handle it normally. 170 // Remove the proxy from the map now that we are going to handle it normally.
171 { 171 {
172 AutoLock lock(pending_paints_lock_); 172 AutoLock lock(pending_paints_lock_);
173 173
174 PaintMsgProxyMap::iterator it = pending_paints_.find(msg.routing_id()); 174 PaintMsgProxyMap::iterator it = pending_paints_.find(msg.routing_id());
(...skipping 27 matching lines...) Expand all
202 void RenderWidgetHelper::CreateNewWindow(int opener_id, 202 void RenderWidgetHelper::CreateNewWindow(int opener_id,
203 bool user_gesture, 203 bool user_gesture,
204 base::ProcessHandle render_process, 204 base::ProcessHandle render_process,
205 int* route_id) { 205 int* route_id) {
206 *route_id = GetNextRoutingID(); 206 *route_id = GetNextRoutingID();
207 // Block resource requests until the view is created, since the HWND might be 207 // Block resource requests until the view is created, since the HWND might be
208 // needed if a response ends up creating a plugin. 208 // needed if a response ends up creating a plugin.
209 resource_dispatcher_host_->BlockRequestsForRoute( 209 resource_dispatcher_host_->BlockRequestsForRoute(
210 render_process_id_, *route_id); 210 render_process_id_, *route_id);
211 211
212 ui_loop_->PostTask(FROM_HERE, NewRunnableMethod( 212 ChromeThread::PostTask(
213 this, &RenderWidgetHelper::OnCreateWindowOnUI, opener_id, *route_id)); 213 ChromeThread::UI, FROM_HERE,
214 NewRunnableMethod(
215 this, &RenderWidgetHelper::OnCreateWindowOnUI, opener_id, *route_id));
214 } 216 }
215 217
216 void RenderWidgetHelper::OnCreateWindowOnUI(int opener_id, int route_id) { 218 void RenderWidgetHelper::OnCreateWindowOnUI(int opener_id, int route_id) {
217 RenderViewHost* host = RenderViewHost::FromID(render_process_id_, opener_id); 219 RenderViewHost* host = RenderViewHost::FromID(render_process_id_, opener_id);
218 if (host) 220 if (host)
219 host->CreateNewWindow(route_id); 221 host->CreateNewWindow(route_id);
220 222
221 g_browser_process->io_thread()->message_loop()->PostTask(FROM_HERE, 223 ChromeThread::PostTask(
224 ChromeThread::IO, FROM_HERE,
222 NewRunnableMethod(this, &RenderWidgetHelper::OnCreateWindowOnIO, 225 NewRunnableMethod(this, &RenderWidgetHelper::OnCreateWindowOnIO,
223 route_id)); 226 route_id));
224 } 227 }
225 228
226 void RenderWidgetHelper::OnCreateWindowOnIO(int route_id) { 229 void RenderWidgetHelper::OnCreateWindowOnIO(int route_id) {
227 resource_dispatcher_host_->ResumeBlockedRequestsForRoute( 230 resource_dispatcher_host_->ResumeBlockedRequestsForRoute(
228 render_process_id_, route_id); 231 render_process_id_, route_id);
229 } 232 }
230 233
231 void RenderWidgetHelper::CreateNewWidget(int opener_id, 234 void RenderWidgetHelper::CreateNewWidget(int opener_id,
232 bool activatable, 235 bool activatable,
233 int* route_id) { 236 int* route_id) {
234 *route_id = GetNextRoutingID(); 237 *route_id = GetNextRoutingID();
235 ui_loop_->PostTask(FROM_HERE, NewRunnableMethod( 238 ChromeThread::PostTask(
236 this, &RenderWidgetHelper::OnCreateWidgetOnUI, opener_id, *route_id, 239 ChromeThread::UI, FROM_HERE,
237 activatable)); 240 NewRunnableMethod(
241 this, &RenderWidgetHelper::OnCreateWidgetOnUI, opener_id, *route_id,
242 activatable));
238 } 243 }
239 244
240 void RenderWidgetHelper::OnCreateWidgetOnUI( 245 void RenderWidgetHelper::OnCreateWidgetOnUI(
241 int opener_id, int route_id, bool activatable) { 246 int opener_id, int route_id, bool activatable) {
242 RenderViewHost* host = RenderViewHost::FromID(render_process_id_, opener_id); 247 RenderViewHost* host = RenderViewHost::FromID(render_process_id_, opener_id);
243 if (host) 248 if (host)
244 host->CreateNewWidget(route_id, activatable); 249 host->CreateNewWidget(route_id, activatable);
245 } 250 }
246 251
247 #if defined(OS_MACOSX) 252 #if defined(OS_MACOSX)
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 295
291 void RenderWidgetHelper::ClearAllocatedDIBs() { 296 void RenderWidgetHelper::ClearAllocatedDIBs() {
292 for (std::map<TransportDIB::Id, int>::iterator 297 for (std::map<TransportDIB::Id, int>::iterator
293 i = allocated_dibs_.begin(); i != allocated_dibs_.end(); ++i) { 298 i = allocated_dibs_.begin(); i != allocated_dibs_.end(); ++i) {
294 HANDLE_EINTR(close(i->second)); 299 HANDLE_EINTR(close(i->second));
295 } 300 }
296 301
297 allocated_dibs_.clear(); 302 allocated_dibs_.clear();
298 } 303 }
299 #endif 304 #endif
OLDNEW
« no previous file with comments | « chrome/browser/renderer_host/render_widget_helper.h ('k') | chrome/browser/renderer_host/render_widget_host_view_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698