bug 719359 - Pageload thumbnails for sites with <meta viewport=width=n> do not cover entire thumbnail box in about:home r=mfinkle

This commit is contained in:
Brad Lassey 2012-03-12 14:05:43 -04:00
Родитель c864aef084
Коммит f3dfd1086f
5 изменённых файлов: 40 добавлений и 13 удалений

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

@ -1011,13 +1011,9 @@ var BrowserApp = {
},
// nsIAndroidBrowserApp
getWindowForTab: function(tabId) {
let tab = this.getTabForId(tabId);
if (!tab.browser)
return null;
return tab.browser.contentWindow;
getBrowserTab: function(tabId) {
return this.getTabForId(tabId);
}
};
var NativeWindow = {
@ -2253,11 +2249,23 @@ Tab.prototype = {
}
},
// nsIBrowserTab
get window() {
if (!this.browser)
return null;
return this.browser.contentWindow;
},
get scale() {
return this.viewport.zoom;
},
QueryInterface: XPCOMUtils.generateQI([
Ci.nsIWebProgressListener,
Ci.nsISHistoryListener,
Ci.nsIObserver,
Ci.nsISupportsWeakReference
Ci.nsISupportsWeakReference,
Ci.nsIBrowserTab
])
};

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

@ -1990,7 +1990,7 @@ jobject JNICALL
Java_org_mozilla_gecko_GeckoAppShell_allocateDirectBuffer(JNIEnv *jenv, jclass, jlong size);
nsresult AndroidBridge::TakeScreenshot(nsIDOMWindow *window, PRInt32 srcX, PRInt32 srcY, PRInt32 srcW, PRInt32 srcH, PRInt32 dstW, PRInt32 dstH, PRInt32 tabId)
nsresult AndroidBridge::TakeScreenshot(nsIDOMWindow *window, PRInt32 srcX, PRInt32 srcY, PRInt32 srcW, PRInt32 srcH, PRInt32 dstW, PRInt32 dstH, PRInt32 tabId, float scale)
{
nsCOMPtr<nsPIDOMWindow> win = do_QueryInterface(window);
if (!win)
@ -2023,8 +2023,10 @@ nsresult AndroidBridge::TakeScreenshot(nsIDOMWindow *window, PRInt32 srcX, PRInt
return NS_OK;
void* data = jenv->GetDirectBufferAddress(buffer);
memset(data, 0, bufferSize);
nsRefPtr<gfxImageSurface> surf = new gfxImageSurface(static_cast<unsigned char*>(data), nsIntSize(dstW, dstH), stride, gfxASurface::ImageFormatRGB16_565);
nsRefPtr<gfxContext> context = new gfxContext(surf);
context->Scale(scale * dstW / srcW, scale * dstH / srcH);
nsresult rv = presShell->RenderDocument(r, renderDocFlags, bgColor, context);
NS_ENSURE_SUCCESS(rv, rv);
AndroidBridge::AutoLocalJNIFrame jniFrame(jenv, 1);

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

@ -156,7 +156,7 @@ public:
static void NotifyIMEChange(const PRUnichar *aText, PRUint32 aTextLen, int aStart, int aEnd, int aNewEnd);
nsresult TakeScreenshot(nsIDOMWindow *window, PRInt32 srcX, PRInt32 srcY, PRInt32 srcW, PRInt32 srcH, PRInt32 dstW, PRInt32 dstH, PRInt32 tabId);
nsresult TakeScreenshot(nsIDOMWindow *window, PRInt32 srcX, PRInt32 srcY, PRInt32 srcW, PRInt32 srcH, PRInt32 dstW, PRInt32 dstH, PRInt32 tabId, float scale);
void AcknowledgeEventSync();

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

@ -445,11 +445,22 @@ nsAppShell::ProcessNextNativeEvent(bool mayWait)
break;
nsCOMPtr<nsIDOMWindow> domWindow;
mBrowserApp->GetWindowForTab(curEvent->MetaState(), getter_AddRefs(domWindow));
nsCOMPtr<nsIBrowserTab> tab;
float scale;
mBrowserApp->GetBrowserTab(curEvent->MetaState(), getter_AddRefs(tab));
if (!tab)
break;
tab->GetWindow(getter_AddRefs(domWindow));
if (!domWindow)
break;
if (NS_FAILED(tab->GetScale(&scale)))
break;
nsTArray<nsIntPoint> points = curEvent->Points();
NS_ASSERTION(points.Length() != 2, "Screenshot event does not have enough coordinates");
if (domWindow)
bridge->TakeScreenshot(domWindow, 0, 0, points[0].x, points[0].y, points[1].x, points[1].y, curEvent->MetaState());
bridge->TakeScreenshot(domWindow, 0, 0, points[0].x, points[0].y, points[1].x, points[1].y, curEvent->MetaState(), scale);
break;
}

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

@ -12,9 +12,15 @@ interface nsIAndroidDrawMetadataProvider : nsISupports {
boolean paintingSuppressed();
};
[scriptable, uuid(0843f3c1-043e-4c64-9d8c-091370548c05)]
interface nsIBrowserTab : nsISupports {
readonly attribute nsIDOMWindow window;
readonly attribute float scale;
};
[scriptable, uuid(d10377b4-1c90-493a-a532-63cb3f16ee2b)]
interface nsIAndroidBrowserApp : nsISupports {
nsIDOMWindow getWindowForTab(in PRInt32 tabId);
nsIBrowserTab getBrowserTab(in PRInt32 tabId);
};
[scriptable, uuid(7dd8441a-4f38-49b2-bd90-da69d02a96cf)]