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
3 // found in the LICENSE file.
8 #include "base/android/jni_android.h"
9 #include "base/android/jni_string.h"
10 #include "base/android/scoped_java_ref.h"
11 #include "base/basictypes.h"
12 #include "base/lazy_instance.h"
13 #include "base/logging.h"
14 #include "content/browser/android/content_view_statics.h"
15 #include "content/common/android/address_parser.h"
16 #include "content/common/view_messages.h"
17 #include "content/public/browser/render_process_host.h"
18 #include "jni/ContentViewStatics_jni.h"
20 using base::android::ConvertJavaStringToUTF16
;
21 using base::android::ConvertUTF16ToJavaString
;
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 // blink::Platform::SuspendSharedTimer.
28 // TODO(pliard): http://crbug.com/235912. Add unit tests for WebKit shared timer
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
;
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));
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));
63 // Returns the first substring consisting of the address of a physical location.
64 static jstring
FindAddress(JNIEnv
* env
, jclass clazz
, jstring addr
) {
65 base::string16 content_16
= ConvertJavaStringToUTF16(env
, addr
);
66 base::string16 result_16
;
67 if (content::address_parser::FindAddress(content_16
, &result_16
))
68 return ConvertUTF16ToJavaString(env
, result_16
).Release();
72 static void SetWebKitSharedTimersSuspended(JNIEnv
* env
,
75 std::vector
<int>* suspended_processes
= g_suspended_processes
.Pointer();
77 DCHECK(suspended_processes
->empty());
78 SuspendWebKitSharedTimers(suspended_processes
);
80 ResumeWebkitSharedTimers(*suspended_processes
);
81 suspended_processes
->clear();
87 bool RegisterWebViewStatics(JNIEnv
* env
) {
88 return RegisterNativesImpl(env
) >= 0;
91 } // namespace content