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

Side by Side Diff: webkit/plugins/npapi/webplugin_delegate_impl_win.cc

Issue 7054068: Make sandboxed Flash work under UIPI (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src/
Patch Set: '' Created 9 years, 6 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 | « webkit/plugins/npapi/webplugin_delegate_impl.h ('k') | webkit/plugins/npapi/webplugin_impl.h » ('j') | 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 "webkit/plugins/npapi/webplugin_delegate_impl.h" 5 #include "webkit/plugins/npapi/webplugin_delegate_impl.h"
6 6
7 #include <map> 7 #include <map>
8 #include <string> 8 #include <string>
9 #include <vector> 9 #include <vector>
10 10
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
267 windowless_(false), 267 windowless_(false),
268 windowed_handle_(NULL), 268 windowed_handle_(NULL),
269 windowed_did_set_window_(false), 269 windowed_did_set_window_(false),
270 plugin_wnd_proc_(NULL), 270 plugin_wnd_proc_(NULL),
271 last_message_(0), 271 last_message_(0),
272 is_calling_wndproc(false), 272 is_calling_wndproc(false),
273 dummy_window_for_activation_(NULL), 273 dummy_window_for_activation_(NULL),
274 handle_event_message_filter_hook_(NULL), 274 handle_event_message_filter_hook_(NULL),
275 handle_event_pump_messages_event_(NULL), 275 handle_event_pump_messages_event_(NULL),
276 user_gesture_message_posted_(false), 276 user_gesture_message_posted_(false),
277 is_builtin_flash_(false),
277 #pragma warning(suppress: 4355) // can use this 278 #pragma warning(suppress: 4355) // can use this
278 user_gesture_msg_factory_(this), 279 user_gesture_msg_factory_(this),
279 handle_event_depth_(0), 280 handle_event_depth_(0),
280 mouse_hook_(NULL), 281 mouse_hook_(NULL),
281 first_set_window_call_(true), 282 first_set_window_call_(true),
282 plugin_has_focus_(false), 283 plugin_has_focus_(false),
283 has_webkit_focus_(false), 284 has_webkit_focus_(false),
284 containing_view_has_focus_(true), 285 containing_view_has_focus_(true),
285 creation_succeeded_(false) { 286 creation_succeeded_(false) {
286 memset(&window_, 0, sizeof(window_)); 287 memset(&window_, 0, sizeof(window_));
287 288
288 const WebPluginInfo& plugin_info = instance_->plugin_lib()->plugin_info(); 289 const WebPluginInfo& plugin_info = instance_->plugin_lib()->plugin_info();
289 std::wstring filename = 290 std::wstring filename =
290 StringToLowerASCII(plugin_info.path.BaseName().value()); 291 StringToLowerASCII(plugin_info.path.BaseName().value());
291 292
292 if (instance_->mime_type() == "application/x-shockwave-flash" || 293 is_builtin_flash_ = filename == kBuiltinFlashPlugin;
294 if (is_builtin_flash_ ||
295 instance_->mime_type() == "application/x-shockwave-flash" ||
293 filename == kFlashPlugin) { 296 filename == kFlashPlugin) {
294 // Flash only requests windowless plugins if we return a Mozilla user 297 // Flash only requests windowless plugins if we return a Mozilla user
295 // agent. 298 // agent.
296 instance_->set_use_mozilla_user_agent(); 299 instance_->set_use_mozilla_user_agent();
297 quirks_ |= PLUGIN_QUIRK_THROTTLE_WM_USER_PLUS_ONE; 300 quirks_ |= PLUGIN_QUIRK_THROTTLE_WM_USER_PLUS_ONE;
298 quirks_ |= PLUGIN_QUIRK_PATCH_SETCURSOR; 301 quirks_ |= PLUGIN_QUIRK_PATCH_SETCURSOR;
299 quirks_ |= PLUGIN_QUIRK_ALWAYS_NOTIFY_SUCCESS; 302 quirks_ |= PLUGIN_QUIRK_ALWAYS_NOTIFY_SUCCESS;
300 quirks_ |= PLUGIN_QUIRK_HANDLE_MOUSE_CAPTURE; 303 quirks_ |= PLUGIN_QUIRK_HANDLE_MOUSE_CAPTURE;
301 } else if (filename == kAcrobatReaderPlugin) { 304 } else if (filename == kAcrobatReaderPlugin) {
302 // Check for the version number above or equal 9. 305 // Check for the version number above or equal 9.
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 std::wstring::npos) { 350 std::wstring::npos) {
348 // The divx plugin sets its size on the first NPP_SetWindow call and never 351 // The divx plugin sets its size on the first NPP_SetWindow call and never
349 // updates its size. We should call the underlying NPP_SetWindow only when 352 // updates its size. We should call the underlying NPP_SetWindow only when
350 // we have the correct size. 353 // we have the correct size.
351 quirks_ |= PLUGIN_QUIRK_IGNORE_FIRST_SETWINDOW_CALL; 354 quirks_ |= PLUGIN_QUIRK_IGNORE_FIRST_SETWINDOW_CALL;
352 } 355 }
353 } 356 }
354 357
355 WebPluginDelegateImpl::~WebPluginDelegateImpl() { 358 WebPluginDelegateImpl::~WebPluginDelegateImpl() {
356 if (::IsWindow(dummy_window_for_activation_)) { 359 if (::IsWindow(dummy_window_for_activation_)) {
357 ::DestroyWindow(dummy_window_for_activation_); 360 // Sandboxed Flash stacks two dummy windows to prevent UIPI failures
361 if (is_builtin_flash_)
362 ::DestroyWindow(::GetParent(dummy_window_for_activation_));
ananta 2011/06/06 22:37:10 We could maintain the dummy parent as a member var
363 else
364 ::DestroyWindow(dummy_window_for_activation_);
358 } 365 }
359 366
360 DestroyInstance(); 367 DestroyInstance();
361 368
362 if (!windowless_) 369 if (!windowless_)
363 WindowedDestroyWindow(); 370 WindowedDestroyWindow();
364 371
365 if (handle_event_pump_messages_event_) { 372 if (handle_event_pump_messages_event_) {
366 CloseHandle(handle_event_pump_messages_event_); 373 CloseHandle(handle_event_pump_messages_event_);
367 } 374 }
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
485 // The window will be sized and shown later. 492 // The window will be sized and shown later.
486 windowed_handle_ = CreateWindowEx( 493 windowed_handle_ = CreateWindowEx(
487 WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR, 494 WS_EX_LEFT | WS_EX_LTRREADING | WS_EX_RIGHTSCROLLBAR,
488 kNativeWindowClassName, 495 kNativeWindowClassName,
489 0, 496 0,
490 WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 497 WS_POPUP | WS_CLIPCHILDREN | WS_CLIPSIBLINGS,
491 0, 498 0,
492 0, 499 0,
493 0, 500 0,
494 0, 501 0,
495 parent_, 502 is_builtin_flash_ ? NULL : parent_,
496 0, 503 0,
497 GetModuleHandle(NULL), 504 GetModuleHandle(NULL),
498 0); 505 0);
499 if (windowed_handle_ == 0) 506 if (windowed_handle_ == 0)
500 return false; 507 return false;
501 508
502 if (IsWindow(parent_)) { 509 if (is_builtin_flash_) {
510 plugin_->ReparentPluginWindow(windowed_handle_, parent_);
511 } else if (IsWindow(parent_)) {
503 // This is a tricky workaround for Issue 2673 in chromium "Flash: IME not 512 // This is a tricky workaround for Issue 2673 in chromium "Flash: IME not
504 // available". To use IMEs in this window, we have to make Windows attach 513 // available". To use IMEs in this window, we have to make Windows attach
505 // IMEs to this window (i.e. load IME DLLs, attach them to this process, 514 // IMEs to this window (i.e. load IME DLLs, attach them to this process,
506 // and add their message hooks to this window). Windows attaches IMEs while 515 // and add their message hooks to this window). Windows attaches IMEs while
507 // this process creates a top-level window. On the other hand, to layout 516 // this process creates a top-level window. On the other hand, to layout
508 // this window correctly in the given parent window (RenderWidgetHostHWND), 517 // this window correctly in the given parent window (RenderWidgetHostHWND),
509 // this window should be a child window of the parent window. 518 // this window should be a child window of the parent window.
510 // To satisfy both of the above conditions, this code once creates a 519 // To satisfy both of the above conditions, this code once creates a
511 // top-level window and change it to a child window of the parent window. 520 // top-level window and change it to a child window of the parent window.
512 SetWindowLongPtr(windowed_handle_, GWL_STYLE, 521 SetWindowLongPtr(windowed_handle_, GWL_STYLE,
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
702 711
703 return TRUE; 712 return TRUE;
704 } 713 }
705 714
706 bool WebPluginDelegateImpl::CreateDummyWindowForActivation() { 715 bool WebPluginDelegateImpl::CreateDummyWindowForActivation() {
707 DCHECK(!dummy_window_for_activation_); 716 DCHECK(!dummy_window_for_activation_);
708 dummy_window_for_activation_ = CreateWindowEx( 717 dummy_window_for_activation_ = CreateWindowEx(
709 0, 718 0,
710 L"Static", 719 L"Static",
711 kDummyActivationWindowName, 720 kDummyActivationWindowName,
712 WS_CHILD, 721 is_builtin_flash_ ? WS_POPUP : WS_CHILD,
713 0, 722 0,
714 0, 723 0,
715 0, 724 0,
716 0, 725 0,
717 parent_, 726 is_builtin_flash_ ? 0 : parent_,
718 0, 727 0,
719 GetModuleHandle(NULL), 728 GetModuleHandle(NULL),
720 0); 729 0);
721 730
722 if (dummy_window_for_activation_ == 0) 731 if (dummy_window_for_activation_ == 0)
723 return false; 732 return false;
724 733
734 if (is_builtin_flash_) {
735 // Built-in Flash runs with UIPI, but in windowless mode Flash sometimes
736 // tries to attach windows to the parent (which fails under UIPI). To make
737 // it work we add an extra dummy parent in the low-integrity process.
738 HWND parent_proxy_window = CreateWindowEx(
739 0,
740 L"Static",
741 kDummyActivationWindowName,
742 WS_POPUP,
743 0,
744 0,
745 0,
746 0,
747 0,
748 0,
749 GetModuleHandle(NULL),
ananta 2011/06/06 22:37:10 We could create the dummy parent window before cre
750 0);
751
752 if (parent_proxy_window == 0 ||
753 ::SetParent(dummy_window_for_activation_, parent_proxy_window) == 0)
754 return false;
755
756 plugin_->ReparentPluginWindow(parent_proxy_window, parent_);
757 }
758
725 // Flash creates background windows which use excessive CPU in our 759 // Flash creates background windows which use excessive CPU in our
726 // environment; we wrap these windows and throttle them so that they don't 760 // environment; we wrap these windows and throttle them so that they don't
727 // get out of hand. 761 // get out of hand.
728 if (!EnumThreadWindows(::GetCurrentThreadId(), EnumFlashWindows, 762 if (!EnumThreadWindows(::GetCurrentThreadId(), EnumFlashWindows,
729 reinterpret_cast<LPARAM>( 763 reinterpret_cast<LPARAM>(
730 &WebPluginDelegateImpl::FlashWindowlessWndProc))) { 764 &WebPluginDelegateImpl::FlashWindowlessWndProc))) {
731 // Log that this happened. Flash will still work; it just means the 765 // Log that this happened. Flash will still work; it just means the
732 // throttle isn't installed (and Flash will use more CPU). 766 // throttle isn't installed (and Flash will use more CPU).
733 NOTREACHED(); 767 NOTREACHED();
734 LOG(ERROR) << "Failed to wrap all windowless Flash windows"; 768 LOG(ERROR) << "Failed to wrap all windowless Flash windows";
(...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after
1396 ::ReleaseCapture(); 1430 ::ReleaseCapture();
1397 break; 1431 break;
1398 1432
1399 default: 1433 default:
1400 break; 1434 break;
1401 } 1435 }
1402 } 1436 }
1403 1437
1404 } // namespace npapi 1438 } // namespace npapi
1405 } // namespace webkit 1439 } // namespace webkit
OLDNEW
« no previous file with comments | « webkit/plugins/npapi/webplugin_delegate_impl.h ('k') | webkit/plugins/npapi/webplugin_impl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698