15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/shell/android/shell_manager.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 "base/bind.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/lazy_instance.h"
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "content/public/browser/web_contents.h"
133551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell.h"
143551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_browser_context.h"
153551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)#include "content/shell/browser/shell_content_browser_client.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "jni/ShellManager_jni.h"
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#include "url/gurl.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using base::android::ScopedJavaLocalRef;
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct GlobalState {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GlobalState() {}
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  base::android::ScopedJavaGlobalRef<jobject> j_shell_manager;
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)base::LazyInstance<GlobalState> g_global_state = LAZY_INSTANCE_INITIALIZER;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)jobject CreateShellView(Shell* shell) {
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  jobject j_shell_manager = g_global_state.Get().j_shell_manager.obj();
375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return Java_ShellManager_createShell(
385d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      env,
395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      j_shell_manager,
405d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      reinterpret_cast<intptr_t>(shell)).Release();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)void RemoveShellView(jobject shell_view) {
4490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  JNIEnv* env = base::android::AttachCurrentThread();
4590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)  jobject j_shell_manager = g_global_state.Get().j_shell_manager.obj();
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  Java_ShellManager_removeShell(env, j_shell_manager, shell_view);
4790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)}
4890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Register native methods
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RegisterShellManager(JNIEnv* env) {
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return RegisterNativesImpl(env);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static void Init(JNIEnv* env, jclass clazz, jobject obj) {
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  g_global_state.Get().j_shell_manager.Reset(
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      base::android::ScopedJavaLocalRef<jobject>(env, obj));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void LaunchShell(JNIEnv* env, jclass clazz, jstring jurl) {
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ShellBrowserContext* browserContext =
61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)      ShellContentBrowserClient::Get()->browser_context();
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  GURL url(base::android::ConvertJavaStringToUTF8(env, jurl));
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  Shell::CreateNewWindow(browserContext,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         url,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         NULL,
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                         MSG_ROUTING_NONE,
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                         gfx::Size());
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace content
71