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

Side by Side Diff: content/browser/android/content_view_core_impl.cc

Issue 236193013: Android: Consolidate and simplify VSync logic (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: rebase 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 2012 The Chromium Authors. All rights reserved. 1 // Copyright 2012 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 "content/browser/android/content_view_core_impl.h" 5 #include "content/browser/android/content_view_core_impl.h"
6 6
7 #include "base/android/jni_android.h" 7 #include "base/android/jni_android.h"
8 #include "base/android/jni_array.h" 8 #include "base/android/jni_array.h"
9 #include "base/android/jni_string.h" 9 #include "base/android/jni_string.h"
10 #include "base/android/scoped_java_ref.h" 10 #include "base/android/scoped_java_ref.h"
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 #include "content/browser/android/popup_item_type_list.h" 80 #include "content/browser/android/popup_item_type_list.h"
81 #undef DEFINE_POPUP_ITEM_TYPE 81 #undef DEFINE_POPUP_ITEM_TYPE
82 }; 82 };
83 83
84 } //namespace 84 } //namespace
85 85
86 namespace content { 86 namespace content {
87 87
88 namespace { 88 namespace {
89 89
90 const unsigned int kDefaultVSyncIntervalMicros = 16666u;
91 // TODO(brianderson): Use adaptive draw-time estimation.
92 const float kDefaultBrowserCompositeVSyncFraction = 1.0f / 3;
93
94 const void* kContentViewUserDataKey = &kContentViewUserDataKey; 90 const void* kContentViewUserDataKey = &kContentViewUserDataKey;
95 91
96 int GetRenderProcessIdFromRenderViewHost(RenderViewHost* host) { 92 int GetRenderProcessIdFromRenderViewHost(RenderViewHost* host) {
97 DCHECK(host); 93 DCHECK(host);
98 RenderProcessHost* render_process = host->GetProcess(); 94 RenderProcessHost* render_process = host->GetProcess();
99 DCHECK(render_process); 95 DCHECK(render_process);
100 if (render_process->HasConnection()) 96 if (render_process->HasConnection())
101 return render_process->GetHandle(); 97 return render_process->GetHandle();
102 else 98 else
103 return 0; 99 return 0;
(...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after
216 ContentViewCoreImpl::ContentViewCoreImpl(JNIEnv* env, 212 ContentViewCoreImpl::ContentViewCoreImpl(JNIEnv* env,
217 jobject obj, 213 jobject obj,
218 WebContents* web_contents, 214 WebContents* web_contents,
219 ui::ViewAndroid* view_android, 215 ui::ViewAndroid* view_android,
220 ui::WindowAndroid* window_android) 216 ui::WindowAndroid* window_android)
221 : WebContentsObserver(web_contents), 217 : WebContentsObserver(web_contents),
222 java_ref_(env, obj), 218 java_ref_(env, obj),
223 web_contents_(static_cast<WebContentsImpl*>(web_contents)), 219 web_contents_(static_cast<WebContentsImpl*>(web_contents)),
224 root_layer_(cc::Layer::Create()), 220 root_layer_(cc::Layer::Create()),
225 dpi_scale_(GetPrimaryDisplayDeviceScaleFactor()), 221 dpi_scale_(GetPrimaryDisplayDeviceScaleFactor()),
226 vsync_interval_(base::TimeDelta::FromMicroseconds(
227 kDefaultVSyncIntervalMicros)),
228 expected_browser_composite_time_(base::TimeDelta::FromMicroseconds(
229 kDefaultVSyncIntervalMicros * kDefaultBrowserCompositeVSyncFraction)),
230 view_android_(view_android), 222 view_android_(view_android),
231 window_android_(window_android), 223 window_android_(window_android),
232 device_orientation_(0), 224 device_orientation_(0),
233 geolocation_needs_pause_(false) { 225 geolocation_needs_pause_(false) {
234 CHECK(web_contents) << 226 CHECK(web_contents) <<
235 "A ContentViewCoreImpl should be created with a valid WebContents."; 227 "A ContentViewCoreImpl should be created with a valid WebContents.";
236 228
237 // Currently, the only use case we have for overriding a user agent involves 229 // Currently, the only use case we have for overriding a user agent involves
238 // spoofing a desktop Linux user agent for "Request desktop site". 230 // spoofing a desktop Linux user agent for "Request desktop site".
239 // Automatically set it for all WebContents so that it is available when a 231 // Automatically set it for all WebContents so that it is available when a
(...skipping 188 matching lines...) Expand 10 before | Expand all | Expand 10 after
428 geolocation_needs_pause_ = false; 420 geolocation_needs_pause_ = false;
429 } 421 }
430 } 422 }
431 } 423 }
432 424
433 void ContentViewCoreImpl::OnTabCrashed() { 425 void ContentViewCoreImpl::OnTabCrashed() {
434 JNIEnv* env = AttachCurrentThread(); 426 JNIEnv* env = AttachCurrentThread();
435 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env); 427 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
436 if (obj.is_null()) 428 if (obj.is_null())
437 return; 429 return;
438 Java_ContentViewCore_resetVSyncNotification(env, obj.obj());
439 } 430 }
440 431
441 // All positions and sizes are in CSS pixels. 432 // All positions and sizes are in CSS pixels.
442 // Note that viewport_width/height is a best effort based. 433 // Note that viewport_width/height is a best effort based.
443 // ContentViewCore has the actual information about the physical viewport size. 434 // ContentViewCore has the actual information about the physical viewport size.
444 void ContentViewCoreImpl::UpdateFrameInfo( 435 void ContentViewCoreImpl::UpdateFrameInfo(
445 const gfx::Vector2dF& scroll_offset, 436 const gfx::Vector2dF& scroll_offset,
446 float page_scale_factor, 437 float page_scale_factor,
447 const gfx::Vector2dF& page_scale_factor_limits, 438 const gfx::Vector2dF& page_scale_factor_limits,
448 const gfx::SizeF& content_size, 439 const gfx::SizeF& content_size,
(...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 839
849 void ContentViewCoreImpl::RemoveLayer(scoped_refptr<cc::Layer> layer) { 840 void ContentViewCoreImpl::RemoveLayer(scoped_refptr<cc::Layer> layer) {
850 layer->RemoveFromParent(); 841 layer->RemoveFromParent();
851 } 842 }
852 843
853 void ContentViewCoreImpl::LoadUrl( 844 void ContentViewCoreImpl::LoadUrl(
854 NavigationController::LoadURLParams& params) { 845 NavigationController::LoadURLParams& params) {
855 GetWebContents()->GetController().LoadURLWithParams(params); 846 GetWebContents()->GetController().LoadURLWithParams(params);
856 } 847 }
857 848
858 void ContentViewCoreImpl::AddBeginFrameSubscriber() {
859 JNIEnv* env = AttachCurrentThread();
860 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
861 if (obj.is_null())
862 return;
863 Java_ContentViewCore_addVSyncSubscriber(env, obj.obj());
864 }
865
866 void ContentViewCoreImpl::RemoveBeginFrameSubscriber() {
867 JNIEnv* env = AttachCurrentThread();
868 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
869 if (obj.is_null())
870 return;
871 Java_ContentViewCore_removeVSyncSubscriber(env, obj.obj());
872 }
873
874 void ContentViewCoreImpl::SetNeedsAnimate() {
875 JNIEnv* env = AttachCurrentThread();
876 ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
877 if (obj.is_null())
878 return;
879 Java_ContentViewCore_setNeedsAnimate(env, obj.obj());
880 }
881
882 ui::ViewAndroid* ContentViewCoreImpl::GetViewAndroid() const { 849 ui::ViewAndroid* ContentViewCoreImpl::GetViewAndroid() const {
883 // view_android_ should never be null for Chrome. 850 // view_android_ should never be null for Chrome.
884 DCHECK(view_android_); 851 DCHECK(view_android_);
885 return view_android_; 852 return view_android_;
886 } 853 }
887 854
888 ui::WindowAndroid* ContentViewCoreImpl::GetWindowAndroid() const { 855 ui::WindowAndroid* ContentViewCoreImpl::GetWindowAndroid() const {
889 // This should never be NULL for Chrome, but will be NULL for WebView. 856 // This should never be NULL for Chrome, but will be NULL for WebView.
890 DCHECK(window_android_); 857 DCHECK(window_android_);
891 return window_android_; 858 return window_android_;
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after
1319 blink::WebBindings::releaseObject(bound_object); 1286 blink::WebBindings::releaseObject(bound_object);
1320 } 1287 }
1321 1288
1322 void ContentViewCoreImpl::RemoveJavascriptInterface(JNIEnv* env, 1289 void ContentViewCoreImpl::RemoveJavascriptInterface(JNIEnv* env,
1323 jobject /* obj */, 1290 jobject /* obj */,
1324 jstring name) { 1291 jstring name) {
1325 web_contents_->java_bridge_dispatcher_host_manager()->RemoveNamedObject( 1292 web_contents_->java_bridge_dispatcher_host_manager()->RemoveNamedObject(
1326 ConvertJavaStringToUTF16(env, name)); 1293 ConvertJavaStringToUTF16(env, name));
1327 } 1294 }
1328 1295
1329 void ContentViewCoreImpl::UpdateVSyncParameters(JNIEnv* env, jobject /* obj */,
1330 jlong timebase_micros,
1331 jlong interval_micros) {
1332 RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
1333 if (!view)
1334 return;
1335
1336 RenderWidgetHostImpl* host = RenderWidgetHostImpl::From(
1337 view->GetRenderWidgetHost());
1338
1339 host->UpdateVSyncParameters(
1340 base::TimeTicks::FromInternalValue(timebase_micros),
1341 base::TimeDelta::FromMicroseconds(interval_micros));
1342
1343 vsync_interval_ =
1344 base::TimeDelta::FromMicroseconds(interval_micros);
1345 expected_browser_composite_time_ =
1346 vsync_interval_ * kDefaultBrowserCompositeVSyncFraction;
1347 }
1348
1349 void ContentViewCoreImpl::OnVSync(JNIEnv* env, jobject /* obj */,
1350 jlong frame_time_micros) {
1351 base::TimeTicks frame_time =
1352 base::TimeTicks::FromInternalValue(frame_time_micros);
1353 SendBeginFrame(frame_time);
1354 }
1355
1356 void ContentViewCoreImpl::SendBeginFrame(base::TimeTicks frame_time) {
1357 RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
1358 if (!view)
1359 return;
1360
1361 base::TimeTicks display_time = frame_time + vsync_interval_;
1362 base::TimeTicks deadline = display_time - expected_browser_composite_time_;
1363
1364 view->SendBeginFrame(
1365 cc::BeginFrameArgs::Create(frame_time, deadline, vsync_interval_));
1366 }
1367
1368 jboolean ContentViewCoreImpl::OnAnimate(JNIEnv* env, jobject /* obj */,
1369 jlong frame_time_micros) {
1370 RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
1371 if (!view)
1372 return false;
1373
1374 return view->Animate(base::TimeTicks::FromInternalValue(frame_time_micros));
1375 }
1376
1377 void ContentViewCoreImpl::WasResized(JNIEnv* env, jobject obj) { 1296 void ContentViewCoreImpl::WasResized(JNIEnv* env, jobject obj) {
1378 RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid(); 1297 RenderWidgetHostViewAndroid* view = GetRenderWidgetHostViewAndroid();
1379 if (view) { 1298 if (view) {
1380 RenderWidgetHostImpl* host = RenderWidgetHostImpl::From( 1299 RenderWidgetHostImpl* host = RenderWidgetHostImpl::From(
1381 view->GetRenderWidgetHost()); 1300 view->GetRenderWidgetHost());
1382 host->SendScreenRects(); 1301 host->SendScreenRects();
1383 view->WasResized(); 1302 view->WasResized();
1384 } 1303 }
1385 } 1304 }
1386 1305
(...skipping 357 matching lines...) Expand 10 before | Expand all | Expand 10 after
1744 reinterpret_cast<ui::ViewAndroid*>(view_android), 1663 reinterpret_cast<ui::ViewAndroid*>(view_android),
1745 reinterpret_cast<ui::WindowAndroid*>(window_android)); 1664 reinterpret_cast<ui::WindowAndroid*>(window_android));
1746 return reinterpret_cast<intptr_t>(view); 1665 return reinterpret_cast<intptr_t>(view);
1747 } 1666 }
1748 1667
1749 bool RegisterContentViewCore(JNIEnv* env) { 1668 bool RegisterContentViewCore(JNIEnv* env) {
1750 return RegisterNativesImpl(env); 1669 return RegisterNativesImpl(env);
1751 } 1670 }
1752 1671
1753 } // namespace content 1672 } // namespace content
OLDNEW
« no previous file with comments | « content/browser/android/content_view_core_impl.h ('k') | content/browser/renderer_host/render_widget_host_view_android.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698