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

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

Issue 14297022: Resume WebKit shared timers only in previously suspended processes. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Address Jonathan's comments Created 7 years, 8 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 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 <jni.h> 5 #include <jni.h>
6 #include <vector>
6 7
7 #include "base/android/jni_android.h" 8 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h" 9 #include "base/android/jni_string.h"
9 #include "base/android/scoped_java_ref.h" 10 #include "base/android/scoped_java_ref.h"
10 #include "base/basictypes.h" 11 #include "base/basictypes.h"
12 #include "base/lazy_instance.h"
11 #include "base/logging.h" 13 #include "base/logging.h"
12 #include "content/browser/android/content_view_statics.h" 14 #include "content/browser/android/content_view_statics.h"
13 #include "content/common/android/address_parser.h" 15 #include "content/common/android/address_parser.h"
14 #include "content/common/view_messages.h" 16 #include "content/common/view_messages.h"
15 #include "content/public/browser/render_process_host.h" 17 #include "content/public/browser/render_process_host.h"
16
17 #include "jni/ContentViewStatics_jni.h" 18 #include "jni/ContentViewStatics_jni.h"
18 19
19 using base::android::ConvertJavaStringToUTF16; 20 using base::android::ConvertJavaStringToUTF16;
20 using base::android::ConvertUTF16ToJavaString; 21 using base::android::ConvertUTF16ToJavaString;
21 using base::android::ScopedJavaLocalRef;
22 22
23 namespace {
23 24
24 // Return the first substring consisting of the address of a physical location. 25 // TODO(pliard): http://crbug.com/235909. Move WebKit shared timer toggling
26 // functionality out of ContentViewStatistics and not be build on top of
27 // WebKit::Platform::SuspendSharedTimer.
28 // TODO(pliard): http://crbug.com/235912. Add unit tests for WebKit shared timer
29 // toggling.
30
31 // This tracks the renderer processes that received a suspend request. It's
32 // important on resume to only resume the renderer processes that were actually
33 // suspended as opposed to all the current renderer processes because the
34 // suspend calls are refcounted within WebKitPlatformSupport and it expects a
35 // perfectly matched number of resume calls.
36 // Note that this vector is only accessed from the UI thread.
37 base::LazyInstance<std::vector<int /* process id */> > g_suspended_processes =
38 LAZY_INSTANCE_INITIALIZER;
39
40 // Suspends timers in all current render processes.
41 void SuspendWebKitSharedTimers(std::vector<int>* suspended_processes) {
42 for (content::RenderProcessHost::iterator i(
43 content::RenderProcessHost::AllHostsIterator());
44 !i.IsAtEnd(); i.Advance()) {
45 content::RenderProcessHost* host = i.GetCurrentValue();
46 suspended_processes->push_back(host->GetID());
47 host->Send(new ViewMsg_SetWebKitSharedTimersSuspended(true));
48 }
49 }
50
51 // Resumes timers in processes that were previously stopped.
52 void ResumeWebkitSharedTimers(const std::vector<int>& suspended_processes) {
53 for (std::vector<int>::const_iterator it = suspended_processes.begin();
54 it != suspended_processes.end(); ++it) {
55 content::RenderProcessHost* host = content::RenderProcessHost::FromID(*it);
56 if (host) // The process might have been killed since it was suspended.
57 host->Send(new ViewMsg_SetWebKitSharedTimersSuspended(false));
58 }
59 }
60
61 } // namespace
62
63 // Returns the first substring consisting of the address of a physical location.
25 static jstring FindAddress(JNIEnv* env, jclass clazz, jstring addr) { 64 static jstring FindAddress(JNIEnv* env, jclass clazz, jstring addr) {
26 string16 content_16 = ConvertJavaStringToUTF16(env, addr); 65 string16 content_16 = ConvertJavaStringToUTF16(env, addr);
27 string16 result_16; 66 string16 result_16;
28 if (content::address_parser::FindAddress(content_16, &result_16)) 67 if (content::address_parser::FindAddress(content_16, &result_16))
29 return ConvertUTF16ToJavaString(env, result_16).Release(); 68 return ConvertUTF16ToJavaString(env, result_16).Release();
30 return NULL; 69 return NULL;
31 } 70 }
32 71
33 static void SetWebKitSharedTimersSuspended(JNIEnv* env, 72 static void SetWebKitSharedTimersSuspended(JNIEnv* env,
34 jclass obj, 73 jclass obj,
35 jboolean suspend) { 74 jboolean suspend) {
36 for (content::RenderProcessHost::iterator i = 75 std::vector<int>* suspended_processes = g_suspended_processes.Pointer();
37 content::RenderProcessHost::AllHostsIterator(); 76 if (suspend) {
38 !i.IsAtEnd(); 77 DCHECK(suspended_processes->empty());
39 i.Advance()) { 78 SuspendWebKitSharedTimers(suspended_processes);
40 content::RenderProcessHost* host = i.GetCurrentValue(); 79 } else {
41 host->Send(new ViewMsg_SetWebKitSharedTimersSuspended(suspend)); 80 ResumeWebkitSharedTimers(*suspended_processes);
81 suspended_processes->clear();
42 } 82 }
43 } 83 }
44 84
45 namespace content { 85 namespace content {
46 86
47 bool RegisterWebViewStatics(JNIEnv* env) { 87 bool RegisterWebViewStatics(JNIEnv* env) {
48 return RegisterNativesImpl(env) >= 0; 88 return RegisterNativesImpl(env) >= 0;
49 } 89 }
50 90
51 } // namespace content 91 } // namespace content
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698