Home | History | Annotate | Download | only in android
      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.
      4 
      5 #include <jni.h>
      6 #include <vector>
      7 
      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"
     19 
     20 using base::android::ConvertJavaStringToUTF16;
     21 using base::android::ConvertUTF16ToJavaString;
     22 
     23 namespace {
     24 
     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.
     64 static jstring FindAddress(JNIEnv* env, jclass clazz, jstring addr) {
     65   string16 content_16 = ConvertJavaStringToUTF16(env, addr);
     66   string16 result_16;
     67   if (content::address_parser::FindAddress(content_16, &result_16))
     68     return ConvertUTF16ToJavaString(env, result_16).Release();
     69   return NULL;
     70 }
     71 
     72 static void SetWebKitSharedTimersSuspended(JNIEnv* env,
     73                                            jclass obj,
     74                                            jboolean suspend) {
     75   std::vector<int>* suspended_processes = g_suspended_processes.Pointer();
     76   if (suspend) {
     77     DCHECK(suspended_processes->empty());
     78     SuspendWebKitSharedTimers(suspended_processes);
     79   } else {
     80     ResumeWebkitSharedTimers(*suspended_processes);
     81     suspended_processes->clear();
     82   }
     83 }
     84 
     85 namespace content {
     86 
     87 bool RegisterWebViewStatics(JNIEnv* env) {
     88   return RegisterNativesImpl(env) >= 0;
     89 }
     90 
     91 }  // namespace content
     92