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

Side by Side Diff: content/browser/browser_plugin/browser_plugin_guest.cc

Issue 12207144: Apply merge from @fsamuel. (Closed) Base URL: svn://svn.chromium.org/chrome/branches/1364/src/
Patch Set: Created 7 years, 10 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
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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/browser/browser_plugin/browser_plugin_guest.h" 5 #include "content/browser/browser_plugin/browser_plugin_guest.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/string_util.h" 9 #include "base/string_util.h"
10 #include "base/utf_string_conversions.h" 10 #include "base/utf_string_conversions.h"
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
42 // static 42 // static
43 BrowserPluginHostFactory* BrowserPluginGuest::factory_ = NULL; 43 BrowserPluginHostFactory* BrowserPluginGuest::factory_ = NULL;
44 44
45 BrowserPluginGuest::BrowserPluginGuest( 45 BrowserPluginGuest::BrowserPluginGuest(
46 int instance_id, 46 int instance_id,
47 WebContentsImpl* web_contents, 47 WebContentsImpl* web_contents,
48 const BrowserPluginHostMsg_CreateGuest_Params& params) 48 const BrowserPluginHostMsg_CreateGuest_Params& params)
49 : WebContentsObserver(web_contents), 49 : WebContentsObserver(web_contents),
50 embedder_web_contents_(NULL), 50 embedder_web_contents_(NULL),
51 instance_id_(instance_id), 51 instance_id_(instance_id),
52 #if defined(OS_WIN) 52 damage_buffer_sequence_id_(0),
53 damage_buffer_size_(0), 53 damage_buffer_size_(0),
54 remote_damage_buffer_handle_(0),
55 #endif
56 damage_buffer_scale_factor_(1.0f), 54 damage_buffer_scale_factor_(1.0f),
57 pending_update_counter_(0), 55 pending_update_counter_(0),
58 guest_hang_timeout_( 56 guest_hang_timeout_(
59 base::TimeDelta::FromMilliseconds(kHungRendererDelayMs)), 57 base::TimeDelta::FromMilliseconds(kHungRendererDelayMs)),
60 focused_(params.focused), 58 focused_(params.focused),
61 visible_(params.visible), 59 visible_(params.visible),
62 auto_size_enabled_(params.auto_size_params.enable), 60 auto_size_enabled_(params.auto_size_params.enable),
63 max_auto_size_(params.auto_size_params.max_size), 61 max_auto_size_(params.auto_size_params.max_size),
64 min_auto_size_(params.auto_size_params.min_size) { 62 min_auto_size_(params.auto_size_params.min_size) {
65 DCHECK(web_contents); 63 DCHECK(web_contents);
(...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 265
268 void BrowserPluginGuest::Resize( 266 void BrowserPluginGuest::Resize(
269 RenderViewHost* embedder_rvh, 267 RenderViewHost* embedder_rvh,
270 const BrowserPluginHostMsg_ResizeGuest_Params& params) { 268 const BrowserPluginHostMsg_ResizeGuest_Params& params) {
271 // BrowserPlugin manages resize flow control itself and does not depend 269 // BrowserPlugin manages resize flow control itself and does not depend
272 // on RenderWidgetHost's mechanisms for flow control, so we reset those flags 270 // on RenderWidgetHost's mechanisms for flow control, so we reset those flags
273 // here. 271 // here.
274 RenderWidgetHostImpl* render_widget_host = 272 RenderWidgetHostImpl* render_widget_host =
275 RenderWidgetHostImpl::From(web_contents()->GetRenderViewHost()); 273 RenderWidgetHostImpl::From(web_contents()->GetRenderViewHost());
276 render_widget_host->ResetSizeAndRepaintPendingFlags(); 274 render_widget_host->ResetSizeAndRepaintPendingFlags();
277 if (!TransportDIB::is_valid_id(params.damage_buffer_id)) { 275 if (!base::SharedMemory::IsHandleValid(params.damage_buffer_handle)) {
278 // Invalid transport dib, so just resize the WebContents. 276 // Invalid damage buffer, so just resize the WebContents.
279 if (!params.view_size.IsEmpty()) 277 if (!params.view_size.IsEmpty())
280 web_contents()->GetView()->SizeContents(params.view_size); 278 web_contents()->GetView()->SizeContents(params.view_size);
281 return; 279 return;
282 } 280 }
283 TransportDIB* damage_buffer = 281 SetDamageBuffer(params);
284 GetDamageBufferFromEmbedder(embedder_rvh, params);
285 SetDamageBuffer(damage_buffer,
286 #if defined(OS_WIN)
287 params.damage_buffer_size,
288 params.damage_buffer_id.handle,
289 #endif
290 params.view_size,
291 params.scale_factor);
292 web_contents()->GetView()->SizeContents(params.view_size); 282 web_contents()->GetView()->SizeContents(params.view_size);
293 } 283 }
294 284
295 TransportDIB* BrowserPluginGuest::GetDamageBufferFromEmbedder( 285 base::SharedMemory* BrowserPluginGuest::GetDamageBufferFromEmbedder(
296 RenderViewHost* embedder_rvh,
297 const BrowserPluginHostMsg_ResizeGuest_Params& params) { 286 const BrowserPluginHostMsg_ResizeGuest_Params& params) {
298 TransportDIB* damage_buffer = NULL;
299 #if defined(OS_WIN) 287 #if defined(OS_WIN)
300 // On Windows we need to duplicate the handle from the remote process. 288 base::ProcessHandle handle =
301 HANDLE section; 289 embedder_web_contents_->GetRenderProcessHost()->GetHandle();
302 DuplicateHandle(embedder_rvh->GetProcess()->GetHandle(), 290 scoped_ptr<base::SharedMemory> shared_buf(
303 params.damage_buffer_id.handle, 291 new base::SharedMemory(params.damage_buffer_handle, false, handle));
304 GetCurrentProcess(), 292 #elif defined(OS_POSIX)
305 &section, 293 scoped_ptr<base::SharedMemory> shared_buf(
306 STANDARD_RIGHTS_REQUIRED | FILE_MAP_READ | FILE_MAP_WRITE, 294 new base::SharedMemory(params.damage_buffer_handle, false));
307 FALSE, 295 #endif
308 0); 296 if (!shared_buf->Map(params.damage_buffer_size)) {
309 damage_buffer = TransportDIB::Map(section); 297 NOTREACHED();
310 #elif defined(OS_MACOSX) 298 return NULL;
311 // On OSX, we need the handle to map the transport dib. 299 }
312 damage_buffer = TransportDIB::Map(params.damage_buffer_handle); 300 return shared_buf.release();
313 #elif defined(OS_ANDROID)
314 damage_buffer = TransportDIB::Map(params.damage_buffer_id);
315 #elif defined(OS_POSIX)
316 damage_buffer = TransportDIB::Map(params.damage_buffer_id.shmkey);
317 #endif // defined(OS_POSIX)
318 DCHECK(damage_buffer);
319 return damage_buffer;
320 } 301 }
321 302
322 void BrowserPluginGuest::SetDamageBuffer( 303 void BrowserPluginGuest::SetDamageBuffer(
323 TransportDIB* damage_buffer, 304 const BrowserPluginHostMsg_ResizeGuest_Params& params) {
324 #if defined(OS_WIN) 305 damage_buffer_.reset(GetDamageBufferFromEmbedder(params));
325 int damage_buffer_size,
326 TransportDIB::Handle remote_handle,
327 #endif
328 const gfx::Size& damage_view_size,
329 float scale_factor) {
330 // Sanity check: Verify that we've correctly shared the damage buffer memory 306 // Sanity check: Verify that we've correctly shared the damage buffer memory
331 // between the embedder and browser processes. 307 // between the embedder and browser processes.
332 DCHECK(*static_cast<unsigned int*>(damage_buffer->memory()) == 0xdeadbeef); 308 DCHECK(*static_cast<unsigned int*>(damage_buffer_->memory()) == 0xdeadbeef);
333 damage_buffer_.reset(damage_buffer); 309 damage_buffer_sequence_id_ = params.damage_buffer_sequence_id;
334 #if defined(OS_WIN) 310 damage_buffer_size_ = params.damage_buffer_size;
335 damage_buffer_size_ = damage_buffer_size; 311 damage_view_size_ = params.view_size;
336 remote_damage_buffer_handle_ = remote_handle; 312 damage_buffer_scale_factor_ = params.scale_factor;
337 #endif
338 damage_view_size_ = damage_view_size;
339 damage_buffer_scale_factor_ = scale_factor;
340 } 313 }
341 314
342 gfx::Point BrowserPluginGuest::GetScreenCoordinates( 315 gfx::Point BrowserPluginGuest::GetScreenCoordinates(
343 const gfx::Point& relative_position) const { 316 const gfx::Point& relative_position) const {
344 gfx::Point screen_pos(relative_position); 317 gfx::Point screen_pos(relative_position);
345 screen_pos += guest_window_rect_.OffsetFromOrigin(); 318 screen_pos += guest_window_rect_.OffsetFromOrigin();
346 return screen_pos; 319 return screen_pos;
347 } 320 }
348 321
349 int BrowserPluginGuest::embedder_routing_id() const { 322 int BrowserPluginGuest::embedder_routing_id() const {
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
390 // buffer's scale factor. 363 // buffer's scale factor.
391 // The scaling change can happen due to asynchronous updates of the DPI on a 364 // The scaling change can happen due to asynchronous updates of the DPI on a
392 // resolution change. 365 // resolution change.
393 if (((auto_size_enabled_ && InAutoSizeBounds(params.view_size)) || 366 if (((auto_size_enabled_ && InAutoSizeBounds(params.view_size)) ||
394 (params.view_size.width() == damage_view_size().width() && 367 (params.view_size.width() == damage_view_size().width() &&
395 params.view_size.height() == damage_view_size().height())) && 368 params.view_size.height() == damage_view_size().height())) &&
396 params.scale_factor == damage_buffer_scale_factor()) { 369 params.scale_factor == damage_buffer_scale_factor()) {
397 TransportDIB* dib = render_view_host->GetProcess()-> 370 TransportDIB* dib = render_view_host->GetProcess()->
398 GetTransportDIB(params.bitmap); 371 GetTransportDIB(params.bitmap);
399 if (dib) { 372 if (dib) {
373 size_t guest_damage_buffer_size =
400 #if defined(OS_WIN) 374 #if defined(OS_WIN)
401 size_t guest_damage_buffer_size = params.bitmap_rect.width() * 375 params.bitmap_rect.width() *
402 params.bitmap_rect.height() * 4; 376 params.bitmap_rect.height() * 4;
377 #else
378 dib->size();
379 #endif
403 size_t embedder_damage_buffer_size = damage_buffer_size_; 380 size_t embedder_damage_buffer_size = damage_buffer_size_;
404 #else
405 size_t guest_damage_buffer_size = dib->size();
406 size_t embedder_damage_buffer_size = damage_buffer_->size();
407 #endif
408 void* guest_memory = dib->memory(); 381 void* guest_memory = dib->memory();
409 void* embedder_memory = damage_buffer_->memory(); 382 void* embedder_memory = damage_buffer_->memory();
410 size_t size = std::min(guest_damage_buffer_size, 383 size_t size = std::min(guest_damage_buffer_size,
411 embedder_damage_buffer_size); 384 embedder_damage_buffer_size);
412 memcpy(embedder_memory, guest_memory, size); 385 memcpy(embedder_memory, guest_memory, size);
413 } 386 }
414 } 387 }
415 BrowserPluginMsg_UpdateRect_Params relay_params; 388 BrowserPluginMsg_UpdateRect_Params relay_params;
416 #if defined(OS_MACOSX) 389 relay_params.damage_buffer_sequence_id = damage_buffer_sequence_id_;
417 relay_params.damage_buffer_identifier = damage_buffer_->id();
418 #elif defined(OS_WIN)
419 // On Windows, the handle used locally differs from the handle received from
420 // the embedder process, since we duplicate the remote handle.
421 relay_params.damage_buffer_identifier = remote_damage_buffer_handle_;
422 #else
423 relay_params.damage_buffer_identifier = damage_buffer_->handle();
424 #endif
425 relay_params.bitmap_rect = params.bitmap_rect; 390 relay_params.bitmap_rect = params.bitmap_rect;
426 relay_params.scroll_delta = params.scroll_delta; 391 relay_params.scroll_delta = params.scroll_delta;
427 relay_params.scroll_rect = params.scroll_rect; 392 relay_params.scroll_rect = params.scroll_rect;
428 relay_params.copy_rects = params.copy_rects; 393 relay_params.copy_rects = params.copy_rects;
429 relay_params.view_size = params.view_size; 394 relay_params.view_size = params.view_size;
430 relay_params.scale_factor = params.scale_factor; 395 relay_params.scale_factor = params.scale_factor;
431 relay_params.is_resize_ack = ViewHostMsg_UpdateRect_Flags::is_resize_ack( 396 relay_params.is_resize_ack = ViewHostMsg_UpdateRect_Flags::is_resize_ack(
432 params.flags); 397 params.flags);
433 398
434 // We need to send the ACK to the same render_view_host that issued 399 // We need to send the ACK to the same render_view_host that issued
(...skipping 225 matching lines...) Expand 10 before | Expand all | Expand 10 after
660 default: 625 default:
661 break; 626 break;
662 } 627 }
663 } 628 }
664 629
665 void BrowserPluginGuest::SendMessageToEmbedder(IPC::Message* msg) { 630 void BrowserPluginGuest::SendMessageToEmbedder(IPC::Message* msg) {
666 embedder_web_contents_->Send(msg); 631 embedder_web_contents_->Send(msg);
667 } 632 }
668 633
669 } // namespace content 634 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/browser_plugin/browser_plugin_guest.h ('k') | content/browser/browser_plugin/test_browser_plugin_guest.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698