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

Side by Side Diff: content/renderer/render_widget.cc

Issue 6319001: Support window.opener after a process swap. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix unload; chrome dependency in RenderWidget. Created 9 years, 7 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 unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « content/renderer/render_widget.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 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 "content/renderer/render_widget.h" 5 #include "content/renderer/render_widget.h"
6 6
7 #include "base/command_line.h" 7 #include "base/command_line.h"
8 #include "base/logging.h" 8 #include "base/logging.h"
9 #include "base/memory/scoped_ptr.h" 9 #include "base/memory/scoped_ptr.h"
10 #include "base/message_loop.h" 10 #include "base/message_loop.h"
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 host_window_(0), 67 host_window_(0),
68 current_paint_buf_(NULL), 68 current_paint_buf_(NULL),
69 next_paint_flags_(0), 69 next_paint_flags_(0),
70 update_reply_pending_(false), 70 update_reply_pending_(false),
71 did_show_(false), 71 did_show_(false),
72 is_hidden_(false), 72 is_hidden_(false),
73 needs_repainting_on_restore_(false), 73 needs_repainting_on_restore_(false),
74 has_focus_(false), 74 has_focus_(false),
75 handling_input_event_(false), 75 handling_input_event_(false),
76 closing_(false), 76 closing_(false),
77 is_swapped_out_(false),
77 input_method_is_active_(false), 78 input_method_is_active_(false),
78 text_input_type_(WebKit::WebTextInputTypeNone), 79 text_input_type_(WebKit::WebTextInputTypeNone),
79 popup_type_(popup_type), 80 popup_type_(popup_type),
80 pending_window_rect_count_(0), 81 pending_window_rect_count_(0),
81 suppress_next_char_events_(false), 82 suppress_next_char_events_(false),
82 is_accelerated_compositing_active_(false), 83 is_accelerated_compositing_active_(false),
83 animation_update_pending_(false), 84 animation_update_pending_(false),
84 animation_task_posted_(false) { 85 animation_task_posted_(false) {
85 RenderProcess::current()->AddRefProcess(); 86 RenderProcess::current()->AddRefProcess();
86 DCHECK(render_thread_); 87 DCHECK(render_thread_);
87 } 88 }
88 89
89 RenderWidget::~RenderWidget() { 90 RenderWidget::~RenderWidget() {
90 DCHECK(!webwidget_) << "Leaking our WebWidget!"; 91 DCHECK(!webwidget_) << "Leaking our WebWidget!";
91 if (current_paint_buf_) { 92 if (current_paint_buf_) {
92 RenderProcess::current()->ReleaseTransportDIB(current_paint_buf_); 93 RenderProcess::current()->ReleaseTransportDIB(current_paint_buf_);
93 current_paint_buf_ = NULL; 94 current_paint_buf_ = NULL;
94 } 95 }
95 RenderProcess::current()->ReleaseProcess(); 96 // If we are swapped out, we have released already.
97 if (!is_swapped_out_)
98 RenderProcess::current()->ReleaseProcess();
96 } 99 }
97 100
98 // static 101 // static
99 RenderWidget* RenderWidget::Create(int32 opener_id, 102 RenderWidget* RenderWidget::Create(int32 opener_id,
100 RenderThreadBase* render_thread, 103 RenderThreadBase* render_thread,
101 WebKit::WebPopupType popup_type) { 104 WebKit::WebPopupType popup_type) {
102 DCHECK(opener_id != MSG_ROUTING_NONE); 105 DCHECK(opener_id != MSG_ROUTING_NONE);
103 scoped_refptr<RenderWidget> widget(new RenderWidget(render_thread, 106 scoped_refptr<RenderWidget> widget(new RenderWidget(render_thread,
104 popup_type)); 107 popup_type));
105 widget->Init(opener_id); // adds reference 108 widget->Init(opener_id); // adds reference
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after
153 void RenderWidget::CompleteInit(gfx::NativeViewId parent_hwnd, 156 void RenderWidget::CompleteInit(gfx::NativeViewId parent_hwnd,
154 gfx::PluginWindowHandle compositing_surface) { 157 gfx::PluginWindowHandle compositing_surface) {
155 DCHECK(routing_id_ != MSG_ROUTING_NONE); 158 DCHECK(routing_id_ != MSG_ROUTING_NONE);
156 159
157 host_window_ = parent_hwnd; 160 host_window_ = parent_hwnd;
158 compositing_surface_ = compositing_surface; 161 compositing_surface_ = compositing_surface;
159 162
160 Send(new ViewHostMsg_RenderViewReady(routing_id_)); 163 Send(new ViewHostMsg_RenderViewReady(routing_id_));
161 } 164 }
162 165
166 void RenderWidget::SetSwappedOut(bool is_swapped_out) {
167 // We should only toggle between states.
168 DCHECK(is_swapped_out_ != is_swapped_out);
169 is_swapped_out_ = is_swapped_out;
170
171 // If we are swapping out, we will call ReleaseProcess, allowing the process
172 // to exit if all of its RenderViews are swapped out. We wait until the
173 // WasSwappedOut call to do this, to avoid showing the sad tab.
174 // If we are swapping in, we call AddRefProcess to prevent the process from
175 // exiting.
176 if (!is_swapped_out)
177 RenderProcess::current()->AddRefProcess();
178 }
179
163 bool RenderWidget::OnMessageReceived(const IPC::Message& message) { 180 bool RenderWidget::OnMessageReceived(const IPC::Message& message) {
164 bool handled = true; 181 bool handled = true;
165 IPC_BEGIN_MESSAGE_MAP(RenderWidget, message) 182 IPC_BEGIN_MESSAGE_MAP(RenderWidget, message)
166 IPC_MESSAGE_HANDLER(ViewMsg_Close, OnClose) 183 IPC_MESSAGE_HANDLER(ViewMsg_Close, OnClose)
167 IPC_MESSAGE_HANDLER(ViewMsg_CreatingNew_ACK, OnCreatingNewAck) 184 IPC_MESSAGE_HANDLER(ViewMsg_CreatingNew_ACK, OnCreatingNewAck)
168 IPC_MESSAGE_HANDLER(ViewMsg_Resize, OnResize) 185 IPC_MESSAGE_HANDLER(ViewMsg_Resize, OnResize)
169 IPC_MESSAGE_HANDLER(ViewMsg_WasHidden, OnWasHidden) 186 IPC_MESSAGE_HANDLER(ViewMsg_WasHidden, OnWasHidden)
170 IPC_MESSAGE_HANDLER(ViewMsg_WasRestored, OnWasRestored) 187 IPC_MESSAGE_HANDLER(ViewMsg_WasRestored, OnWasRestored)
188 IPC_MESSAGE_HANDLER(ViewMsg_WasSwappedOut, OnWasSwappedOut)
171 IPC_MESSAGE_HANDLER(ViewMsg_UpdateRect_ACK, OnUpdateRectAck) 189 IPC_MESSAGE_HANDLER(ViewMsg_UpdateRect_ACK, OnUpdateRectAck)
172 IPC_MESSAGE_HANDLER(ViewMsg_HandleInputEvent, OnHandleInputEvent) 190 IPC_MESSAGE_HANDLER(ViewMsg_HandleInputEvent, OnHandleInputEvent)
173 IPC_MESSAGE_HANDLER(ViewMsg_MouseCaptureLost, OnMouseCaptureLost) 191 IPC_MESSAGE_HANDLER(ViewMsg_MouseCaptureLost, OnMouseCaptureLost)
174 IPC_MESSAGE_HANDLER(ViewMsg_SetFocus, OnSetFocus) 192 IPC_MESSAGE_HANDLER(ViewMsg_SetFocus, OnSetFocus)
175 IPC_MESSAGE_HANDLER(ViewMsg_SetInputMethodActive, OnSetInputMethodActive) 193 IPC_MESSAGE_HANDLER(ViewMsg_SetInputMethodActive, OnSetInputMethodActive)
176 IPC_MESSAGE_HANDLER(ViewMsg_ImeSetComposition, OnImeSetComposition) 194 IPC_MESSAGE_HANDLER(ViewMsg_ImeSetComposition, OnImeSetComposition)
177 IPC_MESSAGE_HANDLER(ViewMsg_ImeConfirmComposition, OnImeConfirmComposition) 195 IPC_MESSAGE_HANDLER(ViewMsg_ImeConfirmComposition, OnImeConfirmComposition)
178 IPC_MESSAGE_HANDLER(ViewMsg_PaintAtSize, OnMsgPaintAtSize) 196 IPC_MESSAGE_HANDLER(ViewMsg_PaintAtSize, OnMsgPaintAtSize)
179 IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnMsgRepaint) 197 IPC_MESSAGE_HANDLER(ViewMsg_Repaint, OnMsgRepaint)
180 IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection) 198 IPC_MESSAGE_HANDLER(ViewMsg_SetTextDirection, OnSetTextDirection)
181 IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck) 199 IPC_MESSAGE_HANDLER(ViewMsg_Move_ACK, OnRequestMoveAck)
182 IPC_MESSAGE_UNHANDLED(handled = false) 200 IPC_MESSAGE_UNHANDLED(handled = false)
183 IPC_END_MESSAGE_MAP() 201 IPC_END_MESSAGE_MAP()
184 return handled; 202 return handled;
185 } 203 }
186 204
205 bool RenderWidget::CanSendWhileSwappedOut(IPC::Message* message) {
Matt Perry 2011/05/05 17:06:50 It's a shame that these message lists are duplicat
Charlie Reis 2011/05/10 20:15:09 The lists aren't identical, but it does seem like
Matt Perry 2011/05/10 20:26:32 Oh interesting. There are some messages that you w
Charlie Reis 2011/05/10 20:35:23 Yes-- there are several messages that the renderer
Charlie Reis 2011/05/10 23:17:56 Fixed in the new patch set. I abstract it out to
206 // We filter out most IPC messages when swapped out. However, some are
207 // important (e.g., ACKs) for keeping the browser and renderer state
208 // consistent in case we later return to this renderer.
209 switch (message->type()) {
210 case ViewHostMsg_HandleInputEvent_ACK::ID:
211 case ViewHostMsg_PaintAtSize_ACK::ID:
212 case ViewHostMsg_UpdateRect::ID:
213 return true;
214 default:
215 break;
216 }
217 return false;
218 }
219
187 bool RenderWidget::Send(IPC::Message* message) { 220 bool RenderWidget::Send(IPC::Message* message) {
188 // Don't send any messages after the browser has told us to close. 221 // Don't send any messages after the browser has told us to close, and filter
189 if (closing_) { 222 // most outgoing messages while swapped out.
223 if (closing_ || (is_swapped_out_ && !CanSendWhileSwappedOut(message))) {
190 delete message; 224 delete message;
191 return false; 225 return false;
192 } 226 }
193 227
194 // If given a messsage without a routing ID, then assign our routing ID. 228 // If given a messsage without a routing ID, then assign our routing ID.
195 if (message->routing_id() == MSG_ROUTING_NONE) 229 if (message->routing_id() == MSG_ROUTING_NONE)
196 message->set_routing_id(routing_id_); 230 message->set_routing_id(routing_id_);
197 231
198 return render_thread_->Send(message); 232 return render_thread_->Send(message);
199 } 233 }
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
292 set_next_paint_is_restore_ack(); 326 set_next_paint_is_restore_ack();
293 327
294 // Generate a full repaint. 328 // Generate a full repaint.
295 if (!is_accelerated_compositing_active_) { 329 if (!is_accelerated_compositing_active_) {
296 didInvalidateRect(gfx::Rect(size_.width(), size_.height())); 330 didInvalidateRect(gfx::Rect(size_.width(), size_.height()));
297 } else { 331 } else {
298 scheduleComposite(); 332 scheduleComposite();
299 } 333 }
300 } 334 }
301 335
336 void RenderWidget::OnWasSwappedOut() {
337 // If we have been swapped out and no one else is using this process,
338 // it's safe to exit now. If we get swapped back in, we will call
339 // AddRefProcess in SetSwappedOut.
340 if (is_swapped_out_)
341 RenderProcess::current()->ReleaseProcess();
342 }
343
302 void RenderWidget::OnRequestMoveAck() { 344 void RenderWidget::OnRequestMoveAck() {
303 DCHECK(pending_window_rect_count_); 345 DCHECK(pending_window_rect_count_);
304 pending_window_rect_count_--; 346 pending_window_rect_count_--;
305 } 347 }
306 348
307 void RenderWidget::OnUpdateRectAck() { 349 void RenderWidget::OnUpdateRectAck() {
308 GPU_TRACE_EVENT0("renderer", "RenderWidget::OnUpdateRectAck"); 350 GPU_TRACE_EVENT0("renderer", "RenderWidget::OnUpdateRectAck");
309 DCHECK(update_reply_pending()); 351 DCHECK(update_reply_pending());
310 update_reply_pending_ = false; 352 update_reply_pending_ = false;
311 353
(...skipping 843 matching lines...) Expand 10 before | Expand all | Expand 10 after
1155 1197
1156 void RenderWidget::CleanupWindowInPluginMoves(gfx::PluginWindowHandle window) { 1198 void RenderWidget::CleanupWindowInPluginMoves(gfx::PluginWindowHandle window) {
1157 for (WebPluginGeometryVector::iterator i = plugin_window_moves_.begin(); 1199 for (WebPluginGeometryVector::iterator i = plugin_window_moves_.begin();
1158 i != plugin_window_moves_.end(); ++i) { 1200 i != plugin_window_moves_.end(); ++i) {
1159 if (i->window == window) { 1201 if (i->window == window) {
1160 plugin_window_moves_.erase(i); 1202 plugin_window_moves_.erase(i);
1161 break; 1203 break;
1162 } 1204 }
1163 } 1205 }
1164 } 1206 }
OLDNEW
« no previous file with comments | « content/renderer/render_widget.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698