Bug 1189995 - Move GeckoAppShell.runGecko to GeckoThread; r=esawin

GeckoAppShell.runGecko really should be in GeckoThread because
GeckoThread already takes care of most of the preparation when running
Gecko. This patch merges runGecko into GeckoThread.run, but split the
argument-building code into its own method.
This commit is contained in:
Jim Chen 2015-08-13 00:53:39 -04:00
Родитель a73169a9de
Коммит afb248e2fa
2 изменённых файлов: 68 добавлений и 63 удалений

Просмотреть файл

@ -41,7 +41,6 @@ import org.mozilla.gecko.gfx.BitmapUtils;
import org.mozilla.gecko.gfx.LayerView;
import org.mozilla.gecko.gfx.PanZoomController;
import org.mozilla.gecko.mozglue.ContextUtils;
import org.mozilla.gecko.mozglue.GeckoLoader;
import org.mozilla.gecko.overlays.ui.ShareDialog;
import org.mozilla.gecko.prompts.PromptService;
import org.mozilla.gecko.util.EventCallback;
@ -339,56 +338,6 @@ public class GeckoAppShell
return sLayerView;
}
public static void runGecko(String apkPath, String args, String url, String type) {
// Preparation for pumpMessageLoop()
MessageQueue.IdleHandler idleHandler = new MessageQueue.IdleHandler() {
@Override public boolean queueIdle() {
final Handler geckoHandler = ThreadUtils.sGeckoHandler;
Message idleMsg = Message.obtain(geckoHandler);
// Use |Message.obj == GeckoHandler| to identify our "queue is empty" message
idleMsg.obj = geckoHandler;
geckoHandler.sendMessageAtFrontOfQueue(idleMsg);
// Keep this IdleHandler
return true;
}
};
Looper.myQueue().addIdleHandler(idleHandler);
// Initialize AndroidBridge.
nativeInit(GeckoAppShell.class.getClassLoader(), Looper.myQueue());
// First argument is the .apk path
String combinedArgs = apkPath + " -greomni " + apkPath;
if (args != null)
combinedArgs += " " + args;
if (url != null)
combinedArgs += " -url " + url;
if (type != null)
combinedArgs += " " + type;
// In un-official builds, we want to load Javascript resources fresh
// with each build. In official builds, the startup cache is purged by
// the buildid mechanism, but most un-official builds don't bump the
// buildid, so we purge here instead.
if (!AppConstants.MOZILLA_OFFICIAL) {
Log.w(LOGTAG, "STARTUP PERFORMANCE WARNING: un-official build: purging the " +
"startup (JavaScript) caches.");
combinedArgs += " -purgecaches";
}
DisplayMetrics metrics = getContext().getResources().getDisplayMetrics();
combinedArgs += " -width " + metrics.widthPixels + " -height " + metrics.heightPixels;
if (!AppConstants.MOZILLA_OFFICIAL) {
Log.d(LOGTAG, "GeckoLoader.nativeRun " + combinedArgs);
}
// and go
GeckoLoader.nativeRun(combinedArgs);
// Remove pumpMessageLoop() idle handler
Looper.myQueue().removeIdleHandler(idleHandler);
}
/**
* If the Gecko thread is running, immediately dispatches the event to
* Gecko.

Просмотреть файл

@ -18,7 +18,10 @@ import android.content.res.Configuration;
import android.content.res.Resources;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.os.MessageQueue;
import android.os.SystemClock;
import android.util.DisplayMetrics;
import android.util.Log;
import java.io.IOException;
@ -225,13 +228,12 @@ public class GeckoThread extends Thread implements GeckoEventListener {
}
}
private String initGeckoEnvironment() {
final Locale locale = Locale.getDefault();
private static String initGeckoEnvironment() {
final Context context = GeckoAppShell.getContext();
GeckoLoader.loadMozGlue(context);
setState(State.MOZGLUE_READY);
final Locale locale = Locale.getDefault();
final Resources res = context.getResources();
if (locale.toString().equalsIgnoreCase("zh_hk")) {
final Locale mappedLocale = Locale.TRADITIONAL_CHINESE;
@ -241,7 +243,6 @@ public class GeckoThread extends Thread implements GeckoEventListener {
res.updateConfiguration(config, null);
}
String resourcePath = "";
String[] pluginDirs = null;
try {
pluginDirs = GeckoAppShell.getPluginDirectories();
@ -249,7 +250,7 @@ public class GeckoThread extends Thread implements GeckoEventListener {
Log.w(LOGTAG, "Caught exception getting plugin dirs.", e);
}
resourcePath = context.getPackageResourcePath();
final String resourcePath = context.getPackageResourcePath();
GeckoLoader.setupGeckoEnvironment(context, pluginDirs, context.getFilesDir().getPath());
GeckoLoader.loadSQLiteLibs(context, resourcePath);
@ -260,14 +261,14 @@ public class GeckoThread extends Thread implements GeckoEventListener {
return resourcePath;
}
private String getTypeFromAction(String action) {
private static String getTypeFromAction(String action) {
if (GeckoApp.ACTION_HOMESCREEN_SHORTCUT.equals(action)) {
return "-bookmark";
}
return null;
}
private String addCustomProfileArg(String args) {
private static String addCustomProfileArg(String args) {
String profileArg = "";
String guestArg = "";
if (GeckoAppShell.getGeckoInterface() != null) {
@ -293,12 +294,63 @@ public class GeckoThread extends Thread implements GeckoEventListener {
return (args != null ? args : "") + profileArg + guestArg;
}
private String getGeckoArgs(final String apkPath) {
// First argument is the .apk path
final StringBuilder args = new StringBuilder(apkPath);
args.append(" -greomni ").append(apkPath);
final String userArgs = addCustomProfileArg(mArgs);
if (userArgs != null) {
args.append(' ').append(userArgs);
}
if (mUri != null) {
args.append(" -url ").append(mUri);
}
final String type = getTypeFromAction(mAction);
if (type != null) {
args.append(" ").append(type);
}
// In un-official builds, we want to load Javascript resources fresh
// with each build. In official builds, the startup cache is purged by
// the buildid mechanism, but most un-official builds don't bump the
// buildid, so we purge here instead.
if (!AppConstants.MOZILLA_OFFICIAL) {
Log.w(LOGTAG, "STARTUP PERFORMANCE WARNING: un-official build: purging the " +
"startup (JavaScript) caches.");
args.append(" -purgecaches");
}
final DisplayMetrics metrics
= GeckoAppShell.getContext().getResources().getDisplayMetrics();
args.append(" -width ").append(metrics.widthPixels)
.append(" -height ").append(metrics.heightPixels);
return args.toString();
}
@Override
public void run() {
Looper.prepare();
ThreadUtils.sGeckoThread = this;
ThreadUtils.sGeckoHandler = new Handler();
// Preparation for pumpMessageLoop()
final MessageQueue.IdleHandler idleHandler = new MessageQueue.IdleHandler() {
@Override public boolean queueIdle() {
final Handler geckoHandler = ThreadUtils.sGeckoHandler;
Message idleMsg = Message.obtain(geckoHandler);
// Use |Message.obj == GeckoHandler| to identify our "queue is empty" message
idleMsg.obj = geckoHandler;
geckoHandler.sendMessageAtFrontOfQueue(idleMsg);
// Keep this IdleHandler
return true;
}
};
Looper.myQueue().addIdleHandler(idleHandler);
if (mDebugging) {
try {
Thread.sleep(5 * 1000 /* 5 seconds */);
@ -306,7 +358,7 @@ public class GeckoThread extends Thread implements GeckoEventListener {
}
}
String path = initGeckoEnvironment();
final String args = getGeckoArgs(initGeckoEnvironment());
// This can only happen after the call to initGeckoEnvironment
// above, because otherwise the JNI code hasn't been loaded yet.
@ -318,14 +370,15 @@ public class GeckoThread extends Thread implements GeckoEventListener {
Log.w(LOGTAG, "zerdatime " + SystemClock.uptimeMillis() + " - runGecko");
String args = addCustomProfileArg(mArgs);
String type = getTypeFromAction(mAction);
// Initialize AndroidBridge.
GeckoAppShell.nativeInit(GeckoThread.class.getClassLoader(), Looper.myQueue());
if (!AppConstants.MOZILLA_OFFICIAL) {
Log.i(LOGTAG, "RunGecko - args = " + args);
}
// and then fire us up
GeckoAppShell.runGecko(path, args, mUri, type);
// And go.
GeckoLoader.nativeRun(args);
// And... we're done.
setState(State.EXITED);
@ -337,6 +390,9 @@ public class GeckoThread extends Thread implements GeckoEventListener {
} catch (final JSONException e) {
Log.e(LOGTAG, "unable to dispatch event", e);
}
// Remove pumpMessageLoop() idle handler
Looper.myQueue().removeIdleHandler(idleHandler);
}
public static void addPendingEvent(final GeckoEvent e) {