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 @@ ...@@ -8,6 +8,9 @@
android:title="@string/menu_reset_webview"/> android:title="@string/menu_reset_webview"/>
<item android:id="@+id/menu_clear_cache" <item android:id="@+id/menu_clear_cache"
android:title="@string/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" <item android:id="@+id/menu_about"
android:title="@string/menu_about"/> android:title="@string/menu_about"/>
</menu> </menu>
...@@ -16,6 +16,7 @@ ...@@ -16,6 +16,7 @@
<string name="title_activity_create_destroy">WebView Create Destroy</string> <string name="title_activity_create_destroy">WebView Create Destroy</string>
<string name="menu_reset_webview">Destroy and create new WebView</string> <string name="menu_reset_webview">Destroy and create new WebView</string>
<string name="menu_clear_cache">Clear cache</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="menu_about">About WebView</string>
<string name="load_url">Load URL</string> <string name="load_url">Load URL</string>
</resources> </resources>
...@@ -34,6 +34,8 @@ import android.view.WindowManager; ...@@ -34,6 +34,8 @@ import android.view.WindowManager;
import android.view.inputmethod.InputMethodManager; import android.view.inputmethod.InputMethodManager;
import android.webkit.GeolocationPermissions; import android.webkit.GeolocationPermissions;
import android.webkit.PermissionRequest; import android.webkit.PermissionRequest;
import android.webkit.TracingConfig;
import android.webkit.TracingController;
import android.webkit.WebChromeClient; import android.webkit.WebChromeClient;
import android.webkit.WebSettings; import android.webkit.WebSettings;
import android.webkit.WebView; import android.webkit.WebView;
...@@ -48,12 +50,16 @@ import org.chromium.base.Log; ...@@ -48,12 +50,16 @@ import org.chromium.base.Log;
import org.chromium.base.StrictModeContext; import org.chromium.base.StrictModeContext;
import java.io.File; 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.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.concurrent.Executors;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
...@@ -99,6 +105,7 @@ public class WebViewBrowserActivity extends Activity implements PopupMenu.OnMenu ...@@ -99,6 +105,7 @@ public class WebViewBrowserActivity extends Activity implements PopupMenu.OnMenu
private WebView mWebView; private WebView mWebView;
private View mFullscreenView; private View mFullscreenView;
private String mWebViewVersion; private String mWebViewVersion;
private boolean mEnableTracing;
// Each time we make a request, store it here with an int key. onRequestPermissionsResult will // 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. // look up the request in order to grant the approprate permissions.
...@@ -174,6 +181,48 @@ public class WebViewBrowserActivity extends Activity implements PopupMenu.OnMenu ...@@ -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 @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
...@@ -454,10 +503,12 @@ public class WebViewBrowserActivity extends Activity implements PopupMenu.OnMenu ...@@ -454,10 +503,12 @@ public class WebViewBrowserActivity extends Activity implements PopupMenu.OnMenu
PopupMenu popup = new PopupMenu(this, v); PopupMenu popup = new PopupMenu(this, v);
popup.setOnMenuItemClickListener(this); popup.setOnMenuItemClickListener(this);
popup.inflate(R.menu.main_menu); popup.inflate(R.menu.main_menu);
popup.getMenu().findItem(R.id.menu_enable_tracing).setChecked(mEnableTracing);
popup.show(); popup.show();
} }
@Override @Override
@SuppressLint("NewApi") // TracingController related methods require API level 28.
public boolean onMenuItemClick(MenuItem item) { public boolean onMenuItemClick(MenuItem item) {
switch(item.getItemId()) { switch(item.getItemId()) {
case R.id.menu_reset_webview: case R.id.menu_reset_webview:
...@@ -474,6 +525,28 @@ public class WebViewBrowserActivity extends Activity implements PopupMenu.OnMenu ...@@ -474,6 +525,28 @@ public class WebViewBrowserActivity extends Activity implements PopupMenu.OnMenu
mWebView.clearCache(true); mWebView.clearCache(true);
} }
return 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: case R.id.menu_about:
about(); about();
hideKeyboard(mUrlBar); 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