2004-06-20 20:42:13 +04:00
|
|
|
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
2012-05-21 15:12:37 +04:00
|
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
2004-06-20 20:42:13 +04:00
|
|
|
|
|
|
|
#include "nsIDocShell.h"
|
2004-08-01 03:15:21 +04:00
|
|
|
#include "nsPresContext.h"
|
2011-10-03 23:11:31 +04:00
|
|
|
#include "nsDOMClassInfoID.h"
|
2012-07-27 18:03:27 +04:00
|
|
|
#include "nsError.h"
|
2012-08-04 11:44:00 +04:00
|
|
|
#include "nsIDOMEvent.h"
|
2004-06-20 20:42:13 +04:00
|
|
|
#include "nsDOMWindowUtils.h"
|
2010-03-19 08:02:53 +03:00
|
|
|
#include "nsQueryContentEventResult.h"
|
2004-06-20 20:42:13 +04:00
|
|
|
#include "nsGlobalWindow.h"
|
2004-11-18 23:50:16 +03:00
|
|
|
#include "nsIDocument.h"
|
Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 22:00:39 +04:00
|
|
|
#include "nsFocusManager.h"
|
2010-09-17 22:56:53 +04:00
|
|
|
#include "nsEventStateManager.h"
|
2011-03-16 02:20:19 +03:00
|
|
|
#include "nsFrameManager.h"
|
2011-04-12 10:18:43 +04:00
|
|
|
#include "nsRefreshDriver.h"
|
2011-12-17 04:24:11 +04:00
|
|
|
#include "nsDOMTouchEvent.h"
|
|
|
|
#include "nsIDOMTouchEvent.h"
|
2012-03-28 19:53:56 +04:00
|
|
|
#include "nsObjectLoadingContent.h"
|
2012-09-11 01:02:23 +04:00
|
|
|
#include "nsFrame.h"
|
2004-06-20 20:42:13 +04:00
|
|
|
|
2009-09-03 07:57:46 +04:00
|
|
|
#include "nsIScrollableFrame.h"
|
2009-03-30 16:19:06 +04:00
|
|
|
|
2005-10-22 02:30:36 +04:00
|
|
|
#include "nsContentUtils.h"
|
2010-03-19 08:02:53 +03:00
|
|
|
#include "nsLayoutUtils.h"
|
2005-10-22 02:30:36 +04:00
|
|
|
|
|
|
|
#include "nsIFrame.h"
|
2007-02-27 00:14:19 +03:00
|
|
|
#include "nsIWidget.h"
|
|
|
|
#include "nsGUIEvent.h"
|
2012-03-22 18:42:42 +04:00
|
|
|
#include "nsCharsetSource.h"
|
2007-11-07 00:47:35 +03:00
|
|
|
#include "nsJSEnvironment.h"
|
2011-12-17 01:11:08 +04:00
|
|
|
#include "nsJSUtils.h"
|
2005-10-22 02:30:36 +04:00
|
|
|
|
2013-01-05 07:12:24 +04:00
|
|
|
#include "nsViewManager.h"
|
2008-08-28 01:24:03 +04:00
|
|
|
|
2008-12-03 04:34:07 +03:00
|
|
|
#include "nsIDOMHTMLCanvasElement.h"
|
|
|
|
#include "gfxContext.h"
|
|
|
|
#include "gfxImageSurface.h"
|
2010-02-24 22:04:32 +03:00
|
|
|
#include "nsLayoutUtils.h"
|
2010-04-03 05:58:25 +04:00
|
|
|
#include "nsComputedDOMStyle.h"
|
2010-08-28 03:15:07 +04:00
|
|
|
#include "nsIPresShell.h"
|
2010-10-24 03:31:55 +04:00
|
|
|
#include "nsStyleAnimation.h"
|
|
|
|
#include "nsCSSProps.h"
|
2011-09-27 04:25:41 +04:00
|
|
|
#include "nsDOMFile.h"
|
2011-10-18 23:28:39 +04:00
|
|
|
#include "BasicLayers.h"
|
2012-03-28 19:53:56 +04:00
|
|
|
#include "nsTArrayHelpers.h"
|
2012-05-05 17:28:06 +04:00
|
|
|
#include "nsIDocShell.h"
|
|
|
|
#include "nsIContentViewer.h"
|
|
|
|
#include "nsIMarkupDocumentViewer.h"
|
2012-05-23 18:49:59 +04:00
|
|
|
#include "nsClientRect.h"
|
2013-01-15 16:22:03 +04:00
|
|
|
#include <algorithm>
|
2008-12-03 04:34:07 +03:00
|
|
|
|
2012-06-28 04:15:32 +04:00
|
|
|
#if defined(MOZ_X11) && defined(MOZ_WIDGET_GTK)
|
2008-06-04 04:00:37 +04:00
|
|
|
#include <gdk/gdk.h>
|
2006-03-25 02:30:24 +03:00
|
|
|
#include <gdk/gdkx.h>
|
|
|
|
#endif
|
|
|
|
|
2010-09-03 22:01:05 +04:00
|
|
|
#include "Layers.h"
|
2011-06-11 17:38:40 +04:00
|
|
|
#include "nsIIOService.h"
|
2010-09-03 22:01:05 +04:00
|
|
|
|
2011-03-28 20:51:56 +04:00
|
|
|
#include "mozilla/dom/Element.h"
|
2011-12-16 11:34:24 +04:00
|
|
|
#include "mozilla/dom/indexedDB/FileInfo.h"
|
|
|
|
#include "mozilla/dom/indexedDB/IndexedDatabaseManager.h"
|
2013-03-18 18:10:30 +04:00
|
|
|
#include "sampler.h"
|
2012-06-03 20:33:52 +04:00
|
|
|
#include "nsDOMBlobBuilder.h"
|
|
|
|
#include "nsIDOMFileHandle.h"
|
2012-09-04 12:39:28 +04:00
|
|
|
#include "nsPrintfCString.h"
|
2012-12-18 01:24:41 +04:00
|
|
|
#include "nsViewportInfo.h"
|
2013-01-03 19:17:36 +04:00
|
|
|
#include "nsIFormControl.h"
|
2011-03-28 20:51:56 +04:00
|
|
|
|
2012-04-25 07:00:02 +04:00
|
|
|
using namespace mozilla;
|
2011-03-28 20:51:56 +04:00
|
|
|
using namespace mozilla::dom;
|
2010-09-03 22:01:05 +04:00
|
|
|
using namespace mozilla::layers;
|
2011-11-27 15:51:52 +04:00
|
|
|
using namespace mozilla::widget;
|
2010-09-03 22:01:05 +04:00
|
|
|
|
2010-01-12 16:08:43 +03:00
|
|
|
DOMCI_DATA(WindowUtils, nsDOMWindowUtils)
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
NS_INTERFACE_MAP_BEGIN(nsDOMWindowUtils)
|
2004-06-20 20:42:13 +04:00
|
|
|
NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIDOMWindowUtils)
|
|
|
|
NS_INTERFACE_MAP_ENTRY(nsIDOMWindowUtils)
|
|
|
|
NS_INTERFACE_MAP_ENTRY(nsISupportsWeakReference)
|
2005-10-22 02:30:36 +04:00
|
|
|
NS_DOM_INTERFACE_MAP_ENTRY_CLASSINFO(WindowUtils)
|
2004-06-20 20:42:13 +04:00
|
|
|
NS_INTERFACE_MAP_END
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
NS_IMPL_ADDREF(nsDOMWindowUtils)
|
|
|
|
NS_IMPL_RELEASE(nsDOMWindowUtils)
|
2004-06-20 20:42:13 +04:00
|
|
|
|
2004-12-10 22:48:22 +03:00
|
|
|
nsDOMWindowUtils::nsDOMWindowUtils(nsGlobalWindow *aWindow)
|
|
|
|
{
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsISupports> supports = do_QueryObject(aWindow);
|
|
|
|
mWindow = do_GetWeakReference(supports);
|
|
|
|
NS_ASSERTION(aWindow->IsOuterWindow(), "How did that happen?");
|
2004-06-21 00:37:16 +04:00
|
|
|
}
|
2004-06-20 20:42:13 +04:00
|
|
|
|
2004-12-10 22:48:22 +03:00
|
|
|
nsDOMWindowUtils::~nsDOMWindowUtils()
|
|
|
|
{
|
2004-06-21 00:37:16 +04:00
|
|
|
}
|
2004-06-20 20:42:13 +04:00
|
|
|
|
2010-09-04 00:10:45 +04:00
|
|
|
nsIPresShell*
|
|
|
|
nsDOMWindowUtils::GetPresShell()
|
|
|
|
{
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
if (!window)
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2010-09-04 00:10:45 +04:00
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsIDocShell *docShell = window->GetDocShell();
|
2010-09-04 00:10:45 +04:00
|
|
|
if (!docShell)
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2010-09-04 00:10:45 +04:00
|
|
|
|
2012-12-29 05:56:42 +04:00
|
|
|
return docShell->GetPresShell();
|
2010-09-04 00:10:45 +04:00
|
|
|
}
|
|
|
|
|
2009-01-06 04:15:13 +03:00
|
|
|
nsPresContext*
|
|
|
|
nsDOMWindowUtils::GetPresContext()
|
|
|
|
{
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
if (!window)
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2012-04-02 06:23:51 +04:00
|
|
|
nsIDocShell *docShell = window->GetDocShell();
|
2009-01-06 04:15:13 +03:00
|
|
|
if (!docShell)
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2010-03-25 16:17:11 +03:00
|
|
|
nsRefPtr<nsPresContext> presContext;
|
2009-01-06 04:15:13 +03:00
|
|
|
docShell->GetPresContext(getter_AddRefs(presContext));
|
|
|
|
return presContext;
|
|
|
|
}
|
|
|
|
|
2004-06-20 20:42:13 +04:00
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::GetImageAnimationMode(uint16_t *aMode)
|
2004-12-10 22:48:22 +03:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2004-06-20 20:42:13 +04:00
|
|
|
NS_ENSURE_ARG_POINTER(aMode);
|
|
|
|
*aMode = 0;
|
2009-01-06 04:15:13 +03:00
|
|
|
nsPresContext* presContext = GetPresContext();
|
|
|
|
if (presContext) {
|
|
|
|
*aMode = presContext->ImageAnimationMode();
|
|
|
|
return NS_OK;
|
2004-06-20 20:42:13 +04:00
|
|
|
}
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::SetImageAnimationMode(uint16_t aMode)
|
2004-12-10 22:48:22 +03:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2009-01-06 04:15:13 +03:00
|
|
|
nsPresContext* presContext = GetPresContext();
|
|
|
|
if (presContext) {
|
|
|
|
presContext->SetImageAnimationMode(aMode);
|
|
|
|
return NS_OK;
|
2004-06-20 20:42:13 +04:00
|
|
|
}
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
}
|
2004-11-18 23:50:16 +03:00
|
|
|
|
2007-08-11 22:37:16 +04:00
|
|
|
NS_IMETHODIMP
|
2011-09-29 10:19:26 +04:00
|
|
|
nsDOMWindowUtils::GetDocCharsetIsForced(bool *aIsForced)
|
2007-08-11 22:37:16 +04:00
|
|
|
{
|
2011-10-17 18:59:28 +04:00
|
|
|
*aIsForced = false;
|
2007-08-11 22:37:16 +04:00
|
|
|
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2007-08-11 22:37:16 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
2010-03-19 08:03:41 +03:00
|
|
|
}
|
2007-08-11 22:37:16 +04:00
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
if (window) {
|
2012-08-23 00:17:20 +04:00
|
|
|
nsCOMPtr<nsIDocument> doc = window->GetExtantDoc();
|
2007-08-11 22:37:16 +04:00
|
|
|
*aIsForced = doc &&
|
|
|
|
doc->GetDocumentCharacterSetSource() >= kCharsetFromParentForced;
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2004-11-18 23:50:16 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetDocumentMetadata(const nsAString& aName,
|
|
|
|
nsAString& aValue)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2005-10-22 02:30:36 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
2010-03-19 08:03:41 +03:00
|
|
|
}
|
2005-10-22 02:30:36 +04:00
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
if (window) {
|
|
|
|
nsCOMPtr<nsIDocument> doc(do_QueryInterface(window->GetExtantDocument()));
|
2004-11-18 23:50:16 +03:00
|
|
|
if (doc) {
|
|
|
|
nsCOMPtr<nsIAtom> name = do_GetAtom(aName);
|
|
|
|
doc->GetHeaderData(name, aValue);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
aValue.Truncate();
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2005-10-22 02:30:36 +04:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::Redraw(uint32_t aCount, uint32_t *aDurationOut)
|
2005-10-22 02:30:36 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2008-06-04 04:00:37 +04:00
|
|
|
if (aCount == 0)
|
|
|
|
aCount = 1;
|
|
|
|
|
2010-09-04 00:10:45 +04:00
|
|
|
if (nsIPresShell* presShell = GetPresShell()) {
|
|
|
|
nsIFrame *rootFrame = presShell->GetRootFrame();
|
2005-10-22 02:30:36 +04:00
|
|
|
|
2010-09-04 00:10:45 +04:00
|
|
|
if (rootFrame) {
|
|
|
|
PRIntervalTime iStart = PR_IntervalNow();
|
2008-06-04 04:00:37 +04:00
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
for (uint32_t i = 0; i < aCount; i++)
|
2012-08-29 09:39:31 +04:00
|
|
|
rootFrame->InvalidateFrame();
|
2008-06-04 04:00:37 +04:00
|
|
|
|
2012-06-28 04:15:32 +04:00
|
|
|
#if defined(MOZ_X11) && defined(MOZ_WIDGET_GTK)
|
|
|
|
XSync(GDK_DISPLAY_XDISPLAY(gdk_display_get_default()), False);
|
2006-03-25 02:30:24 +03:00
|
|
|
#endif
|
2008-06-04 04:00:37 +04:00
|
|
|
|
2010-09-04 00:10:45 +04:00
|
|
|
*aDurationOut = PR_IntervalToMilliseconds(PR_IntervalNow() - iStart);
|
2008-06-04 04:00:37 +04:00
|
|
|
|
2010-09-04 00:10:45 +04:00
|
|
|
return NS_OK;
|
2005-10-22 02:30:36 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
2007-02-27 00:14:19 +03:00
|
|
|
|
2010-09-04 00:10:45 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::SetCSSViewport(float aWidthPx, float aHeightPx)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2010-09-04 00:10:45 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(aWidthPx >= 0.0 && aHeightPx >= 0.0)) {
|
|
|
|
return NS_ERROR_ILLEGAL_VALUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIPresShell* presShell = GetPresShell();
|
|
|
|
if (!presShell) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
nscoord width = nsPresContext::CSSPixelsToAppUnits(aWidthPx);
|
|
|
|
nscoord height = nsPresContext::CSSPixelsToAppUnits(aHeightPx);
|
|
|
|
|
2010-09-25 02:41:31 +04:00
|
|
|
presShell->ResizeReflowOverride(width, height);
|
2010-09-04 00:10:45 +04:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2012-08-23 00:17:20 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetViewportInfo(uint32_t aDisplayWidth,
|
|
|
|
uint32_t aDisplayHeight,
|
|
|
|
double *aDefaultZoom, bool *aAllowZoom,
|
|
|
|
double *aMinZoom, double *aMaxZoom,
|
|
|
|
uint32_t *aWidth, uint32_t *aHeight,
|
|
|
|
bool *aAutoSize)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_STATE(window);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocument> doc(do_QueryInterface(window->GetExtantDocument()));
|
|
|
|
NS_ENSURE_STATE(doc);
|
|
|
|
|
2012-12-18 01:24:41 +04:00
|
|
|
nsViewportInfo info = nsContentUtils::GetViewportInfo(doc, aDisplayWidth, aDisplayHeight);
|
|
|
|
*aDefaultZoom = info.GetDefaultZoom();
|
|
|
|
*aAllowZoom = info.IsZoomAllowed();
|
|
|
|
*aMinZoom = info.GetMinZoom();
|
|
|
|
*aMaxZoom = info.GetMaxZoom();
|
|
|
|
*aWidth = info.GetWidth();
|
|
|
|
*aHeight = info.GetHeight();
|
|
|
|
*aAutoSize = info.IsAutoSizeEnabled();
|
2012-08-23 00:17:20 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2011-03-16 02:20:19 +03:00
|
|
|
static void DestroyNsRect(void* aObject, nsIAtom* aPropertyName,
|
|
|
|
void* aPropertyValue, void* aData)
|
|
|
|
{
|
|
|
|
nsRect* rect = static_cast<nsRect*>(aPropertyValue);
|
|
|
|
delete rect;
|
|
|
|
}
|
|
|
|
|
2012-05-05 17:28:06 +04:00
|
|
|
static void
|
|
|
|
MaybeReflowForInflationScreenWidthChange(nsPresContext *aPresContext)
|
|
|
|
{
|
2012-06-06 07:47:33 +04:00
|
|
|
if (aPresContext) {
|
|
|
|
nsIPresShell* presShell = aPresContext->GetPresShell();
|
|
|
|
if (presShell && nsLayoutUtils::FontSizeInflationEnabled(aPresContext) &&
|
|
|
|
presShell->FontSizeInflationMinTwips() != 0) {
|
|
|
|
bool changed;
|
|
|
|
aPresContext->ScreenWidthInchesForFontInflation(&changed);
|
|
|
|
if (changed) {
|
|
|
|
nsCOMPtr<nsISupports> container = aPresContext->GetContainer();
|
|
|
|
nsCOMPtr<nsIDocShell> docShell = do_QueryInterface(container);
|
|
|
|
if (docShell) {
|
|
|
|
nsCOMPtr<nsIContentViewer> cv;
|
|
|
|
docShell->GetContentViewer(getter_AddRefs(cv));
|
|
|
|
nsCOMPtr<nsIMarkupDocumentViewer> mudv = do_QueryInterface(cv);
|
|
|
|
if (mudv) {
|
|
|
|
nsTArray<nsCOMPtr<nsIMarkupDocumentViewer> > array;
|
|
|
|
mudv->AppendSubtree(array);
|
2012-08-22 19:56:38 +04:00
|
|
|
for (uint32_t i = 0, iEnd = array.Length(); i < iEnd; ++i) {
|
2012-06-06 07:47:33 +04:00
|
|
|
nsCOMPtr<nsIPresShell> shell;
|
|
|
|
nsCOMPtr<nsIContentViewer> cv = do_QueryInterface(array[i]);
|
|
|
|
cv->GetPresShell(getter_AddRefs(shell));
|
|
|
|
if (shell) {
|
|
|
|
nsIFrame *rootFrame = shell->GetRootFrame();
|
|
|
|
if (rootFrame) {
|
2012-06-12 00:57:35 +04:00
|
|
|
shell->FrameNeedsReflow(rootFrame,
|
|
|
|
nsIPresShell::eStyleChange,
|
2012-06-06 07:47:33 +04:00
|
|
|
NS_FRAME_IS_DIRTY);
|
|
|
|
}
|
2012-05-07 19:02:01 +04:00
|
|
|
}
|
2012-05-05 17:28:06 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-03-16 02:20:19 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::SetDisplayPortForElement(float aXPx, float aYPx,
|
|
|
|
float aWidthPx, float aHeightPx,
|
|
|
|
nsIDOMElement* aElement)
|
2010-09-04 00:10:46 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2010-09-04 00:10:46 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIPresShell* presShell = GetPresShell();
|
|
|
|
if (!presShell) {
|
|
|
|
return NS_ERROR_FAILURE;
|
2012-05-05 17:25:26 +04:00
|
|
|
}
|
2010-09-04 00:10:46 +04:00
|
|
|
|
|
|
|
nsRect displayport(nsPresContext::CSSPixelsToAppUnits(aXPx),
|
|
|
|
nsPresContext::CSSPixelsToAppUnits(aYPx),
|
|
|
|
nsPresContext::CSSPixelsToAppUnits(aWidthPx),
|
|
|
|
nsPresContext::CSSPixelsToAppUnits(aHeightPx));
|
|
|
|
|
2011-03-16 02:20:19 +03:00
|
|
|
if (!aElement) {
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIContent> content = do_QueryInterface(aElement);
|
|
|
|
|
|
|
|
if (!content) {
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
2012-04-16 17:48:04 +04:00
|
|
|
if (content->GetCurrentDoc() != presShell->GetDocument()) {
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
2011-03-16 02:20:19 +03:00
|
|
|
content->SetProperty(nsGkAtoms::DisplayPort, new nsRect(displayport),
|
|
|
|
DestroyNsRect);
|
|
|
|
|
|
|
|
nsIFrame* rootScrollFrame = presShell->GetRootScrollFrame();
|
|
|
|
if (rootScrollFrame) {
|
|
|
|
if (content == rootScrollFrame->GetContent()) {
|
2011-03-10 00:35:27 +03:00
|
|
|
// We are setting a root displayport for a document.
|
|
|
|
// The pres shell needs a special flag set.
|
2011-10-17 18:59:28 +04:00
|
|
|
presShell->SetIgnoreViewportScrolling(true);
|
2012-05-05 17:28:06 +04:00
|
|
|
|
|
|
|
// When the "font.size.inflation.minTwips" preference is set, the
|
|
|
|
// layout depends on the size of the screen. Since when the size
|
|
|
|
// of the screen changes, the root displayport also changes, we
|
|
|
|
// hook in the needed updates here rather than adding a
|
|
|
|
// separate notification just for this change.
|
|
|
|
nsPresContext* presContext = GetPresContext();
|
|
|
|
MaybeReflowForInflationScreenWidthChange(presContext);
|
2011-03-16 02:20:19 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-05-05 17:25:26 +04:00
|
|
|
nsIFrame* rootFrame = presShell->FrameManager()->GetRootFrame();
|
|
|
|
if (rootFrame) {
|
2012-12-17 04:20:02 +04:00
|
|
|
rootFrame->SchedulePaint();
|
2012-05-05 17:25:26 +04:00
|
|
|
|
|
|
|
// If we are hiding something that is a display root then send empty paint
|
|
|
|
// transaction in order to release retained layers because it won't get
|
|
|
|
// any more paint requests when it is hidden.
|
|
|
|
if (displayport.IsEmpty() &&
|
|
|
|
rootFrame == nsLayoutUtils::GetDisplayRootFrame(rootFrame)) {
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (widget) {
|
|
|
|
bool isRetainingManager;
|
|
|
|
LayerManager* manager = widget->GetLayerManager(&isRetainingManager);
|
|
|
|
if (isRetainingManager) {
|
|
|
|
manager->BeginTransaction();
|
2012-07-30 18:20:58 +04:00
|
|
|
nsLayoutUtils::PaintFrame(nullptr, rootFrame, nsRegion(), NS_RGB(255, 255, 255),
|
2012-05-05 17:25:26 +04:00
|
|
|
nsLayoutUtils::PAINT_WIDGET_LAYERS |
|
|
|
|
nsLayoutUtils::PAINT_EXISTING_TRANSACTION);
|
2011-10-18 23:28:39 +04:00
|
|
|
}
|
|
|
|
}
|
2011-03-16 02:20:19 +03:00
|
|
|
}
|
|
|
|
}
|
2010-09-04 00:10:46 +04:00
|
|
|
|
2012-11-22 02:34:18 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::SetCriticalDisplayPortForElement(float aXPx, float aYPx,
|
|
|
|
float aWidthPx, float aHeightPx,
|
|
|
|
nsIDOMElement* aElement)
|
|
|
|
{
|
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIPresShell* presShell = GetPresShell();
|
|
|
|
if (!presShell) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!aElement) {
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIContent> content = do_QueryInterface(aElement);
|
|
|
|
|
|
|
|
if (!content) {
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (content->GetCurrentDoc() != presShell->GetDocument()) {
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsRect displayport;
|
|
|
|
if (!nsLayoutUtils::GetDisplayPort(content, &displayport)) {
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsRect criticalDisplayport(nsPresContext::CSSPixelsToAppUnits(aXPx),
|
|
|
|
nsPresContext::CSSPixelsToAppUnits(aYPx),
|
|
|
|
nsPresContext::CSSPixelsToAppUnits(aWidthPx),
|
|
|
|
nsPresContext::CSSPixelsToAppUnits(aHeightPx));
|
|
|
|
content->SetProperty(nsGkAtoms::CriticalDisplayPort, new nsRect(criticalDisplayport),
|
|
|
|
DestroyNsRect);
|
|
|
|
|
|
|
|
nsIFrame* rootFrame = presShell->GetRootFrame();
|
|
|
|
if (rootFrame) {
|
|
|
|
rootFrame->InvalidateFrame();
|
|
|
|
}
|
|
|
|
|
2010-09-04 00:10:46 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2010-09-04 00:10:46 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::SetResolution(float aXResolution, float aYResolution)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2010-09-04 00:10:46 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIPresShell* presShell = GetPresShell();
|
|
|
|
return presShell ? presShell->SetResolution(aXResolution, aYResolution)
|
|
|
|
: NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2012-10-27 01:09:38 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetResolution(float* aXResolution, float* aYResolution)
|
|
|
|
{
|
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIPresShell* presShell = GetPresShell();
|
|
|
|
|
|
|
|
if (presShell) {
|
|
|
|
*aXResolution = presShell->GetXResolution();
|
|
|
|
*aYResolution = presShell->GetYResolution();
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2012-03-12 19:50:11 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::SetIsFirstPaint(bool aIsFirstPaint)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-03-12 19:50:11 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIPresShell* presShell = GetPresShell();
|
|
|
|
if (presShell) {
|
|
|
|
presShell->SetIsFirstPaint(aIsFirstPaint);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetIsFirstPaint(bool *aIsFirstPaint)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-03-12 19:50:11 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIPresShell* presShell = GetPresShell();
|
|
|
|
if (presShell) {
|
|
|
|
*aIsFirstPaint = presShell->GetIsFirstPaint();
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2012-04-25 07:00:02 +04:00
|
|
|
/* static */
|
|
|
|
mozilla::widget::Modifiers
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::GetWidgetModifiers(int32_t aModifiers)
|
2012-04-25 07:00:02 +04:00
|
|
|
{
|
|
|
|
widget::Modifiers result = 0;
|
|
|
|
if (aModifiers & nsIDOMWindowUtils::MODIFIER_SHIFT) {
|
|
|
|
result |= widget::MODIFIER_SHIFT;
|
|
|
|
}
|
|
|
|
if (aModifiers & nsIDOMWindowUtils::MODIFIER_CONTROL) {
|
|
|
|
result |= widget::MODIFIER_CONTROL;
|
|
|
|
}
|
|
|
|
if (aModifiers & nsIDOMWindowUtils::MODIFIER_ALT) {
|
|
|
|
result |= widget::MODIFIER_ALT;
|
|
|
|
}
|
|
|
|
if (aModifiers & nsIDOMWindowUtils::MODIFIER_META) {
|
|
|
|
result |= widget::MODIFIER_META;
|
|
|
|
}
|
|
|
|
if (aModifiers & nsIDOMWindowUtils::MODIFIER_ALTGRAPH) {
|
|
|
|
result |= widget::MODIFIER_ALTGRAPH;
|
|
|
|
}
|
|
|
|
if (aModifiers & nsIDOMWindowUtils::MODIFIER_CAPSLOCK) {
|
|
|
|
result |= widget::MODIFIER_CAPSLOCK;
|
|
|
|
}
|
|
|
|
if (aModifiers & nsIDOMWindowUtils::MODIFIER_FN) {
|
|
|
|
result |= widget::MODIFIER_FN;
|
|
|
|
}
|
|
|
|
if (aModifiers & nsIDOMWindowUtils::MODIFIER_NUMLOCK) {
|
|
|
|
result |= widget::MODIFIER_NUMLOCK;
|
|
|
|
}
|
2012-07-06 04:42:05 +04:00
|
|
|
if (aModifiers & nsIDOMWindowUtils::MODIFIER_SCROLLLOCK) {
|
2012-07-06 04:42:05 +04:00
|
|
|
result |= widget::MODIFIER_SCROLLLOCK;
|
2012-04-25 07:00:02 +04:00
|
|
|
}
|
|
|
|
if (aModifiers & nsIDOMWindowUtils::MODIFIER_SYMBOLLOCK) {
|
|
|
|
result |= widget::MODIFIER_SYMBOLLOCK;
|
|
|
|
}
|
2012-07-06 04:42:05 +04:00
|
|
|
if (aModifiers & nsIDOMWindowUtils::MODIFIER_OS) {
|
2012-07-06 04:42:05 +04:00
|
|
|
result |= widget::MODIFIER_OS;
|
2012-04-25 07:00:02 +04:00
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2007-02-27 00:14:19 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::SendMouseEvent(const nsAString& aType,
|
2008-11-27 00:52:42 +03:00
|
|
|
float aX,
|
|
|
|
float aY,
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t aButton,
|
|
|
|
int32_t aClickCount,
|
|
|
|
int32_t aModifiers,
|
2012-08-14 18:27:39 +04:00
|
|
|
bool aIgnoreRootScrollFrame,
|
|
|
|
float aPressure,
|
2013-02-06 01:40:34 +04:00
|
|
|
unsigned short aInputSourceArg,
|
|
|
|
bool *aPreventDefault)
|
2010-08-28 03:15:07 +04:00
|
|
|
{
|
|
|
|
return SendMouseEventCommon(aType, aX, aY, aButton, aClickCount, aModifiers,
|
2012-08-25 20:04:14 +04:00
|
|
|
aIgnoreRootScrollFrame, aPressure,
|
2013-02-06 01:40:34 +04:00
|
|
|
aInputSourceArg, false, aPreventDefault);
|
2010-08-28 03:15:07 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::SendMouseEventToWindow(const nsAString& aType,
|
|
|
|
float aX,
|
|
|
|
float aY,
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t aButton,
|
|
|
|
int32_t aClickCount,
|
|
|
|
int32_t aModifiers,
|
2012-08-14 18:27:39 +04:00
|
|
|
bool aIgnoreRootScrollFrame,
|
|
|
|
float aPressure,
|
|
|
|
unsigned short aInputSourceArg)
|
2010-08-28 03:15:07 +04:00
|
|
|
{
|
2013-03-18 18:10:35 +04:00
|
|
|
SAMPLE_LABEL("nsDOMWindowUtils", "SendMouseEventToWindow");
|
2010-08-28 03:15:07 +04:00
|
|
|
return SendMouseEventCommon(aType, aX, aY, aButton, aClickCount, aModifiers,
|
2012-08-25 20:04:14 +04:00
|
|
|
aIgnoreRootScrollFrame, aPressure,
|
2013-02-06 01:40:34 +04:00
|
|
|
aInputSourceArg, true, nullptr);
|
2010-08-28 03:15:07 +04:00
|
|
|
}
|
|
|
|
|
2012-05-10 09:24:20 +04:00
|
|
|
static nsIntPoint
|
|
|
|
ToWidgetPoint(float aX, float aY, const nsPoint& aOffset,
|
|
|
|
nsPresContext* aPresContext)
|
|
|
|
{
|
|
|
|
double appPerDev = aPresContext->AppUnitsPerDevPixel();
|
|
|
|
nscoord appPerCSS = nsPresContext::AppUnitsPerCSSPixel();
|
|
|
|
return nsIntPoint(NSToIntRound((aX*appPerCSS + aOffset.x)/appPerDev),
|
|
|
|
NSToIntRound((aY*appPerCSS + aOffset.y)/appPerDev));
|
|
|
|
}
|
|
|
|
|
2013-03-05 00:15:39 +04:00
|
|
|
static inline int16_t
|
|
|
|
GetButtonsFlagForButton(int32_t aButton)
|
|
|
|
{
|
|
|
|
switch (aButton) {
|
|
|
|
case nsMouseEvent::eLeftButton:
|
|
|
|
return nsMouseEvent::eLeftButtonFlag;
|
|
|
|
case nsMouseEvent::eMiddleButton:
|
|
|
|
return nsMouseEvent::eMiddleButtonFlag;
|
|
|
|
case nsMouseEvent::eRightButton:
|
|
|
|
return nsMouseEvent::eRightButtonFlag;
|
|
|
|
case 4:
|
|
|
|
return nsMouseEvent::e4thButtonFlag;
|
|
|
|
case 5:
|
|
|
|
return nsMouseEvent::e5thButtonFlag;
|
|
|
|
default:
|
|
|
|
NS_ERROR("Button not known.");
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-08-28 03:15:07 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::SendMouseEventCommon(const nsAString& aType,
|
|
|
|
float aX,
|
|
|
|
float aY,
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t aButton,
|
|
|
|
int32_t aClickCount,
|
|
|
|
int32_t aModifiers,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool aIgnoreRootScrollFrame,
|
2012-08-14 18:27:39 +04:00
|
|
|
float aPressure,
|
|
|
|
unsigned short aInputSourceArg,
|
2013-02-06 01:40:34 +04:00
|
|
|
bool aToWindow,
|
|
|
|
bool *aPreventDefault)
|
2007-02-27 00:14:19 +03:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2007-02-27 00:14:19 +03:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
2010-03-19 08:03:41 +03:00
|
|
|
}
|
2007-02-27 00:14:19 +03:00
|
|
|
|
|
|
|
// get the widget to send the event to
|
2008-11-27 00:52:42 +03:00
|
|
|
nsPoint offset;
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget(&offset);
|
2007-02-27 00:14:19 +03:00
|
|
|
if (!widget)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t msg;
|
2011-09-29 10:19:26 +04:00
|
|
|
bool contextMenuKey = false;
|
2007-02-27 00:14:19 +03:00
|
|
|
if (aType.EqualsLiteral("mousedown"))
|
|
|
|
msg = NS_MOUSE_BUTTON_DOWN;
|
|
|
|
else if (aType.EqualsLiteral("mouseup"))
|
|
|
|
msg = NS_MOUSE_BUTTON_UP;
|
|
|
|
else if (aType.EqualsLiteral("mousemove"))
|
|
|
|
msg = NS_MOUSE_MOVE;
|
|
|
|
else if (aType.EqualsLiteral("mouseover"))
|
|
|
|
msg = NS_MOUSE_ENTER;
|
|
|
|
else if (aType.EqualsLiteral("mouseout"))
|
|
|
|
msg = NS_MOUSE_EXIT;
|
2007-09-18 11:25:49 +04:00
|
|
|
else if (aType.EqualsLiteral("contextmenu")) {
|
2007-02-27 00:14:19 +03:00
|
|
|
msg = NS_CONTEXTMENU;
|
2007-09-18 11:25:49 +04:00
|
|
|
contextMenuKey = (aButton == 0);
|
2013-02-06 01:40:34 +04:00
|
|
|
} else if (aType.EqualsLiteral("MozMouseHittest"))
|
|
|
|
msg = NS_MOUSE_MOZHITTEST;
|
|
|
|
else
|
2007-02-27 00:14:19 +03:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2012-08-14 18:27:39 +04:00
|
|
|
if (aInputSourceArg == nsIDOMMouseEvent::MOZ_SOURCE_UNKNOWN) {
|
|
|
|
aInputSourceArg = nsIDOMMouseEvent::MOZ_SOURCE_MOUSE;
|
|
|
|
}
|
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
nsMouseEvent event(true, msg, widget, nsMouseEvent::eReal,
|
2007-09-18 11:25:49 +04:00
|
|
|
contextMenuKey ?
|
|
|
|
nsMouseEvent::eContextMenuKey : nsMouseEvent::eNormal);
|
2012-04-25 07:00:02 +04:00
|
|
|
event.modifiers = GetWidgetModifiers(aModifiers);
|
2007-02-27 00:14:19 +03:00
|
|
|
event.button = aButton;
|
2013-03-05 00:15:39 +04:00
|
|
|
event.buttons = GetButtonsFlagForButton(aButton);
|
2007-02-27 00:14:19 +03:00
|
|
|
event.widget = widget;
|
2012-08-14 18:27:39 +04:00
|
|
|
event.pressure = aPressure;
|
|
|
|
event.inputSource = aInputSourceArg;
|
2007-02-27 00:14:19 +03:00
|
|
|
event.clickCount = aClickCount;
|
|
|
|
event.time = PR_IntervalNow();
|
2012-12-16 05:26:04 +04:00
|
|
|
event.mFlags.mIsSynthesizedForTests = true;
|
2008-11-27 00:52:42 +03:00
|
|
|
|
2010-07-19 06:23:48 +04:00
|
|
|
nsPresContext* presContext = GetPresContext();
|
|
|
|
if (!presContext)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2012-05-10 09:24:20 +04:00
|
|
|
event.refPoint = ToWidgetPoint(aX, aY, offset, presContext);
|
2008-11-28 22:53:33 +03:00
|
|
|
event.ignoreRootScrollFrame = aIgnoreRootScrollFrame;
|
2007-02-27 00:14:19 +03:00
|
|
|
|
|
|
|
nsEventStatus status;
|
2010-08-28 03:15:07 +04:00
|
|
|
if (aToWindow) {
|
2011-11-21 21:53:20 +04:00
|
|
|
nsCOMPtr<nsIPresShell> presShell = presContext->PresShell();
|
2010-08-28 03:15:07 +04:00
|
|
|
if (!presShell)
|
|
|
|
return NS_ERROR_FAILURE;
|
2013-01-05 07:12:24 +04:00
|
|
|
nsViewManager* viewManager = presShell->GetViewManager();
|
2010-08-28 03:15:07 +04:00
|
|
|
if (!viewManager)
|
|
|
|
return NS_ERROR_FAILURE;
|
2013-01-03 17:23:11 +04:00
|
|
|
nsView* view = viewManager->GetRootView();
|
2011-03-30 06:24:54 +04:00
|
|
|
if (!view)
|
2010-08-28 03:15:07 +04:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
status = nsEventStatus_eIgnore;
|
2011-11-21 21:53:20 +04:00
|
|
|
return presShell->HandleEvent(view->GetFrame(), &event, false, &status);
|
2010-08-28 03:15:07 +04:00
|
|
|
}
|
2013-02-06 01:40:34 +04:00
|
|
|
nsresult rv = widget->DispatchEvent(&event, status);
|
|
|
|
*aPreventDefault = (status == nsEventStatus_eConsumeNoDefault);
|
|
|
|
|
|
|
|
return rv;
|
2007-02-27 00:14:19 +03:00
|
|
|
}
|
|
|
|
|
2008-08-13 07:08:59 +04:00
|
|
|
NS_IMETHODIMP
|
2012-08-12 05:42:36 +04:00
|
|
|
nsDOMWindowUtils::SendWheelEvent(float aX,
|
|
|
|
float aY,
|
|
|
|
double aDeltaX,
|
|
|
|
double aDeltaY,
|
|
|
|
double aDeltaZ,
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t aDeltaMode,
|
|
|
|
int32_t aModifiers,
|
|
|
|
int32_t aLineOrPageDeltaX,
|
|
|
|
int32_t aLineOrPageDeltaY,
|
|
|
|
uint32_t aOptions)
|
2008-08-13 07:08:59 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2008-08-13 07:08:59 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
2010-03-19 08:03:41 +03:00
|
|
|
}
|
2008-08-13 07:08:59 +04:00
|
|
|
|
|
|
|
// get the widget to send the event to
|
2008-11-27 00:52:42 +03:00
|
|
|
nsPoint offset;
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget(&offset);
|
2012-08-12 05:42:36 +04:00
|
|
|
if (!widget) {
|
2008-08-13 07:08:59 +04:00
|
|
|
return NS_ERROR_NULL_POINTER;
|
2012-08-12 05:42:36 +04:00
|
|
|
}
|
2008-08-13 07:08:59 +04:00
|
|
|
|
2012-08-12 05:42:36 +04:00
|
|
|
widget::WheelEvent wheelEvent(true, NS_WHEEL_WHEEL, widget);
|
|
|
|
wheelEvent.modifiers = GetWidgetModifiers(aModifiers);
|
|
|
|
wheelEvent.deltaX = aDeltaX;
|
|
|
|
wheelEvent.deltaY = aDeltaY;
|
|
|
|
wheelEvent.deltaZ = aDeltaZ;
|
|
|
|
wheelEvent.deltaMode = aDeltaMode;
|
|
|
|
wheelEvent.isMomentum =
|
|
|
|
(aOptions & WHEEL_EVENT_CAUSED_BY_MOMENTUM) != 0;
|
|
|
|
wheelEvent.isPixelOnlyDevice =
|
|
|
|
(aOptions & WHEEL_EVENT_CAUSED_BY_PIXEL_ONLY_DEVICE) != 0;
|
|
|
|
NS_ENSURE_TRUE(
|
|
|
|
!wheelEvent.isPixelOnlyDevice ||
|
|
|
|
aDeltaMode == nsIDOMWheelEvent::DOM_DELTA_PIXEL,
|
|
|
|
NS_ERROR_INVALID_ARG);
|
|
|
|
wheelEvent.customizedByUserPrefs =
|
|
|
|
(aOptions & WHEEL_EVENT_CUSTOMIZED_BY_USER_PREFS) != 0;
|
|
|
|
wheelEvent.lineOrPageDeltaX = aLineOrPageDeltaX;
|
|
|
|
wheelEvent.lineOrPageDeltaY = aLineOrPageDeltaY;
|
|
|
|
wheelEvent.widget = widget;
|
|
|
|
|
|
|
|
wheelEvent.time = PR_Now() / 1000;
|
2008-11-27 00:52:42 +03:00
|
|
|
|
2010-07-19 06:23:48 +04:00
|
|
|
nsPresContext* presContext = GetPresContext();
|
2012-08-12 05:42:36 +04:00
|
|
|
NS_ENSURE_TRUE(presContext, NS_ERROR_FAILURE);
|
2010-07-19 06:23:48 +04:00
|
|
|
|
2012-08-12 05:42:36 +04:00
|
|
|
wheelEvent.refPoint = ToWidgetPoint(aX, aY, offset, presContext);
|
2008-08-13 07:08:59 +04:00
|
|
|
|
|
|
|
nsEventStatus status;
|
2012-08-12 05:42:36 +04:00
|
|
|
nsresult rv = widget->DispatchEvent(&wheelEvent, status);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2012-09-04 12:39:28 +04:00
|
|
|
|
|
|
|
bool failedX = false;
|
|
|
|
if ((aOptions & WHEEL_EVENT_EXPECTED_OVERFLOW_DELTA_X_ZERO) &&
|
|
|
|
wheelEvent.overflowDeltaX != 0) {
|
|
|
|
failedX = true;
|
|
|
|
}
|
|
|
|
if ((aOptions & WHEEL_EVENT_EXPECTED_OVERFLOW_DELTA_X_POSITIVE) &&
|
|
|
|
wheelEvent.overflowDeltaX <= 0) {
|
|
|
|
failedX = true;
|
|
|
|
}
|
|
|
|
if ((aOptions & WHEEL_EVENT_EXPECTED_OVERFLOW_DELTA_X_NEGATIVE) &&
|
|
|
|
wheelEvent.overflowDeltaX >= 0) {
|
|
|
|
failedX = true;
|
|
|
|
}
|
|
|
|
bool failedY = false;
|
|
|
|
if ((aOptions & WHEEL_EVENT_EXPECTED_OVERFLOW_DELTA_Y_ZERO) &&
|
|
|
|
wheelEvent.overflowDeltaY != 0) {
|
|
|
|
failedY = true;
|
|
|
|
}
|
|
|
|
if ((aOptions & WHEEL_EVENT_EXPECTED_OVERFLOW_DELTA_Y_POSITIVE) &&
|
|
|
|
wheelEvent.overflowDeltaY <= 0) {
|
|
|
|
failedY = true;
|
|
|
|
}
|
|
|
|
if ((aOptions & WHEEL_EVENT_EXPECTED_OVERFLOW_DELTA_Y_NEGATIVE) &&
|
|
|
|
wheelEvent.overflowDeltaY >= 0) {
|
|
|
|
failedY = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
|
if (failedX) {
|
|
|
|
nsPrintfCString debugMsg("SendWheelEvent(): unexpected overflowDeltaX: %f",
|
|
|
|
wheelEvent.overflowDeltaX);
|
|
|
|
NS_WARNING(debugMsg.get());
|
|
|
|
}
|
|
|
|
if (failedY) {
|
|
|
|
nsPrintfCString debugMsg("SendWheelEvent(): unexpected overflowDeltaY: %f",
|
|
|
|
wheelEvent.overflowDeltaY);
|
|
|
|
NS_WARNING(debugMsg.get());
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
return (!failedX && !failedY) ? NS_OK : NS_ERROR_FAILURE;
|
2008-08-13 07:08:59 +04:00
|
|
|
}
|
|
|
|
|
2011-12-17 04:24:11 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::SendTouchEvent(const nsAString& aType,
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t *aIdentifiers,
|
|
|
|
int32_t *aXs,
|
|
|
|
int32_t *aYs,
|
|
|
|
uint32_t *aRxs,
|
|
|
|
uint32_t *aRys,
|
2011-12-17 04:24:11 +04:00
|
|
|
float *aRotationAngles,
|
|
|
|
float *aForces,
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t aCount,
|
|
|
|
int32_t aModifiers,
|
2011-12-17 04:24:11 +04:00
|
|
|
bool aIgnoreRootScrollFrame,
|
|
|
|
bool *aPreventDefault)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2011-12-17 04:24:11 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
// get the widget to send the event to
|
|
|
|
nsPoint offset;
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget(&offset);
|
|
|
|
if (!widget) {
|
|
|
|
return NS_ERROR_NULL_POINTER;
|
|
|
|
}
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t msg;
|
2011-12-17 04:24:11 +04:00
|
|
|
if (aType.EqualsLiteral("touchstart")) {
|
|
|
|
msg = NS_TOUCH_START;
|
|
|
|
} else if (aType.EqualsLiteral("touchmove")) {
|
|
|
|
msg = NS_TOUCH_MOVE;
|
|
|
|
} else if (aType.EqualsLiteral("touchend")) {
|
|
|
|
msg = NS_TOUCH_END;
|
|
|
|
} else if (aType.EqualsLiteral("touchcancel")) {
|
|
|
|
msg = NS_TOUCH_CANCEL;
|
|
|
|
} else {
|
|
|
|
return NS_ERROR_UNEXPECTED;
|
|
|
|
}
|
|
|
|
nsTouchEvent event(true, msg, widget);
|
2012-04-25 07:00:02 +04:00
|
|
|
event.modifiers = GetWidgetModifiers(aModifiers);
|
2011-12-17 04:24:11 +04:00
|
|
|
event.widget = widget;
|
|
|
|
event.time = PR_Now();
|
|
|
|
|
|
|
|
nsPresContext* presContext = GetPresContext();
|
|
|
|
if (!presContext) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
event.touches.SetCapacity(aCount);
|
2012-08-22 19:56:38 +04:00
|
|
|
for (uint32_t i = 0; i < aCount; ++i) {
|
2012-05-10 09:24:20 +04:00
|
|
|
nsIntPoint pt = ToWidgetPoint(aXs[i], aYs[i], offset, presContext);
|
2011-12-17 04:24:11 +04:00
|
|
|
nsCOMPtr<nsIDOMTouch> t(new nsDOMTouch(aIdentifiers[i],
|
|
|
|
pt,
|
|
|
|
nsIntPoint(aRxs[i], aRys[i]),
|
|
|
|
aRotationAngles[i],
|
|
|
|
aForces[i]));
|
|
|
|
event.touches.AppendElement(t);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsEventStatus status;
|
|
|
|
nsresult rv = widget->DispatchEvent(&event, status);
|
|
|
|
*aPreventDefault = (status == nsEventStatus_eConsumeNoDefault);
|
|
|
|
return rv;
|
|
|
|
}
|
|
|
|
|
2007-02-27 00:14:19 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::SendKeyEvent(const nsAString& aType,
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t aKeyCode,
|
|
|
|
int32_t aCharCode,
|
|
|
|
int32_t aModifiers,
|
|
|
|
uint32_t aAdditionalFlags,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool* aDefaultActionTaken)
|
2007-02-27 00:14:19 +03:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2007-02-27 00:14:19 +03:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
2010-03-19 08:03:41 +03:00
|
|
|
}
|
2007-02-27 00:14:19 +03:00
|
|
|
|
|
|
|
// get the widget to send the event to
|
2007-07-26 08:14:33 +04:00
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
2007-02-27 00:14:19 +03:00
|
|
|
if (!widget)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t msg;
|
2007-02-27 00:14:19 +03:00
|
|
|
if (aType.EqualsLiteral("keydown"))
|
|
|
|
msg = NS_KEY_DOWN;
|
|
|
|
else if (aType.EqualsLiteral("keyup"))
|
|
|
|
msg = NS_KEY_UP;
|
|
|
|
else if (aType.EqualsLiteral("keypress"))
|
|
|
|
msg = NS_KEY_PRESS;
|
|
|
|
else
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
nsKeyEvent event(true, msg, widget);
|
2012-04-25 07:00:02 +04:00
|
|
|
event.modifiers = GetWidgetModifiers(aModifiers);
|
2007-02-27 00:14:19 +03:00
|
|
|
|
2012-05-03 12:35:02 +04:00
|
|
|
if (msg == NS_KEY_PRESS) {
|
|
|
|
event.keyCode = aCharCode ? 0 : aKeyCode;
|
|
|
|
event.charCode = aCharCode;
|
|
|
|
} else {
|
|
|
|
event.keyCode = aKeyCode;
|
|
|
|
event.charCode = 0;
|
|
|
|
}
|
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t locationFlag = (aAdditionalFlags &
|
2012-05-03 12:35:02 +04:00
|
|
|
(KEY_FLAG_LOCATION_STANDARD | KEY_FLAG_LOCATION_LEFT |
|
|
|
|
KEY_FLAG_LOCATION_RIGHT | KEY_FLAG_LOCATION_NUMPAD |
|
|
|
|
KEY_FLAG_LOCATION_MOBILE | KEY_FLAG_LOCATION_JOYSTICK));
|
|
|
|
switch (locationFlag) {
|
|
|
|
case KEY_FLAG_LOCATION_STANDARD:
|
|
|
|
event.location = nsIDOMKeyEvent::DOM_KEY_LOCATION_STANDARD;
|
|
|
|
break;
|
|
|
|
case KEY_FLAG_LOCATION_LEFT:
|
|
|
|
event.location = nsIDOMKeyEvent::DOM_KEY_LOCATION_LEFT;
|
|
|
|
break;
|
|
|
|
case KEY_FLAG_LOCATION_RIGHT:
|
|
|
|
event.location = nsIDOMKeyEvent::DOM_KEY_LOCATION_RIGHT;
|
|
|
|
break;
|
|
|
|
case KEY_FLAG_LOCATION_NUMPAD:
|
|
|
|
event.location = nsIDOMKeyEvent::DOM_KEY_LOCATION_NUMPAD;
|
|
|
|
break;
|
|
|
|
case KEY_FLAG_LOCATION_MOBILE:
|
|
|
|
event.location = nsIDOMKeyEvent::DOM_KEY_LOCATION_MOBILE;
|
|
|
|
break;
|
|
|
|
case KEY_FLAG_LOCATION_JOYSTICK:
|
|
|
|
event.location = nsIDOMKeyEvent::DOM_KEY_LOCATION_JOYSTICK;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
if (locationFlag != 0) {
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
// If location flag isn't set, choose the location from keycode.
|
|
|
|
switch (aKeyCode) {
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_NUMPAD0:
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_NUMPAD1:
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_NUMPAD2:
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_NUMPAD3:
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_NUMPAD4:
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_NUMPAD5:
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_NUMPAD6:
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_NUMPAD7:
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_NUMPAD8:
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_NUMPAD9:
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_MULTIPLY:
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_ADD:
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_SEPARATOR:
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_SUBTRACT:
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_DECIMAL:
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_DIVIDE:
|
|
|
|
event.location = nsIDOMKeyEvent::DOM_KEY_LOCATION_NUMPAD;
|
|
|
|
break;
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_SHIFT:
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_CONTROL:
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_ALT:
|
|
|
|
case nsIDOMKeyEvent::DOM_VK_META:
|
|
|
|
event.location = nsIDOMKeyEvent::DOM_KEY_LOCATION_LEFT;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
event.location = nsIDOMKeyEvent::DOM_KEY_LOCATION_STANDARD;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2007-02-27 00:14:19 +03:00
|
|
|
event.refPoint.x = event.refPoint.y = 0;
|
|
|
|
event.time = PR_IntervalNow();
|
|
|
|
|
2012-05-03 12:35:02 +04:00
|
|
|
if (aAdditionalFlags & KEY_FLAG_PREVENT_DEFAULT) {
|
2012-12-16 05:26:04 +04:00
|
|
|
event.mFlags.mDefaultPrevented = true;
|
2008-08-25 22:31:38 +04:00
|
|
|
}
|
|
|
|
|
2007-02-27 00:14:19 +03:00
|
|
|
nsEventStatus status;
|
2008-08-25 22:31:38 +04:00
|
|
|
nsresult rv = widget->DispatchEvent(&event, status);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
*aDefaultActionTaken = (status != nsEventStatus_eConsumeNoDefault);
|
|
|
|
|
|
|
|
return NS_OK;
|
2007-02-27 00:14:19 +03:00
|
|
|
}
|
|
|
|
|
2008-05-06 03:01:07 +04:00
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::SendNativeKeyEvent(int32_t aNativeKeyboardLayout,
|
|
|
|
int32_t aNativeKeyCode,
|
|
|
|
int32_t aModifiers,
|
2008-05-06 03:01:07 +04:00
|
|
|
const nsAString& aCharacters,
|
|
|
|
const nsAString& aUnmodifiedCharacters)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2008-05-06 03:01:07 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
2010-03-19 08:03:41 +03:00
|
|
|
}
|
2008-05-06 03:01:07 +04:00
|
|
|
|
|
|
|
// get the widget to send the event to
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2008-05-07 08:46:37 +04:00
|
|
|
return widget->SynthesizeNativeKeyEvent(aNativeKeyboardLayout, aNativeKeyCode,
|
|
|
|
aModifiers, aCharacters, aUnmodifiedCharacters);
|
2008-05-06 03:01:07 +04:00
|
|
|
}
|
|
|
|
|
2009-09-23 06:31:37 +04:00
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::SendNativeMouseEvent(int32_t aScreenX,
|
|
|
|
int32_t aScreenY,
|
|
|
|
int32_t aNativeMessage,
|
|
|
|
int32_t aModifierFlags,
|
2009-09-23 06:31:37 +04:00
|
|
|
nsIDOMElement* aElement)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2009-09-23 06:31:37 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
2010-03-19 08:03:41 +03:00
|
|
|
}
|
2009-09-23 06:31:37 +04:00
|
|
|
|
|
|
|
// get the widget to send the event to
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidgetForElement(aElement);
|
|
|
|
if (!widget)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
return widget->SynthesizeNativeMouseEvent(nsIntPoint(aScreenX, aScreenY),
|
|
|
|
aNativeMessage, aModifierFlags);
|
|
|
|
}
|
|
|
|
|
2012-03-22 04:59:12 +04:00
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::SendNativeMouseScrollEvent(int32_t aScreenX,
|
|
|
|
int32_t aScreenY,
|
|
|
|
uint32_t aNativeMessage,
|
2012-03-22 04:59:12 +04:00
|
|
|
double aDeltaX,
|
|
|
|
double aDeltaY,
|
|
|
|
double aDeltaZ,
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t aModifierFlags,
|
|
|
|
uint32_t aAdditionalFlags,
|
2012-03-22 04:59:12 +04:00
|
|
|
nsIDOMElement* aElement)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-03-22 04:59:12 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
// get the widget to send the event to
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidgetForElement(aElement);
|
|
|
|
if (!widget) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return widget->SynthesizeNativeMouseScrollEvent(nsIntPoint(aScreenX,
|
|
|
|
aScreenY),
|
|
|
|
aNativeMessage,
|
|
|
|
aDeltaX, aDeltaY, aDeltaZ,
|
|
|
|
aModifierFlags,
|
|
|
|
aAdditionalFlags);
|
|
|
|
}
|
|
|
|
|
2008-06-28 11:55:30 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::ActivateNativeMenuItemAt(const nsAString& indexString)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2008-06-28 11:55:30 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
2010-03-19 08:03:41 +03:00
|
|
|
}
|
2008-06-28 11:55:30 +04:00
|
|
|
|
|
|
|
// get the widget to send the event to
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
return widget->ActivateNativeMenuItemAt(indexString);
|
|
|
|
}
|
|
|
|
|
2008-07-28 08:46:33 +04:00
|
|
|
NS_IMETHODIMP
|
2008-10-30 08:36:01 +03:00
|
|
|
nsDOMWindowUtils::ForceUpdateNativeMenuAt(const nsAString& indexString)
|
2008-07-28 08:46:33 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2008-07-28 08:46:33 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
2010-03-19 08:03:41 +03:00
|
|
|
}
|
2008-07-28 08:46:33 +04:00
|
|
|
|
|
|
|
// get the widget to send the event to
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2008-10-30 08:36:01 +03:00
|
|
|
return widget->ForceUpdateNativeMenuAt(indexString);
|
2008-07-28 08:46:33 +04:00
|
|
|
}
|
|
|
|
|
2007-02-27 00:14:19 +03:00
|
|
|
nsIWidget*
|
2008-11-27 00:52:42 +03:00
|
|
|
nsDOMWindowUtils::GetWidget(nsPoint* aOffset)
|
2007-02-27 00:14:19 +03:00
|
|
|
{
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
if (window) {
|
|
|
|
nsIDocShell *docShell = window->GetDocShell();
|
2007-02-27 00:14:19 +03:00
|
|
|
if (docShell) {
|
2012-12-29 05:56:42 +04:00
|
|
|
nsCOMPtr<nsIPresShell> presShell = docShell->GetPresShell();
|
2007-03-02 06:57:16 +03:00
|
|
|
if (presShell) {
|
|
|
|
nsIFrame* frame = presShell->GetRootFrame();
|
|
|
|
if (frame)
|
2008-11-27 00:52:42 +03:00
|
|
|
return frame->GetView()->GetNearestWidget(aOffset);
|
2007-03-02 06:57:16 +03:00
|
|
|
}
|
2007-02-27 00:14:19 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2007-02-27 00:14:19 +03:00
|
|
|
}
|
2007-07-13 02:57:17 +04:00
|
|
|
|
2009-09-23 06:31:37 +04:00
|
|
|
nsIWidget*
|
|
|
|
nsDOMWindowUtils::GetWidgetForElement(nsIDOMElement* aElement)
|
|
|
|
{
|
|
|
|
if (!aElement)
|
|
|
|
return GetWidget();
|
|
|
|
|
|
|
|
nsCOMPtr<nsIContent> content = do_QueryInterface(aElement);
|
|
|
|
nsIDocument* doc = content->GetCurrentDoc();
|
2012-07-30 18:20:58 +04:00
|
|
|
nsIPresShell* presShell = doc ? doc->GetShell() : nullptr;
|
2009-09-23 06:31:37 +04:00
|
|
|
|
|
|
|
if (presShell) {
|
2009-12-25 00:20:06 +03:00
|
|
|
nsIFrame* frame = content->GetPrimaryFrame();
|
2009-09-23 06:31:37 +04:00
|
|
|
if (!frame) {
|
|
|
|
frame = presShell->GetRootFrame();
|
|
|
|
}
|
|
|
|
if (frame)
|
2010-07-02 23:11:04 +04:00
|
|
|
return frame->GetNearestWidget();
|
2009-09-23 06:31:37 +04:00
|
|
|
}
|
|
|
|
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2009-09-23 06:31:37 +04:00
|
|
|
}
|
|
|
|
|
2007-07-13 02:57:17 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::Focus(nsIDOMElement* aElement)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2007-10-11 01:03:12 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
2010-03-19 08:03:41 +03:00
|
|
|
}
|
2007-10-11 01:03:12 +04:00
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsIDOMWindow> window = do_QueryReferent(mWindow);
|
Bug 178324, refactor focus by moving all focus handling into one place and simplifying it, add many tests, fixes many other bugs too numerous to mention in this small checkin comment, r=josh,smichaud,ere,dbaron,marco,neil,gavin,smaug,sr=smaug (CLOSED TREE)
2009-06-10 22:00:39 +04:00
|
|
|
nsIFocusManager* fm = nsFocusManager::GetFocusManager();
|
|
|
|
if (fm) {
|
|
|
|
if (aElement)
|
|
|
|
fm->SetFocus(aElement, 0);
|
|
|
|
else
|
2012-04-02 06:23:51 +04:00
|
|
|
fm->ClearFocus(window);
|
2007-07-13 02:57:17 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2007-10-20 01:36:20 +04:00
|
|
|
NS_IMETHODIMP
|
2012-01-31 00:06:18 +04:00
|
|
|
nsDOMWindowUtils::GarbageCollect(nsICycleCollectorListener *aListener,
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t aExtraForgetSkippableCalls)
|
2007-10-20 01:36:20 +04:00
|
|
|
{
|
2013-03-18 18:10:35 +04:00
|
|
|
SAMPLE_LABEL("GC", "GarbageCollect");
|
2010-07-20 10:31:01 +04:00
|
|
|
// Always permit this in debug builds.
|
2007-10-20 01:36:20 +04:00
|
|
|
#ifndef DEBUG
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2007-10-20 01:36:20 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
2010-03-19 08:03:41 +03:00
|
|
|
}
|
2007-10-20 01:36:20 +04:00
|
|
|
#endif
|
|
|
|
|
2013-03-19 14:35:41 +04:00
|
|
|
nsJSContext::GarbageCollectNow(JS::gcreason::DOM_UTILS);
|
2012-08-11 01:16:05 +04:00
|
|
|
nsJSContext::CycleCollectNow(aListener, aExtraForgetSkippableCalls);
|
2007-10-20 01:36:20 +04:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2008-08-28 01:24:03 +04:00
|
|
|
|
2011-07-26 21:11:15 +04:00
|
|
|
NS_IMETHODIMP
|
2012-01-31 00:06:18 +04:00
|
|
|
nsDOMWindowUtils::CycleCollect(nsICycleCollectorListener *aListener,
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t aExtraForgetSkippableCalls)
|
2011-07-26 21:11:15 +04:00
|
|
|
{
|
|
|
|
// Always permit this in debug builds.
|
|
|
|
#ifndef DEBUG
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2011-07-26 21:11:15 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
2012-01-31 00:06:18 +04:00
|
|
|
nsJSContext::CycleCollectNow(aListener, aExtraForgetSkippableCalls);
|
2011-07-26 21:11:15 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2008-08-28 01:24:03 +04:00
|
|
|
|
2008-10-24 00:15:20 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::SendSimpleGestureEvent(const nsAString& aType,
|
2009-01-03 15:40:26 +03:00
|
|
|
float aX,
|
|
|
|
float aY,
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t aDirection,
|
2012-08-09 11:09:42 +04:00
|
|
|
double aDelta,
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t aModifiers,
|
|
|
|
uint32_t aClickCount)
|
2008-10-24 00:15:20 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2008-10-24 00:15:20 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
2010-03-19 08:03:41 +03:00
|
|
|
}
|
2008-10-24 00:15:20 +04:00
|
|
|
|
|
|
|
// get the widget to send the event to
|
2009-01-03 15:40:26 +03:00
|
|
|
nsPoint offset;
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget(&offset);
|
2008-10-24 00:15:20 +04:00
|
|
|
if (!widget)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t msg;
|
2013-02-09 04:52:12 +04:00
|
|
|
if (aType.EqualsLiteral("MozSwipeGesture"))
|
2008-10-24 00:15:20 +04:00
|
|
|
msg = NS_SIMPLE_GESTURE_SWIPE;
|
|
|
|
else if (aType.EqualsLiteral("MozMagnifyGestureStart"))
|
|
|
|
msg = NS_SIMPLE_GESTURE_MAGNIFY_START;
|
|
|
|
else if (aType.EqualsLiteral("MozMagnifyGestureUpdate"))
|
|
|
|
msg = NS_SIMPLE_GESTURE_MAGNIFY_UPDATE;
|
|
|
|
else if (aType.EqualsLiteral("MozMagnifyGesture"))
|
|
|
|
msg = NS_SIMPLE_GESTURE_MAGNIFY;
|
|
|
|
else if (aType.EqualsLiteral("MozRotateGestureStart"))
|
|
|
|
msg = NS_SIMPLE_GESTURE_ROTATE_START;
|
|
|
|
else if (aType.EqualsLiteral("MozRotateGestureUpdate"))
|
|
|
|
msg = NS_SIMPLE_GESTURE_ROTATE_UPDATE;
|
|
|
|
else if (aType.EqualsLiteral("MozRotateGesture"))
|
|
|
|
msg = NS_SIMPLE_GESTURE_ROTATE;
|
2009-04-02 23:34:31 +04:00
|
|
|
else if (aType.EqualsLiteral("MozTapGesture"))
|
|
|
|
msg = NS_SIMPLE_GESTURE_TAP;
|
|
|
|
else if (aType.EqualsLiteral("MozPressTapGesture"))
|
|
|
|
msg = NS_SIMPLE_GESTURE_PRESSTAP;
|
2012-06-14 21:40:12 +04:00
|
|
|
else if (aType.EqualsLiteral("MozEdgeUIGesture"))
|
|
|
|
msg = NS_SIMPLE_GESTURE_EDGEUI;
|
2008-10-24 00:15:20 +04:00
|
|
|
else
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
nsSimpleGestureEvent event(true, msg, widget, aDirection, aDelta);
|
2012-04-25 07:00:02 +04:00
|
|
|
event.modifiers = GetWidgetModifiers(aModifiers);
|
2012-06-14 21:40:12 +04:00
|
|
|
event.clickCount = aClickCount;
|
2008-10-24 00:15:20 +04:00
|
|
|
event.time = PR_IntervalNow();
|
|
|
|
|
2010-07-19 06:23:48 +04:00
|
|
|
nsPresContext* presContext = GetPresContext();
|
|
|
|
if (!presContext)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2012-05-10 09:24:20 +04:00
|
|
|
event.refPoint = ToWidgetPoint(aX, aY, offset, presContext);
|
2009-01-03 15:40:26 +03:00
|
|
|
|
2008-10-24 00:15:20 +04:00
|
|
|
nsEventStatus status;
|
|
|
|
return widget->DispatchEvent(&event, status);
|
|
|
|
}
|
2008-11-05 06:58:22 +03:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2010-04-03 15:34:24 +04:00
|
|
|
nsDOMWindowUtils::ElementFromPoint(float aX, float aY,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool aIgnoreRootScrollFrame,
|
|
|
|
bool aFlushLayout,
|
2008-11-05 06:58:22 +03:00
|
|
|
nsIDOMElement** aReturn)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_STATE(window);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocument> doc(do_QueryInterface(window->GetExtantDocument()));
|
2008-11-05 06:58:22 +03:00
|
|
|
NS_ENSURE_STATE(doc);
|
2009-03-30 16:19:06 +04:00
|
|
|
|
2012-12-22 12:27:27 +04:00
|
|
|
Element* el =
|
|
|
|
doc->ElementFromPointHelper(aX, aY, aIgnoreRootScrollFrame, aFlushLayout);
|
|
|
|
nsCOMPtr<nsIDOMElement> retval = do_QueryInterface(el);
|
|
|
|
retval.forget(aReturn);
|
|
|
|
return NS_OK;
|
2008-11-05 06:58:22 +03:00
|
|
|
}
|
2008-12-03 04:34:07 +03:00
|
|
|
|
2010-04-08 04:31:26 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::NodesFromRect(float aX, float aY,
|
|
|
|
float aTopSize, float aRightSize,
|
|
|
|
float aBottomSize, float aLeftSize,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool aIgnoreRootScrollFrame,
|
|
|
|
bool aFlushLayout,
|
2010-04-08 04:31:26 +04:00
|
|
|
nsIDOMNodeList** aReturn)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-01-28 04:54:03 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_STATE(window);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocument> doc(do_QueryInterface(window->GetExtantDocument()));
|
2010-04-08 04:31:26 +04:00
|
|
|
NS_ENSURE_STATE(doc);
|
|
|
|
|
|
|
|
return doc->NodesFromRectHelper(aX, aY, aTopSize, aRightSize, aBottomSize, aLeftSize,
|
|
|
|
aIgnoreRootScrollFrame, aFlushLayout, aReturn);
|
|
|
|
}
|
|
|
|
|
2008-12-03 04:34:07 +03:00
|
|
|
static already_AddRefed<gfxImageSurface>
|
2011-12-04 01:50:16 +04:00
|
|
|
CanvasToImageSurface(nsIDOMHTMLCanvasElement* aCanvas)
|
2008-12-03 04:34:07 +03:00
|
|
|
{
|
2011-12-04 01:50:16 +04:00
|
|
|
nsCOMPtr<nsINode> node = do_QueryInterface(aCanvas);
|
|
|
|
if (!node) {
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2011-12-04 01:50:16 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_ABORT_IF_FALSE(node->IsElement(),
|
|
|
|
"An nsINode that implements nsIDOMHTMLCanvasElement should "
|
|
|
|
"be an element.");
|
2010-02-24 22:04:32 +03:00
|
|
|
nsLayoutUtils::SurfaceFromElementResult result =
|
2011-12-04 01:50:16 +04:00
|
|
|
nsLayoutUtils::SurfaceFromElement(node->AsElement(),
|
2010-02-24 22:04:32 +03:00
|
|
|
nsLayoutUtils::SFE_WANT_IMAGE_SURFACE);
|
|
|
|
return static_cast<gfxImageSurface*>(result.mSurface.forget().get());
|
2008-12-03 04:34:07 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::CompareCanvases(nsIDOMHTMLCanvasElement *aCanvas1,
|
|
|
|
nsIDOMHTMLCanvasElement *aCanvas2,
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t* aMaxDifference,
|
|
|
|
uint32_t* retVal)
|
2008-12-03 04:34:07 +03:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2008-12-03 04:34:07 +03:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
2010-03-19 08:03:41 +03:00
|
|
|
}
|
2008-12-03 04:34:07 +03:00
|
|
|
|
2012-07-30 18:20:58 +04:00
|
|
|
if (aCanvas1 == nullptr ||
|
|
|
|
aCanvas2 == nullptr ||
|
|
|
|
retVal == nullptr)
|
2008-12-03 04:34:07 +03:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsRefPtr<gfxImageSurface> img1 = CanvasToImageSurface(aCanvas1);
|
|
|
|
nsRefPtr<gfxImageSurface> img2 = CanvasToImageSurface(aCanvas2);
|
|
|
|
|
2012-07-30 18:20:58 +04:00
|
|
|
if (img1 == nullptr || img2 == nullptr ||
|
2008-12-03 04:34:07 +03:00
|
|
|
img1->GetSize() != img2->GetSize() ||
|
|
|
|
img1->Stride() != img2->Stride())
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
int v;
|
|
|
|
gfxIntSize size = img1->GetSize();
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t stride = img1->Stride();
|
2008-12-03 04:34:07 +03:00
|
|
|
|
|
|
|
// we can optimize for the common all-pass case
|
2012-08-22 19:56:38 +04:00
|
|
|
if (stride == (uint32_t) size.width * 4) {
|
2008-12-03 04:34:07 +03:00
|
|
|
v = memcmp(img1->Data(), img2->Data(), size.width * size.height * 4);
|
|
|
|
if (v == 0) {
|
|
|
|
if (aMaxDifference)
|
|
|
|
*aMaxDifference = 0;
|
|
|
|
*retVal = 0;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t dc = 0;
|
|
|
|
uint32_t different = 0;
|
2008-12-03 04:34:07 +03:00
|
|
|
|
|
|
|
for (int j = 0; j < size.height; j++) {
|
|
|
|
unsigned char *p1 = img1->Data() + j*stride;
|
|
|
|
unsigned char *p2 = img2->Data() + j*stride;
|
|
|
|
v = memcmp(p1, p2, stride);
|
|
|
|
|
|
|
|
if (v) {
|
|
|
|
for (int i = 0; i < size.width; i++) {
|
2012-08-22 19:56:38 +04:00
|
|
|
if (*(uint32_t*) p1 != *(uint32_t*) p2) {
|
2008-12-03 04:34:07 +03:00
|
|
|
|
|
|
|
different++;
|
|
|
|
|
2013-01-15 16:22:03 +04:00
|
|
|
dc = std::max((uint32_t)abs(p1[0] - p2[0]), dc);
|
|
|
|
dc = std::max((uint32_t)abs(p1[1] - p2[1]), dc);
|
|
|
|
dc = std::max((uint32_t)abs(p1[2] - p2[2]), dc);
|
|
|
|
dc = std::max((uint32_t)abs(p1[3] - p2[3]), dc);
|
2008-12-03 04:34:07 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
p1 += 4;
|
|
|
|
p2 += 4;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (aMaxDifference)
|
|
|
|
*aMaxDifference = dc;
|
|
|
|
|
|
|
|
*retVal = different;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2009-01-06 04:15:13 +03:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2011-09-29 10:19:26 +04:00
|
|
|
nsDOMWindowUtils::GetIsMozAfterPaintPending(bool *aResult)
|
2009-01-06 04:15:13 +03:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_ENSURE_ARG_POINTER(aResult);
|
2011-10-17 18:59:28 +04:00
|
|
|
*aResult = false;
|
2009-01-06 04:15:13 +03:00
|
|
|
nsPresContext* presContext = GetPresContext();
|
|
|
|
if (!presContext)
|
|
|
|
return NS_OK;
|
|
|
|
*aResult = presContext->IsDOMPaintEventPending();
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2009-02-12 13:44:38 +03:00
|
|
|
|
2009-02-27 03:21:55 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::ClearMozAfterPaintEvents()
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2009-02-27 03:21:55 +03:00
|
|
|
nsPresContext* presContext = GetPresContext();
|
|
|
|
if (!presContext)
|
|
|
|
return NS_OK;
|
|
|
|
presContext->ClearMozAfterPaintEvents();
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2009-02-12 13:44:38 +03:00
|
|
|
NS_IMETHODIMP
|
2011-09-29 10:19:26 +04:00
|
|
|
nsDOMWindowUtils::DisableNonTestMouseEvents(bool aDisable)
|
2009-02-12 13:44:38 +03:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2009-02-12 13:44:38 +03:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
2010-03-19 08:03:41 +03:00
|
|
|
}
|
2009-02-12 13:44:38 +03:00
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
|
|
|
|
nsIDocShell *docShell = window->GetDocShell();
|
2009-02-12 13:44:38 +03:00
|
|
|
NS_ENSURE_TRUE(docShell, NS_ERROR_FAILURE);
|
2012-12-29 05:56:42 +04:00
|
|
|
nsCOMPtr<nsIPresShell> presShell = docShell->GetPresShell();
|
2009-02-12 13:44:38 +03:00
|
|
|
NS_ENSURE_TRUE(presShell, NS_ERROR_FAILURE);
|
2010-03-31 16:45:32 +04:00
|
|
|
presShell->DisableNonTestMouseEvents(aDisable);
|
|
|
|
return NS_OK;
|
2009-02-12 13:44:38 +03:00
|
|
|
}
|
2009-03-03 23:11:14 +03:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2011-09-29 10:19:26 +04:00
|
|
|
nsDOMWindowUtils::SuppressEventHandling(bool aSuppress)
|
2009-03-03 23:11:14 +03:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2009-03-03 23:11:14 +03:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
2010-03-19 08:03:41 +03:00
|
|
|
}
|
2009-03-03 23:11:14 +03:00
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_STATE(window);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocument> doc(do_QueryInterface(window->GetExtantDocument()));
|
2009-03-03 23:11:14 +03:00
|
|
|
NS_ENSURE_TRUE(doc, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
if (aSuppress) {
|
|
|
|
doc->SuppressEventHandling();
|
|
|
|
} else {
|
2011-10-17 18:59:28 +04:00
|
|
|
doc->UnsuppressEventHandlingAndFireEvents(true);
|
2009-03-03 23:11:14 +03:00
|
|
|
}
|
2009-03-30 16:19:06 +04:00
|
|
|
|
2009-03-03 23:11:14 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2009-03-30 16:19:06 +04:00
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::GetScrollXY(bool aFlushLayout, int32_t* aScrollX, int32_t* aScrollY)
|
2009-03-30 16:19:06 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_STATE(window);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocument> doc(do_QueryInterface(window->GetExtantDocument()));
|
2009-03-30 16:19:06 +04:00
|
|
|
NS_ENSURE_STATE(doc);
|
|
|
|
|
|
|
|
if (aFlushLayout) {
|
|
|
|
doc->FlushPendingNotifications(Flush_Layout);
|
|
|
|
}
|
|
|
|
|
2009-09-03 07:57:46 +04:00
|
|
|
nsPoint scrollPos(0,0);
|
2010-06-25 17:59:57 +04:00
|
|
|
nsIPresShell *presShell = doc->GetShell();
|
2009-03-30 16:19:06 +04:00
|
|
|
if (presShell) {
|
2009-09-03 07:57:46 +04:00
|
|
|
nsIScrollableFrame* sf = presShell->GetRootScrollFrameAsScrollable();
|
|
|
|
if (sf) {
|
|
|
|
scrollPos = sf->GetScrollPosition();
|
2009-03-30 16:19:06 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-09-03 07:57:46 +04:00
|
|
|
*aScrollX = nsPresContext::AppUnitsToIntCSSPixels(scrollPos.x);
|
|
|
|
*aScrollY = nsPresContext::AppUnitsToIntCSSPixels(scrollPos.y);
|
2009-03-30 16:19:06 +04:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2009-05-05 10:15:23 +04:00
|
|
|
|
2013-02-14 00:32:35 +04:00
|
|
|
NS_IMETHODIMP
|
2013-02-26 02:13:36 +04:00
|
|
|
nsDOMWindowUtils::GetScrollbarSize(bool aFlushLayout, int32_t* aWidth,
|
|
|
|
int32_t* aHeight)
|
2013-02-14 00:32:35 +04:00
|
|
|
{
|
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2013-02-26 02:13:36 +04:00
|
|
|
*aWidth = 0;
|
|
|
|
*aHeight = 0;
|
2013-02-14 00:32:35 +04:00
|
|
|
|
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_STATE(window);
|
|
|
|
|
2013-02-18 14:07:24 +04:00
|
|
|
nsCOMPtr<nsIDocument> doc = window->GetExtantDoc();
|
2013-02-14 00:32:35 +04:00
|
|
|
NS_ENSURE_STATE(doc);
|
|
|
|
|
|
|
|
if (aFlushLayout) {
|
|
|
|
doc->FlushPendingNotifications(Flush_Layout);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIPresShell* presShell = doc->GetShell();
|
|
|
|
NS_ENSURE_TRUE(presShell, NS_ERROR_NOT_AVAILABLE);
|
|
|
|
|
|
|
|
nsIScrollableFrame* scrollFrame = presShell->GetRootScrollFrameAsScrollable();
|
|
|
|
NS_ENSURE_TRUE(scrollFrame, NS_OK);
|
|
|
|
|
|
|
|
nsMargin sizes = scrollFrame->GetActualScrollbarSizes();
|
2013-02-26 02:13:36 +04:00
|
|
|
*aWidth = nsPresContext::AppUnitsToIntCSSPixels(sizes.LeftRight());
|
|
|
|
*aHeight = nsPresContext::AppUnitsToIntCSSPixels(sizes.TopBottom());
|
2013-02-14 00:32:35 +04:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2012-05-23 18:49:59 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetRootBounds(nsIDOMClientRect** aResult)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-05-23 18:49:59 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_STATE(window);
|
|
|
|
|
2013-03-17 11:55:17 +04:00
|
|
|
nsCOMPtr<nsIDocument> doc = window->GetExtantDoc();
|
2012-05-23 18:49:59 +04:00
|
|
|
NS_ENSURE_STATE(doc);
|
|
|
|
|
|
|
|
nsRect bounds(0, 0, 0, 0);
|
|
|
|
nsIPresShell* presShell = doc->GetShell();
|
|
|
|
if (presShell) {
|
|
|
|
nsIScrollableFrame* sf = presShell->GetRootScrollFrameAsScrollable();
|
|
|
|
if (sf) {
|
|
|
|
bounds = sf->GetScrollRange();
|
|
|
|
bounds.width += sf->GetScrollPortRect().width;
|
|
|
|
bounds.height += sf->GetScrollPortRect().height;
|
|
|
|
} else if (presShell->GetRootFrame()) {
|
|
|
|
bounds = presShell->GetRootFrame()->GetRect();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-03-17 11:55:17 +04:00
|
|
|
nsRefPtr<nsClientRect> rect = new nsClientRect(window);
|
2012-05-23 18:49:59 +04:00
|
|
|
rect->SetRect(nsPresContext::AppUnitsToFloatCSSPixels(bounds.x),
|
|
|
|
nsPresContext::AppUnitsToFloatCSSPixels(bounds.y),
|
|
|
|
nsPresContext::AppUnitsToFloatCSSPixels(bounds.width),
|
|
|
|
nsPresContext::AppUnitsToFloatCSSPixels(bounds.height));
|
2013-03-17 11:55:17 +04:00
|
|
|
rect.forget(aResult);
|
2012-05-23 18:49:59 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2009-05-05 10:15:23 +04:00
|
|
|
NS_IMETHODIMP
|
2011-09-29 10:19:26 +04:00
|
|
|
nsDOMWindowUtils::GetIMEIsOpen(bool *aState)
|
2009-05-05 10:15:23 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2009-05-05 10:15:23 +04:00
|
|
|
NS_ENSURE_ARG_POINTER(aState);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
// Open state should not be available when IME is not enabled.
|
2011-11-27 15:51:52 +04:00
|
|
|
InputContext context = widget->GetInputContext();
|
2011-11-27 15:51:53 +04:00
|
|
|
if (context.mIMEState.mEnabled != IMEState::ENABLED) {
|
2009-05-05 10:15:23 +04:00
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
2011-11-27 15:51:52 +04:00
|
|
|
}
|
2009-05-05 10:15:23 +04:00
|
|
|
|
2011-11-27 15:51:53 +04:00
|
|
|
if (context.mIMEState.mOpen == IMEState::OPEN_STATE_NOT_SUPPORTED) {
|
|
|
|
return NS_ERROR_NOT_IMPLEMENTED;
|
|
|
|
}
|
|
|
|
*aState = (context.mIMEState.mOpen == IMEState::OPEN);
|
|
|
|
return NS_OK;
|
2009-05-05 10:15:23 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::GetIMEStatus(uint32_t *aState)
|
2009-05-05 10:15:23 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2009-05-05 10:15:23 +04:00
|
|
|
NS_ENSURE_ARG_POINTER(aState);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2011-11-27 15:51:52 +04:00
|
|
|
InputContext context = widget->GetInputContext();
|
2012-08-22 19:56:38 +04:00
|
|
|
*aState = static_cast<uint32_t>(context.mIMEState.mEnabled);
|
2010-11-23 09:48:45 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetFocusedInputType(char** aType)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2010-11-23 09:48:45 +03:00
|
|
|
NS_ENSURE_ARG_POINTER(aType);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2011-11-27 15:51:52 +04:00
|
|
|
InputContext context = widget->GetInputContext();
|
2010-11-23 09:48:45 +03:00
|
|
|
*aType = ToNewCString(context.mHTMLInputType);
|
|
|
|
return NS_OK;
|
2009-05-05 10:15:23 +04:00
|
|
|
}
|
|
|
|
|
2011-01-13 20:45:14 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::FindElementWithViewId(nsViewID aID,
|
|
|
|
nsIDOMElement** aResult)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2011-01-13 20:45:14 +03:00
|
|
|
if (aID == FrameMetrics::ROOT_SCROLL_ID) {
|
|
|
|
nsPresContext* presContext = GetPresContext();
|
2011-02-03 00:35:03 +03:00
|
|
|
if (!presContext) {
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
}
|
|
|
|
|
2011-01-13 20:45:14 +03:00
|
|
|
nsIDocument* document = presContext->Document();
|
2011-01-13 20:45:31 +03:00
|
|
|
mozilla::dom::Element* rootElement = document->GetRootElement();
|
|
|
|
if (!rootElement) {
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
}
|
2011-02-03 00:35:03 +03:00
|
|
|
|
2011-01-13 20:45:31 +03:00
|
|
|
CallQueryInterface(rootElement, aResult);
|
2011-01-13 20:45:14 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsRefPtr<nsIContent> content = nsLayoutUtils::FindContentFor(aID);
|
2011-02-03 00:35:03 +03:00
|
|
|
return content ? CallQueryInterface(content, aResult) : NS_OK;
|
2011-01-13 20:45:14 +03:00
|
|
|
}
|
|
|
|
|
2009-08-04 01:41:36 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetScreenPixelsPerCSSPixel(float* aScreenPixels)
|
|
|
|
{
|
2012-08-23 00:17:26 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
|
|
|
|
return window->GetDevicePixelRatio(aScreenPixels);
|
2009-08-04 01:41:36 +04:00
|
|
|
}
|
2009-10-17 02:19:01 +04:00
|
|
|
|
2012-09-29 15:35:19 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetFullZoom(float* aFullZoom)
|
|
|
|
{
|
|
|
|
*aFullZoom = 1.0f;
|
|
|
|
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-29 15:35:19 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsPresContext* presContext = GetPresContext();
|
|
|
|
if (!presContext) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
*aFullZoom = presContext->DeviceContext()->GetPixelScale();
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2009-10-29 14:11:02 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::DispatchDOMEventViaPresShell(nsIDOMNode* aTarget,
|
|
|
|
nsIDOMEvent* aEvent,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool aTrusted,
|
|
|
|
bool* aRetVal)
|
2009-10-29 14:11:02 +03:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2009-10-29 14:11:02 +03:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-06-11 03:44:50 +04:00
|
|
|
NS_ENSURE_STATE(aEvent);
|
|
|
|
aEvent->SetTrusted(aTrusted);
|
|
|
|
nsEvent* internalEvent = aEvent->GetInternalNSEvent();
|
2009-10-29 14:11:02 +03:00
|
|
|
NS_ENSURE_STATE(internalEvent);
|
|
|
|
nsCOMPtr<nsIContent> content = do_QueryInterface(aTarget);
|
|
|
|
NS_ENSURE_STATE(content);
|
2013-03-08 15:04:53 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
if (content->OwnerDoc()->GetWindow() != window) {
|
|
|
|
return NS_ERROR_DOM_HIERARCHY_REQUEST_ERR;
|
|
|
|
}
|
|
|
|
nsCOMPtr<nsIDocument> targetDoc = content->GetCurrentDoc();
|
|
|
|
NS_ENSURE_STATE(targetDoc);
|
|
|
|
nsRefPtr<nsIPresShell> targetShell = targetDoc->GetShell();
|
|
|
|
NS_ENSURE_STATE(targetShell);
|
2009-10-29 14:11:02 +03:00
|
|
|
|
|
|
|
nsEventStatus status = nsEventStatus_eIgnore;
|
2013-03-08 15:04:53 +04:00
|
|
|
targetShell->HandleEventWithTarget(internalEvent, nullptr, content, &status);
|
2009-10-29 14:11:02 +03:00
|
|
|
*aRetVal = (status != nsEventStatus_eConsumeNoDefault);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2009-12-15 00:58:50 +03:00
|
|
|
|
2010-03-19 08:02:53 +03:00
|
|
|
static void
|
2012-07-30 18:20:58 +04:00
|
|
|
InitEvent(nsGUIEvent &aEvent, nsIntPoint *aPt = nullptr)
|
2010-03-19 08:02:53 +03:00
|
|
|
{
|
|
|
|
if (aPt) {
|
|
|
|
aEvent.refPoint = *aPt;
|
|
|
|
}
|
|
|
|
aEvent.time = PR_IntervalNow();
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2011-09-22 13:17:41 +04:00
|
|
|
nsDOMWindowUtils::SendCompositionEvent(const nsAString& aType,
|
|
|
|
const nsAString& aData,
|
|
|
|
const nsAString& aLocale)
|
2010-03-19 08:02:53 +03:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2010-03-19 08:02:53 +03:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
// get the widget to send the event to
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t msg;
|
2010-03-19 08:02:53 +03:00
|
|
|
if (aType.EqualsLiteral("compositionstart")) {
|
|
|
|
msg = NS_COMPOSITION_START;
|
|
|
|
} else if (aType.EqualsLiteral("compositionend")) {
|
|
|
|
msg = NS_COMPOSITION_END;
|
2011-09-22 13:17:41 +04:00
|
|
|
} else if (aType.EqualsLiteral("compositionupdate")) {
|
|
|
|
msg = NS_COMPOSITION_UPDATE;
|
2010-03-19 08:02:53 +03:00
|
|
|
} else {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
nsCompositionEvent compositionEvent(true, msg, widget);
|
2010-03-19 08:02:53 +03:00
|
|
|
InitEvent(compositionEvent);
|
2011-09-22 13:17:41 +04:00
|
|
|
if (msg != NS_COMPOSITION_START) {
|
|
|
|
compositionEvent.data = aData;
|
|
|
|
}
|
2010-03-19 08:02:53 +03:00
|
|
|
|
2012-12-16 05:26:04 +04:00
|
|
|
compositionEvent.mFlags.mIsSynthesizedForTests = true;
|
2012-09-26 09:47:51 +04:00
|
|
|
|
2010-03-19 08:02:53 +03:00
|
|
|
nsEventStatus status;
|
|
|
|
nsresult rv = widget->DispatchEvent(&compositionEvent, status);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
2012-08-22 19:56:38 +04:00
|
|
|
AppendClause(int32_t aClauseLength, uint32_t aClauseAttr,
|
2010-03-19 08:02:53 +03:00
|
|
|
nsTArray<nsTextRange>* aRanges)
|
|
|
|
{
|
|
|
|
NS_PRECONDITION(aRanges, "aRange is null");
|
|
|
|
if (aClauseLength == 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
nsTextRange range;
|
|
|
|
range.mStartOffset = aRanges->Length() == 0 ? 0 :
|
|
|
|
aRanges->ElementAt(aRanges->Length() - 1).mEndOffset + 1;
|
|
|
|
range.mEndOffset = range.mStartOffset + aClauseLength;
|
|
|
|
NS_ASSERTION(range.mStartOffset <= range.mEndOffset, "range is invalid");
|
|
|
|
NS_PRECONDITION(aClauseAttr == NS_TEXTRANGE_RAWINPUT ||
|
|
|
|
aClauseAttr == NS_TEXTRANGE_SELECTEDRAWTEXT ||
|
|
|
|
aClauseAttr == NS_TEXTRANGE_CONVERTEDTEXT ||
|
|
|
|
aClauseAttr == NS_TEXTRANGE_SELECTEDCONVERTEDTEXT,
|
|
|
|
"aClauseAttr is invalid value");
|
|
|
|
range.mRangeType = aClauseAttr;
|
|
|
|
aRanges->AppendElement(range);
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::SendTextEvent(const nsAString& aCompositionString,
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t aFirstClauseLength,
|
|
|
|
uint32_t aFirstClauseAttr,
|
|
|
|
int32_t aSecondClauseLength,
|
|
|
|
uint32_t aSecondClauseAttr,
|
|
|
|
int32_t aThirdClauseLength,
|
|
|
|
uint32_t aThirdClauseAttr,
|
|
|
|
int32_t aCaretStart,
|
|
|
|
int32_t aCaretLength)
|
2010-03-19 08:02:53 +03:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2010-03-19 08:02:53 +03:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
// get the widget to send the event to
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
nsTextEvent textEvent(true, NS_TEXT_TEXT, widget);
|
2010-03-19 08:02:53 +03:00
|
|
|
InitEvent(textEvent);
|
|
|
|
|
|
|
|
nsAutoTArray<nsTextRange, 4> textRanges;
|
|
|
|
NS_ENSURE_TRUE(aFirstClauseLength >= 0, NS_ERROR_INVALID_ARG);
|
|
|
|
NS_ENSURE_TRUE(aSecondClauseLength >= 0, NS_ERROR_INVALID_ARG);
|
|
|
|
NS_ENSURE_TRUE(aThirdClauseLength >= 0, NS_ERROR_INVALID_ARG);
|
|
|
|
AppendClause(aFirstClauseLength, aFirstClauseAttr, &textRanges);
|
|
|
|
AppendClause(aSecondClauseLength, aSecondClauseAttr, &textRanges);
|
|
|
|
AppendClause(aThirdClauseLength, aThirdClauseAttr, &textRanges);
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t len = aFirstClauseLength + aSecondClauseLength + aThirdClauseLength;
|
|
|
|
NS_ENSURE_TRUE(len == 0 || uint32_t(len) == aCompositionString.Length(),
|
2010-03-19 08:02:53 +03:00
|
|
|
NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
if (aCaretStart >= 0) {
|
|
|
|
nsTextRange range;
|
|
|
|
range.mStartOffset = aCaretStart;
|
|
|
|
range.mEndOffset = range.mStartOffset + aCaretLength;
|
|
|
|
range.mRangeType = NS_TEXTRANGE_CARETPOSITION;
|
|
|
|
textRanges.AppendElement(range);
|
|
|
|
}
|
|
|
|
|
|
|
|
textEvent.theText = aCompositionString;
|
|
|
|
|
|
|
|
textEvent.rangeCount = textRanges.Length();
|
|
|
|
textEvent.rangeArray = textRanges.Elements();
|
|
|
|
|
2012-12-16 05:26:04 +04:00
|
|
|
textEvent.mFlags.mIsSynthesizedForTests = true;
|
2012-09-26 09:47:51 +04:00
|
|
|
|
2010-03-19 08:02:53 +03:00
|
|
|
nsEventStatus status;
|
|
|
|
nsresult rv = widget->DispatchEvent(&textEvent, status);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::SendQueryContentEvent(uint32_t aType,
|
|
|
|
uint32_t aOffset, uint32_t aLength,
|
|
|
|
int32_t aX, int32_t aY,
|
2010-03-19 08:02:53 +03:00
|
|
|
nsIQueryContentEventResult **aResult)
|
|
|
|
{
|
2012-07-30 18:20:58 +04:00
|
|
|
*aResult = nullptr;
|
2010-03-19 08:02:53 +03:00
|
|
|
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2010-03-19 08:02:53 +03:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
|
2010-07-27 17:38:03 +04:00
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsIDocShell *docShell = window->GetDocShell();
|
2010-07-27 17:38:03 +04:00
|
|
|
NS_ENSURE_TRUE(docShell, NS_ERROR_FAILURE);
|
|
|
|
|
2012-12-29 05:56:42 +04:00
|
|
|
nsCOMPtr<nsIPresShell> presShell = docShell->GetPresShell();
|
2010-07-27 17:38:03 +04:00
|
|
|
NS_ENSURE_TRUE(presShell, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
nsPresContext* presContext = presShell->GetPresContext();
|
|
|
|
NS_ENSURE_TRUE(presContext, NS_ERROR_FAILURE);
|
|
|
|
|
2010-03-19 08:02:53 +03:00
|
|
|
// get the widget to send the event to
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (aType != NS_QUERY_SELECTED_TEXT &&
|
|
|
|
aType != NS_QUERY_TEXT_CONTENT &&
|
|
|
|
aType != NS_QUERY_CARET_RECT &&
|
|
|
|
aType != NS_QUERY_TEXT_RECT &&
|
|
|
|
aType != NS_QUERY_EDITOR_RECT &&
|
|
|
|
aType != NS_QUERY_CHARACTER_AT_POINT) {
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIWidget> targetWidget = widget;
|
|
|
|
nsIntPoint pt(aX, aY);
|
|
|
|
|
|
|
|
if (aType == QUERY_CHARACTER_AT_POINT) {
|
|
|
|
// Looking for the widget at the point.
|
2011-10-17 18:59:28 +04:00
|
|
|
nsQueryContentEvent dummyEvent(true, NS_QUERY_CONTENT_STATE, widget);
|
2010-03-19 08:02:53 +03:00
|
|
|
InitEvent(dummyEvent, &pt);
|
|
|
|
nsIFrame* popupFrame =
|
2010-07-27 17:38:03 +04:00
|
|
|
nsLayoutUtils::GetPopupFrameForEventCoordinates(presContext->GetRootPresContext(), &dummyEvent);
|
2010-03-19 08:02:53 +03:00
|
|
|
|
|
|
|
nsIntRect widgetBounds;
|
|
|
|
nsresult rv = widget->GetClientBounds(widgetBounds);
|
2010-04-11 23:57:08 +04:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
2011-12-02 01:35:42 +04:00
|
|
|
widgetBounds.MoveTo(0, 0);
|
2010-03-19 08:02:53 +03:00
|
|
|
|
|
|
|
// There is no popup frame at the point and the point isn't in our widget,
|
|
|
|
// we cannot process this request.
|
|
|
|
NS_ENSURE_TRUE(popupFrame || widgetBounds.Contains(pt),
|
|
|
|
NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
// Fire the event on the widget at the point
|
|
|
|
if (popupFrame) {
|
2010-07-02 23:11:04 +04:00
|
|
|
targetWidget = popupFrame->GetNearestWidget();
|
2010-03-19 08:02:53 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pt += widget->WidgetToScreenOffset() - targetWidget->WidgetToScreenOffset();
|
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
nsQueryContentEvent queryEvent(true, aType, targetWidget);
|
2010-03-19 08:02:53 +03:00
|
|
|
InitEvent(queryEvent, &pt);
|
|
|
|
|
|
|
|
switch (aType) {
|
|
|
|
case NS_QUERY_TEXT_CONTENT:
|
|
|
|
queryEvent.InitForQueryTextContent(aOffset, aLength);
|
|
|
|
break;
|
|
|
|
case NS_QUERY_CARET_RECT:
|
|
|
|
queryEvent.InitForQueryCaretRect(aOffset);
|
|
|
|
break;
|
|
|
|
case NS_QUERY_TEXT_RECT:
|
|
|
|
queryEvent.InitForQueryTextRect(aOffset, aLength);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsEventStatus status;
|
|
|
|
nsresult rv = targetWidget->DispatchEvent(&queryEvent, status);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
nsQueryContentEventResult* result = new nsQueryContentEventResult();
|
|
|
|
NS_ENSURE_TRUE(result, NS_ERROR_OUT_OF_MEMORY);
|
|
|
|
result->SetEventResult(widget, queryEvent);
|
|
|
|
NS_ADDREF(*aResult = result);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::SendSelectionSetEvent(uint32_t aOffset,
|
|
|
|
uint32_t aLength,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool aReverse,
|
|
|
|
bool *aResult)
|
2010-03-19 08:02:53 +03:00
|
|
|
{
|
2011-10-17 18:59:28 +04:00
|
|
|
*aResult = false;
|
2010-03-19 08:02:53 +03:00
|
|
|
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2010-03-19 08:02:53 +03:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
// get the widget to send the event to
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
nsSelectionEvent selectionEvent(true, NS_SELECTION_SET, widget);
|
2010-03-19 08:02:53 +03:00
|
|
|
InitEvent(selectionEvent);
|
|
|
|
|
|
|
|
selectionEvent.mOffset = aOffset;
|
|
|
|
selectionEvent.mLength = aLength;
|
|
|
|
selectionEvent.mReversed = aReverse;
|
|
|
|
|
|
|
|
nsEventStatus status;
|
|
|
|
nsresult rv = widget->DispatchEvent(&selectionEvent, status);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
*aResult = selectionEvent.mSucceeded;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2009-12-15 00:58:50 +03:00
|
|
|
NS_IMETHODIMP
|
2010-01-11 04:45:45 +03:00
|
|
|
nsDOMWindowUtils::SendContentCommandEvent(const nsAString& aType,
|
|
|
|
nsITransferable * aTransferable)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2010-01-11 04:45:45 +03:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
2010-03-19 08:03:41 +03:00
|
|
|
}
|
2010-01-11 04:45:45 +03:00
|
|
|
|
|
|
|
// get the widget to send the event to
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t msg;
|
2010-01-11 04:45:45 +03:00
|
|
|
if (aType.EqualsLiteral("cut"))
|
|
|
|
msg = NS_CONTENT_COMMAND_CUT;
|
|
|
|
else if (aType.EqualsLiteral("copy"))
|
|
|
|
msg = NS_CONTENT_COMMAND_COPY;
|
|
|
|
else if (aType.EqualsLiteral("paste"))
|
|
|
|
msg = NS_CONTENT_COMMAND_PASTE;
|
|
|
|
else if (aType.EqualsLiteral("delete"))
|
|
|
|
msg = NS_CONTENT_COMMAND_DELETE;
|
|
|
|
else if (aType.EqualsLiteral("undo"))
|
|
|
|
msg = NS_CONTENT_COMMAND_UNDO;
|
|
|
|
else if (aType.EqualsLiteral("redo"))
|
|
|
|
msg = NS_CONTENT_COMMAND_REDO;
|
|
|
|
else if (aType.EqualsLiteral("pasteTransferable"))
|
|
|
|
msg = NS_CONTENT_COMMAND_PASTE_TRANSFERABLE;
|
|
|
|
else
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
nsContentCommandEvent event(true, msg, widget);
|
2010-01-11 04:45:45 +03:00
|
|
|
if (msg == NS_CONTENT_COMMAND_PASTE_TRANSFERABLE) {
|
|
|
|
event.mTransferable = aTransferable;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsEventStatus status;
|
|
|
|
return widget->DispatchEvent(&event, status);
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2011-12-04 01:50:16 +04:00
|
|
|
nsDOMWindowUtils::GetClassName(const JS::Value& aObject, JSContext* aCx, char** aName)
|
2009-12-15 00:58:50 +03:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2009-12-15 00:58:50 +03:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Our argument must be a non-null object.
|
2011-12-04 01:50:16 +04:00
|
|
|
if (JSVAL_IS_PRIMITIVE(aObject)) {
|
2009-12-15 00:58:50 +03:00
|
|
|
return NS_ERROR_XPC_BAD_CONVERT_JS;
|
2011-12-04 01:50:16 +04:00
|
|
|
}
|
2009-12-15 00:58:50 +03:00
|
|
|
|
2012-02-04 04:54:57 +04:00
|
|
|
*aName = NS_strdup(JS_GetClass(JSVAL_TO_OBJECT(aObject))->name);
|
2011-12-04 01:50:16 +04:00
|
|
|
NS_ABORT_IF_FALSE(*aName, "NS_strdup should be infallible.");
|
|
|
|
return NS_OK;
|
2009-12-15 00:58:50 +03:00
|
|
|
}
|
2010-04-03 05:58:25 +04:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetVisitedDependentComputedStyle(
|
|
|
|
nsIDOMElement *aElement, const nsAString& aPseudoElement,
|
|
|
|
const nsAString& aPropertyName, nsAString& aResult)
|
|
|
|
{
|
|
|
|
aResult.Truncate();
|
|
|
|
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2010-04-03 05:58:25 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_STATE(window);
|
|
|
|
|
2010-04-03 05:58:25 +04:00
|
|
|
nsCOMPtr<nsIDOMCSSStyleDeclaration> decl;
|
|
|
|
nsresult rv =
|
2012-04-02 06:23:51 +04:00
|
|
|
window->GetComputedStyle(aElement, aPseudoElement, getter_AddRefs(decl));
|
2010-04-03 05:58:25 +04:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
static_cast<nsComputedDOMStyle*>(decl.get())->SetExposeVisitedStyle(true);
|
2010-04-03 05:58:25 +04:00
|
|
|
rv = decl->GetPropertyValue(aPropertyName, aResult);
|
2011-10-17 18:59:28 +04:00
|
|
|
static_cast<nsComputedDOMStyle*>(decl.get())->SetExposeVisitedStyle(false);
|
2010-04-03 05:58:25 +04:00
|
|
|
|
|
|
|
return rv;
|
|
|
|
}
|
2010-04-12 00:51:00 +04:00
|
|
|
|
2010-07-02 01:53:00 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::EnterModalState()
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_STATE(window);
|
|
|
|
|
|
|
|
window->EnterModalState();
|
2010-07-02 01:53:00 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::LeaveModalState()
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_STATE(window);
|
|
|
|
|
2012-07-30 18:20:58 +04:00
|
|
|
window->LeaveModalState(nullptr);
|
2011-02-02 06:23:00 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::EnterModalStateWithWindow(nsIDOMWindow **aWindow)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_STATE(window);
|
|
|
|
|
|
|
|
*aWindow = window->EnterModalState();
|
2011-02-02 06:23:00 +03:00
|
|
|
NS_IF_ADDREF(*aWindow);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::LeaveModalStateWithWindow(nsIDOMWindow *aWindow)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_STATE(window);
|
|
|
|
|
|
|
|
window->LeaveModalState(aWindow);
|
2010-07-02 01:53:00 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2011-09-29 10:19:26 +04:00
|
|
|
nsDOMWindowUtils::IsInModalState(bool *retval)
|
2010-07-02 01:53:00 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_STATE(window);
|
|
|
|
|
|
|
|
*retval = static_cast<nsGlobalWindow*>(window.get())->IsInModalState();
|
2010-07-02 01:53:00 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2010-04-12 00:51:00 +04:00
|
|
|
NS_IMETHODIMP
|
2011-11-16 11:50:19 +04:00
|
|
|
nsDOMWindowUtils::GetParent(const JS::Value& aObject,
|
|
|
|
JSContext* aCx,
|
|
|
|
JS::Value* aParent)
|
2010-04-12 00:51:00 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2010-04-12 00:51:00 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2011-11-16 11:50:19 +04:00
|
|
|
// First argument must be an object.
|
|
|
|
if (JSVAL_IS_PRIMITIVE(aObject)) {
|
2010-04-12 00:51:00 +04:00
|
|
|
return NS_ERROR_XPC_BAD_CONVERT_JS;
|
2011-11-16 11:50:19 +04:00
|
|
|
}
|
2010-04-12 00:51:00 +04:00
|
|
|
|
2013-03-06 20:41:43 +04:00
|
|
|
JS::Rooted<JSObject*> parent(aCx, JS_GetParent(JSVAL_TO_OBJECT(aObject)));
|
2011-11-16 11:50:19 +04:00
|
|
|
*aParent = OBJECT_TO_JSVAL(parent);
|
2010-05-05 05:02:00 +04:00
|
|
|
|
2010-06-12 20:29:04 +04:00
|
|
|
// Outerize if necessary.
|
2010-05-19 01:13:22 +04:00
|
|
|
if (parent) {
|
2011-11-16 11:50:19 +04:00
|
|
|
if (JSObjectOp outerize = js::GetObjectClass(parent)->ext.outerObject) {
|
2012-06-15 06:13:27 +04:00
|
|
|
*aParent = OBJECT_TO_JSVAL(outerize(aCx, parent));
|
2011-11-16 11:50:19 +04:00
|
|
|
}
|
2010-05-05 05:02:00 +04:00
|
|
|
}
|
|
|
|
|
2010-04-12 00:51:00 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2010-05-11 05:12:35 +04:00
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::GetOuterWindowID(uint64_t *aWindowID)
|
2010-05-11 05:12:35 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_STATE(window);
|
|
|
|
|
|
|
|
NS_ASSERTION(window->IsOuterWindow(), "How did that happen?");
|
|
|
|
*aWindowID = window->WindowID();
|
2010-05-11 05:12:35 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::GetCurrentInnerWindowID(uint64_t *aWindowID)
|
2010-05-11 05:12:35 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_TRUE(window, NS_ERROR_NOT_AVAILABLE);
|
|
|
|
|
|
|
|
NS_ASSERTION(window->IsOuterWindow(), "How did that happen?");
|
|
|
|
nsGlobalWindow* inner =
|
|
|
|
static_cast<nsGlobalWindow*>(window.get())->GetCurrentInnerWindowInternal();
|
2010-05-11 05:12:35 +04:00
|
|
|
if (!inner) {
|
|
|
|
return NS_ERROR_NOT_AVAILABLE;
|
|
|
|
}
|
2010-10-21 04:24:15 +04:00
|
|
|
*aWindowID = inner->WindowID();
|
2010-05-11 05:12:35 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2010-07-23 01:33:37 +04:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::SuspendTimeouts()
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2010-07-23 01:33:37 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
window->SuspendTimeouts();
|
2010-07-23 01:33:37 +04:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::ResumeTimeouts()
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2010-07-23 01:33:37 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
window->ResumeTimeouts();
|
2010-07-23 01:33:37 +04:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2010-09-03 22:01:05 +04:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetLayerManagerType(nsAString& aType)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2010-09-03 22:01:05 +04:00
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2013-03-15 08:41:52 +04:00
|
|
|
LayerManager *mgr = widget->GetLayerManager(nsIWidget::LAYER_MANAGER_PERSISTENT);
|
2010-09-03 22:01:05 +04:00
|
|
|
if (!mgr)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
mgr->GetBackendName(aType);
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2010-09-17 04:43:23 +04:00
|
|
|
|
2012-01-06 02:40:35 +04:00
|
|
|
NS_IMETHODIMP
|
2013-01-23 22:47:44 +04:00
|
|
|
nsDOMWindowUtils::StartFrameTimeRecording(uint32_t *startIndex)
|
2012-01-06 02:40:35 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2013-01-23 22:47:44 +04:00
|
|
|
NS_ENSURE_ARG_POINTER(startIndex);
|
|
|
|
|
2012-01-06 02:40:35 +04:00
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
LayerManager *mgr = widget->GetLayerManager();
|
|
|
|
if (!mgr)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2013-01-23 22:47:44 +04:00
|
|
|
*startIndex = mgr->StartFrameTimeRecording();
|
2012-01-06 02:40:35 +04:00
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2013-01-23 22:47:44 +04:00
|
|
|
nsDOMWindowUtils::StopFrameTimeRecording(uint32_t startIndex,
|
|
|
|
float **paintTimes,
|
|
|
|
uint32_t *frameCount,
|
|
|
|
float **frameIntervals)
|
2012-01-06 02:40:35 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-01-06 02:40:35 +04:00
|
|
|
NS_ENSURE_ARG_POINTER(frameCount);
|
2013-01-04 06:53:15 +04:00
|
|
|
NS_ENSURE_ARG_POINTER(frameIntervals);
|
|
|
|
NS_ENSURE_ARG_POINTER(paintTimes);
|
2012-01-06 02:40:35 +04:00
|
|
|
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
LayerManager *mgr = widget->GetLayerManager();
|
|
|
|
if (!mgr)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
2013-01-04 06:53:15 +04:00
|
|
|
nsTArray<float> tmpFrameIntervals;
|
|
|
|
nsTArray<float> tmpPaintTimes;
|
2013-01-23 22:47:44 +04:00
|
|
|
mgr->StopFrameTimeRecording(startIndex, tmpFrameIntervals, tmpPaintTimes);
|
2013-01-04 06:53:15 +04:00
|
|
|
*frameCount = tmpFrameIntervals.Length();
|
2012-01-06 02:40:35 +04:00
|
|
|
|
2013-01-23 22:47:44 +04:00
|
|
|
*frameIntervals = (float*)nsMemory::Alloc(*frameCount * sizeof(float*));
|
|
|
|
*paintTimes = (float*)nsMemory::Alloc(*frameCount * sizeof(float*));
|
2012-01-06 02:40:35 +04:00
|
|
|
|
2013-01-23 22:47:44 +04:00
|
|
|
/* copy over the frame intervals and paint times into the arrays we just allocated */
|
|
|
|
for (uint32_t i = 0; i < *frameCount; i++) {
|
|
|
|
(*frameIntervals)[i] = tmpFrameIntervals[i];
|
2013-01-23 09:52:19 +04:00
|
|
|
#ifndef MOZ_WIDGET_GONK
|
2013-01-23 22:47:44 +04:00
|
|
|
(*paintTimes)[i] = tmpPaintTimes[i];
|
2013-01-14 05:48:33 +04:00
|
|
|
#else
|
2013-01-23 22:47:44 +04:00
|
|
|
// Waiting for bug 830475 to work on B2G.
|
|
|
|
(*paintTimes)[i] = 0;
|
2013-01-14 05:48:33 +04:00
|
|
|
#endif
|
2012-01-06 02:40:35 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2012-10-11 21:54:27 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::BeginTabSwitch()
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-10-11 21:54:27 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
LayerManager *mgr = widget->GetLayerManager();
|
|
|
|
if (!mgr)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
mgr->BeginTabSwitch();
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
static bool
|
2011-03-28 20:51:56 +04:00
|
|
|
ComputeAnimationValue(nsCSSProperty aProperty,
|
|
|
|
Element* aElement,
|
2010-10-24 03:31:55 +04:00
|
|
|
const nsAString& aInput,
|
|
|
|
nsStyleAnimation::Value& aOutput)
|
|
|
|
{
|
|
|
|
|
2011-03-28 20:51:56 +04:00
|
|
|
if (!nsStyleAnimation::ComputeValue(aProperty, aElement, aInput,
|
2011-10-17 18:59:28 +04:00
|
|
|
false, aOutput)) {
|
|
|
|
return false;
|
2010-10-24 03:31:55 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
// This matches TransExtractComputedValue in nsTransitionManager.cpp.
|
|
|
|
if (aProperty == eCSSProperty_visibility) {
|
|
|
|
NS_ABORT_IF_FALSE(aOutput.GetUnit() == nsStyleAnimation::eUnit_Enumerated,
|
|
|
|
"unexpected unit");
|
|
|
|
aOutput.SetIntValue(aOutput.GetIntValue(),
|
|
|
|
nsStyleAnimation::eUnit_Visibility);
|
|
|
|
}
|
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
return true;
|
2010-10-24 03:31:55 +04:00
|
|
|
}
|
|
|
|
|
2011-04-12 10:18:43 +04:00
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::AdvanceTimeAndRefresh(int64_t aMilliseconds)
|
2011-04-12 10:18:43 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2011-04-12 10:18:43 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
GetPresContext()->RefreshDriver()->AdvanceTimeAndRefresh(aMilliseconds);
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::RestoreNormalRefresh()
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2011-04-12 10:18:43 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
GetPresContext()->RefreshDriver()->RestoreNormalRefresh();
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2013-03-16 01:40:37 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetIsTestControllingRefreshes(bool *aResult)
|
|
|
|
{
|
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
*aResult =
|
|
|
|
GetPresContext()->RefreshDriver()->IsTestControllingRefreshesEnabled();
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2010-10-24 03:31:55 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::ComputeAnimationDistance(nsIDOMElement* aElement,
|
|
|
|
const nsAString& aProperty,
|
|
|
|
const nsAString& aValue1,
|
|
|
|
const nsAString& aValue2,
|
|
|
|
double* aResult)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2010-10-24 03:31:55 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsIContent> content = do_QueryInterface(aElement, &rv);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
// Convert direction-dependent properties as appropriate, e.g.,
|
|
|
|
// border-left to border-left-value.
|
2012-07-14 03:59:05 +04:00
|
|
|
nsCSSProperty property = nsCSSProps::LookupProperty(aProperty,
|
|
|
|
nsCSSProps::eAny);
|
2010-10-24 03:31:55 +04:00
|
|
|
if (property != eCSSProperty_UNKNOWN && nsCSSProps::IsShorthand(property)) {
|
|
|
|
nsCSSProperty subprop0 = *nsCSSProps::SubpropertyEntryFor(property);
|
|
|
|
if (nsCSSProps::PropHasFlags(subprop0, CSS_PROPERTY_REPORT_OTHER_NAME) &&
|
|
|
|
nsCSSProps::OtherNameFor(subprop0) == property) {
|
|
|
|
property = subprop0;
|
|
|
|
} else {
|
|
|
|
property = eCSSProperty_UNKNOWN;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_ABORT_IF_FALSE(property == eCSSProperty_UNKNOWN ||
|
|
|
|
!nsCSSProps::IsShorthand(property),
|
|
|
|
"should not have shorthand");
|
|
|
|
|
|
|
|
nsStyleAnimation::Value v1, v2;
|
|
|
|
if (property == eCSSProperty_UNKNOWN ||
|
2011-03-28 20:51:56 +04:00
|
|
|
!ComputeAnimationValue(property, content->AsElement(), aValue1, v1) ||
|
|
|
|
!ComputeAnimationValue(property, content->AsElement(), aValue2, v2)) {
|
2010-10-24 03:31:55 +04:00
|
|
|
return NS_ERROR_ILLEGAL_VALUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!nsStyleAnimation::ComputeDistance(property, v1, v2, *aResult)) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2010-09-17 04:43:23 +04:00
|
|
|
nsresult
|
|
|
|
nsDOMWindowUtils::RenderDocument(const nsRect& aRect,
|
2012-08-22 19:56:38 +04:00
|
|
|
uint32_t aFlags,
|
2010-09-17 04:43:23 +04:00
|
|
|
nscolor aBackgroundColor,
|
|
|
|
gfxContext* aThebesContext)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
|
|
|
|
|
2010-09-17 04:43:23 +04:00
|
|
|
// Get DOM Document
|
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsIDOMDocument> ddoc;
|
2012-04-02 06:23:51 +04:00
|
|
|
rv = window->GetDocument(getter_AddRefs(ddoc));
|
2010-09-17 04:43:23 +04:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
// Get Document
|
|
|
|
nsCOMPtr<nsIDocument> doc = do_QueryInterface(ddoc, &rv);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
// Get Primary Shell
|
|
|
|
nsCOMPtr<nsIPresShell> presShell = doc->GetShell();
|
|
|
|
NS_ENSURE_TRUE(presShell, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
// Render Document
|
|
|
|
return presShell->RenderDocument(aRect, aFlags, aBackgroundColor, aThebesContext);
|
|
|
|
}
|
2010-09-17 22:56:53 +04:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::GetCursorType(int16_t *aCursor)
|
2010-09-17 22:56:53 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2010-09-17 22:56:53 +04:00
|
|
|
NS_ENSURE_ARG_POINTER(aCursor);
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
|
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
bool isSameDoc = false;
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsIDocument> doc(do_QueryInterface(window->GetExtantDocument()));
|
2010-09-17 22:56:53 +04:00
|
|
|
|
|
|
|
NS_ENSURE_TRUE(doc, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
do {
|
|
|
|
if (nsEventStateManager::sMouseOverDocument == doc.get()) {
|
2011-10-17 18:59:28 +04:00
|
|
|
isSameDoc = true;
|
2010-09-17 22:56:53 +04:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
} while ((doc = doc->GetParentDocument()));
|
|
|
|
|
|
|
|
if (!isSameDoc) {
|
|
|
|
*aCursor = eCursor_none;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
// fetch cursor value from window's widget
|
|
|
|
*aCursor = widget->GetCursor();
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2010-10-21 04:24:16 +04:00
|
|
|
|
2010-10-14 20:19:27 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetDisplayDPI(float *aDPI)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2010-10-14 20:19:27 +04:00
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
*aDPI = widget->GetDPI();
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2010-10-21 04:24:16 +04:00
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::GetOuterWindowWithId(uint64_t aWindowID,
|
2010-10-21 04:24:16 +04:00
|
|
|
nsIDOMWindow** aWindow)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2010-10-21 05:33:34 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2010-10-21 04:24:16 +04:00
|
|
|
*aWindow = nsGlobalWindow::GetOuterWindowWithId(aWindowID);
|
|
|
|
NS_IF_ADDREF(*aWindow);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2011-02-03 11:47:11 +03:00
|
|
|
|
2011-09-27 04:25:41 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::WrapDOMFile(nsIFile *aFile,
|
2012-09-10 23:45:10 +04:00
|
|
|
nsIDOMFile **aDOMFile)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-09-25 19:04:25 +04:00
|
|
|
if (!aFile) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2011-09-27 04:25:41 +04:00
|
|
|
NS_ADDREF(*aDOMFile = new nsDOMFileFile(aFile));
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2011-02-03 11:47:11 +03:00
|
|
|
#ifdef DEBUG
|
2011-09-29 10:19:26 +04:00
|
|
|
static bool
|
2011-02-03 11:47:11 +03:00
|
|
|
CheckLeafLayers(Layer* aLayer, const nsIntPoint& aOffset, nsIntRegion* aCoveredRegion)
|
|
|
|
{
|
|
|
|
gfxMatrix transform;
|
|
|
|
if (!aLayer->GetTransform().Is2D(&transform) ||
|
|
|
|
transform.HasNonIntegerTranslation())
|
2011-10-17 18:59:28 +04:00
|
|
|
return false;
|
2011-02-03 11:47:11 +03:00
|
|
|
transform.NudgeToIntegers();
|
|
|
|
nsIntPoint offset = aOffset + nsIntPoint(transform.x0, transform.y0);
|
|
|
|
|
|
|
|
Layer* child = aLayer->GetFirstChild();
|
|
|
|
if (child) {
|
|
|
|
while (child) {
|
|
|
|
if (!CheckLeafLayers(child, offset, aCoveredRegion))
|
2011-10-17 18:59:28 +04:00
|
|
|
return false;
|
2011-02-03 11:47:11 +03:00
|
|
|
child = child->GetNextSibling();
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
nsIntRegion rgn = aLayer->GetVisibleRegion();
|
|
|
|
rgn.MoveBy(offset);
|
|
|
|
nsIntRegion tmp;
|
|
|
|
tmp.And(rgn, *aCoveredRegion);
|
|
|
|
if (!tmp.IsEmpty())
|
2011-10-17 18:59:28 +04:00
|
|
|
return false;
|
2011-02-03 11:47:11 +03:00
|
|
|
aCoveredRegion->Or(*aCoveredRegion, rgn);
|
|
|
|
}
|
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
return true;
|
2011-02-03 11:47:11 +03:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2011-09-29 10:19:26 +04:00
|
|
|
nsDOMWindowUtils::LeafLayersPartitionWindow(bool* aResult)
|
2011-02-03 11:47:11 +03:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2011-02-03 11:47:11 +03:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
*aResult = true;
|
2011-02-03 11:47:11 +03:00
|
|
|
#ifdef DEBUG
|
|
|
|
nsIWidget* widget = GetWidget();
|
|
|
|
if (!widget)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
LayerManager* manager = widget->GetLayerManager();
|
|
|
|
if (!manager)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
nsPresContext* presContext = GetPresContext();
|
|
|
|
if (!presContext)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
Layer* root = manager->GetRoot();
|
|
|
|
if (!root)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsIntPoint offset(0, 0);
|
|
|
|
nsIntRegion coveredRegion;
|
|
|
|
if (!CheckLeafLayers(root, offset, &coveredRegion)) {
|
2011-10-17 18:59:28 +04:00
|
|
|
*aResult = false;
|
2011-02-03 11:47:11 +03:00
|
|
|
}
|
|
|
|
if (!coveredRegion.IsEqual(root->GetVisibleRegion())) {
|
2011-10-17 18:59:28 +04:00
|
|
|
*aResult = false;
|
2011-02-03 11:47:11 +03:00
|
|
|
}
|
|
|
|
#endif
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2011-04-26 16:31:21 +04:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2011-09-29 10:19:26 +04:00
|
|
|
nsDOMWindowUtils::GetMayHaveTouchEventListeners(bool* aResult)
|
2011-04-26 16:31:21 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2011-04-26 16:31:21 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
nsPIDOMWindow* innerWindow = window->GetCurrentInnerWindow();
|
2011-10-17 18:59:28 +04:00
|
|
|
*aResult = innerWindow ? innerWindow->HasTouchEventListeners() : false;
|
2011-04-26 16:31:21 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2011-10-26 07:23:26 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::CheckAndClearPaintedState(nsIDOMElement* aElement, bool* aResult)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2011-10-26 07:23:26 +04:00
|
|
|
if (!aElement) {
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsIContent> content = do_QueryInterface(aElement, &rv);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
nsIFrame* frame = content->GetPrimaryFrame();
|
|
|
|
|
|
|
|
if (!frame) {
|
|
|
|
*aResult = false;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
*aResult = frame->CheckAndClearPaintedState();
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2012-08-13 23:05:34 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::PreventFurtherDialogs()
|
|
|
|
{
|
|
|
|
// Permanently disable further dialogs for this window.
|
|
|
|
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-08-13 23:05:34 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
static_cast<nsGlobalWindow*>(window.get())->PreventFurtherDialogs(true);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2012-12-12 01:21:03 +04:00
|
|
|
static nsIDOMBlob*
|
|
|
|
GetXPConnectNative(JSContext* aCx, JSObject* aObj) {
|
|
|
|
nsCOMPtr<nsIDOMBlob> blob = do_QueryInterface(
|
|
|
|
nsContentUtils::XPConnect()->GetNativeOfWrapper(aCx, aObj));
|
|
|
|
return blob;
|
|
|
|
}
|
|
|
|
|
2012-06-03 20:33:52 +04:00
|
|
|
static nsresult
|
|
|
|
GetFileOrBlob(const nsAString& aName, const jsval& aBlobParts,
|
|
|
|
const jsval& aParameters, JSContext* aCx,
|
2012-08-22 19:56:38 +04:00
|
|
|
uint8_t aOptionalArgCount, nsISupports** aResult)
|
2011-12-16 11:34:24 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2011-12-16 11:34:24 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-06-03 20:33:52 +04:00
|
|
|
nsresult rv;
|
|
|
|
|
|
|
|
nsCOMPtr<nsISupports> file;
|
|
|
|
|
|
|
|
if (aName.IsVoid()) {
|
|
|
|
rv = nsDOMMultipartFile::NewBlob(getter_AddRefs(file));
|
|
|
|
}
|
|
|
|
else {
|
|
|
|
rv = nsDOMMultipartFile::NewFile(aName, getter_AddRefs(file));
|
|
|
|
}
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2012-12-12 01:21:03 +04:00
|
|
|
nsDOMMultipartFile* domFile =
|
|
|
|
static_cast<nsDOMMultipartFile*>(static_cast<nsIDOMFile*>(file.get()));
|
2012-06-03 20:33:52 +04:00
|
|
|
|
|
|
|
jsval args[2] = { aBlobParts, aParameters };
|
|
|
|
|
2012-12-12 01:21:03 +04:00
|
|
|
rv = domFile->InitBlob(aCx, aOptionalArgCount, args, GetXPConnectNative);
|
2012-06-03 20:33:52 +04:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
file.forget(aResult);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetFile(const nsAString& aName, const jsval& aBlobParts,
|
|
|
|
const jsval& aParameters, JSContext* aCx,
|
2012-08-22 19:56:38 +04:00
|
|
|
uint8_t aOptionalArgCount, nsIDOMFile** aResult)
|
2012-06-03 20:33:52 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-06-03 20:33:52 +04:00
|
|
|
nsCOMPtr<nsISupports> file;
|
|
|
|
nsresult rv = GetFileOrBlob(aName, aBlobParts, aParameters, aCx,
|
|
|
|
aOptionalArgCount, getter_AddRefs(file));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMFile> result = do_QueryInterface(file);
|
|
|
|
result.forget(aResult);
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetBlob(const jsval& aBlobParts, const jsval& aParameters,
|
2012-08-22 19:56:38 +04:00
|
|
|
JSContext* aCx, uint8_t aOptionalArgCount,
|
2012-06-03 20:33:52 +04:00
|
|
|
nsIDOMBlob** aResult)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-06-03 20:33:52 +04:00
|
|
|
nsCOMPtr<nsISupports> blob;
|
2012-08-24 22:51:33 +04:00
|
|
|
nsresult rv = GetFileOrBlob(NullString(), aBlobParts, aParameters, aCx,
|
2012-06-03 20:33:52 +04:00
|
|
|
aOptionalArgCount, getter_AddRefs(blob));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMBlob> result = do_QueryInterface(blob);
|
|
|
|
result.forget(aResult);
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetFileId(const jsval& aFile, JSContext* aCx,
|
2012-08-22 19:56:38 +04:00
|
|
|
int64_t* aResult)
|
2012-06-03 20:33:52 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
2012-06-03 20:33:52 +04:00
|
|
|
|
|
|
|
if (!JSVAL_IS_PRIMITIVE(aFile)) {
|
|
|
|
JSObject* obj = JSVAL_TO_OBJECT(aFile);
|
|
|
|
|
|
|
|
nsISupports* nativeObj =
|
|
|
|
nsContentUtils::XPConnect()->GetNativeOfWrapper(aCx, obj);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMBlob> blob = do_QueryInterface(nativeObj);
|
|
|
|
if (blob) {
|
|
|
|
*aResult = blob->GetFileId();
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMFileHandle> fileHandle = do_QueryInterface(nativeObj);
|
|
|
|
if (fileHandle) {
|
|
|
|
*aResult = fileHandle->GetFileId();
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
*aResult = -1;
|
2011-12-16 11:34:24 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetFileReferences(const nsAString& aDatabaseName,
|
2012-08-22 19:56:38 +04:00
|
|
|
int64_t aId, int32_t* aRefCnt,
|
|
|
|
int32_t* aDBRefCnt, int32_t* aSliceRefCnt,
|
2011-12-16 11:34:24 +04:00
|
|
|
bool* aResult)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2011-12-16 11:34:24 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
|
2011-12-16 11:34:24 +04:00
|
|
|
|
|
|
|
nsCString origin;
|
|
|
|
nsresult rv = indexedDB::IndexedDatabaseManager::GetASCIIOriginFromWindow(
|
2012-04-02 06:23:51 +04:00
|
|
|
window, origin);
|
2011-12-16 11:34:24 +04:00
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
nsRefPtr<indexedDB::IndexedDatabaseManager> mgr =
|
2011-12-20 15:23:27 +04:00
|
|
|
indexedDB::IndexedDatabaseManager::Get();
|
|
|
|
|
|
|
|
if (mgr) {
|
|
|
|
nsRefPtr<indexedDB::FileManager> fileManager =
|
|
|
|
mgr->GetFileManager(origin, aDatabaseName);
|
|
|
|
|
|
|
|
if (fileManager) {
|
|
|
|
nsRefPtr<indexedDB::FileInfo> fileInfo = fileManager->GetFileInfo(aId);
|
|
|
|
|
|
|
|
if (fileInfo) {
|
|
|
|
fileInfo->GetReferences(aRefCnt, aDBRefCnt, aSliceRefCnt);
|
|
|
|
|
|
|
|
if (*aRefCnt != -1) {
|
|
|
|
// We added an extra temp ref, so account for that accordingly.
|
|
|
|
(*aRefCnt)--;
|
|
|
|
}
|
|
|
|
|
|
|
|
*aResult = true;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
}
|
2011-12-16 11:34:24 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
*aRefCnt = *aDBRefCnt = *aSliceRefCnt = -1;
|
|
|
|
*aResult = false;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2011-12-17 01:11:08 +04:00
|
|
|
|
2012-02-18 02:35:20 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::IsIncrementalGCEnabled(JSContext* cx, bool* aResult)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2013-03-19 14:35:41 +04:00
|
|
|
*aResult = JS::IsIncrementalGCEnabled(JS_GetRuntime(cx));
|
2012-02-18 02:35:20 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2011-12-17 01:11:08 +04:00
|
|
|
NS_IMETHODIMP
|
2011-12-24 12:21:26 +04:00
|
|
|
nsDOMWindowUtils::StartPCCountProfiling(JSContext* cx)
|
2011-12-17 01:11:08 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2011-12-17 01:11:08 +04:00
|
|
|
js::StartPCCountProfiling(cx);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2011-12-24 12:21:26 +04:00
|
|
|
nsDOMWindowUtils::StopPCCountProfiling(JSContext* cx)
|
2011-12-17 01:11:08 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2011-12-17 01:11:08 +04:00
|
|
|
js::StopPCCountProfiling(cx);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2011-12-24 12:21:26 +04:00
|
|
|
nsDOMWindowUtils::PurgePCCounts(JSContext* cx)
|
2011-12-17 01:11:08 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2011-12-17 01:11:08 +04:00
|
|
|
js::PurgePCCounts(cx);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::GetPCCountScriptCount(JSContext* cx, int32_t *result)
|
2011-12-17 01:11:08 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2011-12-17 01:11:08 +04:00
|
|
|
*result = js::GetPCCountScriptCount(cx);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::GetPCCountScriptSummary(int32_t script, JSContext* cx, nsAString& result)
|
2011-12-17 01:11:08 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2011-12-17 01:11:08 +04:00
|
|
|
JSString *text = js::GetPCCountScriptSummary(cx, script);
|
|
|
|
if (!text)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsDependentJSString str;
|
|
|
|
if (!str.init(cx, text))
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
result = str;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
nsDOMWindowUtils::GetPCCountScriptContents(int32_t script, JSContext* cx, nsAString& result)
|
2011-12-17 01:11:08 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2011-12-17 01:11:08 +04:00
|
|
|
JSString *text = js::GetPCCountScriptContents(cx, script);
|
|
|
|
if (!text)
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
nsDependentJSString str;
|
|
|
|
if (!str.init(cx, text))
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
|
|
|
|
result = str;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2012-01-04 10:52:20 +04:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetPaintingSuppressed(bool *aPaintingSuppressed)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_TRUE(window, NS_ERROR_FAILURE);
|
|
|
|
nsIDocShell *docShell = window->GetDocShell();
|
2012-01-04 10:52:20 +04:00
|
|
|
NS_ENSURE_TRUE(docShell, NS_ERROR_FAILURE);
|
|
|
|
|
2012-12-29 05:56:42 +04:00
|
|
|
nsCOMPtr<nsIPresShell> presShell = docShell->GetPresShell();
|
2012-01-04 10:52:20 +04:00
|
|
|
NS_ENSURE_TRUE(presShell, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
*aPaintingSuppressed = presShell->IsPaintingSuppressed();
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2012-03-28 19:53:56 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetPlugins(JSContext* cx, jsval* aPlugins)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-03-28 19:53:56 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-04-02 06:23:51 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_STATE(window);
|
|
|
|
|
|
|
|
nsIDOMDocument* ddoc = window->GetExtantDocument();
|
2012-03-28 19:53:56 +04:00
|
|
|
|
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsIDocument> doc = do_QueryInterface(ddoc, &rv);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
nsTArray<nsIObjectLoadingContent*> plugins;
|
|
|
|
doc->GetPlugins(plugins);
|
|
|
|
|
2012-07-30 18:20:58 +04:00
|
|
|
JSObject* jsPlugins = nullptr;
|
2012-03-31 09:34:16 +04:00
|
|
|
rv = nsTArrayToJSArray(cx, plugins, &jsPlugins);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
*aPlugins = OBJECT_TO_JSVAL(jsPlugins);
|
2012-03-28 19:53:56 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2012-04-24 22:52:35 +04:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::SetScrollPositionClampingScrollPortSize(float aWidth, float aHeight)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-04-24 22:52:35 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(aWidth >= 0.0 && aHeight >= 0.0)) {
|
|
|
|
return NS_ERROR_ILLEGAL_VALUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIPresShell* presShell = GetPresShell();
|
|
|
|
if (!presShell) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
presShell->SetScrollPositionClampingScrollPortSize(
|
|
|
|
nsPresContext::CSSPixelsToAppUnits(aWidth),
|
|
|
|
nsPresContext::CSSPixelsToAppUnits(aHeight));
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2012-05-11 04:56:21 +04:00
|
|
|
|
2013-03-07 14:17:33 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::SetContentDocumentFixedPositionMargins(float aTop, float aRight,
|
|
|
|
float aBottom, float aLeft)
|
|
|
|
{
|
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!(aTop >= 0.0f && aRight >= 0.0f && aBottom >= 0.0f && aLeft >= 0.0f)) {
|
|
|
|
return NS_ERROR_ILLEGAL_VALUE;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIPresShell* presShell = GetPresShell();
|
|
|
|
if (!presShell) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsMargin margins(nsPresContext::CSSPixelsToAppUnits(aTop),
|
|
|
|
nsPresContext::CSSPixelsToAppUnits(aRight),
|
|
|
|
nsPresContext::CSSPixelsToAppUnits(aBottom),
|
|
|
|
nsPresContext::CSSPixelsToAppUnits(aLeft));
|
|
|
|
presShell->SetContentDocumentFixedPositionMargins(margins);
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2012-07-31 06:09:31 +04:00
|
|
|
nsresult
|
|
|
|
nsDOMWindowUtils::RemoteFrameFullscreenChanged(nsIDOMElement* aFrameElement,
|
|
|
|
const nsAString& aNewOrigin)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:37 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-07-31 06:09:31 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_STATE(window);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocument> doc(do_QueryInterface(window->GetExtantDocument()));
|
|
|
|
NS_ENSURE_STATE(doc);
|
|
|
|
|
|
|
|
doc->RemoteFrameFullscreenChanged(aFrameElement, aNewOrigin);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsDOMWindowUtils::RemoteFrameFullscreenReverted()
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:37 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2012-07-31 06:09:31 +04:00
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_STATE(window);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocument> doc(do_QueryInterface(window->GetExtantDocument()));
|
|
|
|
NS_ENSURE_STATE(doc);
|
|
|
|
|
|
|
|
doc->RemoteFrameFullscreenReverted();
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsresult
|
|
|
|
nsDOMWindowUtils::ExitFullscreen()
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-10 23:45:37 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
2013-02-26 09:40:53 +04:00
|
|
|
nsIDocument::ExitFullscreen(nullptr, /* async */ false);
|
2012-07-31 06:09:31 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2012-09-11 01:02:23 +04:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2012-09-14 22:55:01 +04:00
|
|
|
nsDOMWindowUtils::SelectAtPoint(float aX, float aY, uint32_t aSelectBehavior,
|
2012-09-11 01:02:23 +04:00
|
|
|
bool *_retval)
|
|
|
|
{
|
|
|
|
*_retval = false;
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-11 01:02:23 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsSelectionAmount amount;
|
|
|
|
switch (aSelectBehavior) {
|
|
|
|
case nsIDOMWindowUtils::SELECT_CHARACTER:
|
|
|
|
amount = eSelectCharacter;
|
|
|
|
break;
|
|
|
|
case nsIDOMWindowUtils::SELECT_CLUSTER:
|
|
|
|
amount = eSelectCluster;
|
|
|
|
break;
|
|
|
|
case nsIDOMWindowUtils::SELECT_WORD:
|
|
|
|
amount = eSelectWord;
|
|
|
|
break;
|
|
|
|
case nsIDOMWindowUtils::SELECT_LINE:
|
|
|
|
amount = eSelectLine;
|
|
|
|
break;
|
|
|
|
case nsIDOMWindowUtils::SELECT_BEGINLINE:
|
|
|
|
amount = eSelectBeginLine;
|
|
|
|
break;
|
|
|
|
case nsIDOMWindowUtils::SELECT_ENDLINE:
|
|
|
|
amount = eSelectEndLine;
|
|
|
|
break;
|
|
|
|
case nsIDOMWindowUtils::SELECT_PARAGRAPH:
|
|
|
|
amount = eSelectParagraph;
|
|
|
|
break;
|
|
|
|
case nsIDOMWindowUtils::SELECT_WORDNOSPACE:
|
|
|
|
amount = eSelectWordNoSpace;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIPresShell* presShell = GetPresShell();
|
|
|
|
if (!presShell) {
|
|
|
|
return NS_ERROR_UNEXPECTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
// The root frame for this content window
|
|
|
|
nsIFrame* rootFrame = presShell->FrameManager()->GetRootFrame();
|
|
|
|
if (!rootFrame) {
|
|
|
|
return NS_ERROR_UNEXPECTED;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Get the target frame at the client coordinates passed to us
|
2013-02-27 18:12:39 +04:00
|
|
|
nsPoint offset;
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget(&offset);
|
|
|
|
nsIntPoint pt = ToWidgetPoint(aX, aY, offset, GetPresContext());
|
2012-09-11 01:02:23 +04:00
|
|
|
nsPoint ptInRoot =
|
|
|
|
nsLayoutUtils::GetEventCoordinatesRelativeTo(widget, pt, rootFrame);
|
|
|
|
nsIFrame* targetFrame = nsLayoutUtils::GetFrameForPoint(rootFrame, ptInRoot);
|
|
|
|
// This can happen if the page hasn't loaded yet or if the point
|
|
|
|
// is outside the frame.
|
|
|
|
if (!targetFrame) {
|
|
|
|
return NS_ERROR_INVALID_ARG;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Convert point to coordinates relative to the target frame, which is
|
|
|
|
// what targetFrame's SelectByTypeAtPoint expects.
|
|
|
|
nsPoint relPoint =
|
|
|
|
nsLayoutUtils::GetEventCoordinatesRelativeTo(widget, pt, targetFrame);
|
|
|
|
|
|
|
|
nsresult rv =
|
|
|
|
static_cast<nsFrame*>(targetFrame)->
|
|
|
|
SelectByTypeAtPoint(GetPresContext(), relPoint, amount, amount,
|
|
|
|
nsFrame::SELECT_ACCUMULATE);
|
|
|
|
*_retval = !NS_FAILED(rv);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2012-09-11 15:51:10 +04:00
|
|
|
|
2012-10-29 15:21:15 +04:00
|
|
|
static nsIDocument::additionalSheetType
|
|
|
|
convertSheetType(uint32_t aSheetType)
|
|
|
|
{
|
|
|
|
switch(aSheetType) {
|
|
|
|
case nsDOMWindowUtils::AGENT_SHEET:
|
|
|
|
return nsIDocument::eAgentSheet;
|
|
|
|
case nsDOMWindowUtils::USER_SHEET:
|
|
|
|
return nsIDocument::eUserSheet;
|
|
|
|
case nsDOMWindowUtils::AUTHOR_SHEET:
|
|
|
|
return nsIDocument::eAuthorSheet;
|
|
|
|
default:
|
|
|
|
NS_ASSERTION(false, "wrong type");
|
|
|
|
// we must return something although this should never happen
|
|
|
|
return nsIDocument::SheetTypeCount;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-09-11 15:51:10 +04:00
|
|
|
NS_IMETHODIMP
|
2012-09-14 22:55:01 +04:00
|
|
|
nsDOMWindowUtils::LoadSheet(nsIURI *aSheetURI, uint32_t aSheetType)
|
2012-09-11 15:51:10 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-11 15:51:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_ENSURE_ARG_POINTER(aSheetURI);
|
2012-10-29 15:21:15 +04:00
|
|
|
NS_ENSURE_ARG(aSheetType == AGENT_SHEET ||
|
|
|
|
aSheetType == USER_SHEET ||
|
|
|
|
aSheetType == AUTHOR_SHEET);
|
2012-09-11 15:51:10 +04:00
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_TRUE(window, NS_ERROR_INVALID_ARG);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMDocument> ddoc;
|
|
|
|
nsresult rv = window->GetDocument(getter_AddRefs(ddoc));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
NS_ENSURE_TRUE(ddoc, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocument> doc = do_QueryInterface(ddoc);
|
|
|
|
NS_ENSURE_TRUE(doc, NS_ERROR_INVALID_ARG);
|
|
|
|
|
2012-10-29 15:21:15 +04:00
|
|
|
nsIDocument::additionalSheetType type = convertSheetType(aSheetType);
|
2012-09-11 15:51:10 +04:00
|
|
|
|
|
|
|
rv = doc->LoadAdditionalStyleSheet(type, aSheetURI);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2012-09-14 22:55:01 +04:00
|
|
|
nsDOMWindowUtils::RemoveSheet(nsIURI *aSheetURI, uint32_t aSheetType)
|
2012-09-11 15:51:10 +04:00
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-09-11 15:51:10 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_ENSURE_ARG_POINTER(aSheetURI);
|
2012-10-29 15:21:15 +04:00
|
|
|
NS_ENSURE_ARG(aSheetType == AGENT_SHEET ||
|
|
|
|
aSheetType == USER_SHEET ||
|
|
|
|
aSheetType == AUTHOR_SHEET);
|
2012-09-11 15:51:10 +04:00
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_TRUE(window, NS_ERROR_INVALID_ARG);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMDocument> ddoc;
|
|
|
|
nsresult rv = window->GetDocument(getter_AddRefs(ddoc));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
NS_ENSURE_TRUE(ddoc, NS_ERROR_FAILURE);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocument> doc = do_QueryInterface(ddoc);
|
|
|
|
NS_ENSURE_TRUE(doc, NS_ERROR_INVALID_ARG);
|
|
|
|
|
2012-10-29 15:21:15 +04:00
|
|
|
nsIDocument::additionalSheetType type = convertSheetType(aSheetType);
|
2012-09-11 15:51:10 +04:00
|
|
|
|
|
|
|
doc->RemoveAdditionalStyleSheet(type, aSheetURI);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2012-10-08 15:02:57 +04:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetIsHandlingUserInput(bool* aHandlingUserInput)
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-10-08 15:02:57 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
|
|
|
|
*aHandlingUserInput = nsEventStateManager::IsHandlingUserInput();
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2012-10-12 14:17:56 +04:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::AllowScriptsToClose()
|
|
|
|
{
|
2012-10-26 03:10:53 +04:00
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
2012-10-12 14:17:56 +04:00
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
nsCOMPtr<nsPIDOMWindow> window = do_QueryReferent(mWindow);
|
|
|
|
NS_ENSURE_STATE(window);
|
|
|
|
static_cast<nsGlobalWindow*>(window.get())->AllowScriptsToClose();
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2013-01-03 19:17:36 +04:00
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::IsNodeDisabledForEvents(nsIDOMNode* aNode, bool* aRetVal)
|
|
|
|
{
|
|
|
|
*aRetVal = false;
|
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
nsCOMPtr<nsINode> n = do_QueryInterface(aNode);
|
|
|
|
nsINode* node = n;
|
|
|
|
while (node) {
|
|
|
|
if (node->IsNodeOfType(nsINode::eHTML_FORM_CONTROL)) {
|
|
|
|
nsCOMPtr<nsIFormControl> fc = do_QueryInterface(node);
|
|
|
|
if (fc && fc->IsDisabledForEvents(NS_EVENT_NULL)) {
|
|
|
|
*aRetVal = true;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
node = node->GetParentNode();
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2013-01-16 13:27:06 +04:00
|
|
|
|
2013-03-12 22:01:00 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::SetPaintFlashing(bool aPaintFlashing)
|
|
|
|
{
|
|
|
|
nsPresContext* presContext = GetPresContext();
|
|
|
|
if (presContext) {
|
|
|
|
presContext->RefreshDriver()->SetPaintFlashing(aPaintFlashing);
|
|
|
|
// Clear paint flashing colors
|
|
|
|
nsIPresShell* presShell = GetPresShell();
|
|
|
|
if (!aPaintFlashing && presShell) {
|
|
|
|
nsIFrame* rootFrame = presShell->GetRootFrame();
|
|
|
|
if (rootFrame) {
|
|
|
|
rootFrame->InvalidateFrameSubtree();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::GetPaintFlashing(bool* aRetVal)
|
|
|
|
{
|
|
|
|
*aRetVal = false;
|
|
|
|
nsPresContext* presContext = GetPresContext();
|
|
|
|
if (presContext) {
|
|
|
|
*aRetVal = presContext->RefreshDriver()->GetPaintFlashing();
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2013-01-16 13:27:06 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
nsDOMWindowUtils::DispatchEventToChromeOnly(nsIDOMEventTarget* aTarget,
|
|
|
|
nsIDOMEvent* aEvent,
|
|
|
|
bool* aRetVal)
|
|
|
|
{
|
|
|
|
*aRetVal = false;
|
|
|
|
if (!nsContentUtils::IsCallerChrome()) {
|
|
|
|
return NS_ERROR_DOM_SECURITY_ERR;
|
|
|
|
}
|
|
|
|
NS_ENSURE_STATE(aTarget && aEvent);
|
|
|
|
aEvent->GetInternalNSEvent()->mFlags.mOnlyChromeDispatch = true;
|
|
|
|
aTarget->DispatchEvent(aEvent, aRetVal);
|
|
|
|
return NS_OK;
|
|
|
|
}
|