OLD | NEW |
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 "webkit/plugins/ppapi/ppapi_plugin_instance.h" | 5 #include "webkit/plugins/ppapi/ppapi_plugin_instance.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/memory/scoped_ptr.h" | 8 #include "base/memory/scoped_ptr.h" |
9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
10 #include "base/metrics/histogram.h" | 10 #include "base/metrics/histogram.h" |
(...skipping 221 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 plugin_pdf_interface_(NULL), | 232 plugin_pdf_interface_(NULL), |
233 plugin_policy_updated_interface_(NULL), | 233 plugin_policy_updated_interface_(NULL), |
234 plugin_selection_interface_(NULL), | 234 plugin_selection_interface_(NULL), |
235 plugin_zoom_interface_(NULL), | 235 plugin_zoom_interface_(NULL), |
236 checked_for_plugin_input_event_interface_(false), | 236 checked_for_plugin_input_event_interface_(false), |
237 checked_for_plugin_messaging_interface_(false), | 237 checked_for_plugin_messaging_interface_(false), |
238 plugin_print_interface_(NULL), | 238 plugin_print_interface_(NULL), |
239 plugin_graphics_3d_interface_(NULL), | 239 plugin_graphics_3d_interface_(NULL), |
240 always_on_top_(false), | 240 always_on_top_(false), |
241 fullscreen_container_(NULL), | 241 fullscreen_container_(NULL), |
| 242 flash_fullscreen_(false), |
| 243 desired_fullscreen_state_(false), |
242 fullscreen_(false), | 244 fullscreen_(false), |
243 message_channel_(NULL), | 245 message_channel_(NULL), |
244 sad_plugin_(NULL), | 246 sad_plugin_(NULL), |
245 input_event_mask_(0), | 247 input_event_mask_(0), |
246 filtered_input_event_mask_(0), | 248 filtered_input_event_mask_(0), |
247 lock_mouse_callback_(PP_BlockUntilComplete()) { | 249 lock_mouse_callback_(PP_BlockUntilComplete()) { |
248 pp_instance_ = ResourceTracker::Get()->AddInstance(this); | 250 pp_instance_ = ResourceTracker::Get()->AddInstance(this); |
249 | 251 |
250 memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); | 252 memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); |
251 DCHECK(delegate); | 253 DCHECK(delegate); |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
354 else if (container_) | 356 else if (container_) |
355 container_->commitBackingTexture(); | 357 container_->commitBackingTexture(); |
356 } | 358 } |
357 | 359 |
358 void PluginInstance::InstanceCrashed() { | 360 void PluginInstance::InstanceCrashed() { |
359 // Force free all resources and vars. | 361 // Force free all resources and vars. |
360 ResourceTracker::Get()->InstanceCrashed(pp_instance()); | 362 ResourceTracker::Get()->InstanceCrashed(pp_instance()); |
361 | 363 |
362 // Free any associated graphics. | 364 // Free any associated graphics. |
363 SetFullscreen(false, false); | 365 SetFullscreen(false, false); |
| 366 FlashSetFullscreen(false, false); |
364 bound_graphics_ = NULL; | 367 bound_graphics_ = NULL; |
365 InvalidateRect(gfx::Rect()); | 368 InvalidateRect(gfx::Rect()); |
366 | 369 |
367 delegate()->PluginCrashed(this); | 370 delegate()->PluginCrashed(this); |
368 } | 371 } |
369 | 372 |
370 bool PluginInstance::SetCursor(PP_CursorType_Dev type, | 373 bool PluginInstance::SetCursor(PP_CursorType_Dev type, |
371 PP_Resource custom_image, | 374 PP_Resource custom_image, |
372 const PP_Point* hot_spot) { | 375 const PP_Point* hot_spot) { |
373 if (type != PP_CURSORTYPE_CUSTOM) { | 376 if (type != PP_CURSORTYPE_CUSTOM) { |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
526 if (!clip.IsEmpty()) | 529 if (!clip.IsEmpty()) |
527 new_clip = clip; | 530 new_clip = clip; |
528 | 531 |
529 // Don't notify the plugin if we've already sent these same params before. | 532 // Don't notify the plugin if we've already sent these same params before. |
530 if (sent_did_change_view_ && position == position_ && new_clip == clip_) | 533 if (sent_did_change_view_ && position == position_ && new_clip == clip_) |
531 return; | 534 return; |
532 | 535 |
533 sent_did_change_view_ = true; | 536 sent_did_change_view_ = true; |
534 position_ = position; | 537 position_ = position; |
535 clip_ = new_clip; | 538 clip_ = new_clip; |
536 fullscreen_ = (fullscreen_container_ != NULL); | 539 fullscreen_ = desired_fullscreen_state_; |
| 540 flash_fullscreen_ = (fullscreen_container_ != NULL); |
537 | 541 |
538 PP_Rect pp_position, pp_clip; | 542 PP_Rect pp_position, pp_clip; |
539 RectToPPRect(position_, &pp_position); | 543 RectToPPRect(position_, &pp_position); |
540 RectToPPRect(clip_, &pp_clip); | 544 RectToPPRect(clip_, &pp_clip); |
541 instance_interface_->DidChangeView(pp_instance(), &pp_position, &pp_clip); | 545 instance_interface_->DidChangeView(pp_instance(), &pp_position, &pp_clip); |
542 } | 546 } |
543 | 547 |
544 void PluginInstance::SetWebKitFocus(bool has_focus) { | 548 void PluginInstance::SetWebKitFocus(bool has_focus) { |
545 if (has_webkit_focus_ == has_focus) | 549 if (has_webkit_focus_ == has_focus) |
546 return; | 550 return; |
(...skipping 242 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
789 } | 793 } |
790 | 794 |
791 bool PluginInstance::PluginHasFocus() const { | 795 bool PluginInstance::PluginHasFocus() const { |
792 return has_webkit_focus_ && has_content_area_focus_; | 796 return has_webkit_focus_ && has_content_area_focus_; |
793 } | 797 } |
794 | 798 |
795 void PluginInstance::ReportGeometry() { | 799 void PluginInstance::ReportGeometry() { |
796 // If this call was delayed, we may have transitioned back to fullscreen in | 800 // If this call was delayed, we may have transitioned back to fullscreen in |
797 // the mean time, so only report the geometry if we are actually in normal | 801 // the mean time, so only report the geometry if we are actually in normal |
798 // mode. | 802 // mode. |
799 if (container_ && !fullscreen_container_) | 803 if (container_ && !fullscreen_container_ && !flash_fullscreen_) |
800 container_->reportGeometry(); | 804 container_->reportGeometry(); |
801 } | 805 } |
802 | 806 |
803 bool PluginInstance::GetPreferredPrintOutputFormat( | 807 bool PluginInstance::GetPreferredPrintOutputFormat( |
804 PP_PrintOutputFormat_Dev* format) { | 808 PP_PrintOutputFormat_Dev* format) { |
805 // Keep a reference on the stack. See NOTE above. | 809 // Keep a reference on the stack. See NOTE above. |
806 scoped_refptr<PluginInstance> ref(this); | 810 scoped_refptr<PluginInstance> ref(this); |
807 if (!LoadPrintInterface()) | 811 if (!LoadPrintInterface()) |
808 return false; | 812 return false; |
809 uint32_t supported_formats = | 813 uint32_t supported_formats = |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
907 DCHECK(plugin_print_interface_); | 911 DCHECK(plugin_print_interface_); |
908 if (plugin_print_interface_) | 912 if (plugin_print_interface_) |
909 plugin_print_interface_->End(pp_instance()); | 913 plugin_print_interface_->End(pp_instance()); |
910 | 914 |
911 memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); | 915 memset(¤t_print_settings_, 0, sizeof(current_print_settings_)); |
912 #if defined(OS_MACOSX) | 916 #if defined(OS_MACOSX) |
913 last_printed_page_ = NULL; | 917 last_printed_page_ = NULL; |
914 #endif // defined(OS_MACOSX) | 918 #endif // defined(OS_MACOSX) |
915 } | 919 } |
916 | 920 |
| 921 bool PluginInstance::FlashIsFullscreenOrPending() { |
| 922 return fullscreen_container_ != NULL; |
| 923 } |
| 924 |
917 bool PluginInstance::IsFullscreenOrPending() { | 925 bool PluginInstance::IsFullscreenOrPending() { |
918 return fullscreen_container_ != NULL; | 926 return desired_fullscreen_state_; |
919 } | 927 } |
920 | 928 |
921 void PluginInstance::SetFullscreen(bool fullscreen, bool delay_report) { | 929 void PluginInstance::SetFullscreen(bool fullscreen, bool delay_report) { |
922 // Keep a reference on the stack. See NOTE above. | 930 // Keep a reference on the stack. See NOTE above. |
923 scoped_refptr<PluginInstance> ref(this); | 931 scoped_refptr<PluginInstance> ref(this); |
924 | 932 |
925 // We check whether we are trying to switch to the state we're already going | 933 // We check whether we are trying to switch to the state we're already going |
926 // to (i.e. if we're already switching to fullscreen but the fullscreen | 934 // to (i.e. if we're already switching to fullscreen but the fullscreen |
927 // container isn't ready yet, don't do anything more). | 935 // container isn't ready yet, don't do anything more). |
928 if (fullscreen == IsFullscreenOrPending()) | 936 if (fullscreen == IsFullscreenOrPending()) |
929 return; | 937 return; |
930 | 938 |
| 939 // Unbind current 2D or 3D graphics context. |
| 940 BindGraphics(pp_instance(), 0); |
| 941 |
| 942 VLOG(1) << "Setting fullscreen to " << (fullscreen ? "on" : "off"); |
| 943 desired_fullscreen_state_ = fullscreen; |
| 944 if (fullscreen) |
| 945 container_->element().requestFullScreen(); |
| 946 else |
| 947 container_->element().document().cancelFullScreen(); |
| 948 if (!delay_report) { |
| 949 ReportGeometry(); |
| 950 } else { |
| 951 MessageLoop::current()->PostTask( |
| 952 FROM_HERE, NewRunnableMethod(this, &PluginInstance::ReportGeometry)); |
| 953 } |
| 954 } |
| 955 |
| 956 void PluginInstance::FlashSetFullscreen(bool fullscreen, bool delay_report) { |
| 957 // Keep a reference on the stack. See NOTE above. |
| 958 scoped_refptr<PluginInstance> ref(this); |
| 959 |
| 960 // We check whether we are trying to switch to the state we're already going |
| 961 // to (i.e. if we're already switching to fullscreen but the fullscreen |
| 962 // container isn't ready yet, don't do anything more). |
| 963 if (fullscreen == FlashIsFullscreenOrPending()) |
| 964 return; |
| 965 |
| 966 // Unbind current 2D or 3D graphics context. |
931 BindGraphics(pp_instance(), 0); | 967 BindGraphics(pp_instance(), 0); |
932 VLOG(1) << "Setting fullscreen to " << (fullscreen ? "on" : "off"); | 968 VLOG(1) << "Setting fullscreen to " << (fullscreen ? "on" : "off"); |
933 if (fullscreen) { | 969 if (fullscreen) { |
934 DCHECK(!fullscreen_container_); | 970 DCHECK(!fullscreen_container_); |
935 fullscreen_container_ = delegate_->CreateFullscreenContainer(this); | 971 fullscreen_container_ = delegate_->CreateFullscreenContainer(this); |
936 } else { | 972 } else { |
937 DCHECK(fullscreen_container_); | 973 DCHECK(fullscreen_container_); |
938 fullscreen_container_->Destroy(); | 974 fullscreen_container_->Destroy(); |
939 fullscreen_container_ = NULL; | 975 fullscreen_container_ = NULL; |
940 fullscreen_ = false; | 976 flash_fullscreen_ = false; |
941 if (!delay_report) { | 977 if (!delay_report) { |
942 ReportGeometry(); | 978 ReportGeometry(); |
943 } else { | 979 } else { |
944 MessageLoop::current()->PostTask( | 980 MessageLoop::current()->PostTask( |
945 FROM_HERE, NewRunnableMethod(this, &PluginInstance::ReportGeometry)); | 981 FROM_HERE, NewRunnableMethod(this, &PluginInstance::ReportGeometry)); |
946 } | 982 } |
947 } | 983 } |
948 } | 984 } |
949 | 985 |
950 int32_t PluginInstance::Navigate(PPB_URLRequestInfo_Impl* request, | 986 int32_t PluginInstance::Navigate(PPB_URLRequestInfo_Impl* request, |
(...skipping 305 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1256 PPB_Surface3D_Impl* PluginInstance::GetBoundSurface3D() const { | 1292 PPB_Surface3D_Impl* PluginInstance::GetBoundSurface3D() const { |
1257 if (bound_graphics_.get() == NULL) | 1293 if (bound_graphics_.get() == NULL) |
1258 return NULL; | 1294 return NULL; |
1259 | 1295 |
1260 if (bound_graphics_->AsPPB_Surface3D_API()) | 1296 if (bound_graphics_->AsPPB_Surface3D_API()) |
1261 return static_cast<PPB_Surface3D_Impl*>(bound_graphics_.get()); | 1297 return static_cast<PPB_Surface3D_Impl*>(bound_graphics_.get()); |
1262 return NULL; | 1298 return NULL; |
1263 } | 1299 } |
1264 | 1300 |
1265 void PluginInstance::setBackingTextureId(unsigned int id) { | 1301 void PluginInstance::setBackingTextureId(unsigned int id) { |
1266 // If we have a full-screen container_ then the plugin is fullscreen, | 1302 // If we have a fullscreen_container_ (under PPB_FlashFullscreen) |
1267 // and the parent context is not the one for the browser page, but for the | 1303 // or desired_fullscreen_state is true (under PPB_Fullscreen_Dev), |
1268 // full-screen window, and so the parent texture ID doesn't correspond to | 1304 // then the plugin is fullscreen or transitioning to fullscreen |
1269 // anything in the page's context. | 1305 // and the parent context is not the one for the browser page, |
| 1306 // but for the fullscreen window, and so the parent texture ID |
| 1307 // doesn't correspond to anything in the page's context. |
1270 // | 1308 // |
1271 // TODO(alokp): It would be better at some point to have the equivalent | 1309 // TODO(alokp): It would be better at some point to have the equivalent |
1272 // in the FullscreenContainer so that we don't need to poll | 1310 // in the FullscreenContainer so that we don't need to poll |
1273 if (fullscreen_container_) | 1311 if (fullscreen_container_ || desired_fullscreen_state_) |
1274 return; | 1312 return; |
1275 | 1313 |
1276 if (container_) | 1314 if (container_) |
1277 container_->setBackingTextureId(id); | 1315 container_->setBackingTextureId(id); |
1278 } | 1316 } |
1279 | 1317 |
1280 void PluginInstance::AddPluginObject(PluginObject* plugin_object) { | 1318 void PluginInstance::AddPluginObject(PluginObject* plugin_object) { |
1281 DCHECK(live_plugin_objects_.find(plugin_object) == | 1319 DCHECK(live_plugin_objects_.find(plugin_object) == |
1282 live_plugin_objects_.end()); | 1320 live_plugin_objects_.end()); |
1283 live_plugin_objects_.insert(plugin_object); | 1321 live_plugin_objects_.insert(plugin_object); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1325 bound_graphics_ = NULL; | 1363 bound_graphics_ = NULL; |
1326 } | 1364 } |
1327 | 1365 |
1328 // Special-case clearing the current device. | 1366 // Special-case clearing the current device. |
1329 if (!device) { | 1367 if (!device) { |
1330 setBackingTextureId(0); | 1368 setBackingTextureId(0); |
1331 InvalidateRect(gfx::Rect()); | 1369 InvalidateRect(gfx::Rect()); |
1332 return PP_TRUE; | 1370 return PP_TRUE; |
1333 } | 1371 } |
1334 | 1372 |
1335 // Refuse to bind if we're transitioning to fullscreen. | 1373 // Refuse to bind if in transition to fullscreen with PPB_FlashFullscreen or |
1336 if (fullscreen_container_ && !fullscreen_) | 1374 // to/from fullscreen with PPB_Fullscreen_Dev. |
| 1375 if ((fullscreen_container_ && !flash_fullscreen_) || |
| 1376 desired_fullscreen_state_ != fullscreen_) |
1337 return PP_FALSE; | 1377 return PP_FALSE; |
1338 | 1378 |
1339 EnterResourceNoLock<PPB_Graphics2D_API> enter_2d(device, false); | 1379 EnterResourceNoLock<PPB_Graphics2D_API> enter_2d(device, false); |
1340 PPB_Graphics2D_Impl* graphics_2d = enter_2d.succeeded() ? | 1380 PPB_Graphics2D_Impl* graphics_2d = enter_2d.succeeded() ? |
1341 static_cast<PPB_Graphics2D_Impl*>(enter_2d.object()) : NULL; | 1381 static_cast<PPB_Graphics2D_Impl*>(enter_2d.object()) : NULL; |
1342 EnterResourceNoLock<PPB_Graphics3D_API> enter_3d(device, false); | 1382 EnterResourceNoLock<PPB_Graphics3D_API> enter_3d(device, false); |
1343 PPB_Graphics3D_Impl* graphics_3d = enter_3d.succeeded() ? | 1383 PPB_Graphics3D_Impl* graphics_3d = enter_3d.succeeded() ? |
1344 static_cast<PPB_Graphics3D_Impl*>(enter_3d.object()) : NULL; | 1384 static_cast<PPB_Graphics3D_Impl*>(enter_3d.object()) : NULL; |
1345 EnterResourceNoLock<PPB_Surface3D_API> enter_surface_3d(device, false); | 1385 EnterResourceNoLock<PPB_Surface3D_API> enter_surface_3d(device, false); |
1346 PPB_Surface3D_Impl* surface_3d = enter_surface_3d.succeeded() ? | 1386 PPB_Surface3D_Impl* surface_3d = enter_surface_3d.succeeded() ? |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1498 delegate_->NumberOfFindResultsChanged(find_identifier_, total, | 1538 delegate_->NumberOfFindResultsChanged(find_identifier_, total, |
1499 PP_ToBool(final_result)); | 1539 PP_ToBool(final_result)); |
1500 } | 1540 } |
1501 | 1541 |
1502 void PluginInstance::SelectedFindResultChanged(PP_Instance instance, | 1542 void PluginInstance::SelectedFindResultChanged(PP_Instance instance, |
1503 int32_t index) { | 1543 int32_t index) { |
1504 DCHECK_NE(find_identifier_, -1); | 1544 DCHECK_NE(find_identifier_, -1); |
1505 delegate_->SelectedFindResultChanged(find_identifier_, index); | 1545 delegate_->SelectedFindResultChanged(find_identifier_, index); |
1506 } | 1546 } |
1507 | 1547 |
| 1548 PP_Bool PluginInstance::IsFullscreen(PP_Instance instance) { |
| 1549 return PP_FromBool(fullscreen_); |
| 1550 } |
| 1551 |
1508 PP_Bool PluginInstance::FlashIsFullscreen(PP_Instance instance) { | 1552 PP_Bool PluginInstance::FlashIsFullscreen(PP_Instance instance) { |
1509 return PP_FromBool(fullscreen_); | 1553 return PP_FromBool(flash_fullscreen_); |
| 1554 } |
| 1555 |
| 1556 PP_Bool PluginInstance::SetFullscreen(PP_Instance instance, |
| 1557 PP_Bool fullscreen) { |
| 1558 SetFullscreen(PP_ToBool(fullscreen), true); |
| 1559 return PP_TRUE; |
1510 } | 1560 } |
1511 | 1561 |
1512 PP_Bool PluginInstance::FlashSetFullscreen(PP_Instance instance, | 1562 PP_Bool PluginInstance::FlashSetFullscreen(PP_Instance instance, |
1513 PP_Bool fullscreen) { | 1563 PP_Bool fullscreen) { |
1514 SetFullscreen(PP_ToBool(fullscreen), true); | 1564 FlashSetFullscreen(PP_ToBool(fullscreen), true); |
| 1565 return PP_TRUE; |
| 1566 } |
| 1567 |
| 1568 PP_Bool PluginInstance::GetScreenSize(PP_Instance instance, PP_Size* size) { |
| 1569 gfx::Size screen_size = delegate()->GetScreenSize(); |
| 1570 *size = PP_MakeSize(screen_size.width(), screen_size.height()); |
1515 return PP_TRUE; | 1571 return PP_TRUE; |
1516 } | 1572 } |
1517 | 1573 |
1518 PP_Bool PluginInstance::FlashGetScreenSize(PP_Instance instance, | 1574 PP_Bool PluginInstance::FlashGetScreenSize(PP_Instance instance, |
1519 PP_Size* size) { | 1575 PP_Size* size) { |
1520 gfx::Size screen_size = delegate()->GetScreenSize(); | 1576 return GetScreenSize(instance, size); |
1521 *size = PP_MakeSize(screen_size.width(), screen_size.height()); | |
1522 return PP_TRUE; | |
1523 } | 1577 } |
1524 | 1578 |
1525 int32_t PluginInstance::RequestInputEvents(PP_Instance instance, | 1579 int32_t PluginInstance::RequestInputEvents(PP_Instance instance, |
1526 uint32_t event_classes) { | 1580 uint32_t event_classes) { |
1527 input_event_mask_ |= event_classes; | 1581 input_event_mask_ |= event_classes; |
1528 filtered_input_event_mask_ &= ~(event_classes); | 1582 filtered_input_event_mask_ &= ~(event_classes); |
1529 return ValidateRequestInputEvents(false, event_classes); | 1583 return ValidateRequestInputEvents(false, event_classes); |
1530 } | 1584 } |
1531 | 1585 |
1532 int32_t PluginInstance::RequestFilteringInputEvents(PP_Instance instance, | 1586 int32_t PluginInstance::RequestFilteringInputEvents(PP_Instance instance, |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1600 } | 1654 } |
1601 | 1655 |
1602 void PluginInstance::DoSetCursor(WebCursorInfo* cursor) { | 1656 void PluginInstance::DoSetCursor(WebCursorInfo* cursor) { |
1603 cursor_.reset(cursor); | 1657 cursor_.reset(cursor); |
1604 if (fullscreen_container_) | 1658 if (fullscreen_container_) |
1605 fullscreen_container_->DidChangeCursor(*cursor); | 1659 fullscreen_container_->DidChangeCursor(*cursor); |
1606 } | 1660 } |
1607 | 1661 |
1608 } // namespace ppapi | 1662 } // namespace ppapi |
1609 } // namespace webkit | 1663 } // namespace webkit |
OLD | NEW |