1ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
3ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/browser/android/interstitial_page_delegate_android.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_android.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/jni_string.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/android/scoped_java_ref.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/interstitial_page.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jni/InterstitialPageDelegateAndroid_jni.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::AttachCurrentThread;
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ScopedJavaLocalRef;
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InterstitialPageDelegateAndroid::InterstitialPageDelegateAndroid(
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    JNIEnv* env,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    jobject obj,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& html_content)
22b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    : weak_java_obj_(env, obj),
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      html_content_(html_content),
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      page_(NULL) {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)InterstitialPageDelegateAndroid::~InterstitialPageDelegateAndroid() {
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_obj_.get(env);
30b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  if (obj.obj())
31b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)    Java_InterstitialPageDelegateAndroid_onNativeDestroyed(env, obj.obj());
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InterstitialPageDelegateAndroid::Proceed(JNIEnv* env, jobject obj) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (page_)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    page_->Proceed();
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InterstitialPageDelegateAndroid::DontProceed(JNIEnv* env,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                  jobject obj) {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (page_)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    page_->DontProceed();
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string InterstitialPageDelegateAndroid::GetHTMLContents() {
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return html_content_;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InterstitialPageDelegateAndroid::OnProceed() {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_obj_.get(env);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.obj())
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Java_InterstitialPageDelegateAndroid_onProceed(env, obj.obj());
54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)void InterstitialPageDelegateAndroid::OnDontProceed() {
57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_obj_.get(env);
59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (obj.obj())
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Java_InterstitialPageDelegateAndroid_onDontProceed(env, obj.obj());
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void InterstitialPageDelegateAndroid::CommandReceived(
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const std::string& command) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = AttachCurrentThread();
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ScopedJavaLocalRef<jobject> obj = weak_java_obj_.get(env);
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (obj.obj()) {
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::string sanitized_command(command);
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    // The JSONified response has quotes, remove them.
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (sanitized_command.length() > 1 && sanitized_command[0] == '"') {
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      sanitized_command = sanitized_command.substr(
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)          1, sanitized_command.length() - 2);
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    }
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    Java_InterstitialPageDelegateAndroid_commandReceived(
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        env, obj.obj(),
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        base::android::ConvertUTF8ToJavaString(env, sanitized_command).obj());
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
81c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// static
82c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool InterstitialPageDelegateAndroid
83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ::RegisterInterstitialPageDelegateAndroid(JNIEnv* env) {
84c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return RegisterNativesImpl(env);
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static jint Init(JNIEnv* env, jobject obj, jstring html_content) {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  InterstitialPageDelegateAndroid* delegate =
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      new InterstitialPageDelegateAndroid(
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)          env, obj, base::android::ConvertJavaStringToUTF8(env, html_content));
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return reinterpret_cast<jint>(delegate);
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)