зеркало из https://github.com/mozilla/pjs.git
Relanding bug 406686
This commit is contained in:
Родитель
7999a39f74
Коммит
3e28abc362
|
@ -1152,6 +1152,12 @@ public:
|
|||
nsNativeKeyEvent* aNativeEvent,
|
||||
PRBool aGetCharCode);
|
||||
|
||||
/**
|
||||
* Hide any XUL popups associated with aDocument, including any documents
|
||||
* displayed in child frames.
|
||||
*/
|
||||
static void HidePopupsInDocument(nsIDocument* aDocument);
|
||||
|
||||
/**
|
||||
* Get the application manifest URI for this context. The manifest URI
|
||||
* is specified in the manifest= attribute of the root element of the
|
||||
|
|
|
@ -145,6 +145,7 @@ static NS_DEFINE_CID(kXTFServiceCID, NS_XTFSERVICE_CID);
|
|||
#include "nsIDOMNSUIEvent.h"
|
||||
#include "nsIDOMNSEvent.h"
|
||||
#include "nsIPrivateDOMEvent.h"
|
||||
#include "nsXULPopupManager.h"
|
||||
#include "nsIPermissionManager.h"
|
||||
|
||||
#ifdef IBMBIDI
|
||||
|
@ -3924,6 +3925,21 @@ nsContentUtils::DOMEventToNativeKeyEvent(nsIDOMEvent* aDOMEvent,
|
|||
return PR_TRUE;
|
||||
}
|
||||
|
||||
/* static */
|
||||
void
|
||||
nsContentUtils::HidePopupsInDocument(nsIDocument* aDocument)
|
||||
{
|
||||
NS_PRECONDITION(aDocument, "Null document");
|
||||
|
||||
nsXULPopupManager* pm = nsXULPopupManager::GetInstance();
|
||||
if (pm) {
|
||||
nsCOMPtr<nsISupports> container = aDocument->GetContainer();
|
||||
nsCOMPtr<nsIDocShellTreeItem> docShellToHide = do_QueryInterface(container);
|
||||
if (docShellToHide)
|
||||
pm->HidePopupsInDocShell(docShellToHide);
|
||||
}
|
||||
}
|
||||
|
||||
/* static */
|
||||
void
|
||||
nsAutoGCRoot::Shutdown()
|
||||
|
|
|
@ -3297,10 +3297,8 @@ nsGlobalWindow::CheckSecurityWidthAndHeight(PRInt32* aWidth, PRInt32* aHeight)
|
|||
#ifdef MOZ_XUL
|
||||
if (!nsContentUtils::IsCallerTrustedForWrite()) {
|
||||
// if attempting to resize the window, hide any open popups
|
||||
nsXULPopupManager* pm = nsXULPopupManager::GetInstance();
|
||||
nsCOMPtr<nsIDocument> doc(do_QueryInterface(mDocument));
|
||||
if (pm && doc)
|
||||
pm->HidePopupsInDocument(doc);
|
||||
nsContentUtils::HidePopupsInDocument(doc);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -3332,10 +3330,8 @@ nsGlobalWindow::CheckSecurityLeftAndTop(PRInt32* aLeft, PRInt32* aTop)
|
|||
if (!nsContentUtils::IsCallerTrustedForWrite()) {
|
||||
#ifdef MOZ_XUL
|
||||
// if attempting to move the window, hide any open popups
|
||||
nsXULPopupManager* pm = nsXULPopupManager::GetInstance();
|
||||
nsCOMPtr<nsIDocument> doc(do_QueryInterface(mDocument));
|
||||
if (pm && doc)
|
||||
pm->HidePopupsInDocument(doc);
|
||||
nsContentUtils::HidePopupsInDocument(doc);
|
||||
#endif
|
||||
|
||||
PRInt32 screenLeft, screenTop, screenWidth, screenHeight;
|
||||
|
|
|
@ -231,30 +231,57 @@ nsThebesImage::Optimize(nsIDeviceContext* aContext)
|
|||
if (mOptSurface || mSinglePixel)
|
||||
return NS_OK;
|
||||
|
||||
if (mWidth == 1 && mHeight == 1) {
|
||||
// yeah, let's optimize this.
|
||||
if (mFormat == gfxImageSurface::ImageFormatARGB32 ||
|
||||
mFormat == gfxImageSurface::ImageFormatRGB24)
|
||||
{
|
||||
PRUint32 pixel = *((PRUint32 *) mImageSurface->Data());
|
||||
/* Figure out if the entire image is a constant color */
|
||||
|
||||
mSinglePixelColor = gfxRGBA
|
||||
(pixel,
|
||||
(mFormat == gfxImageSurface::ImageFormatRGB24 ?
|
||||
gfxRGBA::PACKED_XRGB :
|
||||
gfxRGBA::PACKED_ARGB_PREMULTIPLIED));
|
||||
// this should always be true
|
||||
if (mStride == mWidth * 4) {
|
||||
PRUint32 *imgData = (PRUint32*) mImageSurface->Data();
|
||||
PRUint32 firstPixel = * (PRUint32*) imgData;
|
||||
PRUint32 pixelCount = mWidth * mHeight + 1;
|
||||
|
||||
mSinglePixel = PR_TRUE;
|
||||
while (--pixelCount && *imgData++ == firstPixel)
|
||||
;
|
||||
|
||||
return NS_OK;
|
||||
if (pixelCount == 0) {
|
||||
// all pixels were the same
|
||||
if (mFormat == gfxImageSurface::ImageFormatARGB32 ||
|
||||
mFormat == gfxImageSurface::ImageFormatRGB24)
|
||||
{
|
||||
mSinglePixelColor = gfxRGBA
|
||||
(firstPixel,
|
||||
(mFormat == gfxImageSurface::ImageFormatRGB24 ?
|
||||
gfxRGBA::PACKED_XRGB :
|
||||
gfxRGBA::PACKED_ARGB_PREMULTIPLIED));
|
||||
|
||||
mSinglePixel = PR_TRUE;
|
||||
|
||||
// XXX we can't do this until we either teach anyone
|
||||
// who calls GetSurface() about single-color stuff,
|
||||
// or until we make GetSurface() create a new temporary
|
||||
// surface to return (and that callers understand that
|
||||
// modifying that surface won't modify the image).
|
||||
// Current users are drag & drop and clipboard.
|
||||
#if 0
|
||||
// blow away the older surfaces, to release data
|
||||
|
||||
mImageSurface = nsnull;
|
||||
mOptSurface = nsnull;
|
||||
#ifdef XP_WIN
|
||||
mWinSurface = nsnull;
|
||||
#endif
|
||||
#ifdef XP_MACOSX
|
||||
mQuartzSurface = nsnull;
|
||||
#endif
|
||||
#endif
|
||||
return NS_OK;
|
||||
}
|
||||
}
|
||||
|
||||
// if it's not RGB24/ARGB32, don't optimize, but we should
|
||||
// never hit this.
|
||||
// if it's not RGB24/ARGB32, don't optimize, but we never hit this at the moment
|
||||
}
|
||||
|
||||
// if we're being forced to use image surfaces due to
|
||||
// resource constraints, don't try to optimize beyond single-pixel.
|
||||
// resource constraints, don't try to optimize beyond same-pixel.
|
||||
if (ShouldUseImageSurfaces())
|
||||
return NS_OK;
|
||||
|
||||
|
|
|
@ -1179,9 +1179,7 @@ DocumentViewerImpl::PageHide(PRBool aIsUnload)
|
|||
#ifdef MOZ_XUL
|
||||
// look for open menupopups and close them after the unload event, in case
|
||||
// the unload event listeners open any new popups
|
||||
nsXULPopupManager* pm = nsXULPopupManager::GetInstance();
|
||||
if (pm && mDocument)
|
||||
pm->HidePopupsInDocument(mDocument);
|
||||
nsContentUtils::HidePopupsInDocument(mDocument);
|
||||
#endif
|
||||
|
||||
return NS_OK;
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
*
|
||||
* Contributor(s):
|
||||
* Travis Bogard <travis@netscape.com>
|
||||
* Håkan Waara <hwaara@chello.se>
|
||||
* HÂkan Waara <hwaara@chello.se>
|
||||
*
|
||||
* Alternatively, the contents of this file may be used under the terms of
|
||||
* either of the GNU General Public License Version 2 or later (the "GPL"),
|
||||
|
@ -94,6 +94,10 @@
|
|||
#include "nsIObjectLoadingContent.h"
|
||||
#include "nsLayoutUtils.h"
|
||||
|
||||
#ifdef MOZ_XUL
|
||||
#include "nsXULPopupManager.h"
|
||||
#endif
|
||||
|
||||
// For Accessibility
|
||||
#ifdef ACCESSIBILITY
|
||||
#include "nsIAccessibilityService.h"
|
||||
|
@ -673,6 +677,15 @@ nsSubDocumentFrame::AttributeChanged(PRInt32 aNameSpaceID,
|
|||
|
||||
PRBool is_primary = value.LowerCaseEqualsLiteral("content-primary");
|
||||
|
||||
#ifdef MOZ_XUL
|
||||
// when a content panel is no longer primary, hide any open popups it may have
|
||||
if (!is_primary) {
|
||||
nsXULPopupManager* pm = nsXULPopupManager::GetInstance();
|
||||
if (pm)
|
||||
pm->HidePopupsInDocShell(docShellAsItem);
|
||||
}
|
||||
#endif
|
||||
|
||||
parentTreeOwner->ContentShellRemoved(docShellAsItem);
|
||||
|
||||
if (value.LowerCaseEqualsLiteral("content") ||
|
||||
|
|
|
@ -75,6 +75,7 @@ class nsMenuPopupFrame;
|
|||
class nsMenuBarFrame;
|
||||
class nsIMenuParent;
|
||||
class nsIDOMKeyEvent;
|
||||
class nsIDocShellTreeItem;
|
||||
|
||||
enum nsPopupType {
|
||||
ePopupTypePanel,
|
||||
|
@ -473,10 +474,10 @@ public:
|
|||
void HidePopupAfterDelay(nsMenuPopupFrame* aPopup);
|
||||
|
||||
/**
|
||||
* Hide all of the popups from a given document. This should be called when the
|
||||
* Hide all of the popups from a given docshell. This should be called when the
|
||||
* document is hidden.
|
||||
*/
|
||||
void HidePopupsInDocument(nsIDocument* aDocument);
|
||||
void HidePopupsInDocShell(nsIDocShellTreeItem* aDocShellToHide);
|
||||
|
||||
/**
|
||||
* Execute a menu command from the triggering event aEvent.
|
||||
|
@ -712,6 +713,11 @@ protected:
|
|||
*/
|
||||
void UpdateKeyboardListeners();
|
||||
|
||||
/*
|
||||
* Returns true if the docshell for aDoc is aExpected or a child of aExpected.
|
||||
*/
|
||||
PRBool IsChildOfDocShell(nsIDocument* aDoc, nsIDocShellTreeItem* aExpected);
|
||||
|
||||
// the document the key event listener is attached to
|
||||
nsCOMPtr<nsIDOMEventTarget> mKeyListener;
|
||||
|
||||
|
|
|
@ -60,6 +60,7 @@
|
|||
#include "nsPIDOMWindow.h"
|
||||
#include "nsIInterfaceRequestorUtils.h"
|
||||
#include "nsIBaseWindow.h"
|
||||
#include "nsIDocShellTreeItem.h"
|
||||
|
||||
// See matching definitions in nsXULPopupManager.h
|
||||
nsNavigationDirection DirectionFromKeyCode_lr_tb [6] = {
|
||||
|
@ -765,8 +766,25 @@ nsXULPopupManager::HidePopupsInList(const nsTArray<nsMenuPopupFrame *> &aFrames,
|
|||
SetCaptureState(nsnull);
|
||||
}
|
||||
|
||||
PRBool
|
||||
nsXULPopupManager::IsChildOfDocShell(nsIDocument* aDoc, nsIDocShellTreeItem* aExpected)
|
||||
{
|
||||
nsCOMPtr<nsISupports> doc = aDoc->GetContainer();
|
||||
nsCOMPtr<nsIDocShellTreeItem> docShellItem(do_QueryInterface(doc));
|
||||
while(docShellItem) {
|
||||
if (docShellItem == aExpected)
|
||||
return PR_TRUE;
|
||||
|
||||
nsCOMPtr<nsIDocShellTreeItem> parent;
|
||||
docShellItem->GetParent(getter_AddRefs(parent));
|
||||
docShellItem = parent;
|
||||
}
|
||||
|
||||
return PR_FALSE;
|
||||
}
|
||||
|
||||
void
|
||||
nsXULPopupManager::HidePopupsInDocument(nsIDocument* aDocument)
|
||||
nsXULPopupManager::HidePopupsInDocShell(nsIDocShellTreeItem* aDocShellToHide)
|
||||
{
|
||||
nsTArray<nsMenuPopupFrame *> popupsToHide;
|
||||
|
||||
|
@ -775,7 +793,7 @@ nsXULPopupManager::HidePopupsInDocument(nsIDocument* aDocument)
|
|||
while (item) {
|
||||
nsMenuChainItem* parent = item->GetParent();
|
||||
if (item->Frame()->PopupState() != ePopupInvisible &&
|
||||
aDocument && item->Content()->GetOwnerDoc() == aDocument) {
|
||||
IsChildOfDocShell(item->Content()->GetOwnerDoc(), aDocShellToHide)) {
|
||||
nsMenuPopupFrame* frame = item->Frame();
|
||||
item->Detach(&mCurrentMenu);
|
||||
delete item;
|
||||
|
@ -789,7 +807,7 @@ nsXULPopupManager::HidePopupsInDocument(nsIDocument* aDocument)
|
|||
while (item) {
|
||||
nsMenuChainItem* parent = item->GetParent();
|
||||
if (item->Frame()->PopupState() != ePopupInvisible &&
|
||||
aDocument && item->Content()->GetOwnerDoc() == aDocument) {
|
||||
IsChildOfDocShell(item->Content()->GetOwnerDoc(), aDocShellToHide)) {
|
||||
nsMenuPopupFrame* frame = item->Frame();
|
||||
item->Detach(&mPanels);
|
||||
delete item;
|
||||
|
|
Загрузка…
Ссылка в новой задаче