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 package org.chromium.chrome.testshell;
7 import android.app.Activity;
8 import android.content.Intent;
9 import android.os.Bundle;
10 import android.text.TextUtils;
11 import android.util.Log;
12 import android.view.KeyEvent;
13 import android.view.Menu;
14 import android.view.MenuInflater;
15 import android.view.MenuItem;
16 import android.widget.Toast;
18 import org.chromium.base.MemoryPressureListener;
19 import org.chromium.chrome.browser.DevToolsServer;
20 import org.chromium.chrome.testshell.sync.SyncController;
21 import org.chromium.content.browser.ActivityContentVideoViewClient;
22 import org.chromium.content.browser.BrowserStartupController;
23 import org.chromium.content.browser.ContentVideoViewClient;
24 import org.chromium.content.browser.ContentView;
25 import org.chromium.content.browser.ContentViewClient;
26 import org.chromium.content.browser.DeviceUtils;
27 import org.chromium.content.browser.TracingControllerAndroid;
28 import org.chromium.content.common.CommandLine;
29 import org.chromium.sync.signin.ChromeSigninController;
30 import org.chromium.ui.WindowAndroid;
33 * The {@link android.app.Activity} component of a basic test shell to test Chrome features.
35 public class ChromiumTestShellActivity extends Activity implements MenuHandler {
36 private static final String TAG = "ChromiumTestShellActivity";
38 private WindowAndroid mWindow;
39 private TabManager mTabManager;
40 private DevToolsServer mDevToolsServer;
41 private SyncController mSyncController;
44 protected void onCreate(final Bundle savedInstanceState) {
45 super.onCreate(savedInstanceState);
47 ChromiumTestShellApplication.initCommandLine();
48 waitForDebuggerIfNeeded();
50 DeviceUtils.addDeviceSpecificUserAgentSwitch(this);
52 BrowserStartupController.StartupCallback callback =
53 new BrowserStartupController.StartupCallback() {
55 public void onSuccess(boolean alreadyStarted) {
56 finishInitialization(savedInstanceState);
60 public void onFailure() {
61 Toast.makeText(ChromiumTestShellActivity.this,
62 R.string.browser_process_initialization_failed,
63 Toast.LENGTH_SHORT).show();
64 Log.e(TAG, "Chromium browser process initialization failed");
68 BrowserStartupController.get(this).startBrowserProcessesAsync(callback);
71 private void finishInitialization(final Bundle savedInstanceState) {
72 setContentView(R.layout.testshell_activity);
73 mTabManager = (TabManager) findViewById(R.id.tab_manager);
74 String startupUrl = getUrlFromIntent(getIntent());
75 if (!TextUtils.isEmpty(startupUrl)) {
76 mTabManager.setStartupUrl(startupUrl);
78 TestShellToolbar mToolbar = (TestShellToolbar) findViewById(R.id.toolbar);
79 mToolbar.setMenuHandler(this);
81 mWindow = new WindowAndroid(this);
82 mWindow.restoreInstanceState(savedInstanceState);
83 mTabManager.setWindow(mWindow);
85 mDevToolsServer = new DevToolsServer("chromium_testshell");
86 mDevToolsServer.setRemoteDebuggingEnabled(true);
87 mSyncController = SyncController.get(this);
88 // In case this method is called after the first onStart(), we need to inform the
89 // SyncController that we have started.
90 mSyncController.onStart();
94 protected void onDestroy() {
97 if (mDevToolsServer != null)
98 mDevToolsServer.destroy();
99 mDevToolsServer = null;
103 protected void onSaveInstanceState(Bundle outState) {
104 // TODO(dtrainor): Save/restore the tab state.
105 mWindow.saveInstanceState(outState);
109 public boolean onKeyUp(int keyCode, KeyEvent event) {
110 if (keyCode == KeyEvent.KEYCODE_BACK) {
111 TestShellTab tab = getActiveTab();
112 if (tab != null && tab.getContentView().canGoBack()) {
113 tab.getContentView().goBack();
118 return super.onKeyUp(keyCode, event);
122 protected void onNewIntent(Intent intent) {
123 if (MemoryPressureListener.handleDebugIntent(this, intent.getAction())) return;
125 String url = getUrlFromIntent(intent);
126 if (!TextUtils.isEmpty(url)) {
127 TestShellTab tab = getActiveTab();
128 if (tab != null) tab.loadUrlWithSanitization(url);
133 protected void onStop() {
136 ContentView view = getActiveContentView();
137 if (view != null) view.onHide();
141 protected void onStart() {
144 ContentView view = getActiveContentView();
145 if (view != null) view.onShow();
147 if (mSyncController != null) {
148 mSyncController.onStart();
153 public void onActivityResult(int requestCode, int resultCode, Intent data) {
154 mWindow.onActivityResult(requestCode, resultCode, data);
158 * @return The {@link TestShellTab} that is currently visible.
160 public TestShellTab getActiveTab() {
161 return mTabManager != null ? mTabManager.getCurrentTab() : null;
165 * @return The ContentView of the active tab.
167 public ContentView getActiveContentView() {
168 TestShellTab tab = getActiveTab();
169 return tab != null ? tab.getContentView() : null;
173 * Creates a {@link TestShellTab} with a URL specified by {@code url}.
175 * @param url The URL the new {@link TestShellTab} should start with.
177 public void createTab(String url) {
178 mTabManager.createTab(url);
179 getActiveContentView().setContentViewClient(new ContentViewClient() {
181 public ContentVideoViewClient getContentVideoViewClient() {
182 return new ActivityContentVideoViewClient(ChromiumTestShellActivity.this);
188 * From {@link MenuHandler}.
191 public void showPopupMenu() {
196 public boolean onCreateOptionsMenu(Menu menu) {
197 MenuInflater inflater = getMenuInflater();
198 inflater.inflate(R.menu.main_menu, menu);
203 public boolean onOptionsItemSelected(MenuItem item) {
204 switch (item.getItemId()) {
206 if (ChromeSigninController.get(this).isSignedIn())
207 SyncController.openSignOutDialog(getFragmentManager());
209 SyncController.openSigninDialog(getFragmentManager());
212 return super.onOptionsItemSelected(item);
217 public boolean onPrepareOptionsMenu(Menu menu) {
218 menu.setGroupVisible(R.id.MAIN_MENU, true);
219 MenuItem signinItem = menu.findItem(R.id.signin);
220 if (ChromeSigninController.get(this).isSignedIn())
221 signinItem.setTitle(ChromeSigninController.get(this).getSignedInAccountName());
223 signinItem.setTitle(R.string.signin_sign_in);
227 private void waitForDebuggerIfNeeded() {
228 if (CommandLine.getInstance().hasSwitch(CommandLine.WAIT_FOR_JAVA_DEBUGGER)) {
229 Log.e(TAG, "Waiting for Java debugger to connect...");
230 android.os.Debug.waitForDebugger();
231 Log.e(TAG, "Java debugger connected. Resuming execution.");
235 private static String getUrlFromIntent(Intent intent) {
236 return intent != null ? intent.getDataString() : null;