Index: webkit/glue/plugins/webplugin_delegate_impl_win.cc |
=================================================================== |
--- webkit/glue/plugins/webplugin_delegate_impl_win.cc (revision 26533) |
+++ webkit/glue/plugins/webplugin_delegate_impl_win.cc (working copy) |
@@ -298,6 +298,9 @@ |
// Explanation for this quirk can be found in |
// WebPluginDelegateImpl::Initialize. |
quirks_ |= PLUGIN_QUIRK_PATCH_SETCURSOR; |
+ } else if (instance_->mime_type() == "application/x-nacl-srpc") { |
+ // NaCl plugin runs in the sandbox - it cannot use the hwnd |
+ quirks_ |= PLUGIN_QUIRK_DONT_CREATE_DUMMY_WINDOW; |
} |
} |
@@ -326,35 +329,40 @@ |
void WebPluginDelegateImpl::PlatformInitialize() { |
plugin_->SetWindow(windowed_handle_); |
- if (windowless_) { |
+ |
+ if (windowless_ && !(quirks_ & PLUGIN_QUIRK_DONT_CREATE_DUMMY_WINDOW)) { |
CreateDummyWindowForActivation(); |
handle_event_pump_messages_event_ = CreateEvent(NULL, TRUE, FALSE, NULL); |
plugin_->SetWindowlessPumpEvent(handle_event_pump_messages_event_); |
} |
- // Windowless plugins call the WindowFromPoint API and passes the result of |
- // that to the TrackPopupMenu API call as the owner window. This causes the |
- // API to fail as the API expects the window handle to live on the same thread |
- // as the caller. It works in the other browsers as the plugin lives on the |
- // browser thread. Our workaround is to intercept the TrackPopupMenu API and |
- // replace the window handle with the dummy activation window. |
- if (windowless_ && !g_iat_patch_track_popup_menu.Pointer()->is_patched()) { |
- g_iat_patch_track_popup_menu.Pointer()->Patch( |
- GetPluginPath().value().c_str(), "user32.dll", "TrackPopupMenu", |
- WebPluginDelegateImpl::TrackPopupMenuPatch); |
- } |
+ // We cannot patch internal plugins as they are not shared libraries. |
+ if (!instance_->plugin_lib()->internal()) { |
+ // Windowless plugins call the WindowFromPoint API and passes the result of |
+ // that to the TrackPopupMenu API call as the owner window. This causes the |
+ // API to fail as the API expects the window handle to live on the same |
+ // thread as the caller. It works in the other browsers as the plugin lives |
+ // on the browser thread. Our workaround is to intercept the TrackPopupMenu |
+ // API and replace the window handle with the dummy activation window. |
+ if (windowless_ && !g_iat_patch_track_popup_menu.Pointer()->is_patched()) { |
+ g_iat_patch_track_popup_menu.Pointer()->Patch( |
+ GetPluginPath().value().c_str(), "user32.dll", "TrackPopupMenu", |
+ WebPluginDelegateImpl::TrackPopupMenuPatch); |
+ } |
- // Windowless plugins can set cursors by calling the SetCursor API. This |
- // works because the thread inputs of the browser UI thread and the plugin |
- // thread are attached. We intercept the SetCursor API for windowless plugins |
- // and remember the cursor being set. This is shipped over to the browser |
- // in the HandleEvent call, which ensures that the cursor does not change |
- // when a windowless plugin instance changes the cursor in a background tab. |
- if (windowless_ && !g_iat_patch_set_cursor.Pointer()->is_patched() && |
- (quirks_ & PLUGIN_QUIRK_PATCH_SETCURSOR)) { |
- g_iat_patch_set_cursor.Pointer()->Patch( |
- GetPluginPath().value().c_str(), "user32.dll", "SetCursor", |
- WebPluginDelegateImpl::SetCursorPatch); |
+ // Windowless plugins can set cursors by calling the SetCursor API. This |
+ // works because the thread inputs of the browser UI thread and the plugin |
+ // thread are attached. We intercept the SetCursor API for windowless |
+ // plugins and remember the cursor being set. This is shipped over to the |
+ // browser in the HandleEvent call, which ensures that the cursor does not |
+ // change when a windowless plugin instance changes the cursor |
+ // in a background tab. |
+ if (windowless_ && !g_iat_patch_set_cursor.Pointer()->is_patched() && |
+ (quirks_ & PLUGIN_QUIRK_PATCH_SETCURSOR)) { |
+ g_iat_patch_set_cursor.Pointer()->Patch( |
+ GetPluginPath().value().c_str(), "user32.dll", "SetCursor", |
+ WebPluginDelegateImpl::SetCursorPatch); |
+ } |
} |
// On XP, WMP will use its old UI unless a registry key under HKLM has the |