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

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: 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 "third_party/skia/include/core/SkPictureRecorder.h" 21 #include "third_party/skia/include/core/SkPictureRecorder.h"
21 #include "ui/gfx/vector2d_conversions.h" 22 #include "ui/gfx/vector2d_conversions.h"
22 23
(...skipping 25 matching lines...) Expand all
48 } 49 }
49 50
50 private: 51 private:
51 gfx::Vector2dF* scoped_variable_; 52 gfx::Vector2dF* scoped_variable_;
52 gfx::Vector2dF original_value_; 53 gfx::Vector2dF original_value_;
53 base::Lock& lock_; 54 base::Lock& lock_;
54 55
55 DISALLOW_COPY_AND_ASSIGN(AutoResetWithLock); 56 DISALLOW_COPY_AND_ASSIGN(AutoResetWithLock);
56 }; 57 };
57 58
59 class TracedValue : public base::debug::ConvertableToTraceFormat {
60 public:
61 explicit TracedValue(base::Value* value) : value_(value) {}
62 static scoped_refptr<base::debug::ConvertableToTraceFormat> FromValue(
63 base::Value* value) {
64 return scoped_refptr<base::debug::ConvertableToTraceFormat>(
65 new TracedValue(value));
66 }
67 virtual void AppendAsTraceFormat(std::string* out) const OVERRIDE {
68 std::string tmp;
69 base::JSONWriter::Write(value_.get(), &tmp);
70 *out += tmp;
71 }
72
73 private:
74 virtual ~TracedValue() {}
75 scoped_ptr<base::Value> value_;
76
77 DISALLOW_COPY_AND_ASSIGN(TracedValue);
78 };
79
58 } // namespace 80 } // namespace
59 81
60 BrowserViewRenderer::BrowserViewRenderer( 82 BrowserViewRenderer::BrowserViewRenderer(
61 BrowserViewRendererClient* client, 83 BrowserViewRendererClient* client,
62 SharedRendererState* shared_renderer_state, 84 SharedRendererState* shared_renderer_state,
63 content::WebContents* web_contents, 85 content::WebContents* web_contents,
64 const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner) 86 const scoped_refptr<base::SingleThreadTaskRunner>& ui_task_runner)
65 : client_(client), 87 : client_(client),
66 shared_renderer_state_(shared_renderer_state), 88 shared_renderer_state_(shared_renderer_state),
67 web_contents_(web_contents), 89 web_contents_(web_contents),
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
324 DCHECK_LE(scroll_offset_dip.y(), max_scroll_offset_dip_.y()); 346 DCHECK_LE(scroll_offset_dip.y(), max_scroll_offset_dip_.y());
325 347
326 { 348 {
327 base::AutoLock lock(scroll_offset_dip_lock_); 349 base::AutoLock lock(scroll_offset_dip_lock_);
328 if (scroll_offset_dip_ == scroll_offset_dip) 350 if (scroll_offset_dip_ == scroll_offset_dip)
329 return; 351 return;
330 352
331 scroll_offset_dip_ = scroll_offset_dip; 353 scroll_offset_dip_ = scroll_offset_dip;
332 } 354 }
333 355
356 TRACE_EVENT2("android_webview",
boliu 2014/05/01 16:31:50 I'm nit picking TRACE_EVENTs... Can these new tra
mkosiba (inactive) 2014/05/01 16:42:22 good call. This is probably my 2nd time adding tra
357 "BrowserViewRenderer::ScrollTo",
358 "x",
359 scroll_offset_dip.x(),
360 "y",
361 scroll_offset_dip.y());
362
334 if (has_compositor_) 363 if (has_compositor_)
335 shared_renderer_state_->GetCompositor()-> 364 shared_renderer_state_->GetCompositor()->
336 DidChangeRootLayerScrollOffset(); 365 DidChangeRootLayerScrollOffset();
337 } 366 }
338 367
339 void BrowserViewRenderer::DidUpdateContent() { 368 void BrowserViewRenderer::DidUpdateContent() {
340 if (!ui_task_runner_->BelongsToCurrentThread()) { 369 if (!ui_task_runner_->BelongsToCurrentThread()) {
341 ui_task_runner_->PostTask(FROM_HERE, 370 ui_task_runner_->PostTask(FROM_HERE,
342 base::Bind(&BrowserViewRenderer::DidUpdateContent, 371 base::Bind(&BrowserViewRenderer::DidUpdateContent,
343 ui_thread_weak_ptr_)); 372 ui_thread_weak_ptr_));
344 return; 373 return;
345 } 374 }
346 TRACE_EVENT_INSTANT0("android_webview", 375 TRACE_EVENT_INSTANT0("android_webview",
347 "BrowserViewRenderer::DidUpdateContent", 376 "BrowserViewRenderer::DidUpdateContent",
348 TRACE_EVENT_SCOPE_THREAD); 377 TRACE_EVENT_SCOPE_THREAD);
349 clear_view_ = false; 378 clear_view_ = false;
350 if (on_new_picture_enable_) 379 if (on_new_picture_enable_)
351 client_->OnNewPicture(); 380 client_->OnNewPicture();
352 } 381 }
353 382
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( 383 void BrowserViewRenderer::SetTotalRootLayerScrollOffset(
374 gfx::Vector2dF scroll_offset_dip) { 384 gfx::Vector2dF scroll_offset_dip) {
375 if (!ui_task_runner_->BelongsToCurrentThread()) { 385 if (!ui_task_runner_->BelongsToCurrentThread()) {
376 ui_task_runner_->PostTask( 386 ui_task_runner_->PostTask(
377 FROM_HERE, 387 FROM_HERE,
378 base::Bind(&BrowserViewRenderer::SetTotalRootLayerScrollOffset, 388 base::Bind(&BrowserViewRenderer::SetTotalRootLayerScrollOffset,
379 ui_thread_weak_ptr_, 389 ui_thread_weak_ptr_,
380 scroll_offset_dip)); 390 scroll_offset_dip));
381 return; 391 return;
382 } 392 }
383 393
384 { 394 {
385 base::AutoLock lock(scroll_offset_dip_lock_); 395 base::AutoLock lock(scroll_offset_dip_lock_);
386 // TOOD(mkosiba): Add a DCHECK to say that this does _not_ get called during 396 // TOOD(mkosiba): Add a DCHECK to say that this does _not_ get called during
387 // DrawGl when http://crbug.com/249972 is fixed. 397 // DrawGl when http://crbug.com/249972 is fixed.
388 if (scroll_offset_dip_ == scroll_offset_dip) 398 if (scroll_offset_dip_ == scroll_offset_dip)
389 return; 399 return;
390 400
391 scroll_offset_dip_ = scroll_offset_dip; 401 scroll_offset_dip_ = scroll_offset_dip;
392 } 402 }
393 403
404 TRACE_EVENT2("android_webview",
405 "BrowserViewRenderer::SetTotalRootLayerScrollOffset",
406 "x",
407 scroll_offset_dip.x(),
408 "y",
409 scroll_offset_dip.y());
410
394 gfx::Vector2d max_offset = max_scroll_offset(); 411 gfx::Vector2d max_offset = max_scroll_offset();
395 gfx::Vector2d scroll_offset; 412 gfx::Vector2d scroll_offset;
396 // For an explanation as to why this is done this way see the comment in 413 // For an explanation as to why this is done this way see the comment in
397 // BrowserViewRenderer::ScrollTo. 414 // BrowserViewRenderer::ScrollTo.
398 if (max_scroll_offset_dip_.x()) { 415 if (max_scroll_offset_dip_.x()) {
399 scroll_offset.set_x((scroll_offset_dip.x() * max_offset.x()) / 416 scroll_offset.set_x((scroll_offset_dip.x() * max_offset.x()) /
400 max_scroll_offset_dip_.x()); 417 max_scroll_offset_dip_.x());
401 } 418 }
402 419
403 if (max_scroll_offset_dip_.y()) { 420 if (max_scroll_offset_dip_.y()) {
404 scroll_offset.set_y((scroll_offset_dip.y() * max_offset.y()) / 421 scroll_offset.set_y((scroll_offset_dip.y() * max_offset.y()) /
405 max_scroll_offset_dip_.y()); 422 max_scroll_offset_dip_.y());
406 } 423 }
407 424
408 DCHECK(0 <= scroll_offset.x()); 425 DCHECK(0 <= scroll_offset.x());
409 DCHECK(0 <= scroll_offset.y()); 426 DCHECK(0 <= scroll_offset.y());
410 // Disabled because the conditions are being violated while running 427 DCHECK(scroll_offset.x() <= max_offset.x());
411 // AwZoomTest.testMagnification, see http://crbug.com/340648 428 DCHECK(scroll_offset.y() <= max_offset.y());
412 // DCHECK(scroll_offset.x() <= max_offset.x());
413 // DCHECK(scroll_offset.y() <= max_offset.y());
414 429
415 client_->ScrollContainerViewTo(scroll_offset); 430 client_->ScrollContainerViewTo(scroll_offset);
416 } 431 }
417 432
418 gfx::Vector2dF BrowserViewRenderer::GetTotalRootLayerScrollOffset() { 433 gfx::Vector2dF BrowserViewRenderer::GetTotalRootLayerScrollOffset() {
419 base::AutoLock lock(scroll_offset_dip_lock_); 434 base::AutoLock lock(scroll_offset_dip_lock_);
420 return scroll_offset_dip_; 435 return scroll_offset_dip_;
421 } 436 }
422 437
423 bool BrowserViewRenderer::IsExternalFlingActive() const { 438 bool BrowserViewRenderer::IsExternalFlingActive() const {
424 if (!ui_task_runner_->BelongsToCurrentThread()) { 439 if (!ui_task_runner_->BelongsToCurrentThread()) {
425 // TODO(boliu): This is short term hack since we cannot call into 440 // TODO(boliu): This is short term hack since we cannot call into
426 // view system on non-UI thread. 441 // view system on non-UI thread.
427 return false; 442 return false;
428 } 443 }
429 return client_->IsFlingActive(); 444 return client_->IsFlingActive();
430 } 445 }
431 446
432 void BrowserViewRenderer::SetRootLayerPageScaleFactorAndLimits( 447 void BrowserViewRenderer::UpdateRootLayerState(
448 const gfx::Vector2dF& total_scroll_offset_dip,
449 const gfx::Vector2dF& max_scroll_offset_dip,
450 const gfx::SizeF& scrollable_size_dip,
433 float page_scale_factor, 451 float page_scale_factor,
434 float min_page_scale_factor, 452 float min_page_scale_factor,
435 float max_page_scale_factor) { 453 float max_page_scale_factor) {
436 if (!ui_task_runner_->BelongsToCurrentThread()) { 454 if (!ui_task_runner_->BelongsToCurrentThread()) {
437 ui_task_runner_->PostTask( 455 ui_task_runner_->PostTask(
438 FROM_HERE, 456 FROM_HERE,
439 base::Bind(&BrowserViewRenderer::SetRootLayerPageScaleFactorAndLimits, 457 base::Bind(&BrowserViewRenderer::UpdateRootLayerState,
440 ui_thread_weak_ptr_, 458 ui_thread_weak_ptr_,
459 total_scroll_offset_dip,
460 max_scroll_offset_dip,
461 scrollable_size_dip,
441 page_scale_factor, 462 page_scale_factor,
442 min_page_scale_factor, 463 min_page_scale_factor,
443 max_page_scale_factor)); 464 max_page_scale_factor));
444 return; 465 return;
445 } 466 }
467 TRACE_EVENT_INSTANT1(
468 "android_webview",
469 "BrowserViewRenderer::UpdateRootLayerState",
470 TRACE_EVENT_SCOPE_THREAD,
471 "state",
472 TracedValue::FromValue(
473 RootLayerStateAsValue(scrollable_size_dip).release()));
474
475 DCHECK_GT(dip_scale_, 0);
476
477 max_scroll_offset_dip_ = max_scroll_offset_dip;
478 DCHECK_LE(0, max_scroll_offset_dip_.x());
479 DCHECK_LE(0, max_scroll_offset_dip_.y());
480
446 page_scale_factor_ = page_scale_factor; 481 page_scale_factor_ = page_scale_factor;
447 DCHECK_GT(page_scale_factor_, 0); 482 DCHECK_GT(page_scale_factor_, 0);
448 client_->SetPageScaleFactorAndLimits( 483
449 page_scale_factor, min_page_scale_factor, max_page_scale_factor); 484 client_->UpdateScrollState(max_scroll_offset(),
450 client_->SetMaxContainerViewScrollOffset(max_scroll_offset()); 485 scrollable_size_dip,
486 page_scale_factor,
487 min_page_scale_factor,
488 max_page_scale_factor);
489 SetTotalRootLayerScrollOffset(total_scroll_offset_dip);
451 } 490 }
452 491
453 void BrowserViewRenderer::SetRootLayerScrollableSize( 492 scoped_ptr<base::Value> BrowserViewRenderer::RootLayerStateAsValue(
454 gfx::SizeF scrollable_size) { 493 const gfx::SizeF& scrollable_size_dip) {
455 if (!ui_task_runner_->BelongsToCurrentThread()) { 494 scoped_ptr<base::DictionaryValue> state(new base::DictionaryValue);
456 ui_task_runner_->PostTask( 495
457 FROM_HERE, 496 state->SetDouble("max_scroll_offset_dip.x", max_scroll_offset_dip_.x());
458 base::Bind(&BrowserViewRenderer::SetRootLayerScrollableSize, 497 state->SetDouble("max_scroll_offset_dip.y", max_scroll_offset_dip_.y());
459 ui_thread_weak_ptr_, 498
460 scrollable_size)); 499 state->SetDouble("scrollable_size_dip.width", scrollable_size_dip.width());
461 return; 500 state->SetDouble("scrollable_size_dip.height", scrollable_size_dip.height());
462 } 501
463 client_->SetContentsSize(scrollable_size); 502 state->SetDouble("page_scale_factor", page_scale_factor_);
503 return state.PassAs<base::Value>();
464 } 504 }
465 505
466 void BrowserViewRenderer::DidOverscroll(gfx::Vector2dF accumulated_overscroll, 506 void BrowserViewRenderer::DidOverscroll(gfx::Vector2dF accumulated_overscroll,
467 gfx::Vector2dF latest_overscroll_delta, 507 gfx::Vector2dF latest_overscroll_delta,
468 gfx::Vector2dF current_fling_velocity) { 508 gfx::Vector2dF current_fling_velocity) {
469 if (!ui_task_runner_->BelongsToCurrentThread()) { 509 if (!ui_task_runner_->BelongsToCurrentThread()) {
470 ui_task_runner_->PostTask( 510 ui_task_runner_->PostTask(
471 FROM_HERE, 511 FROM_HERE,
472 base::Bind(&BrowserViewRenderer::DidOverscroll, 512 base::Bind(&BrowserViewRenderer::DidOverscroll,
473 ui_thread_weak_ptr_, 513 ui_thread_weak_ptr_,
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
598 base::StringAppendF(&str, 638 base::StringAppendF(&str,
599 "surface width height: [%d %d] ", 639 "surface width height: [%d %d] ",
600 draw_info->width, 640 draw_info->width,
601 draw_info->height); 641 draw_info->height);
602 base::StringAppendF(&str, "is_layer: %d ", draw_info->is_layer); 642 base::StringAppendF(&str, "is_layer: %d ", draw_info->is_layer);
603 } 643 }
604 return str; 644 return str;
605 } 645 }
606 646
607 } // namespace android_webview 647 } // namespace android_webview
OLDNEW
« no previous file with comments | « android_webview/browser/browser_view_renderer.h ('k') | android_webview/browser/browser_view_renderer_client.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698