| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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 "content/renderer/npapi/webplugin_impl.h" | 5 #include "content/renderer/npapi/webplugin_impl.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/command_line.h" | 8 #include "base/command_line.h" |
| 9 #include "base/debug/crash_logging.h" | 9 #include "base/debug/crash_logging.h" |
| 10 #include "base/location.h" | 10 #include "base/location.h" |
| (...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 // Note that |canvas| is only used when in windowless mode. | 185 // Note that |canvas| is only used when in windowless mode. |
| 186 delegate_->Paint(canvas, paint_rect); | 186 delegate_->Paint(canvas, paint_rect); |
| 187 } | 187 } |
| 188 | 188 |
| 189 void WebPluginImpl::updateGeometry(const WebRect& window_rect, | 189 void WebPluginImpl::updateGeometry(const WebRect& window_rect, |
| 190 const WebRect& clip_rect, | 190 const WebRect& clip_rect, |
| 191 const WebRect& unobscured_rect, | 191 const WebRect& unobscured_rect, |
| 192 const WebVector<WebRect>& cut_outs_rects, | 192 const WebVector<WebRect>& cut_outs_rects, |
| 193 bool is_visible) { | 193 bool is_visible) { |
| 194 WebPluginGeometry new_geometry; | 194 WebPluginGeometry new_geometry; |
| 195 new_geometry.window = window_; | |
| 196 new_geometry.window_rect = window_rect; | 195 new_geometry.window_rect = window_rect; |
| 197 new_geometry.clip_rect = clip_rect; | 196 new_geometry.clip_rect = clip_rect; |
| 198 new_geometry.visible = is_visible; | 197 new_geometry.visible = is_visible; |
| 199 new_geometry.rects_valid = true; | 198 new_geometry.rects_valid = true; |
| 200 for (size_t i = 0; i < cut_outs_rects.size(); ++i) | 199 for (size_t i = 0; i < cut_outs_rects.size(); ++i) |
| 201 new_geometry.cutout_rects.push_back(cut_outs_rects[i]); | 200 new_geometry.cutout_rects.push_back(cut_outs_rects[i]); |
| 202 | 201 |
| 203 // Only send DidMovePlugin if the geometry changed in some way. | |
| 204 if (window_ && (first_geometry_update_ || !new_geometry.Equals(geometry_))) { | |
| 205 render_frame_->GetRenderWidget()->SchedulePluginMove(new_geometry); | |
| 206 // We invalidate windowed plugins during the first geometry update to | |
| 207 // ensure that they get reparented to the wrapper window in the browser. | |
| 208 // This ensures that they become visible and are painted by the OS. This is | |
| 209 // required as some pages don't invalidate when the plugin is added. | |
| 210 if (first_geometry_update_ && window_) { | |
| 211 InvalidateRect(window_rect); | |
| 212 } | |
| 213 } | |
| 214 | |
| 215 // Only UpdateGeometry if either the window or clip rects have changed. | 202 // Only UpdateGeometry if either the window or clip rects have changed. |
| 216 if (delegate_ && (first_geometry_update_ || | 203 if (delegate_ && (first_geometry_update_ || |
| 217 new_geometry.window_rect != geometry_.window_rect || | 204 new_geometry.window_rect != geometry_.window_rect || |
| 218 new_geometry.clip_rect != geometry_.clip_rect)) { | 205 new_geometry.clip_rect != geometry_.clip_rect)) { |
| 219 // Notify the plugin that its parameters have changed. | 206 // Notify the plugin that its parameters have changed. |
| 220 delegate_->UpdateGeometry(new_geometry.window_rect, new_geometry.clip_rect); | 207 delegate_->UpdateGeometry(new_geometry.window_rect, new_geometry.clip_rect); |
| 221 } | 208 } |
| 222 | 209 |
| 223 #if defined(OS_WIN) | 210 #if defined(OS_WIN) |
| 224 // Don't cache the geometry during the first geometry update. The first | 211 // Don't cache the geometry during the first geometry update. The first |
| 225 // geometry update sequence is received when Widget::setParent is called. | 212 // geometry update sequence is received when Widget::setParent is called. |
| 226 // For plugins like media player which have a bug where they only honor | 213 // For plugins like media player which have a bug where they only honor |
| 227 // the first geometry update, we have a quirk which ignores the first | 214 // the first geometry update, we have a quirk which ignores the first |
| 228 // geometry update. To ensure that these plugins work correctly in cases | 215 // geometry update. To ensure that these plugins work correctly in cases |
| 229 // where we receive only one geometry update from webkit, we also force | 216 // where we receive only one geometry update from webkit, we also force |
| 230 // a geometry update during paint which should go out correctly as the | 217 // a geometry update during paint which should go out correctly as the |
| 231 // initial geometry update was not cached. | 218 // initial geometry update was not cached. |
| 232 if (!first_geometry_update_) | 219 if (!first_geometry_update_) |
| 233 geometry_ = new_geometry; | 220 geometry_ = new_geometry; |
| 234 #else // OS_WIN | 221 #else // OS_WIN |
| 235 geometry_ = new_geometry; | 222 geometry_ = new_geometry; |
| 236 #endif // OS_WIN | 223 #endif // OS_WIN |
| 237 first_geometry_update_ = false; | 224 first_geometry_update_ = false; |
| 238 } | 225 } |
| 239 | 226 |
| 240 void WebPluginImpl::updateFocus(bool focused, blink::WebFocusType focus_type) { | 227 void WebPluginImpl::updateFocus(bool focused, blink::WebFocusType focus_type) { |
| 241 if (accepts_input_events_) | 228 delegate_->SetFocus(focused); |
| 242 delegate_->SetFocus(focused); | |
| 243 } | 229 } |
| 244 | 230 |
| 245 void WebPluginImpl::updateVisibility(bool visible) { | 231 void WebPluginImpl::updateVisibility(bool visible) { |
| 246 if (!window_) | |
| 247 return; | |
| 248 | |
| 249 WebPluginGeometry move; | |
| 250 move.window = window_; | |
| 251 move.window_rect = gfx::Rect(); | |
| 252 move.clip_rect = gfx::Rect(); | |
| 253 move.rects_valid = false; | |
| 254 move.visible = visible; | |
| 255 | |
| 256 render_frame_->GetRenderWidget()->SchedulePluginMove(move); | |
| 257 } | 232 } |
| 258 | 233 |
| 259 bool WebPluginImpl::acceptsInputEvents() { | 234 bool WebPluginImpl::acceptsInputEvents() { |
| 260 return accepts_input_events_; | 235 return true; |
| 261 } | 236 } |
| 262 | 237 |
| 263 WebInputEventResult WebPluginImpl::handleInputEvent( | 238 WebInputEventResult WebPluginImpl::handleInputEvent( |
| 264 const WebInputEvent& event, | 239 const WebInputEvent& event, |
| 265 WebCursorInfo& cursor_info) { | 240 WebCursorInfo& cursor_info) { |
| 266 // Swallow context menu events in order to suppress the default context menu. | 241 // Swallow context menu events in order to suppress the default context menu. |
| 267 if (event.type == WebInputEvent::ContextMenu) | 242 if (event.type == WebInputEvent::ContextMenu) |
| 268 return WebInputEventResult::HandledSuppressed; | 243 return WebInputEventResult::HandledSuppressed; |
| 269 | 244 |
| 270 WebCursor::CursorInfo web_cursor_info; | 245 WebCursor::CursorInfo web_cursor_info; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 285 } | 260 } |
| 286 | 261 |
| 287 // ----------------------------------------------------------------------------- | 262 // ----------------------------------------------------------------------------- |
| 288 | 263 |
| 289 WebPluginImpl::WebPluginImpl( | 264 WebPluginImpl::WebPluginImpl( |
| 290 WebFrame* webframe, | 265 WebFrame* webframe, |
| 291 const WebPluginParams& params, | 266 const WebPluginParams& params, |
| 292 const base::FilePath& file_path, | 267 const base::FilePath& file_path, |
| 293 const base::WeakPtr<RenderViewImpl>& render_view, | 268 const base::WeakPtr<RenderViewImpl>& render_view, |
| 294 RenderFrameImpl* render_frame) | 269 RenderFrameImpl* render_frame) |
| 295 : windowless_(false), | 270 : render_frame_(render_frame), |
| 296 window_(gfx::kNullPluginWindow), | |
| 297 accepts_input_events_(false), | |
| 298 render_frame_(render_frame), | |
| 299 render_view_(render_view), | 271 render_view_(render_view), |
| 300 webframe_(webframe), | 272 webframe_(webframe), |
| 301 delegate_(NULL), | 273 delegate_(NULL), |
| 302 container_(NULL), | 274 container_(NULL), |
| 303 npp_(NULL), | 275 npp_(NULL), |
| 304 plugin_url_(params.url), | 276 plugin_url_(params.url), |
| 305 load_manually_(params.loadManually), | 277 load_manually_(params.loadManually), |
| 306 first_geometry_update_(true), | 278 first_geometry_update_(true), |
| 307 ignore_response_error_(false), | 279 ignore_response_error_(false), |
| 308 file_path_(file_path), | 280 file_path_(file_path), |
| 309 mime_type_(base::ToLowerASCII(base::UTF16ToASCII( | 281 mime_type_(base::ToLowerASCII(base::UTF16ToASCII( |
| 310 base::StringPiece16(params.mimeType)))) { | 282 base::StringPiece16(params.mimeType)))) { |
| 311 DCHECK_EQ(params.attributeNames.size(), params.attributeValues.size()); | 283 DCHECK_EQ(params.attributeNames.size(), params.attributeValues.size()); |
| 312 | 284 |
| 313 for (size_t i = 0; i < params.attributeNames.size(); ++i) { | 285 for (size_t i = 0; i < params.attributeNames.size(); ++i) { |
| 314 arg_names_.push_back(params.attributeNames[i].utf8()); | 286 arg_names_.push_back(params.attributeNames[i].utf8()); |
| 315 arg_values_.push_back(params.attributeValues[i].utf8()); | 287 arg_values_.push_back(params.attributeValues[i].utf8()); |
| 316 } | 288 } |
| 317 | 289 |
| 318 // Set subresource URL for crash reporting. | 290 // Set subresource URL for crash reporting. |
| 319 base::debug::SetCrashKeyValue("subresource_url", plugin_url_.spec()); | 291 base::debug::SetCrashKeyValue("subresource_url", plugin_url_.spec()); |
| 320 } | 292 } |
| 321 | 293 |
| 322 WebPluginImpl::~WebPluginImpl() { | 294 WebPluginImpl::~WebPluginImpl() { |
| 323 } | 295 } |
| 324 | 296 |
| 325 void WebPluginImpl::SetWindow(gfx::PluginWindowHandle window) { | |
| 326 if (window) { | |
| 327 DCHECK(!windowless_); | |
| 328 window_ = window; | |
| 329 #if defined(OS_MACOSX) | |
| 330 // TODO(kbr): remove. http://crbug.com/105344 | |
| 331 | |
| 332 // Lie to ourselves about being windowless even if we got a fake | |
| 333 // plugin window handle, so we continue to get input events. | |
| 334 windowless_ = true; | |
| 335 accepts_input_events_ = true; | |
| 336 // We do not really need to notify the page delegate that a plugin | |
| 337 // window was created -- so don't. | |
| 338 #else | |
| 339 accepts_input_events_ = false; | |
| 340 | |
| 341 #endif // OS_MACOSX | |
| 342 } else { | |
| 343 DCHECK(!window_); // Make sure not called twice. | |
| 344 windowless_ = true; | |
| 345 accepts_input_events_ = true; | |
| 346 } | |
| 347 } | |
| 348 | |
| 349 void WebPluginImpl::SetAcceptsInputEvents(bool accepts) { | |
| 350 accepts_input_events_ = accepts; | |
| 351 } | |
| 352 | |
| 353 void WebPluginImpl::WillDestroyWindow(gfx::PluginWindowHandle window) { | |
| 354 DCHECK_EQ(window, window_); | |
| 355 window_ = gfx::kNullPluginWindow; | |
| 356 if (render_view_.get()) | |
| 357 render_frame_->GetRenderWidget()->CleanupWindowInPluginMoves(window); | |
| 358 } | |
| 359 | |
| 360 GURL WebPluginImpl::CompleteURL(const char* url) { | 297 GURL WebPluginImpl::CompleteURL(const char* url) { |
| 361 if (!webframe_) { | 298 if (!webframe_) { |
| 362 NOTREACHED(); | 299 NOTREACHED(); |
| 363 return GURL(); | 300 return GURL(); |
| 364 } | 301 } |
| 365 // TODO(darin): Is conversion from UTF8 correct here? | 302 // TODO(darin): Is conversion from UTF8 correct here? |
| 366 return webframe_->document().completeURL(WebString::fromUTF8(url)); | 303 return webframe_->document().completeURL(WebString::fromUTF8(url)); |
| 367 } | 304 } |
| 368 | 305 |
| 369 bool WebPluginImpl::SetPostData(WebURLRequest* request, | 306 bool WebPluginImpl::SetPostData(WebURLRequest* request, |
| (...skipping 372 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 742 case PLUGIN_SRC: | 679 case PLUGIN_SRC: |
| 743 webframe_->setReferrerForRequest(*request, plugin_url_); | 680 webframe_->setReferrerForRequest(*request, plugin_url_); |
| 744 break; | 681 break; |
| 745 | 682 |
| 746 default: | 683 default: |
| 747 break; | 684 break; |
| 748 } | 685 } |
| 749 } | 686 } |
| 750 | 687 |
| 751 } // namespace content | 688 } // namespace content |
| OLD | NEW |