Chromium Code Reviews| OLD | NEW |
|---|---|
| 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/renderer/browser_plugin/browser_plugin.h" | 5 #include "content/renderer/browser_plugin/browser_plugin.h" |
| 6 | 6 |
| 7 #include "base/json/json_string_value_serializer.h" | 7 #include "base/json/json_string_value_serializer.h" |
| 8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
| 9 #include "base/string_number_conversions.h" | 9 #include "base/string_number_conversions.h" |
| 10 #include "base/string_util.h" | 10 #include "base/string_util.h" |
| (...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 145 instance_id_)); | 145 instance_id_)); |
| 146 } | 146 } |
| 147 | 147 |
| 148 void BrowserPlugin::Cleanup() { | 148 void BrowserPlugin::Cleanup() { |
| 149 if (current_damage_buffer_) | 149 if (current_damage_buffer_) |
| 150 FreeDamageBuffer(¤t_damage_buffer_); | 150 FreeDamageBuffer(¤t_damage_buffer_); |
| 151 if (pending_damage_buffer_) | 151 if (pending_damage_buffer_) |
| 152 FreeDamageBuffer(&pending_damage_buffer_); | 152 FreeDamageBuffer(&pending_damage_buffer_); |
| 153 } | 153 } |
| 154 | 154 |
| 155 bool BrowserPlugin::OnMessageReceived(const IPC::Message& message) { | |
| 156 bool handled = true; | |
| 157 IPC_BEGIN_MESSAGE_MAP(BrowserPlugin, message) | |
| 158 IPC_MESSAGE_HANDLER(BrowserPluginMsg_AdvanceFocus, OnAdvanceFocus) | |
| 159 IPC_MESSAGE_HANDLER(BrowserPluginMsg_GuestContentWindowReady, | |
| 160 OnGuestContentWindowReady) | |
| 161 IPC_MESSAGE_HANDLER(BrowserPluginMsg_GuestGone, OnGuestGone) | |
| 162 IPC_MESSAGE_HANDLER(BrowserPluginMsg_GuestResponsive, OnGuestResponsive) | |
| 163 IPC_MESSAGE_HANDLER(BrowserPluginMsg_GuestUnresponsive, OnGuestUnresponsive) | |
| 164 IPC_MESSAGE_HANDLER(BrowserPluginMsg_LoadAbort, OnLoadAbort) | |
| 165 IPC_MESSAGE_HANDLER(BrowserPluginMsg_LoadCommit, OnLoadCommit) | |
| 166 IPC_MESSAGE_HANDLER(BrowserPluginMsg_LoadRedirect, OnLoadRedirect) | |
| 167 IPC_MESSAGE_HANDLER(BrowserPluginMsg_LoadStart, OnLoadStart) | |
| 168 IPC_MESSAGE_HANDLER(BrowserPluginMsg_LoadStop, OnLoadStop) | |
| 169 IPC_MESSAGE_HANDLER(BrowserPluginMsg_ShouldAcceptTouchEvents, | |
| 170 OnShouldAcceptTouchEvents) | |
| 171 IPC_MESSAGE_HANDLER(BrowserPluginMsg_SetCursor, OnSetCursor) | |
| 172 IPC_MESSAGE_HANDLER(BrowserPluginMsg_UpdateRect, OnUpdateRect) | |
| 173 IPC_MESSAGE_UNHANDLED(handled = false) | |
| 174 IPC_END_MESSAGE_MAP() | |
| 175 return handled; | |
| 176 } | |
| 177 | |
| 178 void BrowserPlugin::UpdateDOMAttribute( | |
| 179 const std::string& attribute_name, | |
| 180 const std::string& attribute_value) { | |
| 181 if (!container()) | |
| 182 return; | |
| 183 | |
| 184 WebKit::WebElement element = container()->element(); | |
| 185 WebKit::WebString web_attribute_name = | |
| 186 WebKit::WebString::fromUTF8(attribute_name); | |
| 187 std::string current_value(element.getAttribute(web_attribute_name).utf8()); | |
| 188 if (current_value == attribute_value) | |
| 189 return; | |
| 190 | |
| 191 if (attribute_value.empty()) { | |
| 192 element.removeAttribute(web_attribute_name); | |
| 193 } else { | |
| 194 element.setAttribute(web_attribute_name, | |
| 195 WebKit::WebString::fromUTF8(attribute_value)); | |
| 196 } | |
| 197 } | |
| 198 | |
| 199 | |
| 155 bool BrowserPlugin::SetSrcAttribute(const std::string& src, | 200 bool BrowserPlugin::SetSrcAttribute(const std::string& src, |
| 156 std::string* error_message) { | 201 std::string* error_message) { |
| 157 if (!valid_partition_id_) { | 202 if (!valid_partition_id_) { |
| 158 *error_message = kErrorInvalidPartition; | 203 *error_message = kErrorInvalidPartition; |
| 159 return false; | 204 return false; |
| 160 } | 205 } |
| 161 | 206 |
| 162 if (src.empty() || (src == src_ && !guest_crashed_)) | 207 if (src.empty() || (src == src_ && !guest_crashed_)) |
| 163 return true; | 208 return true; |
| 164 | 209 |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 255 #else | 300 #else |
| 256 bool BrowserPlugin::DamageBufferMatches( | 301 bool BrowserPlugin::DamageBufferMatches( |
| 257 const TransportDIB* damage_buffer, | 302 const TransportDIB* damage_buffer, |
| 258 const TransportDIB::Handle& other_damage_buffer_handle) { | 303 const TransportDIB::Handle& other_damage_buffer_handle) { |
| 259 if (!damage_buffer) | 304 if (!damage_buffer) |
| 260 return false; | 305 return false; |
| 261 return damage_buffer->handle() == other_damage_buffer_handle; | 306 return damage_buffer->handle() == other_damage_buffer_handle; |
| 262 } | 307 } |
| 263 #endif | 308 #endif |
| 264 | 309 |
| 265 void BrowserPlugin::UpdateDOMAttribute( | 310 void BrowserPlugin::OnAdvanceFocus(int instance_id, bool reverse) { |
| 266 const std::string& attribute_name, | 311 DCHECK(render_view_); |
| 267 const std::string& attribute_value) { | 312 render_view_->GetWebView()->advanceFocus(reverse); |
| 268 if (!container()) | 313 } |
| 314 | |
| 315 void BrowserPlugin::OnGuestContentWindowReady(int instance_id, | |
| 316 int content_window_routing_id) { | |
| 317 DCHECK(content_window_routing_id != MSG_ROUTING_NONE); | |
| 318 content_window_routing_id_ = content_window_routing_id; | |
| 319 } | |
| 320 | |
| 321 void BrowserPlugin::OnGuestGone(int instance_id, int process_id, int status) { | |
| 322 // We fire the event listeners before painting the sad graphic to give the | |
| 323 // developer an opportunity to display an alternative overlay image on crash. | |
| 324 std::string termination_status = TerminationStatusToString( | |
| 325 static_cast<base::TerminationStatus>(status)); | |
| 326 std::map<std::string, base::Value*> props; | |
| 327 props[kProcessId] = base::Value::CreateIntegerValue(process_id); | |
| 328 props[kReason] = base::Value::CreateStringValue(termination_status); | |
| 329 | |
| 330 // Event listeners may remove the BrowserPlugin from the document. If that | |
| 331 // happens, the BrowserPlugin will be scheduled for later deletion (see | |
| 332 // BrowserPlugin::destroy()). That will clear the container_ reference, | |
| 333 // but leave other member variables valid below. | |
| 334 TriggerEvent(kEventExit, &props); | |
| 335 | |
| 336 guest_crashed_ = true; | |
| 337 // We won't paint the contents of the current backing store again so we might | |
| 338 // as well toss it out and save memory. | |
| 339 backing_store_.reset(); | |
| 340 // If the BrowserPlugin is scheduled to be deleted, then container_ will be | |
| 341 // NULL so we shouldn't attempt to access it. | |
| 342 if (container_) | |
| 343 container_->invalidate(); | |
| 344 } | |
| 345 | |
| 346 void BrowserPlugin::OnGuestResponsive(int instance_id, int process_id) { | |
| 347 std::map<std::string, base::Value*> props; | |
| 348 props[kProcessId] = base::Value::CreateIntegerValue(process_id); | |
| 349 TriggerEvent(kEventResponsive, &props); | |
| 350 } | |
| 351 | |
| 352 void BrowserPlugin::OnGuestUnresponsive(int instance_id, int process_id) { | |
| 353 std::map<std::string, base::Value*> props; | |
| 354 props[kProcessId] = base::Value::CreateIntegerValue(process_id); | |
| 355 TriggerEvent(kEventUnresponsive, &props); | |
| 356 } | |
| 357 | |
| 358 void BrowserPlugin::OnLoadAbort(int instance_id, | |
| 359 const GURL& url, | |
| 360 bool is_top_level, | |
| 361 const std::string& type) { | |
| 362 std::map<std::string, base::Value*> props; | |
| 363 props[kURL] = base::Value::CreateStringValue(url.spec()); | |
| 364 props[kIsTopLevel] = base::Value::CreateBooleanValue(is_top_level); | |
| 365 props[kReason] = base::Value::CreateStringValue(type); | |
| 366 TriggerEvent(kEventLoadAbort, &props); | |
| 367 } | |
| 368 | |
| 369 void BrowserPlugin::OnLoadCommit( | |
| 370 int instance_id, | |
| 371 const BrowserPluginMsg_LoadCommit_Params& params) { | |
| 372 // If the guest has just committed a new navigation then it is no longer | |
| 373 // crashed. | |
| 374 guest_crashed_ = false; | |
| 375 if (params.is_top_level) { | |
| 376 src_ = params.url.spec(); | |
| 377 UpdateDOMAttribute(kSrc, src_.c_str()); | |
| 378 } | |
| 379 process_id_ = params.process_id; | |
| 380 current_nav_entry_index_ = params.current_entry_index; | |
| 381 nav_entry_count_ = params.entry_count; | |
| 382 | |
| 383 std::map<std::string, base::Value*> props; | |
| 384 props[kURL] = base::Value::CreateStringValue(params.url.spec()); | |
| 385 props[kIsTopLevel] = base::Value::CreateBooleanValue(params.is_top_level); | |
| 386 TriggerEvent(kEventLoadCommit, &props); | |
| 387 } | |
| 388 | |
| 389 void BrowserPlugin::OnLoadRedirect(int instance_id, | |
| 390 const GURL& old_url, | |
| 391 const GURL& new_url, | |
| 392 bool is_top_level) { | |
| 393 std::map<std::string, base::Value*> props; | |
| 394 props[kOldURL] = base::Value::CreateStringValue(old_url.spec()); | |
| 395 props[kNewURL] = base::Value::CreateStringValue(new_url.spec()); | |
| 396 props[kIsTopLevel] = base::Value::CreateBooleanValue(is_top_level); | |
| 397 TriggerEvent(kEventLoadRedirect, &props); | |
| 398 } | |
| 399 | |
| 400 void BrowserPlugin::OnLoadStart(int instance_id, | |
| 401 const GURL& url, | |
| 402 bool is_top_level) { | |
| 403 std::map<std::string, base::Value*> props; | |
| 404 props[kURL] = base::Value::CreateStringValue(url.spec()); | |
| 405 props[kIsTopLevel] = base::Value::CreateBooleanValue(is_top_level); | |
| 406 | |
| 407 TriggerEvent(kEventLoadStart, &props); | |
| 408 } | |
| 409 | |
| 410 void BrowserPlugin::OnLoadStop(int instance_id) { | |
| 411 // Construct the loadStop event object. | |
|
sadrul
2012/12/14 16:08:39
This comment doesn't seem relevant anymore.
Fady Samuel
2012/12/14 17:05:54
Done.
| |
| 412 TriggerEvent(kEventLoadStop, NULL); | |
| 413 } | |
| 414 | |
| 415 void BrowserPlugin::OnSetCursor(int instance_id, const WebCursor& cursor) { | |
| 416 cursor_ = cursor; | |
| 417 } | |
| 418 | |
| 419 void BrowserPlugin::OnShouldAcceptTouchEvents(int instance_id, bool accept) { | |
| 420 if (container()) { | |
| 421 container()->requestTouchEventType(accept ? | |
| 422 WebKit::WebPluginContainer::TouchEventRequestTypeRaw : | |
| 423 WebKit::WebPluginContainer::TouchEventRequestTypeNone); | |
| 424 } | |
| 425 } | |
| 426 | |
| 427 void BrowserPlugin::OnUpdateRect( | |
| 428 int instance_id, | |
| 429 int message_id, | |
| 430 const BrowserPluginMsg_UpdateRect_Params& params) { | |
| 431 bool use_new_damage_buffer = !backing_store_; | |
| 432 BrowserPluginHostMsg_AutoSize_Params auto_size_params; | |
| 433 BrowserPluginHostMsg_ResizeGuest_Params resize_guest_params; | |
| 434 // If we have a pending damage buffer, and the guest has begun to use the | |
| 435 // damage buffer then we know the guest will no longer use the current | |
| 436 // damage buffer. At this point, we drop the current damage buffer, and | |
| 437 // mark the pending damage buffer as the current damage buffer. | |
| 438 if (DamageBufferMatches(pending_damage_buffer_, | |
| 439 params.damage_buffer_identifier)) { | |
| 440 SwapDamageBuffers(); | |
| 441 use_new_damage_buffer = true; | |
| 442 } | |
| 443 if ((!auto_size_ && | |
| 444 (width() != params.view_size.width() || | |
| 445 height() != params.view_size.height())) || | |
| 446 (auto_size_ && (!InAutoSizeBounds(params.view_size)))) { | |
| 447 if (pending_damage_buffer_) { | |
| 448 // The guest has not yet responded to the last resize request, and | |
| 449 // so we don't want to do anything at this point other than ACK the guest. | |
| 450 PopulateAutoSizeParameters(&auto_size_params); | |
| 451 } else { | |
| 452 // If we have no pending damage buffer, then the guest has not caught up | |
| 453 // with the BrowserPlugin container. We now tell the guest about the new | |
| 454 // container size. | |
| 455 pending_damage_buffer_ = | |
| 456 GetDamageBufferWithSizeParams(&auto_size_params, | |
| 457 &resize_guest_params); | |
| 458 } | |
| 459 browser_plugin_manager()->Send(new BrowserPluginHostMsg_UpdateRect_ACK( | |
| 460 render_view_routing_id_, | |
| 461 instance_id_, | |
| 462 message_id, | |
| 463 auto_size_params, | |
| 464 resize_guest_params)); | |
| 269 return; | 465 return; |
| 270 | 466 } |
| 271 WebKit::WebElement element = container()->element(); | 467 |
| 272 WebKit::WebString web_attribute_name = | 468 if (auto_size_ && (params.view_size != last_view_size_)) { |
| 273 WebKit::WebString::fromUTF8(attribute_name); | 469 if (backing_store_) |
| 274 std::string current_value(element.getAttribute(web_attribute_name).utf8()); | 470 backing_store_->Clear(SK_ColorWHITE); |
| 275 if (current_value == attribute_value) | 471 gfx::Size old_view_size = last_view_size_; |
| 276 return; | 472 last_view_size_ = params.view_size; |
| 277 | 473 // Schedule a SizeChanged instead of calling it directly to ensure that |
| 278 if (attribute_value.empty()) { | 474 // the backing store has been updated before the developer attempts to |
| 279 element.removeAttribute(web_attribute_name); | 475 // resize to avoid flicker. |size_changed_in_flight_| acts as a form of |
| 280 } else { | 476 // flow control for SizeChanged events. If the guest's view size is changing |
| 281 element.setAttribute(web_attribute_name, | 477 // rapidly before a SizeChanged event fires, then we avoid scheduling |
| 282 WebKit::WebString::fromUTF8(attribute_value)); | 478 // another SizeChanged event. SizeChanged reads the new size from |
| 283 } | 479 // |last_view_size_| so we can be sure that it always fires an event |
| 480 // with the last seen view size. | |
| 481 if (container_ && !size_changed_in_flight_) { | |
| 482 size_changed_in_flight_ = true; | |
| 483 MessageLoop::current()->PostTask( | |
| 484 FROM_HERE, | |
| 485 base::Bind(&BrowserPlugin::SizeChangedDueToAutoSize, | |
| 486 base::Unretained(this), | |
| 487 old_view_size)); | |
| 488 } | |
| 489 } | |
| 490 | |
| 491 // If we are now using a new damage buffer, then that means that the guest | |
| 492 // has updated its size state in response to a resize request. We change | |
| 493 // the backing store's size to accomodate the new damage buffer size. | |
| 494 if (use_new_damage_buffer) { | |
| 495 int backing_store_width = auto_size_ ? max_width_ : width(); | |
| 496 int backing_store_height = auto_size_ ? max_height_: height(); | |
| 497 backing_store_.reset( | |
| 498 new BrowserPluginBackingStore( | |
| 499 gfx::Size(backing_store_width, backing_store_height), | |
| 500 params.scale_factor)); | |
| 501 } | |
| 502 | |
| 503 // Update the backing store. | |
| 504 if (!params.scroll_rect.IsEmpty()) { | |
| 505 backing_store_->ScrollBackingStore(params.scroll_delta, | |
| 506 params.scroll_rect, | |
| 507 params.view_size); | |
| 508 } | |
| 509 for (unsigned i = 0; i < params.copy_rects.size(); i++) { | |
| 510 backing_store_->PaintToBackingStore(params.bitmap_rect, | |
| 511 params.copy_rects, | |
| 512 current_damage_buffer_); | |
| 513 } | |
| 514 // Invalidate the container. | |
| 515 // If the BrowserPlugin is scheduled to be deleted, then container_ will be | |
| 516 // NULL so we shouldn't attempt to access it. | |
| 517 if (container_) | |
| 518 container_->invalidate(); | |
| 519 PopulateAutoSizeParameters(&auto_size_params); | |
| 520 browser_plugin_manager()->Send(new BrowserPluginHostMsg_UpdateRect_ACK( | |
| 521 render_view_routing_id_, | |
| 522 instance_id_, | |
| 523 message_id, | |
| 524 auto_size_params, | |
| 525 resize_guest_params)); | |
| 284 } | 526 } |
| 285 | 527 |
| 286 void BrowserPlugin::SetMaxHeightAttribute(int max_height) { | 528 void BrowserPlugin::SetMaxHeightAttribute(int max_height) { |
| 287 if (max_height_ == max_height) | 529 if (max_height_ == max_height) |
| 288 return; | 530 return; |
| 289 max_height_ = max_height; | 531 max_height_ = max_height; |
| 290 if (!auto_size_) | 532 if (!auto_size_) |
| 291 return; | 533 return; |
| 292 UpdateGuestAutoSizeState(); | 534 UpdateGuestAutoSizeState(); |
| 293 } | 535 } |
| (...skipping 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 489 } | 731 } |
| 490 | 732 |
| 491 void BrowserPlugin::Reload() { | 733 void BrowserPlugin::Reload() { |
| 492 if (!navigate_src_sent_) | 734 if (!navigate_src_sent_) |
| 493 return; | 735 return; |
| 494 browser_plugin_manager()->Send( | 736 browser_plugin_manager()->Send( |
| 495 new BrowserPluginHostMsg_Reload(render_view_routing_id_, | 737 new BrowserPluginHostMsg_Reload(render_view_routing_id_, |
| 496 instance_id_)); | 738 instance_id_)); |
| 497 } | 739 } |
| 498 | 740 |
| 499 void BrowserPlugin::SetCursor(const WebCursor& cursor) { | |
| 500 cursor_ = cursor; | |
| 501 } | |
| 502 | |
| 503 void BrowserPlugin::UpdateRect( | |
| 504 int message_id, | |
| 505 const BrowserPluginMsg_UpdateRect_Params& params) { | |
| 506 bool use_new_damage_buffer = !backing_store_; | |
| 507 BrowserPluginHostMsg_AutoSize_Params auto_size_params; | |
| 508 BrowserPluginHostMsg_ResizeGuest_Params resize_guest_params; | |
| 509 // If we have a pending damage buffer, and the guest has begun to use the | |
| 510 // damage buffer then we know the guest will no longer use the current | |
| 511 // damage buffer. At this point, we drop the current damage buffer, and | |
| 512 // mark the pending damage buffer as the current damage buffer. | |
| 513 if (DamageBufferMatches(pending_damage_buffer_, | |
| 514 params.damage_buffer_identifier)) { | |
| 515 SwapDamageBuffers(); | |
| 516 use_new_damage_buffer = true; | |
| 517 } | |
| 518 if ((!auto_size_ && | |
| 519 (width() != params.view_size.width() || | |
| 520 height() != params.view_size.height())) || | |
| 521 (auto_size_ && (!InAutoSizeBounds(params.view_size)))) { | |
| 522 if (pending_damage_buffer_) { | |
| 523 // The guest has not yet responded to the last resize request, and | |
| 524 // so we don't want to do anything at this point other than ACK the guest. | |
| 525 PopulateAutoSizeParameters(&auto_size_params); | |
| 526 } else { | |
| 527 // If we have no pending damage buffer, then the guest has not caught up | |
| 528 // with the BrowserPlugin container. We now tell the guest about the new | |
| 529 // container size. | |
| 530 pending_damage_buffer_ = | |
| 531 GetDamageBufferWithSizeParams(&auto_size_params, | |
| 532 &resize_guest_params); | |
| 533 } | |
| 534 browser_plugin_manager()->Send(new BrowserPluginHostMsg_UpdateRect_ACK( | |
| 535 render_view_routing_id_, | |
| 536 instance_id_, | |
| 537 message_id, | |
| 538 auto_size_params, | |
| 539 resize_guest_params)); | |
| 540 return; | |
| 541 } | |
| 542 | |
| 543 if (auto_size_ && (params.view_size != last_view_size_)) { | |
| 544 if (backing_store_) | |
| 545 backing_store_->Clear(SK_ColorWHITE); | |
| 546 gfx::Size old_view_size = last_view_size_; | |
| 547 last_view_size_ = params.view_size; | |
| 548 // Schedule a SizeChanged instead of calling it directly to ensure that | |
| 549 // the backing store has been updated before the developer attempts to | |
| 550 // resize to avoid flicker. |size_changed_in_flight_| acts as a form of | |
| 551 // flow control for SizeChanged events. If the guest's view size is changing | |
| 552 // rapidly before a SizeChanged event fires, then we avoid scheduling | |
| 553 // another SizeChanged event. SizeChanged reads the new size from | |
| 554 // |last_view_size_| so we can be sure that it always fires an event | |
| 555 // with the last seen view size. | |
| 556 if (container_ && !size_changed_in_flight_) { | |
| 557 size_changed_in_flight_ = true; | |
| 558 MessageLoop::current()->PostTask( | |
| 559 FROM_HERE, | |
| 560 base::Bind(&BrowserPlugin::SizeChangedDueToAutoSize, | |
| 561 base::Unretained(this), | |
| 562 old_view_size)); | |
| 563 } | |
| 564 } | |
| 565 | |
| 566 // If we are now using a new damage buffer, then that means that the guest | |
| 567 // has updated its size state in response to a resize request. We change | |
| 568 // the backing store's size to accomodate the new damage buffer size. | |
| 569 if (use_new_damage_buffer) { | |
| 570 int backing_store_width = auto_size_ ? max_width_ : width(); | |
| 571 int backing_store_height = auto_size_ ? max_height_: height(); | |
| 572 backing_store_.reset( | |
| 573 new BrowserPluginBackingStore( | |
| 574 gfx::Size(backing_store_width, backing_store_height), | |
| 575 params.scale_factor)); | |
| 576 } | |
| 577 | |
| 578 // Update the backing store. | |
| 579 if (!params.scroll_rect.IsEmpty()) { | |
| 580 backing_store_->ScrollBackingStore(params.scroll_delta, | |
| 581 params.scroll_rect, | |
| 582 params.view_size); | |
| 583 } | |
| 584 for (unsigned i = 0; i < params.copy_rects.size(); i++) { | |
| 585 backing_store_->PaintToBackingStore(params.bitmap_rect, | |
| 586 params.copy_rects, | |
| 587 current_damage_buffer_); | |
| 588 } | |
| 589 // Invalidate the container. | |
| 590 // If the BrowserPlugin is scheduled to be deleted, then container_ will be | |
| 591 // NULL so we shouldn't attempt to access it. | |
| 592 if (container_) | |
| 593 container_->invalidate(); | |
| 594 PopulateAutoSizeParameters(&auto_size_params); | |
| 595 browser_plugin_manager()->Send(new BrowserPluginHostMsg_UpdateRect_ACK( | |
| 596 render_view_routing_id_, | |
| 597 instance_id_, | |
| 598 message_id, | |
| 599 auto_size_params, | |
| 600 resize_guest_params)); | |
| 601 } | |
| 602 | |
| 603 void BrowserPlugin::GuestGone(int process_id, base::TerminationStatus status) { | |
| 604 // We fire the event listeners before painting the sad graphic to give the | |
| 605 // developer an opportunity to display an alternative overlay image on crash. | |
| 606 std::string termination_status = TerminationStatusToString(status); | |
| 607 std::map<std::string, base::Value*> props; | |
| 608 props[kProcessId] = base::Value::CreateIntegerValue(process_id); | |
| 609 props[kReason] = base::Value::CreateStringValue(termination_status); | |
| 610 | |
| 611 // Event listeners may remove the BrowserPlugin from the document. If that | |
| 612 // happens, the BrowserPlugin will be scheduled for later deletion (see | |
| 613 // BrowserPlugin::destroy()). That will clear the container_ reference, | |
| 614 // but leave other member variables valid below. | |
| 615 TriggerEvent(kEventExit, &props); | |
| 616 | |
| 617 guest_crashed_ = true; | |
| 618 // We won't paint the contents of the current backing store again so we might | |
| 619 // as well toss it out and save memory. | |
| 620 backing_store_.reset(); | |
| 621 // If the BrowserPlugin is scheduled to be deleted, then container_ will be | |
| 622 // NULL so we shouldn't attempt to access it. | |
| 623 if (container_) | |
| 624 container_->invalidate(); | |
| 625 } | |
| 626 | |
| 627 void BrowserPlugin::GuestUnresponsive(int process_id) { | |
| 628 std::map<std::string, base::Value*> props; | |
| 629 props[kProcessId] = base::Value::CreateIntegerValue(process_id); | |
| 630 TriggerEvent(kEventUnresponsive, &props); | |
| 631 } | |
| 632 | |
| 633 void BrowserPlugin::GuestResponsive(int process_id) { | |
| 634 std::map<std::string, base::Value*> props; | |
| 635 props[kProcessId] = base::Value::CreateIntegerValue(process_id); | |
| 636 TriggerEvent(kEventResponsive, &props); | |
| 637 } | |
| 638 | |
| 639 void BrowserPlugin::LoadStart(const GURL& url, bool is_top_level) { | |
| 640 std::map<std::string, base::Value*> props; | |
| 641 props[kURL] = base::Value::CreateStringValue(url.spec()); | |
| 642 props[kIsTopLevel] = base::Value::CreateBooleanValue(is_top_level); | |
| 643 | |
| 644 TriggerEvent(kEventLoadStart, &props); | |
| 645 } | |
| 646 | |
| 647 void BrowserPlugin::LoadCommit( | |
| 648 const BrowserPluginMsg_LoadCommit_Params& params) { | |
| 649 // If the guest has just committed a new navigation then it is no longer | |
| 650 // crashed. | |
| 651 guest_crashed_ = false; | |
| 652 if (params.is_top_level) { | |
| 653 src_ = params.url.spec(); | |
| 654 UpdateDOMAttribute(kSrc, src_.c_str()); | |
| 655 } | |
| 656 process_id_ = params.process_id; | |
| 657 current_nav_entry_index_ = params.current_entry_index; | |
| 658 nav_entry_count_ = params.entry_count; | |
| 659 | |
| 660 std::map<std::string, base::Value*> props; | |
| 661 props[kURL] = base::Value::CreateStringValue(params.url.spec()); | |
| 662 props[kIsTopLevel] = base::Value::CreateBooleanValue(params.is_top_level); | |
| 663 TriggerEvent(kEventLoadCommit, &props); | |
| 664 } | |
| 665 | |
| 666 void BrowserPlugin::LoadStop() { | |
| 667 // Construct the loadStop event object. | |
| 668 TriggerEvent(kEventLoadStop, NULL); | |
| 669 } | |
| 670 | |
| 671 void BrowserPlugin::LoadAbort(const GURL& url, | |
| 672 bool is_top_level, | |
| 673 const std::string& type) { | |
| 674 std::map<std::string, base::Value*> props; | |
| 675 props[kURL] = base::Value::CreateStringValue(url.spec()); | |
| 676 props[kIsTopLevel] = base::Value::CreateBooleanValue(is_top_level); | |
| 677 props[kReason] = base::Value::CreateStringValue(type); | |
| 678 TriggerEvent(kEventLoadAbort, &props); | |
| 679 } | |
| 680 | |
| 681 void BrowserPlugin::LoadRedirect(const GURL& old_url, | |
| 682 const GURL& new_url, | |
| 683 bool is_top_level) { | |
| 684 std::map<std::string, base::Value*> props; | |
| 685 props[kOldURL] = base::Value::CreateStringValue(old_url.spec()); | |
| 686 props[kNewURL] = base::Value::CreateStringValue(new_url.spec()); | |
| 687 props[kIsTopLevel] = base::Value::CreateBooleanValue(is_top_level); | |
| 688 TriggerEvent(kEventLoadRedirect, &props); | |
| 689 } | |
| 690 | |
| 691 void BrowserPlugin::AdvanceFocus(bool reverse) { | |
| 692 DCHECK(render_view_); | |
| 693 render_view_->GetWebView()->advanceFocus(reverse); | |
| 694 } | |
| 695 | |
| 696 void BrowserPlugin::SetEmbedderFocus(bool focused) { | 741 void BrowserPlugin::SetEmbedderFocus(bool focused) { |
| 697 if (embedder_focused_ == focused) | 742 if (embedder_focused_ == focused) |
| 698 return; | 743 return; |
| 699 | 744 |
| 700 bool old_guest_focus_state = ShouldGuestBeFocused(); | 745 bool old_guest_focus_state = ShouldGuestBeFocused(); |
| 701 embedder_focused_ = focused; | 746 embedder_focused_ = focused; |
| 702 | 747 |
| 703 if (ShouldGuestBeFocused() != old_guest_focus_state) | 748 if (ShouldGuestBeFocused() != old_guest_focus_state) |
| 704 UpdateGuestFocusState(); | 749 UpdateGuestFocusState(); |
| 705 } | 750 } |
| 706 | 751 |
| 707 void BrowserPlugin::UpdateGuestFocusState() { | 752 void BrowserPlugin::UpdateGuestFocusState() { |
| 708 if (!navigate_src_sent_) | 753 if (!navigate_src_sent_) |
| 709 return; | 754 return; |
| 710 bool should_be_focused = ShouldGuestBeFocused(); | 755 bool should_be_focused = ShouldGuestBeFocused(); |
| 711 browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetFocus( | 756 browser_plugin_manager()->Send(new BrowserPluginHostMsg_SetFocus( |
| 712 render_view_routing_id_, | 757 render_view_routing_id_, |
| 713 instance_id_, | 758 instance_id_, |
| 714 should_be_focused)); | 759 should_be_focused)); |
| 715 } | 760 } |
| 716 | 761 |
| 717 bool BrowserPlugin::ShouldGuestBeFocused() const { | 762 bool BrowserPlugin::ShouldGuestBeFocused() const { |
| 718 return plugin_focused_ && embedder_focused_; | 763 return plugin_focused_ && embedder_focused_; |
| 719 } | 764 } |
| 720 | 765 |
| 721 void BrowserPlugin::GuestContentWindowReady(int content_window_routing_id) { | |
| 722 DCHECK(content_window_routing_id != MSG_ROUTING_NONE); | |
| 723 content_window_routing_id_ = content_window_routing_id; | |
| 724 } | |
| 725 | |
| 726 void BrowserPlugin::SetAcceptTouchEvents(bool accept) { | |
| 727 if (container()) { | |
| 728 container()->requestTouchEventType(accept ? | |
| 729 WebKit::WebPluginContainer::TouchEventRequestTypeRaw : | |
| 730 WebKit::WebPluginContainer::TouchEventRequestTypeNone); | |
| 731 } | |
| 732 } | |
| 733 | |
| 734 WebKit::WebPluginContainer* BrowserPlugin::container() const { | 766 WebKit::WebPluginContainer* BrowserPlugin::container() const { |
| 735 return container_; | 767 return container_; |
| 736 } | 768 } |
| 737 | 769 |
| 738 bool BrowserPlugin::initialize(WebPluginContainer* container) { | 770 bool BrowserPlugin::initialize(WebPluginContainer* container) { |
| 739 container_ = container; | 771 container_ = container; |
| 740 container_->setWantsWheelEvents(true); | 772 container_->setWantsWheelEvents(true); |
| 741 return true; | 773 return true; |
| 742 } | 774 } |
| 743 | 775 |
| (...skipping 272 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1016 void* notify_data) { | 1048 void* notify_data) { |
| 1017 } | 1049 } |
| 1018 | 1050 |
| 1019 void BrowserPlugin::didFailLoadingFrameRequest( | 1051 void BrowserPlugin::didFailLoadingFrameRequest( |
| 1020 const WebKit::WebURL& url, | 1052 const WebKit::WebURL& url, |
| 1021 void* notify_data, | 1053 void* notify_data, |
| 1022 const WebKit::WebURLError& error) { | 1054 const WebKit::WebURLError& error) { |
| 1023 } | 1055 } |
| 1024 | 1056 |
| 1025 } // namespace content | 1057 } // namespace content |
| OLD | NEW |