Index: chrome/android/testshell/tab_manager.cc |
diff --git a/chrome/android/testshell/tab_manager.cc b/chrome/android/testshell/tab_manager.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..cf3fc5d18638418ea5d150b95123ad8f099b015b |
--- /dev/null |
+++ b/chrome/android/testshell/tab_manager.cc |
@@ -0,0 +1,112 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include "chrome/android/testshell/tab_manager.h" |
+ |
+#include "base/logging.h" |
+#include "base/android/jni_android.h" |
+#include "base/android/jni_string.h" |
+#include "base/android/scoped_java_ref.h" |
+#include "base/bind.h" |
+#include "base/lazy_instance.h" |
+#include "chrome/browser/android/tab_base_android_impl.h" |
+#include "content/public/browser/android/compositor.h" |
+#include "content/public/browser/android/draw_delegate.h" |
+#include "jni/TabManager_jni.h" |
+#include "third_party/WebKit/Source/Platform/chromium/public/WebLayer.h" |
+ |
+#include <android/native_window_jni.h> |
+ |
+using base::android::ScopedJavaLocalRef; |
+ |
+namespace { |
+ |
+struct GlobalState { |
+ base::android::ScopedJavaGlobalRef<jobject> jobj_; |
+ scoped_ptr<content::Compositor> compositor_; |
+ scoped_ptr<WebKit::WebLayer> root_layer_; |
+}; |
+ |
+base::LazyInstance<GlobalState> g_global_state = LAZY_INSTANCE_INITIALIZER; |
+ |
+content::Compositor* GetCompositor() { |
+ return g_global_state.Get().compositor_.get(); |
+} |
+ |
+static void SurfacePresented( |
+ const content::DrawDelegate::SurfacePresentedCallback& callback, |
+ uint32 sync_point) { |
+ callback.Run(sync_point); |
+} |
+ |
+static void SurfaceUpdated( |
+ uint64 texture, |
+ content::RenderWidgetHostView* view, |
+ const content::DrawDelegate::SurfacePresentedCallback& callback) { |
+ GetCompositor()->OnSurfaceUpdated(base::Bind( |
+ &SurfacePresented, callback)); |
+} |
+ |
+} // anonymous namespace |
+ |
+namespace chrome { |
+ |
+// Register native methods |
+bool RegisterTabManager(JNIEnv* env) { |
+ return RegisterNativesImpl(env); |
+} |
+ |
+static void Init(JNIEnv* env, jclass clazz, jobject obj) { |
+ g_global_state.Get().jobj_.Reset(env, obj); |
+ content::DrawDelegate::GetInstance()->SetUpdateCallback( |
+ base::Bind(&SurfaceUpdated)); |
+} |
+ |
+static void SurfaceCreated( |
+ JNIEnv* env, jclass clazz, jobject jsurface) { |
+ ANativeWindow* native_window = ANativeWindow_fromSurface(env, jsurface); |
+ if (!native_window) |
+ return; |
+ |
+ if (!GetCompositor()) { |
+ content::Compositor::Initialize(); |
+ g_global_state.Get().compositor_.reset(content::Compositor::Create()); |
+ DCHECK(!g_global_state.Get().root_layer_.get()); |
+ g_global_state.Get().root_layer_.reset(WebKit::WebLayer::create()); |
+ } |
+ GetCompositor()->SetWindowSurface(native_window); |
+ ANativeWindow_release(native_window); |
+ GetCompositor()->SetRootLayer(g_global_state.Get().root_layer_.get()); |
+} |
+ |
+static void SurfaceDestroyed(JNIEnv* env, jclass clazz) { |
+ GetCompositor()->SetWindowSurface(NULL); |
+} |
+ |
+static void SurfaceSetSize( |
+ JNIEnv* env, jclass clazz, jint width, jint height) { |
+ gfx::Size size = gfx::Size(width, height); |
+ content::DrawDelegate::GetInstance()->SetBounds(size); |
+ GetCompositor()->SetWindowBounds(size); |
+} |
+ |
+static void ShowTab( |
+ JNIEnv* env, jclass clazz, jint jtab) { |
+ TabBaseAndroidImpl* tab = reinterpret_cast<TabBaseAndroidImpl*>(jtab); |
+ DCHECK(tab); |
+ WebKit::WebLayer* layer = tab->tab_layer(); |
+ DCHECK(layer); |
+ g_global_state.Get().root_layer_->addChild(layer); |
+} |
+ |
+static void HideTab( |
+ JNIEnv* env, jclass clazz, jint jtab) { |
+ TabBaseAndroidImpl* tab = reinterpret_cast<TabBaseAndroidImpl*>(jtab); |
+ DCHECK(tab); |
+ WebKit::WebLayer* layer = tab->tab_layer(); |
+ DCHECK(layer); |
+ layer->removeFromParent(); |
+} |
+ |
+} // namespace chrome |