Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "android_webview/browser/browser_view_renderer.h" | 5 #include "android_webview/browser/browser_view_renderer.h" |
| 6 | 6 |
| 7 #include "android_webview/browser/browser_view_renderer_client.h" | 7 #include "android_webview/browser/browser_view_renderer_client.h" |
| 8 #include "android_webview/browser/shared_renderer_state.h" | 8 #include "android_webview/browser/shared_renderer_state.h" |
| 9 #include "android_webview/public/browser/draw_gl.h" | 9 #include "android_webview/public/browser/draw_gl.h" |
| 10 #include "base/android/jni_android.h" | 10 #include "base/android/jni_android.h" |
| 11 #include "base/auto_reset.h" | 11 #include "base/auto_reset.h" |
| 12 #include "base/debug/trace_event.h" | 12 #include "base/debug/trace_event.h" |
| 13 #include "base/json/json_writer.h" | |
| 13 #include "base/logging.h" | 14 #include "base/logging.h" |
| 14 #include "base/strings/stringprintf.h" | 15 #include "base/strings/stringprintf.h" |
| 15 #include "content/public/browser/android/synchronous_compositor.h" | 16 #include "content/public/browser/android/synchronous_compositor.h" |
| 16 #include "content/public/browser/web_contents.h" | 17 #include "content/public/browser/web_contents.h" |
| 17 #include "third_party/skia/include/core/SkBitmap.h" | 18 #include "third_party/skia/include/core/SkBitmap.h" |
| 18 #include "third_party/skia/include/core/SkCanvas.h" | 19 #include "third_party/skia/include/core/SkCanvas.h" |
| 19 #include "third_party/skia/include/core/SkPicture.h" | 20 #include "third_party/skia/include/core/SkPicture.h" |
| 20 #include "ui/gfx/vector2d_conversions.h" | 21 #include "ui/gfx/vector2d_conversions.h" |
| 21 | 22 |
| 22 using base::android::AttachCurrentThread; | 23 using base::android::AttachCurrentThread; |
| (...skipping 24 matching lines...) Expand all Loading... | |
| 47 } | 48 } |
| 48 | 49 |
| 49 private: | 50 private: |
| 50 gfx::Vector2dF* scoped_variable_; | 51 gfx::Vector2dF* scoped_variable_; |
| 51 gfx::Vector2dF original_value_; | 52 gfx::Vector2dF original_value_; |
| 52 base::Lock& lock_; | 53 base::Lock& lock_; |
| 53 | 54 |
| 54 DISALLOW_COPY_AND_ASSIGN(AutoResetWithLock); | 55 DISALLOW_COPY_AND_ASSIGN(AutoResetWithLock); |
| 55 }; | 56 }; |
| 56 | 57 |
| 58 class TracedValue : public base::debug::ConvertableToTraceFormat { | |
| 59 public: | |
| 60 explicit TracedValue(base::Value* value) : value_(value) {} | |
| 61 static scoped_refptr<base::debug::ConvertableToTraceFormat> FromValue( | |
| 62 base::Value* value) { | |
| 63 return scoped_refptr<base::debug::ConvertableToTraceFormat>( | |
| 64 new TracedValue(value)); | |
| 65 } | |
| 66 virtual void AppendAsTraceFormat(std::string* out) const OVERRIDE { | |
| 67 std::string tmp; | |
| 68 base::JSONWriter::Write(value_.get(), &tmp); | |
| 69 *out += tmp; | |
| 70 } | |
| 71 | |
| 72 private: | |
| 73 virtual ~TracedValue() {} | |
| 74 scoped_ptr<base::Value> value_; | |
| 75 | |
| 76 DISALLOW_COPY_AND_ASSIGN(TracedValue); | |
| 77 }; | |
| 78 | |
| 57 } // namespace | 79 } // namespace |
| 58 | 80 |
| 59 BrowserViewRenderer::BrowserViewRenderer( | 81 BrowserViewRenderer::BrowserViewRenderer( |
| 60 BrowserViewRendererClient* client, | 82 BrowserViewRendererClient* client, |
| 61 SharedRendererState* shared_renderer_state, | 83 SharedRendererState* shared_renderer_state, |
| 62 content::WebContents* web_contents, | 84 content::WebContents* web_contents, |
| 63 const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner) | 85 const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner) |
| 64 : client_(client), | 86 : client_(client), |
| 65 shared_renderer_state_(shared_renderer_state), | 87 shared_renderer_state_(shared_renderer_state), |
| 66 web_contents_(web_contents), | 88 web_contents_(web_contents), |
| (...skipping 277 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 344 return; | 366 return; |
| 345 } | 367 } |
| 346 TRACE_EVENT_INSTANT0("android_webview", | 368 TRACE_EVENT_INSTANT0("android_webview", |
| 347 "BrowserViewRenderer::DidUpdateContent", | 369 "BrowserViewRenderer::DidUpdateContent", |
| 348 TRACE_EVENT_SCOPE_THREAD); | 370 TRACE_EVENT_SCOPE_THREAD); |
| 349 clear_view_ = false; | 371 clear_view_ = false; |
| 350 if (on_new_picture_enable_) | 372 if (on_new_picture_enable_) |
| 351 client_->OnNewPicture(); | 373 client_->OnNewPicture(); |
| 352 } | 374 } |
| 353 | 375 |
| 354 void BrowserViewRenderer::SetMaxRootLayerScrollOffset( | |
| 355 gfx::Vector2dF new_value_dip) { | |
| 356 if (!ui_task_runner_->BelongsToCurrentThread()) { | |
| 357 ui_task_runner_->PostTask( | |
| 358 FROM_HERE, | |
| 359 base::Bind(&BrowserViewRenderer::SetMaxRootLayerScrollOffset, | |
| 360 ui_thread_weak_ptr_, | |
| 361 new_value_dip)); | |
| 362 return; | |
| 363 } | |
| 364 DCHECK_GT(dip_scale_, 0); | |
| 365 | |
| 366 max_scroll_offset_dip_ = new_value_dip; | |
| 367 DCHECK_LE(0, max_scroll_offset_dip_.x()); | |
| 368 DCHECK_LE(0, max_scroll_offset_dip_.y()); | |
| 369 | |
| 370 client_->SetMaxContainerViewScrollOffset(max_scroll_offset()); | |
| 371 } | |
| 372 | |
| 373 void BrowserViewRenderer::SetTotalRootLayerScrollOffset( | 376 void BrowserViewRenderer::SetTotalRootLayerScrollOffset( |
| 374 gfx::Vector2dF scroll_offset_dip) { | 377 gfx::Vector2dF scroll_offset_dip) { |
| 375 if (!ui_task_runner_->BelongsToCurrentThread()) { | 378 if (!ui_task_runner_->BelongsToCurrentThread()) { |
| 376 ui_task_runner_->PostTask( | 379 ui_task_runner_->PostTask( |
| 377 FROM_HERE, | 380 FROM_HERE, |
| 378 base::Bind(&BrowserViewRenderer::SetTotalRootLayerScrollOffset, | 381 base::Bind(&BrowserViewRenderer::SetTotalRootLayerScrollOffset, |
| 379 ui_thread_weak_ptr_, | 382 ui_thread_weak_ptr_, |
| 380 scroll_offset_dip)); | 383 scroll_offset_dip)); |
| 381 return; | 384 return; |
| 382 } | 385 } |
| 386 TRACE_EVENT2("android_webview", | |
| 387 "BrowserViewRenderer::SetTotalRootLayerScrollOffset", | |
| 388 "x", | |
| 389 scroll_offset_dip.x(), | |
| 390 "y", | |
| 391 scroll_offset_dip.y()); | |
| 383 | 392 |
| 384 { | 393 { |
| 385 base::AutoLock lock(scroll_offset_dip_lock_); | 394 base::AutoLock lock(scroll_offset_dip_lock_); |
| 386 // TOOD(mkosiba): Add a DCHECK to say that this does _not_ get called during | 395 // TOOD(mkosiba): Add a DCHECK to say that this does _not_ get called during |
| 387 // DrawGl when http://crbug.com/249972 is fixed. | 396 // DrawGl when http://crbug.com/249972 is fixed. |
| 388 if (scroll_offset_dip_ == scroll_offset_dip) | 397 if (scroll_offset_dip_ == scroll_offset_dip) |
| 389 return; | 398 return; |
| 390 | 399 |
| 391 scroll_offset_dip_ = scroll_offset_dip; | 400 scroll_offset_dip_ = scroll_offset_dip; |
| 392 } | 401 } |
| 393 | 402 |
| 394 gfx::Vector2d max_offset = max_scroll_offset(); | 403 gfx::Vector2d max_offset = max_scroll_offset(); |
| 395 gfx::Vector2d scroll_offset; | 404 gfx::Vector2d scroll_offset; |
| 396 // For an explanation as to why this is done this way see the comment in | 405 // For an explanation as to why this is done this way see the comment in |
| 397 // BrowserViewRenderer::ScrollTo. | 406 // BrowserViewRenderer::ScrollTo. |
| 398 if (max_scroll_offset_dip_.x()) { | 407 if (max_scroll_offset_dip_.x()) { |
| 399 scroll_offset.set_x((scroll_offset_dip.x() * max_offset.x()) / | 408 scroll_offset.set_x((scroll_offset_dip.x() * max_offset.x()) / |
| 400 max_scroll_offset_dip_.x()); | 409 max_scroll_offset_dip_.x()); |
| 401 } | 410 } |
| 402 | 411 |
| 403 if (max_scroll_offset_dip_.y()) { | 412 if (max_scroll_offset_dip_.y()) { |
| 404 scroll_offset.set_y((scroll_offset_dip.y() * max_offset.y()) / | 413 scroll_offset.set_y((scroll_offset_dip.y() * max_offset.y()) / |
| 405 max_scroll_offset_dip_.y()); | 414 max_scroll_offset_dip_.y()); |
| 406 } | 415 } |
| 407 | 416 |
| 408 DCHECK(0 <= scroll_offset.x()); | 417 DCHECK(0 <= scroll_offset.x()); |
| 409 DCHECK(0 <= scroll_offset.y()); | 418 DCHECK(0 <= scroll_offset.y()); |
| 410 // Disabled because the conditions are being violated while running | 419 DCHECK(scroll_offset.x() <= max_offset.x()); |
| 411 // AwZoomTest.testMagnification, see http://crbug.com/340648 | 420 DCHECK(scroll_offset.y() <= max_offset.y()); |
| 412 // DCHECK(scroll_offset.x() <= max_offset.x()); | |
| 413 // DCHECK(scroll_offset.y() <= max_offset.y()); | |
| 414 | 421 |
| 415 client_->ScrollContainerViewTo(scroll_offset); | 422 client_->ScrollContainerViewTo(scroll_offset); |
| 416 } | 423 } |
| 417 | 424 |
| 418 gfx::Vector2dF BrowserViewRenderer::GetTotalRootLayerScrollOffset() { | 425 gfx::Vector2dF BrowserViewRenderer::GetTotalRootLayerScrollOffset() { |
| 419 base::AutoLock lock(scroll_offset_dip_lock_); | 426 base::AutoLock lock(scroll_offset_dip_lock_); |
| 420 return scroll_offset_dip_; | 427 return scroll_offset_dip_; |
| 421 } | 428 } |
| 422 | 429 |
| 423 bool BrowserViewRenderer::IsExternalFlingActive() const { | 430 bool BrowserViewRenderer::IsExternalFlingActive() const { |
| 424 if (!ui_task_runner_->BelongsToCurrentThread()) { | 431 if (!ui_task_runner_->BelongsToCurrentThread()) { |
| 425 // TODO(boliu): This is short term hack since we cannot call into | 432 // TODO(boliu): This is short term hack since we cannot call into |
| 426 // view system on non-UI thread. | 433 // view system on non-UI thread. |
| 427 return false; | 434 return false; |
| 428 } | 435 } |
| 429 return client_->IsFlingActive(); | 436 return client_->IsFlingActive(); |
| 430 } | 437 } |
| 431 | 438 |
| 432 void BrowserViewRenderer::SetRootLayerPageScaleFactorAndLimits( | 439 void BrowserViewRenderer::UpdateRootLayerState( |
| 440 const gfx::Vector2dF& total_scroll_offset_dip, | |
| 441 const gfx::Vector2dF& max_scroll_offset_dip, | |
| 442 const gfx::SizeF& scrollable_size_dip, | |
| 433 float page_scale_factor, | 443 float page_scale_factor, |
| 434 float min_page_scale_factor, | 444 float min_page_scale_factor, |
| 435 float max_page_scale_factor) { | 445 float max_page_scale_factor) { |
| 436 if (!ui_task_runner_->BelongsToCurrentThread()) { | 446 if (!ui_task_runner_->BelongsToCurrentThread()) { |
| 437 ui_task_runner_->PostTask( | 447 ui_task_runner_->PostTask( |
| 438 FROM_HERE, | 448 FROM_HERE, |
| 439 base::Bind(&BrowserViewRenderer::SetRootLayerPageScaleFactorAndLimits, | 449 base::Bind(&BrowserViewRenderer::UpdateRootLayerState, |
| 440 ui_thread_weak_ptr_, | 450 ui_thread_weak_ptr_, |
| 451 total_scroll_offset_dip, | |
| 452 max_scroll_offset_dip, | |
| 453 scrollable_size_dip, | |
| 441 page_scale_factor, | 454 page_scale_factor, |
| 442 min_page_scale_factor, | 455 min_page_scale_factor, |
| 443 max_page_scale_factor)); | 456 max_page_scale_factor)); |
| 444 return; | 457 return; |
| 445 } | 458 } |
| 459 { | |
| 460 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue); | |
|
boliu
2014/04/30 05:48:42
Isn't this gonna be slow in production?
I think i
mkosiba (inactive)
2014/05/01 11:13:25
Done. The main reason for adding these is that we'
| |
| 461 state->SetDouble("total_scroll_offset_dip.x", total_scroll_offset_dip.x()); | |
| 462 state->SetDouble("total_scroll_offset_dip.y", total_scroll_offset_dip.y()); | |
| 463 | |
| 464 state->SetDouble("max_scroll_offset_dip.x", max_scroll_offset_dip.x()); | |
| 465 state->SetDouble("max_scroll_offset_dip.y", max_scroll_offset_dip.y()); | |
| 466 | |
| 467 state->SetDouble("scrollable_size_dip.width", scrollable_size_dip.width()); | |
| 468 state->SetDouble("scrollable_size_dip.height", | |
| 469 scrollable_size_dip.height()); | |
| 470 | |
| 471 state->SetDouble("page_scale_factor", page_scale_factor); | |
| 472 state->SetDouble("min_page_scale_factor", min_page_scale_factor); | |
| 473 state->SetDouble("max_page_scale_factor", max_page_scale_factor); | |
| 474 | |
| 475 TRACE_EVENT_INSTANT1("android_webview", | |
| 476 "BrowserViewRenderer::UpdateRootLayerState", | |
| 477 TRACE_EVENT_SCOPE_THREAD, | |
| 478 "state", | |
| 479 TracedValue::FromValue(state.release())); | |
| 480 } | |
| 481 | |
| 482 DCHECK_GT(dip_scale_, 0); | |
| 483 | |
| 484 max_scroll_offset_dip_ = max_scroll_offset_dip; | |
| 485 DCHECK_LE(0, max_scroll_offset_dip_.x()); | |
| 486 DCHECK_LE(0, max_scroll_offset_dip_.y()); | |
| 487 | |
| 446 page_scale_factor_ = page_scale_factor; | 488 page_scale_factor_ = page_scale_factor; |
| 447 DCHECK_GT(page_scale_factor_, 0); | 489 DCHECK_GT(page_scale_factor_, 0); |
| 448 client_->SetPageScaleFactorAndLimits( | |
| 449 page_scale_factor, min_page_scale_factor, max_page_scale_factor); | |
| 450 client_->SetMaxContainerViewScrollOffset(max_scroll_offset()); | |
| 451 } | |
| 452 | 490 |
| 453 void BrowserViewRenderer::SetRootLayerScrollableSize( | 491 client_->UpdateScrollState(max_scroll_offset(), |
| 454 gfx::SizeF scrollable_size) { | 492 scrollable_size_dip, |
| 455 if (!ui_task_runner_->BelongsToCurrentThread()) { | 493 page_scale_factor, |
| 456 ui_task_runner_->PostTask( | 494 min_page_scale_factor, |
| 457 FROM_HERE, | 495 max_page_scale_factor); |
| 458 base::Bind(&BrowserViewRenderer::SetRootLayerScrollableSize, | 496 SetTotalRootLayerScrollOffset(total_scroll_offset_dip); |
| 459 ui_thread_weak_ptr_, | |
| 460 scrollable_size)); | |
| 461 return; | |
| 462 } | |
| 463 client_->SetContentsSize(scrollable_size); | |
| 464 } | 497 } |
| 465 | 498 |
| 466 void BrowserViewRenderer::DidOverscroll(gfx::Vector2dF accumulated_overscroll, | 499 void BrowserViewRenderer::DidOverscroll(gfx::Vector2dF accumulated_overscroll, |
| 467 gfx::Vector2dF latest_overscroll_delta, | 500 gfx::Vector2dF latest_overscroll_delta, |
| 468 gfx::Vector2dF current_fling_velocity) { | 501 gfx::Vector2dF current_fling_velocity) { |
| 469 if (!ui_task_runner_->BelongsToCurrentThread()) { | 502 if (!ui_task_runner_->BelongsToCurrentThread()) { |
| 470 ui_task_runner_->PostTask( | 503 ui_task_runner_->PostTask( |
| 471 FROM_HERE, | 504 FROM_HERE, |
| 472 base::Bind(&BrowserViewRenderer::DidOverscroll, | 505 base::Bind(&BrowserViewRenderer::DidOverscroll, |
| 473 ui_thread_weak_ptr_, | 506 ui_thread_weak_ptr_, |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 598 base::StringAppendF(&str, | 631 base::StringAppendF(&str, |
| 599 "surface width height: [%d %d] ", | 632 "surface width height: [%d %d] ", |
| 600 draw_info->width, | 633 draw_info->width, |
| 601 draw_info->height); | 634 draw_info->height); |
| 602 base::StringAppendF(&str, "is_layer: %d ", draw_info->is_layer); | 635 base::StringAppendF(&str, "is_layer: %d ", draw_info->is_layer); |
| 603 } | 636 } |
| 604 return str; | 637 return str; |
| 605 } | 638 } |
| 606 | 639 |
| 607 } // namespace android_webview | 640 } // namespace android_webview |
| OLD | NEW |