Bug 728614 - Part 0: Allow querying the viewport information from Java; r=dougt

This commit is contained in:
Brad Lassey 2012-02-18 19:22:56 -05:00
Родитель af50207d95
Коммит 54d0094288
5 изменённых файлов: 87 добавлений и 1 удалений

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

@ -1302,6 +1302,16 @@ abstract public class GeckoApp
Runnable r = new SessionSnapshotRunnable(tab);
GeckoAppShell.getHandler().postDelayed(r, 500);
}
GeckoAppShell.sendEventToGecko(
GeckoEvent.createMetaViewportQueryEvent(tab.getId(),
new GeckoEvent.Callback() {
public void callback(GeckoEvent ev, String data) {
Log.i(LOGTAG, "Meta Viewport Data:" + data);
// To do: do something with this data
}
})
);
}
void handleShowToast(final String message, final String duration) {

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

@ -62,6 +62,10 @@ import android.util.Log;
*/
public class GeckoEvent {
public interface Callback {
public void callback(GeckoEvent event, String jsonData);
}
private static final String LOGTAG = "GeckoEvent";
private static final int INVALID = -1;
@ -89,6 +93,7 @@ public class GeckoEvent {
private static final int PROXIMITY_EVENT = 23;
private static final int ACTIVITY_RESUMING = 24;
private static final int SCREENSHOT = 25;
private static final int META_VIEWPORT_QUERY = 26;
public static final int IME_COMPOSITION_END = 0;
public static final int IME_COMPOSITION_BEGIN = 1;
@ -136,6 +141,9 @@ public class GeckoEvent {
public boolean mCanBeMetered;
public int mNativeWindow;
public int mTabId;
Callback mCallback;
private GeckoEvent(int evType) {
mType = evType;
@ -382,6 +390,14 @@ public class GeckoEvent {
return event;
}
public static GeckoEvent createMetaViewportQueryEvent(int tabId, Callback callback) {
Log.i("GeckoEvent", "createMetaViewportQueryEvent");
GeckoEvent event = new GeckoEvent(META_VIEWPORT_QUERY);
event.mCallback = callback;
event.mTabId = tabId;
return event;
}
public static GeckoEvent createLoadEvent(String uri) {
GeckoEvent event = new GeckoEvent(LOAD_URI);
event.mCharacters = uri;
@ -409,4 +425,10 @@ public class GeckoEvent {
event.mMetaState = tabId;
return event;
}
public void doCallback(String jsonData) {
if (mCallback != null) {
mCallback.callback(this, jsonData);
}
}
}

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

@ -76,6 +76,8 @@ jfieldID AndroidGeckoEvent::jLocationField = 0;
jfieldID AndroidGeckoEvent::jAddressField = 0;
jfieldID AndroidGeckoEvent::jBandwidthField = 0;
jfieldID AndroidGeckoEvent::jCanBeMeteredField = 0;
jfieldID AndroidGeckoEvent::jTabIdField = 0;
jmethodID AndroidGeckoEvent::jDoCallbackMethod = 0;
jclass AndroidPoint::jPointClass = 0;
jfieldID AndroidPoint::jXField = 0;
@ -208,6 +210,9 @@ AndroidGeckoEvent::InitGeckoEventClass(JNIEnv *jEnv)
jAddressField = getField("mAddress", "Landroid/location/Address;");
jBandwidthField = getField("mBandwidth", "D");
jCanBeMeteredField = getField("mCanBeMetered", "Z");
jTabIdField = getField("mTabId", "I");
jDoCallbackMethod = getMethod("doCallback", "(Ljava/lang/String;)V");
}
void
@ -585,6 +590,10 @@ AndroidGeckoEvent::Init(JNIEnv *jenv, jobject jobj)
break;
}
case META_VIEWPORT_QUERY:
mTabId = jenv->GetIntField(jobj, jTabIdField);
break;
case VIEWPORT:
case BROADCAST: {
ReadCharactersField(jenv);
@ -665,6 +674,16 @@ AndroidPoint::Init(JNIEnv *jenv, jobject jobj)
}
}
void
AndroidGeckoEvent::DoCallback(const nsAString& data) {
JNIEnv* env = AndroidBridge::GetJNIEnv();
if (!env)
return;
AndroidBridge::AutoLocalJNIFrame(env, 1);
jstring jData = env->NewString(nsPromiseFlatString(data).get(), data.Length());
env->CallVoidMethod(wrapped_obj, jDoCallbackMethod, jData);
}
void
AndroidGeckoGLLayerClient::Init(jobject jobj)
{

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

@ -546,6 +546,8 @@ public:
nsGeoPositionAddress* GeoAddress() { return mGeoAddress; }
double Bandwidth() { return mBandwidth; }
bool CanBeMetered() { return mCanBeMetered; }
int TabId() { return mTabId; }
void DoCallback(const nsAString& data);
protected:
int mAction;
@ -571,6 +573,7 @@ protected:
nsRefPtr<nsGeoPositionAddress> mGeoAddress;
double mBandwidth;
bool mCanBeMetered;
int mTabId;
void ReadIntArray(nsTArray<int> &aVals,
JNIEnv *jenv,
@ -625,6 +628,9 @@ protected:
static jfieldID jBandwidthField;
static jfieldID jCanBeMeteredField;
static jfieldID jTabIdField;
static jmethodID jDoCallbackMethod;
public:
enum {
@ -653,6 +659,7 @@ public:
PROXIMITY_EVENT = 23,
ACTIVITY_RESUMING = 24,
SCREENSHOT = 25,
META_VIEWPORT_QUERY = 26,
dummy_java_enum_list_end
};

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

@ -60,7 +60,7 @@
#include <android/log.h>
#include <pthread.h>
#include <wchar.h>
#include "nsContentUtils.h"
#ifdef MOZ_ANDROID_HISTORY
#include "nsAndroidHistory.h"
#endif
@ -453,6 +453,34 @@ nsAppShell::ProcessNextNativeEvent(bool mayWait)
break;
}
case AndroidGeckoEvent::META_VIEWPORT_QUERY:
{
nsCOMPtr<nsIDOMWindow> domWindow;
mBrowserApp->GetWindowForTab(curEvent->TabId(), getter_AddRefs(domWindow));
if (!domWindow)
break;
nsCOMPtr<nsIDOMDocument> domDocument;
domWindow->GetDocument(getter_AddRefs(domDocument));
nsCOMPtr<nsIDocument> doc = do_QueryInterface(domDocument);
if (!doc)
break;
ViewportInfo vi = nsContentUtils::GetViewportInfo(doc);
nsAutoString data;
data.AppendLiteral("{");
data.AppendPrintf("\"defaultZoom\": %f,", vi.defaultZoom);
data.AppendPrintf("\"minZoom\": %f,", vi.minZoom);
data.AppendPrintf("\"maxZoom\": %f,", vi.maxZoom);
data.AppendPrintf("\"width\": %d,", vi.width);
data.AppendPrintf("\"height\": %d,", vi.height);
data.AppendPrintf("\"autoSize\": %s,", vi.autoSize ? "true" : "false");
data.AppendPrintf("\"allowZoom\": %s,", vi.allowZoom ? "true" : "false");
data.AppendPrintf("\"autoScale\": %s", vi.autoScale ? "true" : "false");
data.AppendLiteral("}");
curEvent->DoCallback(data);
}
break;
case AndroidGeckoEvent::VIEWPORT:
case AndroidGeckoEvent::BROADCAST: {