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 |