| OLD | NEW |
| 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 137 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 148 windowless_needs_set_window_(true), | 148 windowless_needs_set_window_(true), |
| 149 plugin_wnd_proc_(NULL), | 149 plugin_wnd_proc_(NULL), |
| 150 last_message_(0), | 150 last_message_(0), |
| 151 is_calling_wndproc(false), | 151 is_calling_wndproc(false), |
| 152 dummy_window_for_activation_(NULL), | 152 dummy_window_for_activation_(NULL), |
| 153 handle_event_message_filter_hook_(NULL), | 153 handle_event_message_filter_hook_(NULL), |
| 154 handle_event_pump_messages_event_(NULL), | 154 handle_event_pump_messages_event_(NULL), |
| 155 handle_event_depth_(0), | 155 handle_event_depth_(0), |
| 156 user_gesture_message_posted_(false), | 156 user_gesture_message_posted_(false), |
| 157 #pragma warning(suppress: 4355) // can use this | 157 #pragma warning(suppress: 4355) // can use this |
| 158 user_gesture_msg_factory_(this), | 158 user_gesture_msg_factory_(this) { |
| 159 plugin_module_handle_(NULL) { | |
| 160 memset(&window_, 0, sizeof(window_)); | 159 memset(&window_, 0, sizeof(window_)); |
| 161 | 160 |
| 162 const WebPluginInfo& plugin_info = instance_->plugin_lib()->plugin_info(); | 161 const WebPluginInfo& plugin_info = instance_->plugin_lib()->plugin_info(); |
| 163 std::string filename = | 162 std::string filename = |
| 164 WideToUTF8(StringToLowerASCII(plugin_info.path.BaseName().value())); | 163 WideToUTF8(StringToLowerASCII(plugin_info.path.BaseName().value())); |
| 165 | 164 |
| 166 if (instance_->mime_type() == "application/x-shockwave-flash" || | 165 if (instance_->mime_type() == "application/x-shockwave-flash" || |
| 167 filename == "npswf32.dll") { | 166 filename == "npswf32.dll") { |
| 168 // Flash only requests windowless plugins if we return a Mozilla user | 167 // Flash only requests windowless plugins if we return a Mozilla user |
| 169 // agent. | 168 // agent. |
| (...skipping 24 matching lines...) Expand all Loading... |
| 194 // handle | 193 // handle |
| 195 quirks_ |= PLUGIN_QUIRK_DONT_SET_NULL_WINDOW_HANDLE_ON_DESTROY; | 194 quirks_ |= PLUGIN_QUIRK_DONT_SET_NULL_WINDOW_HANDLE_ON_DESTROY; |
| 196 // VLC 0.8.6d and 0.8.6e crash if multiple instances are created. | 195 // VLC 0.8.6d and 0.8.6e crash if multiple instances are created. |
| 197 quirks_ |= PLUGIN_QUIRK_DONT_ALLOW_MULTIPLE_INSTANCES; | 196 quirks_ |= PLUGIN_QUIRK_DONT_ALLOW_MULTIPLE_INSTANCES; |
| 198 } else if (filename == "npctrl.dll") { | 197 } else if (filename == "npctrl.dll") { |
| 199 // Explanation for this quirk can be found in | 198 // Explanation for this quirk can be found in |
| 200 // WebPluginDelegateImpl::Initialize. | 199 // WebPluginDelegateImpl::Initialize. |
| 201 quirks_ |= PLUGIN_QUIRK_PATCH_TRACKPOPUP_MENU; | 200 quirks_ |= PLUGIN_QUIRK_PATCH_TRACKPOPUP_MENU; |
| 202 quirks_ |= PLUGIN_QUIRK_PATCH_SETCURSOR; | 201 quirks_ |= PLUGIN_QUIRK_PATCH_SETCURSOR; |
| 203 } | 202 } |
| 204 | |
| 205 plugin_module_handle_ = ::GetModuleHandle(plugin_info.path.value().c_str()); | |
| 206 } | 203 } |
| 207 | 204 |
| 208 WebPluginDelegateImpl::~WebPluginDelegateImpl() { | 205 WebPluginDelegateImpl::~WebPluginDelegateImpl() { |
| 209 if (::IsWindow(dummy_window_for_activation_)) { | 206 if (::IsWindow(dummy_window_for_activation_)) { |
| 210 ::DestroyWindow(dummy_window_for_activation_); | 207 ::DestroyWindow(dummy_window_for_activation_); |
| 211 TRACK_HWND_DESTRUCTION(dummy_window_for_activation_); | 208 TRACK_HWND_DESTRUCTION(dummy_window_for_activation_); |
| 212 } | 209 } |
| 213 | 210 |
| 214 DestroyInstance(); | 211 DestroyInstance(); |
| 215 | 212 |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 276 // WindowFromPoint API and passes the result of that to the | 273 // WindowFromPoint API and passes the result of that to the |
| 277 // TrackPopupMenu API call as the owner window. This causes the API | 274 // TrackPopupMenu API call as the owner window. This causes the API |
| 278 // to fail as the API expects the window handle to live on the same | 275 // to fail as the API expects the window handle to live on the same |
| 279 // thread as the caller. It works in the other browsers as the plugin | 276 // thread as the caller. It works in the other browsers as the plugin |
| 280 // lives on the browser thread. Our workaround is to intercept the | 277 // lives on the browser thread. Our workaround is to intercept the |
| 281 // TrackPopupMenu API for Silverlight and replace the window handle | 278 // TrackPopupMenu API for Silverlight and replace the window handle |
| 282 // with the dummy activation window. | 279 // with the dummy activation window. |
| 283 if (windowless_ && !g_iat_patch_track_popup_menu.Pointer()->is_patched() && | 280 if (windowless_ && !g_iat_patch_track_popup_menu.Pointer()->is_patched() && |
| 284 (quirks_ & PLUGIN_QUIRK_PATCH_TRACKPOPUP_MENU)) { | 281 (quirks_ & PLUGIN_QUIRK_PATCH_TRACKPOPUP_MENU)) { |
| 285 g_iat_patch_track_popup_menu.Pointer()->Patch( | 282 g_iat_patch_track_popup_menu.Pointer()->Patch( |
| 286 plugin_module_handle_, "user32.dll", "TrackPopupMenu", | 283 GetPluginPath().value().c_str(), "user32.dll", "TrackPopupMenu", |
| 287 WebPluginDelegateImpl::TrackPopupMenuPatch); | 284 WebPluginDelegateImpl::TrackPopupMenuPatch); |
| 288 } | 285 } |
| 289 | 286 |
| 290 // Windowless plugins can set cursors by calling the SetCursor API. This | 287 // Windowless plugins can set cursors by calling the SetCursor API. This |
| 291 // works because the thread inputs of the browser UI thread and the plugin | 288 // works because the thread inputs of the browser UI thread and the plugin |
| 292 // thread are attached. We intercept the SetCursor API for windowless plugins | 289 // thread are attached. We intercept the SetCursor API for windowless plugins |
| 293 // and remember the cursor being set. This is shipped over to the browser | 290 // and remember the cursor being set. This is shipped over to the browser |
| 294 // in the HandleEvent call, which ensures that the cursor does not change | 291 // in the HandleEvent call, which ensures that the cursor does not change |
| 295 // when a windowless plugin instance changes the cursor in a background tab. | 292 // when a windowless plugin instance changes the cursor in a background tab. |
| 296 if (windowless_ && !g_iat_patch_set_cursor.Pointer()->is_patched() && | 293 if (windowless_ && !g_iat_patch_set_cursor.Pointer()->is_patched() && |
| 297 (quirks_ & PLUGIN_QUIRK_PATCH_SETCURSOR)) { | 294 (quirks_ & PLUGIN_QUIRK_PATCH_SETCURSOR)) { |
| 298 g_iat_patch_set_cursor.Pointer()->Patch( | 295 g_iat_patch_set_cursor.Pointer()->Patch( |
| 299 plugin_module_handle_, "user32.dll", "SetCursor", | 296 GetPluginPath().value().c_str(), "user32.dll", "SetCursor", |
| 300 WebPluginDelegateImpl::SetCursorPatch); | 297 WebPluginDelegateImpl::SetCursorPatch); |
| 301 } | 298 } |
| 302 return true; | 299 return true; |
| 303 } | 300 } |
| 304 | 301 |
| 305 void WebPluginDelegateImpl::DestroyInstance() { | 302 void WebPluginDelegateImpl::DestroyInstance() { |
| 306 if (instance_ && (instance_->npp()->ndata != NULL)) { | 303 if (instance_ && (instance_->npp()->ndata != NULL)) { |
| 307 // Shutdown all streams before destroying so that | 304 // Shutdown all streams before destroying so that |
| 308 // no streams are left "in progress". Need to do | 305 // no streams are left "in progress". Need to do |
| 309 // this before calling set_web_plugin(NULL) because the | 306 // this before calling set_web_plugin(NULL) because the |
| (...skipping 885 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1195 | 1192 |
| 1196 // It is ok to pass NULL here to GetCursor as we are not looking for cursor | 1193 // It is ok to pass NULL here to GetCursor as we are not looking for cursor |
| 1197 // types defined by Webkit. | 1194 // types defined by Webkit. |
| 1198 HCURSOR previous_cursor = | 1195 HCURSOR previous_cursor = |
| 1199 g_current_plugin_instance->current_windowless_cursor_.GetCursor(NULL); | 1196 g_current_plugin_instance->current_windowless_cursor_.GetCursor(NULL); |
| 1200 | 1197 |
| 1201 g_current_plugin_instance->current_windowless_cursor_.InitFromExternalCursor( | 1198 g_current_plugin_instance->current_windowless_cursor_.InitFromExternalCursor( |
| 1202 cursor); | 1199 cursor); |
| 1203 return previous_cursor; | 1200 return previous_cursor; |
| 1204 } | 1201 } |
| OLD | NEW |