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

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

Issue 207025: NaCl-Chrome integration (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 11 years, 3 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/glue/plugins/webplugin_delegate_impl.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) 2006-2008 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2008 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/glue/plugins/webplugin_delegate_impl.h" 5 #include "webkit/glue/plugins/webplugin_delegate_impl.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/file_util.h" 10 #include "base/file_util.h"
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 std::wstring::npos) { 291 std::wstring::npos) {
292 // VLC hangs on NPP_Destroy if we call NPP_SetWindow with a null window 292 // VLC hangs on NPP_Destroy if we call NPP_SetWindow with a null window
293 // handle 293 // handle
294 quirks_ |= PLUGIN_QUIRK_DONT_SET_NULL_WINDOW_HANDLE_ON_DESTROY; 294 quirks_ |= PLUGIN_QUIRK_DONT_SET_NULL_WINDOW_HANDLE_ON_DESTROY;
295 // VLC 0.8.6d and 0.8.6e crash if multiple instances are created. 295 // VLC 0.8.6d and 0.8.6e crash if multiple instances are created.
296 quirks_ |= PLUGIN_QUIRK_DONT_ALLOW_MULTIPLE_INSTANCES; 296 quirks_ |= PLUGIN_QUIRK_DONT_ALLOW_MULTIPLE_INSTANCES;
297 } else if (filename == kSilverlightPlugin) { 297 } else if (filename == kSilverlightPlugin) {
298 // Explanation for this quirk can be found in 298 // Explanation for this quirk can be found in
299 // WebPluginDelegateImpl::Initialize. 299 // WebPluginDelegateImpl::Initialize.
300 quirks_ |= PLUGIN_QUIRK_PATCH_SETCURSOR; 300 quirks_ |= PLUGIN_QUIRK_PATCH_SETCURSOR;
301 } else if (instance_->mime_type() == "application/x-nacl-srpc") {
302 // NaCl plugin runs in the sandbox - it cannot use the hwnd
303 quirks_ |= PLUGIN_QUIRK_DONT_CREATE_DUMMY_WINDOW;
301 } 304 }
302 } 305 }
303 306
304 WebPluginDelegateImpl::~WebPluginDelegateImpl() { 307 WebPluginDelegateImpl::~WebPluginDelegateImpl() {
305 if (::IsWindow(dummy_window_for_activation_)) { 308 if (::IsWindow(dummy_window_for_activation_)) {
306 ::DestroyWindow(dummy_window_for_activation_); 309 ::DestroyWindow(dummy_window_for_activation_);
307 } 310 }
308 311
309 DestroyInstance(); 312 DestroyInstance();
310 313
311 if (!windowless_) 314 if (!windowless_)
312 WindowedDestroyWindow(); 315 WindowedDestroyWindow();
313 316
314 if (handle_event_pump_messages_event_) { 317 if (handle_event_pump_messages_event_) {
315 CloseHandle(handle_event_pump_messages_event_); 318 CloseHandle(handle_event_pump_messages_event_);
316 } 319 }
317 } 320 }
318 321
319 void WebPluginDelegateImpl::PluginDestroyed() { 322 void WebPluginDelegateImpl::PluginDestroyed() {
320 if (handle_event_depth_) { 323 if (handle_event_depth_) {
321 MessageLoop::current()->DeleteSoon(FROM_HERE, this); 324 MessageLoop::current()->DeleteSoon(FROM_HERE, this);
322 } else { 325 } else {
323 delete this; 326 delete this;
324 } 327 }
325 } 328 }
326 329
327 void WebPluginDelegateImpl::PlatformInitialize() { 330 void WebPluginDelegateImpl::PlatformInitialize() {
328 plugin_->SetWindow(windowed_handle_); 331 plugin_->SetWindow(windowed_handle_);
329 if (windowless_) { 332
333 if (windowless_ && !(quirks_ & PLUGIN_QUIRK_DONT_CREATE_DUMMY_WINDOW)) {
330 CreateDummyWindowForActivation(); 334 CreateDummyWindowForActivation();
331 handle_event_pump_messages_event_ = CreateEvent(NULL, TRUE, FALSE, NULL); 335 handle_event_pump_messages_event_ = CreateEvent(NULL, TRUE, FALSE, NULL);
332 plugin_->SetWindowlessPumpEvent(handle_event_pump_messages_event_); 336 plugin_->SetWindowlessPumpEvent(handle_event_pump_messages_event_);
333 } 337 }
334 338
335 // Windowless plugins call the WindowFromPoint API and passes the result of 339 // We cannot patch internal plugins as they are not shared libraries.
336 // that to the TrackPopupMenu API call as the owner window. This causes the 340 if (!instance_->plugin_lib()->internal()) {
337 // API to fail as the API expects the window handle to live on the same thread 341 // Windowless plugins call the WindowFromPoint API and passes the result of
338 // as the caller. It works in the other browsers as the plugin lives on the 342 // that to the TrackPopupMenu API call as the owner window. This causes the
339 // browser thread. Our workaround is to intercept the TrackPopupMenu API and 343 // API to fail as the API expects the window handle to live on the same
340 // replace the window handle with the dummy activation window. 344 // thread as the caller. It works in the other browsers as the plugin lives
341 if (windowless_ && !g_iat_patch_track_popup_menu.Pointer()->is_patched()) { 345 // on the browser thread. Our workaround is to intercept the TrackPopupMenu
342 g_iat_patch_track_popup_menu.Pointer()->Patch( 346 // API and replace the window handle with the dummy activation window.
343 GetPluginPath().value().c_str(), "user32.dll", "TrackPopupMenu", 347 if (windowless_ && !g_iat_patch_track_popup_menu.Pointer()->is_patched()) {
344 WebPluginDelegateImpl::TrackPopupMenuPatch); 348 g_iat_patch_track_popup_menu.Pointer()->Patch(
345 } 349 GetPluginPath().value().c_str(), "user32.dll", "TrackPopupMenu",
350 WebPluginDelegateImpl::TrackPopupMenuPatch);
351 }
346 352
347 // Windowless plugins can set cursors by calling the SetCursor API. This 353 // Windowless plugins can set cursors by calling the SetCursor API. This
348 // works because the thread inputs of the browser UI thread and the plugin 354 // works because the thread inputs of the browser UI thread and the plugin
349 // thread are attached. We intercept the SetCursor API for windowless plugins 355 // thread are attached. We intercept the SetCursor API for windowless
350 // and remember the cursor being set. This is shipped over to the browser 356 // plugins and remember the cursor being set. This is shipped over to the
351 // in the HandleEvent call, which ensures that the cursor does not change 357 // browser in the HandleEvent call, which ensures that the cursor does not
352 // when a windowless plugin instance changes the cursor in a background tab. 358 // change when a windowless plugin instance changes the cursor
353 if (windowless_ && !g_iat_patch_set_cursor.Pointer()->is_patched() && 359 // in a background tab.
354 (quirks_ & PLUGIN_QUIRK_PATCH_SETCURSOR)) { 360 if (windowless_ && !g_iat_patch_set_cursor.Pointer()->is_patched() &&
355 g_iat_patch_set_cursor.Pointer()->Patch( 361 (quirks_ & PLUGIN_QUIRK_PATCH_SETCURSOR)) {
356 GetPluginPath().value().c_str(), "user32.dll", "SetCursor", 362 g_iat_patch_set_cursor.Pointer()->Patch(
357 WebPluginDelegateImpl::SetCursorPatch); 363 GetPluginPath().value().c_str(), "user32.dll", "SetCursor",
364 WebPluginDelegateImpl::SetCursorPatch);
365 }
358 } 366 }
359 367
360 // On XP, WMP will use its old UI unless a registry key under HKLM has the 368 // On XP, WMP will use its old UI unless a registry key under HKLM has the
361 // name of the current process. We do it in the installer for admin users, 369 // name of the current process. We do it in the installer for admin users,
362 // for the rest patch this function. 370 // for the rest patch this function.
363 if ((quirks_ & PLUGIN_QUIRK_PATCH_REGENUMKEYEXW) && 371 if ((quirks_ & PLUGIN_QUIRK_PATCH_REGENUMKEYEXW) &&
364 win_util::GetWinVersion() == win_util::WINVERSION_XP && 372 win_util::GetWinVersion() == win_util::WINVERSION_XP &&
365 !RegKey().Open(HKEY_LOCAL_MACHINE, 373 !RegKey().Open(HKEY_LOCAL_MACHINE,
366 L"SOFTWARE\\Microsoft\\MediaPlayer\\ShimInclusionList\\chrome.exe") && 374 L"SOFTWARE\\Microsoft\\MediaPlayer\\ShimInclusionList\\chrome.exe") &&
367 !g_iat_patch_reg_enum_key_ex_w.Pointer()->is_patched()) { 375 !g_iat_patch_reg_enum_key_ex_w.Pointer()->is_patched()) {
(...skipping 889 matching lines...) Expand 10 before | Expand all | Expand 10 after
1257 GetKeyPath(key).find(L"Microsoft\\MediaPlayer\\ShimInclusionList") != 1265 GetKeyPath(key).find(L"Microsoft\\MediaPlayer\\ShimInclusionList") !=
1258 std::wstring::npos) { 1266 std::wstring::npos) {
1259 static const wchar_t kChromeExeName[] = L"chrome.exe"; 1267 static const wchar_t kChromeExeName[] = L"chrome.exe";
1260 wcsncpy_s(name, orig_size, kChromeExeName, arraysize(kChromeExeName)); 1268 wcsncpy_s(name, orig_size, kChromeExeName, arraysize(kChromeExeName));
1261 *name_size = 1269 *name_size =
1262 std::min(orig_size, static_cast<DWORD>(arraysize(kChromeExeName))); 1270 std::min(orig_size, static_cast<DWORD>(arraysize(kChromeExeName)));
1263 } 1271 }
1264 1272
1265 return rv; 1273 return rv;
1266 } 1274 }
OLDNEW
« no previous file with comments | « webkit/glue/plugins/webplugin_delegate_impl.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698