From 48224a7a9f5cbae5fcf0344bbd24a660f5b5c1c8 Mon Sep 17 00:00:00 2001 From: "jcivelli@chromium.org" Date: Sat, 10 Nov 2012 03:49:11 +0000 Subject: Created a new class ContentViewRenderView which contains the code used to bridge the compositor to the SurfaceView. Make ContentShell and ChromiumTestShell use that class. BUG=None TEST=ContentShell and ChromiumTestShell should still work. Review URL: https://chromiumcodereview.appspot.com/11369136 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@167051 0039d316-1c4b-4281-b951-d872f2087c98 --- .../org/chromium/chrome/testshell/TabManager.java | 48 ++++------- .../testshell/res/layout/testshell_activity.xml | 5 +- chrome/android/testshell/tab_manager.cc | 92 ++++------------------ 3 files changed, 31 insertions(+), 114 deletions(-) (limited to 'chrome/android') diff --git a/chrome/android/testshell/java/src/org/chromium/chrome/testshell/TabManager.java b/chrome/android/testshell/java/src/org/chromium/chrome/testshell/TabManager.java index 649b40f..b5f64c7 100644 --- a/chrome/android/testshell/java/src/org/chromium/chrome/testshell/TabManager.java +++ b/chrome/android/testshell/java/src/org/chromium/chrome/testshell/TabManager.java @@ -5,9 +5,6 @@ package org.chromium.chrome.testshell; import android.util.AttributeSet; -import android.view.Surface; -import android.view.SurfaceHolder; -import android.view.SurfaceView; import android.view.ViewGroup; import android.content.Context; import android.widget.FrameLayout; @@ -15,14 +12,14 @@ import android.widget.LinearLayout; import org.chromium.base.JNINamespace; -import org.chromium.chrome.browser.ChromeWebContentsDelegateAndroid; import org.chromium.chrome.browser.TabBase; +import org.chromium.content.browser.ContentViewRenderView; import org.chromium.ui.gfx.NativeWindow; /** * The TabManager hooks together all of the related {@link View}s that are used to represent * a {@link TabBase}. It properly builds a {@link TabBase} and makes sure that the {@link Toolbar} - * and {@link SurfaceView} show the proper content. + * and {@link ContentViewRenderView} show the proper content. */ @JNINamespace("chrome") public class TabManager extends LinearLayout { @@ -30,7 +27,7 @@ public class TabManager extends LinearLayout { private NativeWindow mWindow; private ViewGroup mContentViewHolder; - private SurfaceView mRenderTarget; + private ContentViewRenderView mRenderTarget; private TestShellToolbar mToolbar; private TabBase mCurrentTab; @@ -43,7 +40,6 @@ public class TabManager extends LinearLayout { */ public TabManager(Context context, AttributeSet attrs) { super(context, attrs); - nativeInit(this); } @Override @@ -52,25 +48,16 @@ public class TabManager extends LinearLayout { mContentViewHolder = (ViewGroup) findViewById(R.id.content_container); mToolbar = (TestShellToolbar) findViewById(R.id.toolbar); - mRenderTarget = (SurfaceView) findViewById(R.id.render_target); - mRenderTarget.getHolder().addCallback(new SurfaceHolder.Callback() { + mRenderTarget = new ContentViewRenderView(getContext()) { @Override - public void surfaceDestroyed(SurfaceHolder holder) { - nativeSurfaceDestroyed(); - } - - @Override - public void surfaceCreated(SurfaceHolder holder) { - nativeSurfaceCreated(holder.getSurface()); - + protected void onReadyToRender() { if (mCurrentTab == null) createTab(mStartupUrl); } - - @Override - public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { - nativeSurfaceSetSize(width, height); - } - }); + }; + mContentViewHolder.addView(mRenderTarget, + new FrameLayout.LayoutParams( + FrameLayout.LayoutParams.MATCH_PARENT, + FrameLayout.LayoutParams.MATCH_PARENT)); } /** @@ -106,13 +93,14 @@ public class TabManager extends LinearLayout { } private boolean isRenderTargetInitialized() { - return mRenderTarget != null && mRenderTarget.getHolder().getSurface() != null; + return mRenderTarget != null && mRenderTarget.isInitialized(); } private void setCurrentTab(TabBase tab) { + int nativeContentViewLayerRenderer = mRenderTarget.getNativeContentViewLayerRenderer(); if (mCurrentTab != null) { mContentViewHolder.removeView(mCurrentTab.getContentView()); - nativeHideTab(mCurrentTab.getNativeTab()); + nativeHideTab(mCurrentTab.getNativeTab(), nativeContentViewLayerRenderer); mCurrentTab.destroy(); } @@ -121,13 +109,9 @@ public class TabManager extends LinearLayout { mToolbar.showTab(mCurrentTab); mContentViewHolder.addView(mCurrentTab.getContentView()); mCurrentTab.getContentView().requestFocus(); - nativeShowTab(mCurrentTab.getNativeTab()); + nativeShowTab(mCurrentTab.getNativeTab(), nativeContentViewLayerRenderer); } - private static native void nativeShowTab(int jtab); - private static native void nativeHideTab(int jtab); - private static native void nativeInit(Object renderTargetInstance); - private static native void nativeSurfaceCreated(Surface surface); - private static native void nativeSurfaceDestroyed(); - private static native void nativeSurfaceSetSize(int width, int height); + private static native void nativeShowTab(int jtab, int contentViewLayerRenderer); + private static native void nativeHideTab(int jtab, int contentViewLayerRenderer); } \ No newline at end of file diff --git a/chrome/android/testshell/res/layout/testshell_activity.xml b/chrome/android/testshell/res/layout/testshell_activity.xml index 43323a6..4346e59 100644 --- a/chrome/android/testshell/res/layout/testshell_activity.xml +++ b/chrome/android/testshell/res/layout/testshell_activity.xml @@ -44,9 +44,6 @@ android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1"> - - + diff --git a/chrome/android/testshell/tab_manager.cc b/chrome/android/testshell/tab_manager.cc index fc379dd..0a9da47 100644 --- a/chrome/android/testshell/tab_manager.cc +++ b/chrome/android/testshell/tab_manager.cc @@ -12,52 +12,14 @@ #include "base/lazy_instance.h" #include "base/message_loop.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 "content/public/browser/android/content_view_layer_renderer.h" #include "jni/TabManager_jni.h" #include "third_party/WebKit/Source/Platform/chromium/public/WebLayer.h" #include using base::android::ScopedJavaLocalRef; - -namespace { - -class CompositorClient : public content::Compositor::Client { - public: - virtual void ScheduleComposite() OVERRIDE; -}; - -struct GlobalState { - GlobalState() - : g_scheduled_composite(false) {} - CompositorClient client; - scoped_ptr compositor; - scoped_ptr root_layer; - bool g_scheduled_composite; -}; - -base::LazyInstance g_global_state = LAZY_INSTANCE_INITIALIZER; - -content::Compositor* GetCompositor() { - return g_global_state.Get().compositor.get(); -} - -void Composite() { - g_global_state.Get().g_scheduled_composite = false; - if (GetCompositor()) { - GetCompositor()->Composite(); - } -} - -void CompositorClient::ScheduleComposite() { - if (!g_global_state.Get().g_scheduled_composite) { - g_global_state.Get().g_scheduled_composite = true; - MessageLoop::current()->PostTask(FROM_HERE, base::Bind(&Composite)); - } -} - -} // anonymous namespace +using content::ContentViewLayerRenderer; namespace chrome { @@ -66,48 +28,22 @@ bool RegisterTabManager(JNIEnv* env) { return RegisterNativesImpl(env); } -static void Init(JNIEnv* env, jclass clazz, jobject obj) { - if (!GetCompositor()) { - content::Compositor::Initialize(); - g_global_state.Get().compositor.reset(content::Compositor::Create( - &g_global_state.Get().client)); - DCHECK(!g_global_state.Get().root_layer.get()); - g_global_state.Get().root_layer.reset(WebKit::WebLayer::create()); - } -} - -static void SurfaceCreated(JNIEnv* env, jclass clazz, jobject jsurface) { - ANativeWindow* native_window = ANativeWindow_fromSurface(env, jsurface); - if (native_window) { - 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) { - if (!GetCompositor()) - return; +static void ShowTab(JNIEnv* env, jclass clazz, jint jtab, + jint j_content_view_layer_renderer) { TabBaseAndroidImpl* tab = reinterpret_cast(jtab); - g_global_state.Get().root_layer->addChild(tab->tab_layer()); + ContentViewLayerRenderer* content_view_layer_renderer = + reinterpret_cast( + j_content_view_layer_renderer); + content_view_layer_renderer->AttachLayer(tab->tab_layer()); } -static void HideTab(JNIEnv* env, jclass clazz, jint jtab) { - if (!GetCompositor()) - return; +static void HideTab(JNIEnv* env, jclass clazz, jint jtab, + jint j_content_view_layer_renderer) { TabBaseAndroidImpl* tab = reinterpret_cast(jtab); - tab->tab_layer()->removeFromParent(); + ContentViewLayerRenderer* content_view_layer_renderer = + reinterpret_cast( + j_content_view_layer_renderer); + content_view_layer_renderer->DetachLayer(tab->tab_layer()); } } // namespace chrome -- cgit v1.1