Commit 6783d4b5 authored by Tim Volodine's avatar Tim Volodine Committed by Commit Bot

[SystemWebViewShell] Add Tracing API functionality.

Provide a "Enable tracing" option in the menu of the SystemWebViewShell,
to demo/test the new Tracing API functionality. This requires Android P
SDK which has been dropped upstream recently.

When "Enable tracing" is selected the tracing is started. The following
configuration is used:
- trace web-developer categories
- use continuous tracing i.e. a ring buffer

When the user un-checks "Enable tracing" in the menu the tracing is stopped
and the trace data is written to webview_tracing.json in the application
file directory. An alert dialog showing the number of bytes written is
shown upon completion.

Note:
The trace file can be pulled from the device using "adb pull" using the
relevant local directory, e.g.
$ adb pull /data/user/0/org.chromium.webview_shell/files/webview_tracing.json .

BUG=798101

Change-Id: I2a22fbf5f07f12e9c3eadfe9fb027c05b892c092
Reviewed-on: https://chromium-review.googlesource.com/1143820
Commit-Queue: Tim Volodine <timvolodine@chromium.org>
Reviewed-by: default avatarRichard Coles <torne@chromium.org>
Cr-Commit-Position: refs/heads/master@{#578633}
parent dfa5e05a
......@@ -8,6 +8,9 @@
android:title="@string/menu_reset_webview"/>
<item android:id="@+id/menu_clear_cache"
android:title="@string/menu_clear_cache"/>
<item android:id="@+id/menu_enable_tracing"
android:checkable="true"
android:title="@string/menu_enable_tracing"/>
<item android:id="@+id/menu_about"
android:title="@string/menu_about"/>
</menu>
......@@ -16,6 +16,7 @@
<string name="title_activity_create_destroy">WebView Create Destroy</string>
<string name="menu_reset_webview">Destroy and create new WebView</string>
<string name="menu_clear_cache">Clear cache</string>
<string name="menu_enable_tracing">Enable tracing</string>
<string name="menu_about">About WebView</string>
<string name="load_url">Load URL</string>
</resources>
......@@ -34,6 +34,8 @@ import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager;
import android.webkit.GeolocationPermissions;
import android.webkit.PermissionRequest;
import android.webkit.TracingConfig;
import android.webkit.TracingController;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebView;
......@@ -48,12 +50,16 @@ import org.chromium.base.Log;
import org.chromium.base.StrictModeContext;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.concurrent.Executors;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
......@@ -99,6 +105,7 @@ public class WebViewBrowserActivity extends Activity implements PopupMenu.OnMenu
private WebView mWebView;
private View mFullscreenView;
private String mWebViewVersion;
private boolean mEnableTracing;
// Each time we make a request, store it here with an int key. onRequestPermissionsResult will
// look up the request in order to grant the approprate permissions.
......@@ -174,6 +181,48 @@ public class WebViewBrowserActivity extends Activity implements PopupMenu.OnMenu
}
}
private static class TracingLogger extends FileOutputStream {
private long mByteCount;
private long mChunkCount;
private final Activity mActivity;
public TracingLogger(String fileName, Activity activity) throws FileNotFoundException {
super(fileName);
mActivity = activity;
}
@Override
public void write(byte[] chunk) throws IOException {
mByteCount += chunk.length;
mChunkCount++;
super.write(chunk);
}
@Override
public void close() throws IOException {
super.close();
showDialog(mByteCount);
}
private void showDialog(long nbBytes) {
StringBuilder info = new StringBuilder();
info.append("Tracing data written to file\n");
info.append("number of bytes: " + nbBytes);
mActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog dialog = new AlertDialog.Builder(mActivity)
.setTitle("Tracing API")
.setMessage(info)
.setNeutralButton(" OK ", null)
.create();
dialog.show();
}
});
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
......@@ -454,10 +503,12 @@ public class WebViewBrowserActivity extends Activity implements PopupMenu.OnMenu
PopupMenu popup = new PopupMenu(this, v);
popup.setOnMenuItemClickListener(this);
popup.inflate(R.menu.main_menu);
popup.getMenu().findItem(R.id.menu_enable_tracing).setChecked(mEnableTracing);
popup.show();
}
@Override
@SuppressLint("NewApi") // TracingController related methods require API level 28.
public boolean onMenuItemClick(MenuItem item) {
switch(item.getItemId()) {
case R.id.menu_reset_webview:
......@@ -474,6 +525,28 @@ public class WebViewBrowserActivity extends Activity implements PopupMenu.OnMenu
mWebView.clearCache(true);
}
return true;
case R.id.menu_enable_tracing:
mEnableTracing = !mEnableTracing;
item.setChecked(mEnableTracing);
TracingController tracingController = TracingController.getInstance();
if (mEnableTracing) {
tracingController.start(
new TracingConfig.Builder()
.addCategories(TracingConfig.CATEGORIES_WEB_DEVELOPER)
.setTracingMode(TracingConfig.RECORD_CONTINUOUSLY)
.build());
} else {
try (StrictModeContext unused = StrictModeContext.allowDiskWrites()) {
String outFileName = getFilesDir() + "/webview_tracing.json";
try {
tracingController.stop(new TracingLogger(outFileName, this),
Executors.newSingleThreadExecutor());
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
}
}
return true;
case R.id.menu_about:
about();
hideKeyboard(mUrlBar);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment