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

Side by Side Diff: webkit/glue/webplugin_impl.cc

Issue 549025: Set disabled style on GPU window and plugin intermediate window so mouse mess... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: '' Created 10 years, 11 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/webplugin_impl.h ('k') | webkit/webkit.gyp » ('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) 2006-2009 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2006-2009 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 "base/gfx/rect.h" 5 #include "base/gfx/rect.h"
6 #include "base/logging.h" 6 #include "base/logging.h"
7 #include "base/message_loop.h" 7 #include "base/message_loop.h"
8 #include "base/string_util.h" 8 #include "base/string_util.h"
9 #include "base/utf_string_conversions.h" 9 #include "base/utf_string_conversions.h"
10 #include "net/base/escape.h" 10 #include "net/base/escape.h"
(...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after
243 if (!delegate_) 243 if (!delegate_)
244 return; 244 return;
245 245
246 // Note that |canvas| is only used when in windowless mode. 246 // Note that |canvas| is only used when in windowless mode.
247 delegate_->Paint(canvas, paint_rect); 247 delegate_->Paint(canvas, paint_rect);
248 } 248 }
249 249
250 void WebPluginImpl::updateGeometry( 250 void WebPluginImpl::updateGeometry(
251 const WebRect& window_rect, const WebRect& clip_rect, 251 const WebRect& window_rect, const WebRect& clip_rect,
252 const WebVector<WebRect>& cutout_rects, bool is_visible) { 252 const WebVector<WebRect>& cutout_rects, bool is_visible) {
253 if (window_ && page_delegate_) { 253 WebPluginGeometry new_geometry;
254 // Notify the window hosting the plugin (the WebViewDelegate) that 254 new_geometry.window = window_;
255 // it needs to adjust the plugin, so that all the HWNDs can be moved 255 new_geometry.window_rect = window_rect;
256 // at the same time. 256 new_geometry.clip_rect = clip_rect;
257 WebPluginGeometry move; 257 new_geometry.visible = is_visible;
258 move.window = window_; 258 new_geometry.rects_valid = true;
259 move.window_rect = window_rect; 259 for (size_t i = 0; i < cutout_rects.size(); ++i)
260 move.clip_rect = clip_rect; 260 new_geometry.cutout_rects.push_back(cutout_rects[i]);
261 for (size_t i = 0; i < cutout_rects.size(); ++i)
262 move.cutout_rects.push_back(cutout_rects[i]);
263 move.rects_valid = true;
264 move.visible = is_visible;
265 261
266 page_delegate_->DidMovePlugin(move); 262 // Only send DidMovePlugin if the geometry changed in some way.
263 if (window_ &&
264 page_delegate_ &&
265 (first_geometry_update_ || !new_geometry.Equals(geometry_))) {
266 page_delegate_->DidMovePlugin(new_geometry);
267 } 267 }
268 268
269 if (first_geometry_update_ || window_rect != window_rect_ || 269 // Only UpdateGeometry if either the window or clip rects have changed.
270 clip_rect != clip_rect_) { 270 if (first_geometry_update_ ||
271 window_rect_ = window_rect; 271 new_geometry.window_rect != geometry_.window_rect ||
272 clip_rect_ = clip_rect; 272 new_geometry.clip_rect != geometry_.clip_rect) {
273 // Notify the plugin that its parameters have changed. 273 // Notify the plugin that its parameters have changed.
274 delegate_->UpdateGeometry(window_rect_, clip_rect_); 274 delegate_->UpdateGeometry(new_geometry.window_rect, new_geometry.clip_rect);
275 }
275 276
276 // Initiate a download on the plugin url. This should be done for the 277 // Initiate a download on the plugin url. This should be done for the
277 // first update geometry sequence. We need to ensure that the plugin 278 // first update geometry sequence. We need to ensure that the plugin
278 // receives the geometry update before it starts receiving data. 279 // receives the geometry update before it starts receiving data.
279 if (first_geometry_update_) { 280 if (first_geometry_update_) {
280 first_geometry_update_ = false; 281 // An empty url corresponds to an EMBED tag with no src attribute.
281 // An empty url corresponds to an EMBED tag with no src attribute. 282 if (!load_manually_ && plugin_url_.is_valid()) {
282 if (!load_manually_ && plugin_url_.is_valid()) { 283 // The Flash plugin hangs for a while if it receives data before
283 // The Flash plugin hangs for a while if it receives data before 284 // receiving valid plugin geometry. By valid geometry we mean the
284 // receiving valid plugin geometry. By valid geometry we mean the 285 // geometry received by a call to setFrameRect in the Webkit
285 // geometry received by a call to setFrameRect in the Webkit 286 // layout code path. To workaround this issue we download the
286 // layout code path. To workaround this issue we download the 287 // plugin source url on a timer.
287 // plugin source url on a timer. 288 MessageLoop::current()->PostDelayedTask(
288 MessageLoop::current()->PostDelayedTask( 289 FROM_HERE, method_factory_.NewRunnableMethod(
289 FROM_HERE, method_factory_.NewRunnableMethod( 290 &WebPluginImpl::OnDownloadPluginSrcUrl), 0);
290 &WebPluginImpl::OnDownloadPluginSrcUrl), 0);
291 }
292 } 291 }
293 } 292 }
293
294 first_geometry_update_ = false;
295 geometry_ = new_geometry;
294 } 296 }
295 297
296 void WebPluginImpl::updateFocus(bool focused) { 298 void WebPluginImpl::updateFocus(bool focused) {
297 if (focused && windowless_) 299 if (focused && accepts_input_events_)
298 delegate_->SetFocus(); 300 delegate_->SetFocus();
299 } 301 }
300 302
301 void WebPluginImpl::updateVisibility(bool visible) { 303 void WebPluginImpl::updateVisibility(bool visible) {
302 if (!window_ || !page_delegate_) 304 if (!window_ || !page_delegate_)
303 return; 305 return;
304 306
305 WebPluginGeometry move; 307 WebPluginGeometry move;
306 move.window = window_; 308 move.window = window_;
307 move.window_rect = gfx::Rect(); 309 move.window_rect = gfx::Rect();
308 move.clip_rect = gfx::Rect(); 310 move.clip_rect = gfx::Rect();
309 move.rects_valid = false; 311 move.rects_valid = false;
310 move.visible = visible; 312 move.visible = visible;
311 313
312 page_delegate_->DidMovePlugin(move); 314 page_delegate_->DidMovePlugin(move);
313 } 315 }
314 316
315 bool WebPluginImpl::acceptsInputEvents() { 317 bool WebPluginImpl::acceptsInputEvents() {
316 return windowless_; 318 return accepts_input_events_;
317 } 319 }
318 320
319 bool WebPluginImpl::handleInputEvent( 321 bool WebPluginImpl::handleInputEvent(
320 const WebInputEvent& event, WebCursorInfo& cursor_info) { 322 const WebInputEvent& event, WebCursorInfo& cursor_info) {
321 return delegate_->HandleInputEvent(event, &cursor_info); 323 return delegate_->HandleInputEvent(event, &cursor_info);
322 } 324 }
323 325
324 void WebPluginImpl::didReceiveResponse(const WebURLResponse& response) { 326 void WebPluginImpl::didReceiveResponse(const WebURLResponse& response) {
325 ignore_response_error_ = false; 327 ignore_response_error_ = false;
326 328
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
367 url, reason, reinterpret_cast<intptr_t>(notify_data)); 369 url, reason, reinterpret_cast<intptr_t>(notify_data));
368 } 370 }
369 371
370 // ----------------------------------------------------------------------------- 372 // -----------------------------------------------------------------------------
371 373
372 WebPluginImpl::WebPluginImpl( 374 WebPluginImpl::WebPluginImpl(
373 WebFrame* webframe, const WebPluginParams& params, 375 WebFrame* webframe, const WebPluginParams& params,
374 const base::WeakPtr<WebPluginPageDelegate>& page_delegate) 376 const base::WeakPtr<WebPluginPageDelegate>& page_delegate)
375 : windowless_(false), 377 : windowless_(false),
376 window_(NULL), 378 window_(NULL),
379 accepts_input_events_(false),
377 page_delegate_(page_delegate), 380 page_delegate_(page_delegate),
378 webframe_(webframe), 381 webframe_(webframe),
379 delegate_(NULL), 382 delegate_(NULL),
380 container_(NULL), 383 container_(NULL),
381 plugin_url_(params.url), 384 plugin_url_(params.url),
382 load_manually_(params.loadManually), 385 load_manually_(params.loadManually),
383 first_geometry_update_(true), 386 first_geometry_update_(true),
384 ignore_response_error_(false), 387 ignore_response_error_(false),
385 mime_type_(params.mimeType.utf8()), 388 mime_type_(params.mimeType.utf8()),
386 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) { 389 ALLOW_THIS_IN_INITIALIZER_LIST(method_factory_(this)) {
387 DCHECK_EQ(params.attributeNames.size(), params.attributeValues.size()); 390 DCHECK_EQ(params.attributeNames.size(), params.attributeValues.size());
388 StringToLowerASCII(&mime_type_); 391 StringToLowerASCII(&mime_type_);
389 392
390 for (size_t i = 0; i < params.attributeNames.size(); ++i) { 393 for (size_t i = 0; i < params.attributeNames.size(); ++i) {
391 arg_names_.push_back(params.attributeNames[i].utf8()); 394 arg_names_.push_back(params.attributeNames[i].utf8());
392 arg_values_.push_back(params.attributeValues[i].utf8()); 395 arg_values_.push_back(params.attributeValues[i].utf8());
393 } 396 }
394 } 397 }
395 398
396 WebPluginImpl::~WebPluginImpl() { 399 WebPluginImpl::~WebPluginImpl() {
397 } 400 }
398 401
399 void WebPluginImpl::SetWindow(gfx::PluginWindowHandle window) { 402 void WebPluginImpl::SetWindow(gfx::PluginWindowHandle window) {
400 if (window) { 403 if (window) {
401 DCHECK(!windowless_); 404 DCHECK(!windowless_);
402 window_ = window; 405 window_ = window;
406 accepts_input_events_ = false;
403 if (page_delegate_) { 407 if (page_delegate_) {
404 // Tell the view delegate that the plugin window was created, so that it 408 // Tell the view delegate that the plugin window was created, so that it
405 // can create necessary container widgets. 409 // can create necessary container widgets.
406 page_delegate_->CreatedPluginWindow(window); 410 page_delegate_->CreatedPluginWindow(window);
407 } 411 }
408 } else { 412 } else {
409 DCHECK(!window_); // Make sure not called twice. 413 DCHECK(!window_); // Make sure not called twice.
410 windowless_ = true; 414 windowless_ = true;
415 accepts_input_events_ = true;
411 } 416 }
412 } 417 }
413 418
414 void WebPluginImpl::WillDestroyWindow(gfx::PluginWindowHandle window) { 419 void WebPluginImpl::WillDestroyWindow(gfx::PluginWindowHandle window) {
415 DCHECK_EQ(window, window_); 420 DCHECK_EQ(window, window_);
416 window_ = NULL; 421 window_ = NULL;
417 if (page_delegate_) 422 if (page_delegate_)
418 page_delegate_->WillDestroyPluginWindow(window); 423 page_delegate_->WillDestroyPluginWindow(window);
419 } 424 }
420 425
(...skipping 704 matching lines...) Expand 10 before | Expand all | Expand 10 after
1125 WebDevToolsAgent* WebPluginImpl::GetDevToolsAgent() { 1130 WebDevToolsAgent* WebPluginImpl::GetDevToolsAgent() {
1126 if (!webframe_) 1131 if (!webframe_)
1127 return NULL; 1132 return NULL;
1128 WebView* view = webframe_->view(); 1133 WebView* view = webframe_->view();
1129 if (!view) 1134 if (!view)
1130 return NULL; 1135 return NULL;
1131 return view->devToolsAgent(); 1136 return view->devToolsAgent();
1132 } 1137 }
1133 1138
1134 } // namespace webkit_glue 1139 } // namespace webkit_glue
OLDNEW
« no previous file with comments | « webkit/glue/webplugin_impl.h ('k') | webkit/webkit.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698