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

Side by Side Diff: android_webview/browser/browser_view_renderer.cc

Issue 256303006: Make LayerScrollOffsetDelegate updates consistent. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: less jni Created 6 years, 7 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
OLDNEW
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698