| 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
|
|
|