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.
5 #include "content/shell/android/shell_manager.h"
7 #include "base/android/jni_android.h"
8 #include "base/android/jni_string.h"
9 #include "base/android/scoped_java_ref.h"
10 #include "base/bind.h"
11 #include "base/lazy_instance.h"
12 #include "base/memory/scoped_ptr.h"
13 #include "content/shell/shell.h"
14 #include "content/shell/shell_browser_context.h"
15 #include "content/shell/shell_content_browser_client.h"
16 #include "content/public/browser/android/compositor.h"
17 #include "content/public/browser/android/draw_delegate.h"
18 #include "content/public/browser/web_contents.h"
19 #include "content/shell/shell.h"
20 #include "googleurl/src/gurl.h"
21 #include "jni/ShellManager_jni.h"
22 #include "third_party/WebKit/Source/Platform/chromium/public/WebLayer.h"
23 #include "ui/gfx/size.h"
25 #include <android/native_window_jni.h>
27 using base::android::ScopedJavaLocalRef
;
28 using content::Compositor
;
29 using content::DrawDelegate
;
34 base::android::ScopedJavaGlobalRef
<jobject
> j_obj
;
35 scoped_ptr
<content::Compositor
> compositor
;
36 scoped_ptr
<WebKit::WebLayer
> root_layer
;
39 base::LazyInstance
<GlobalState
> g_global_state
= LAZY_INSTANCE_INITIALIZER
;
41 content::Compositor
* GetCompositor() {
42 return g_global_state
.Get().compositor
.get();
45 static void SurfacePresented(
46 const DrawDelegate::SurfacePresentedCallback
& callback
,
48 callback
.Run(sync_point
);
51 static void SurfaceUpdated(
53 content::RenderWidgetHostView
* view
,
54 const DrawDelegate::SurfacePresentedCallback
& callback
) {
55 GetCompositor()->OnSurfaceUpdated(base::Bind(
56 &SurfacePresented
, callback
));
59 } // anonymous namespace
63 jobject
CreateShellView() {
64 JNIEnv
* env
= base::android::AttachCurrentThread();
65 if (!GetCompositor()) {
66 Compositor::Initialize();
67 g_global_state
.Get().compositor
.reset(Compositor::Create());
68 DCHECK(!g_global_state
.Get().root_layer
.get());
69 g_global_state
.Get().root_layer
.reset(WebKit::WebLayer::create());
71 return Java_ShellManager_createShell(
72 env
, g_global_state
.Get().j_obj
.obj()).Release();
75 // Register native methods
76 bool RegisterShellManager(JNIEnv
* env
) {
77 return RegisterNativesImpl(env
);
80 static void Init(JNIEnv
* env
, jclass clazz
, jobject obj
) {
81 g_global_state
.Get().j_obj
.Reset(
82 base::android::ScopedJavaLocalRef
<jobject
>(env
, obj
));
83 DrawDelegate::SurfaceUpdatedCallback cb
= base::Bind(
85 DrawDelegate::GetInstance()->SetUpdateCallback(cb
);
88 static void SurfaceCreated(
89 JNIEnv
* env
, jclass clazz
, jobject jsurface
) {
90 ANativeWindow
* native_window
= ANativeWindow_fromSurface(env
, jsurface
);
92 GetCompositor()->SetWindowSurface(native_window
);
93 ANativeWindow_release(native_window
);
94 GetCompositor()->SetRootLayer(g_global_state
.Get().root_layer
.get());
98 static void SurfaceDestroyed(JNIEnv
* env
, jclass clazz
) {
99 GetCompositor()->SetWindowSurface(NULL
);
102 static void SurfaceSetSize(
103 JNIEnv
* env
, jclass clazz
, jint width
, jint height
) {
104 gfx::Size size
= gfx::Size(width
, height
);
105 DrawDelegate::GetInstance()->SetBounds(size
);
106 GetCompositor()->SetWindowBounds(size
);
109 void LaunchShell(JNIEnv
* env
, jclass clazz
, jstring jurl
) {
110 ShellBrowserContext
* browserContext
=
111 static_cast<ShellContentBrowserClient
*>(
112 GetContentClient()->browser())->browser_context();
113 GURL
url(base::android::ConvertJavaStringToUTF8(env
, jurl
));
114 Shell::CreateNewWindow(browserContext
,
121 void ShellAttachLayer(WebKit::WebLayer
* layer
) {
122 g_global_state
.Get().root_layer
->addChild(layer
);
126 void ShellRemoveLayer(WebKit::WebLayer
* layer
) {
127 layer
->removeFromParent();
130 } // namespace content