2015-05-03 22:32:37 +03:00
|
|
|
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
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/. */
|
2009-09-10 02:00:14 +04:00
|
|
|
|
2012-07-20 10:48:27 +04:00
|
|
|
#include "base/basictypes.h"
|
2009-07-01 00:39:22 +04:00
|
|
|
|
2012-08-02 10:02:29 +04:00
|
|
|
#include "TabParent.h"
|
|
|
|
|
2015-07-10 19:38:44 +03:00
|
|
|
#include "AudioChannelService.h"
|
2013-11-06 21:21:17 +04:00
|
|
|
#include "AppProcessChecker.h"
|
2012-08-09 06:58:06 +04:00
|
|
|
#include "mozIApplication.h"
|
2015-05-21 20:04:58 +03:00
|
|
|
#ifdef ACCESSIBILITY
|
|
|
|
#include "mozilla/a11y/DocAccessibleParent.h"
|
|
|
|
#include "nsAccessibilityService.h"
|
|
|
|
#endif
|
2012-07-20 10:48:27 +04:00
|
|
|
#include "mozilla/BrowserElementParent.h"
|
2015-10-23 00:10:14 +03:00
|
|
|
#include "mozilla/dom/ContentBridgeParent.h"
|
2010-08-21 03:24:41 +04:00
|
|
|
#include "mozilla/dom/ContentParent.h"
|
2015-04-08 21:48:11 +03:00
|
|
|
#include "mozilla/dom/DataTransfer.h"
|
2015-10-23 00:10:14 +03:00
|
|
|
#include "mozilla/dom/Event.h"
|
2014-09-27 03:21:57 +04:00
|
|
|
#include "mozilla/dom/indexedDB/ActorsParent.h"
|
2014-11-12 23:59:19 +03:00
|
|
|
#include "mozilla/plugins/PluginWidgetParent.h"
|
2014-04-01 08:09:23 +04:00
|
|
|
#include "mozilla/EventStateManager.h"
|
2015-04-08 21:48:11 +03:00
|
|
|
#include "mozilla/gfx/2D.h"
|
2016-05-09 01:33:00 +03:00
|
|
|
#include "mozilla/gfx/DataSurfaceHelpers.h"
|
2012-12-23 17:48:07 +04:00
|
|
|
#include "mozilla/Hal.h"
|
2015-06-27 03:23:31 +03:00
|
|
|
#include "mozilla/IMEStateManager.h"
|
2009-10-29 20:58:31 +03:00
|
|
|
#include "mozilla/ipc/DocumentRendererParent.h"
|
2015-01-27 00:32:18 +03:00
|
|
|
#include "mozilla/jsipc/CrossProcessObjectWrappers.h"
|
2015-09-29 00:00:25 +03:00
|
|
|
#include "mozilla/layers/AsyncDragMetrics.h"
|
2016-03-22 21:08:38 +03:00
|
|
|
#include "mozilla/layers/CompositorBridgeParent.h"
|
2014-12-16 10:31:12 +03:00
|
|
|
#include "mozilla/layers/InputAPZContext.h"
|
2010-08-21 03:24:41 +04:00
|
|
|
#include "mozilla/layout/RenderFrameParent.h"
|
2015-04-22 17:58:33 +03:00
|
|
|
#include "mozilla/LookAndFeel.h"
|
2013-09-25 15:21:18 +04:00
|
|
|
#include "mozilla/MouseEvents.h"
|
2014-06-11 09:44:36 +04:00
|
|
|
#include "mozilla/net/NeckoChild.h"
|
2012-07-20 10:48:27 +04:00
|
|
|
#include "mozilla/Preferences.h"
|
2013-09-25 15:21:19 +04:00
|
|
|
#include "mozilla/TextEvents.h"
|
2013-09-25 15:21:16 +04:00
|
|
|
#include "mozilla/TouchEvents.h"
|
2015-11-03 21:29:19 +03:00
|
|
|
#include "mozilla/UniquePtr.h"
|
2012-07-20 10:48:27 +04:00
|
|
|
#include "mozilla/unused.h"
|
2015-04-08 21:48:11 +03:00
|
|
|
#include "BlobParent.h"
|
2009-11-05 21:14:22 +03:00
|
|
|
#include "nsCOMPtr.h"
|
2015-04-08 21:48:11 +03:00
|
|
|
#include "nsContentAreaDragDrop.h"
|
2012-07-20 10:48:27 +04:00
|
|
|
#include "nsContentUtils.h"
|
|
|
|
#include "nsDebug.h"
|
|
|
|
#include "nsFocusManager.h"
|
2010-01-01 04:35:55 +03:00
|
|
|
#include "nsFrameLoader.h"
|
2015-01-13 03:41:53 +03:00
|
|
|
#include "nsIBaseWindow.h"
|
2012-07-20 10:48:27 +04:00
|
|
|
#include "nsIContent.h"
|
2013-03-28 09:12:03 +04:00
|
|
|
#include "nsIDocShell.h"
|
2013-09-24 01:30:40 +04:00
|
|
|
#include "nsIDocShellTreeOwner.h"
|
2012-07-20 10:48:27 +04:00
|
|
|
#include "nsIDOMElement.h"
|
|
|
|
#include "nsIDOMEvent.h"
|
|
|
|
#include "nsIDOMWindow.h"
|
2014-04-05 01:50:42 +04:00
|
|
|
#include "nsIDOMWindowUtils.h"
|
2013-09-24 01:30:40 +04:00
|
|
|
#include "nsIInterfaceRequestorUtils.h"
|
2014-07-10 10:56:36 +04:00
|
|
|
#include "nsILoadInfo.h"
|
2015-02-11 14:53:00 +03:00
|
|
|
#include "nsPrincipal.h"
|
2010-06-25 02:20:42 +04:00
|
|
|
#include "nsIPromptFactory.h"
|
2012-07-20 10:48:27 +04:00
|
|
|
#include "nsIURI.h"
|
2013-07-25 23:45:31 +04:00
|
|
|
#include "nsIWebBrowserChrome.h"
|
|
|
|
#include "nsIXULBrowserWindow.h"
|
|
|
|
#include "nsIXULWindow.h"
|
2014-12-09 18:48:27 +03:00
|
|
|
#include "nsIRemoteBrowser.h"
|
2013-01-05 07:12:24 +04:00
|
|
|
#include "nsViewManager.h"
|
2015-10-07 18:17:42 +03:00
|
|
|
#include "nsVariant.h"
|
2012-07-20 10:48:27 +04:00
|
|
|
#include "nsIWidget.h"
|
2015-08-17 05:25:59 +03:00
|
|
|
#ifndef XP_WIN
|
|
|
|
#include "nsJARProtocolHandler.h"
|
|
|
|
#endif
|
2012-07-20 10:48:27 +04:00
|
|
|
#include "nsPIDOMWindow.h"
|
2014-11-03 10:05:38 +03:00
|
|
|
#include "nsPresShell.h"
|
2012-04-25 20:35:58 +04:00
|
|
|
#include "nsPrintfCString.h"
|
2012-07-20 10:48:27 +04:00
|
|
|
#include "nsServiceManagerUtils.h"
|
|
|
|
#include "nsThreadUtils.h"
|
2013-02-16 02:27:21 +04:00
|
|
|
#include "private/pprio.h"
|
2013-11-06 21:21:15 +04:00
|
|
|
#include "PermissionMessageUtils.h"
|
2015-09-10 23:50:58 +03:00
|
|
|
#include "StructuredCloneData.h"
|
2014-02-24 00:19:43 +04:00
|
|
|
#include "ColorPickerParent.h"
|
2014-02-18 04:30:06 +04:00
|
|
|
#include "FilePickerParent.h"
|
2012-07-20 10:48:27 +04:00
|
|
|
#include "TabChild.h"
|
2014-01-11 05:10:57 +04:00
|
|
|
#include "LoadContext.h"
|
2013-09-24 01:30:40 +04:00
|
|
|
#include "nsNetCID.h"
|
2014-06-11 09:44:36 +04:00
|
|
|
#include "nsIAuthInformation.h"
|
|
|
|
#include "nsIAuthPromptCallback.h"
|
|
|
|
#include "nsAuthInformationHolder.h"
|
|
|
|
#include "nsICancelable.h"
|
2014-06-03 17:39:44 +04:00
|
|
|
#include "gfxPrefs.h"
|
2014-11-04 22:51:06 +03:00
|
|
|
#include "nsILoginManagerPrompter.h"
|
2015-03-31 23:39:02 +03:00
|
|
|
#include "nsPIWindowRoot.h"
|
2015-07-07 05:17:00 +03:00
|
|
|
#include "nsIAuthPrompt2.h"
|
2015-05-20 04:28:57 +03:00
|
|
|
#include "gfxDrawable.h"
|
|
|
|
#include "ImageOps.h"
|
2015-06-08 08:39:28 +03:00
|
|
|
#include "UnitTransforms.h"
|
2013-01-15 16:22:03 +04:00
|
|
|
#include <algorithm>
|
2015-08-06 00:25:39 +03:00
|
|
|
#include "mozilla/WebBrowserPersistDocumentParent.h"
|
2010-07-19 22:33:33 +04:00
|
|
|
|
2010-08-21 03:24:41 +04:00
|
|
|
using namespace mozilla::dom;
|
|
|
|
using namespace mozilla::ipc;
|
2012-07-20 10:48:27 +04:00
|
|
|
using namespace mozilla::layers;
|
2010-08-21 03:24:41 +04:00
|
|
|
using namespace mozilla::layout;
|
2012-08-09 06:58:06 +04:00
|
|
|
using namespace mozilla::services;
|
2011-11-27 15:51:52 +04:00
|
|
|
using namespace mozilla::widget;
|
2013-07-11 02:05:39 +04:00
|
|
|
using namespace mozilla::jsipc;
|
2009-07-01 00:39:22 +04:00
|
|
|
|
2010-03-26 21:39:39 +03:00
|
|
|
// The flags passed by the webProgress notifications are 16 bits shifted
|
|
|
|
// from the ones registered by webProgressListeners.
|
|
|
|
#define NOTIFY_FLAG_SHIFT 16
|
|
|
|
|
2016-04-26 03:23:21 +03:00
|
|
|
class OpenFileAndSendFDRunnable : public mozilla::Runnable
|
2013-02-16 02:27:21 +04:00
|
|
|
{
|
|
|
|
const nsString mPath;
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<TabParent> mTabParent;
|
2013-02-16 02:27:21 +04:00
|
|
|
nsCOMPtr<nsIEventTarget> mEventTarget;
|
|
|
|
PRFileDesc* mFD;
|
|
|
|
|
|
|
|
public:
|
|
|
|
OpenFileAndSendFDRunnable(const nsAString& aPath, TabParent* aTabParent)
|
|
|
|
: mPath(aPath), mTabParent(aTabParent), mFD(nullptr)
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
|
|
MOZ_ASSERT(!aPath.IsEmpty());
|
|
|
|
MOZ_ASSERT(aTabParent);
|
|
|
|
}
|
|
|
|
|
|
|
|
void Dispatch()
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
|
|
|
|
|
|
mEventTarget = do_GetService(NS_STREAMTRANSPORTSERVICE_CONTRACTID);
|
|
|
|
NS_ENSURE_TRUE_VOID(mEventTarget);
|
|
|
|
|
|
|
|
nsresult rv = mEventTarget->Dispatch(this, NS_DISPATCH_NORMAL);
|
|
|
|
NS_ENSURE_SUCCESS_VOID(rv);
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
~OpenFileAndSendFDRunnable()
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(!mFD);
|
|
|
|
}
|
|
|
|
|
|
|
|
// This shouldn't be called directly except by the event loop. Use Dispatch
|
|
|
|
// to start the sequence.
|
|
|
|
NS_IMETHOD Run()
|
|
|
|
{
|
|
|
|
if (NS_IsMainThread()) {
|
|
|
|
SendResponse();
|
|
|
|
} else if (mFD) {
|
|
|
|
CloseFile();
|
|
|
|
} else {
|
|
|
|
OpenFile();
|
|
|
|
}
|
|
|
|
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
void SendResponse()
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
|
|
MOZ_ASSERT(mTabParent);
|
|
|
|
MOZ_ASSERT(mEventTarget);
|
|
|
|
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<TabParent> tabParent;
|
2013-02-16 02:27:21 +04:00
|
|
|
mTabParent.swap(tabParent);
|
|
|
|
|
2013-11-26 20:39:19 +04:00
|
|
|
using mozilla::ipc::FileDescriptor;
|
|
|
|
|
2015-01-10 00:10:14 +03:00
|
|
|
FileDescriptor fd;
|
|
|
|
if (mFD) {
|
|
|
|
FileDescriptor::PlatformHandleType handle =
|
|
|
|
FileDescriptor::PlatformHandleType(PR_FileDesc2NativeHandle(mFD));
|
|
|
|
fd = FileDescriptor(handle);
|
|
|
|
}
|
2013-02-16 02:27:21 +04:00
|
|
|
|
2014-08-27 23:15:30 +04:00
|
|
|
// Our TabParent may have been destroyed already. If so, don't send any
|
|
|
|
// fds over, just go back to the IO thread and close them.
|
|
|
|
if (!tabParent->IsDestroyed()) {
|
2015-12-11 19:17:33 +03:00
|
|
|
Unused << tabParent->SendCacheFileDescriptor(mPath, fd);
|
2015-01-10 00:10:14 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
if (!mFD) {
|
|
|
|
return;
|
2014-08-27 23:15:30 +04:00
|
|
|
}
|
2013-02-16 02:27:21 +04:00
|
|
|
|
|
|
|
nsCOMPtr<nsIEventTarget> eventTarget;
|
|
|
|
mEventTarget.swap(eventTarget);
|
|
|
|
|
|
|
|
if (NS_FAILED(eventTarget->Dispatch(this, NS_DISPATCH_NORMAL))) {
|
|
|
|
NS_WARNING("Failed to dispatch to stream transport service!");
|
|
|
|
|
|
|
|
// It's probably safer to take the main thread IO hit here rather
|
|
|
|
// than leak a file descriptor.
|
|
|
|
CloseFile();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-01-10 00:10:14 +03:00
|
|
|
// Helper method to avoid gnarly control flow for failures.
|
2015-05-12 15:11:03 +03:00
|
|
|
void OpenBlobImpl()
|
2013-02-16 02:27:21 +04:00
|
|
|
{
|
|
|
|
MOZ_ASSERT(!NS_IsMainThread());
|
|
|
|
MOZ_ASSERT(!mFD);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIFile> file;
|
|
|
|
nsresult rv = NS_NewLocalFile(mPath, false, getter_AddRefs(file));
|
|
|
|
NS_ENSURE_SUCCESS_VOID(rv);
|
|
|
|
|
|
|
|
PRFileDesc* fd;
|
|
|
|
rv = file->OpenNSPRFileDesc(PR_RDONLY, 0, &fd);
|
|
|
|
NS_ENSURE_SUCCESS_VOID(rv);
|
|
|
|
|
|
|
|
mFD = fd;
|
2015-01-10 00:10:14 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void OpenFile()
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(!NS_IsMainThread());
|
|
|
|
|
2015-05-12 15:11:03 +03:00
|
|
|
OpenBlobImpl();
|
2013-02-16 02:27:21 +04:00
|
|
|
|
2014-05-23 23:53:17 +04:00
|
|
|
if (NS_FAILED(NS_DispatchToMainThread(this))) {
|
2013-02-16 02:27:21 +04:00
|
|
|
NS_WARNING("Failed to dispatch to main thread!");
|
|
|
|
|
2015-01-10 00:10:14 +03:00
|
|
|
// Intentionally leak the runnable (but not the fd) rather
|
|
|
|
// than crash when trying to release a main thread object
|
|
|
|
// off the main thread.
|
2015-12-11 19:17:33 +03:00
|
|
|
Unused << mTabParent.forget();
|
2013-02-16 02:27:21 +04:00
|
|
|
CloseFile();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void CloseFile()
|
|
|
|
{
|
|
|
|
// It's possible for this to happen on the main thread if the dispatch
|
|
|
|
// to the stream service fails after we've already opened the file so
|
|
|
|
// we can't assert the thread we're running on.
|
|
|
|
|
|
|
|
MOZ_ASSERT(mFD);
|
|
|
|
|
2013-12-05 02:46:20 +04:00
|
|
|
PRStatus prrc;
|
|
|
|
prrc = PR_Close(mFD);
|
|
|
|
if (prrc != PR_SUCCESS) {
|
|
|
|
NS_ERROR("PR_Close() failed.");
|
|
|
|
}
|
2013-02-16 02:27:21 +04:00
|
|
|
mFD = nullptr;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2009-07-01 00:39:22 +04:00
|
|
|
namespace mozilla {
|
2009-08-12 20:18:08 +04:00
|
|
|
namespace dom {
|
2009-07-01 00:39:22 +04:00
|
|
|
|
2014-12-19 02:23:39 +03:00
|
|
|
TabParent::LayerToTabParentTable* TabParent::sLayerToTabParentTable = nullptr;
|
2010-09-24 07:28:15 +04:00
|
|
|
|
2014-06-06 06:49:43 +04:00
|
|
|
NS_IMPL_ISUPPORTS(TabParent,
|
|
|
|
nsITabParent,
|
|
|
|
nsIAuthPromptProvider,
|
|
|
|
nsISecureBrowserUI,
|
2015-08-06 00:25:39 +03:00
|
|
|
nsISupportsWeakReference,
|
|
|
|
nsIWebBrowserPersistable)
|
2010-03-26 21:39:39 +03:00
|
|
|
|
2014-10-29 21:11:00 +03:00
|
|
|
TabParent::TabParent(nsIContentParent* aManager,
|
|
|
|
const TabId& aTabId,
|
|
|
|
const TabContext& aContext,
|
|
|
|
uint32_t aChromeFlags)
|
Bug 802366 - The main event: Let a browser process inherit its app's id. r=bz,cjones
The main bug fixed here is that in half of our interfaces, we use "is browser frame/element" to mean "browser or app", and in the other half, we use it to mean "is browser not app".
There's a related, functional bug also fixed here, which is that a browser process doesn't inherit its parent's app-id. This causes problems e.g. for IndexedDB: If a browser inside an app uses IndexedDB, the DB should have the app's app-id.
I also modified Tab{Parent,Child} and nsFrameLoader to call "app" "ownOrContainingApp", to emphasize that we might have inherited the app from a parent process. I left nsIDocShell::appId alone, because changing that would have necessitated changing nsILoadGroup and therefore a /lot/ of users in Necko; it's also not clear it would have clarified anything in those cases.
2012-11-10 22:32:37 +04:00
|
|
|
: TabContext(aContext)
|
2013-10-28 18:04:12 +04:00
|
|
|
, mFrameElement(nullptr)
|
2013-01-29 11:49:38 +04:00
|
|
|
, mRect(0, 0, 0, 0)
|
2012-09-29 06:16:36 +04:00
|
|
|
, mDimensions(0, 0)
|
2013-01-29 11:49:38 +04:00
|
|
|
, mOrientation(0)
|
2010-12-09 21:57:05 +03:00
|
|
|
, mDPI(0)
|
2013-05-02 03:06:19 +04:00
|
|
|
, mDefaultScale(0)
|
2013-01-29 11:49:38 +04:00
|
|
|
, mUpdatedDimensions(false)
|
2016-02-23 19:10:00 +03:00
|
|
|
, mSizeMode(nsSizeMode_Normal)
|
2013-07-10 21:07:51 +04:00
|
|
|
, mManager(aManager)
|
2015-09-04 16:42:01 +03:00
|
|
|
, mDocShellIsActive(false)
|
2013-01-10 17:22:14 +04:00
|
|
|
, mMarkedDestroying(false)
|
2012-11-10 10:09:24 +04:00
|
|
|
, mIsDestroyed(false)
|
2015-08-31 13:21:40 +03:00
|
|
|
, mIsDetached(true)
|
2013-02-16 02:27:21 +04:00
|
|
|
, mAppPackageFileDescriptorSent(false)
|
2014-08-23 03:17:18 +04:00
|
|
|
, mSendOfflineStatus(true)
|
2014-01-11 05:10:57 +04:00
|
|
|
, mChromeFlags(aChromeFlags)
|
2015-04-08 21:48:11 +03:00
|
|
|
, mDragAreaX(0)
|
|
|
|
, mDragAreaY(0)
|
2014-11-16 21:23:22 +03:00
|
|
|
, mInitedByParent(false)
|
2014-10-29 21:11:00 +03:00
|
|
|
, mTabId(aTabId)
|
2015-01-23 07:00:18 +03:00
|
|
|
, mCreatingWindow(false)
|
2015-03-11 01:21:02 +03:00
|
|
|
, mNeedLayerTreeReadyNotification(false)
|
2015-04-15 02:29:10 +03:00
|
|
|
, mCursor(nsCursor(-1))
|
|
|
|
, mTabSetsCursor(false)
|
2015-05-13 23:44:39 +03:00
|
|
|
, mHasContentOpener(false)
|
2016-02-26 18:52:06 +03:00
|
|
|
#ifdef DEBUG
|
2015-08-20 00:08:41 +03:00
|
|
|
, mActiveSupressDisplayportCount(0)
|
2016-02-26 18:52:06 +03:00
|
|
|
#endif
|
2009-07-01 00:39:22 +04:00
|
|
|
{
|
2014-06-11 09:44:03 +04:00
|
|
|
MOZ_ASSERT(aManager);
|
2009-07-01 00:39:22 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
TabParent::~TabParent()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
2014-12-19 02:23:39 +03:00
|
|
|
TabParent*
|
|
|
|
TabParent::GetTabParentFromLayersId(uint64_t aLayersId)
|
|
|
|
{
|
|
|
|
if (!sLayerToTabParentTable) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
return sLayerToTabParentTable->Get(aLayersId);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
TabParent::AddTabParentToTable(uint64_t aLayersId, TabParent* aTabParent)
|
|
|
|
{
|
|
|
|
if (!sLayerToTabParentTable) {
|
|
|
|
sLayerToTabParentTable = new LayerToTabParentTable();
|
|
|
|
}
|
|
|
|
sLayerToTabParentTable->Put(aLayersId, aTabParent);
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
TabParent::RemoveTabParentFromTable(uint64_t aLayersId)
|
|
|
|
{
|
|
|
|
if (!sLayerToTabParentTable) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
sLayerToTabParentTable->Remove(aLayersId);
|
|
|
|
if (sLayerToTabParentTable->Count() == 0) {
|
|
|
|
delete sLayerToTabParentTable;
|
|
|
|
sLayerToTabParentTable = nullptr;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-02-27 08:35:26 +03:00
|
|
|
void
|
|
|
|
TabParent::CacheFrameLoader(nsFrameLoader* aFrameLoader)
|
|
|
|
{
|
|
|
|
mFrameLoader = aFrameLoader;
|
|
|
|
}
|
|
|
|
|
2010-12-09 21:57:05 +03:00
|
|
|
void
|
2013-07-24 03:39:17 +04:00
|
|
|
TabParent::SetOwnerElement(Element* aElement)
|
2010-12-09 21:57:05 +03:00
|
|
|
{
|
2015-03-31 23:39:02 +03:00
|
|
|
// If we held previous content then unregister for its events.
|
|
|
|
RemoveWindowListeners();
|
|
|
|
|
2015-06-08 08:39:39 +03:00
|
|
|
// If we change top-level documents then we need to change our
|
|
|
|
// registration with them.
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsPIWindowRoot> curTopLevelWin, newTopLevelWin;
|
2015-06-08 08:39:39 +03:00
|
|
|
if (mFrameElement) {
|
|
|
|
curTopLevelWin = nsContentUtils::GetWindowRoot(mFrameElement->OwnerDoc());
|
|
|
|
}
|
|
|
|
if (aElement) {
|
|
|
|
newTopLevelWin = nsContentUtils::GetWindowRoot(aElement->OwnerDoc());
|
|
|
|
}
|
|
|
|
bool isSameTopLevelWin = curTopLevelWin == newTopLevelWin;
|
|
|
|
if (curTopLevelWin && !isSameTopLevelWin) {
|
|
|
|
curTopLevelWin->RemoveBrowser(this);
|
|
|
|
}
|
|
|
|
|
2015-03-31 23:39:02 +03:00
|
|
|
// Update to the new content, and register to listen for events from it.
|
2010-12-09 21:57:05 +03:00
|
|
|
mFrameElement = aElement;
|
2015-03-31 23:39:02 +03:00
|
|
|
|
2015-06-08 08:39:39 +03:00
|
|
|
if (newTopLevelWin && !isSameTopLevelWin) {
|
|
|
|
newTopLevelWin->AddBrowser(this);
|
|
|
|
}
|
|
|
|
|
2016-03-23 21:39:28 +03:00
|
|
|
if (mFrameElement) {
|
|
|
|
bool useGlobalHistory =
|
|
|
|
!mFrameElement->HasAttr(kNameSpaceID_None, nsGkAtoms::disableglobalhistory);
|
|
|
|
Unused << SendSetUseGlobalHistory(useGlobalHistory);
|
|
|
|
}
|
|
|
|
|
2015-04-21 17:33:56 +03:00
|
|
|
AddWindowListeners();
|
2013-05-02 03:06:19 +04:00
|
|
|
TryCacheDPIAndScale();
|
2010-12-09 21:57:05 +03:00
|
|
|
}
|
|
|
|
|
2015-04-21 17:33:56 +03:00
|
|
|
void
|
|
|
|
TabParent::AddWindowListeners()
|
|
|
|
{
|
|
|
|
if (mFrameElement && mFrameElement->OwnerDoc()) {
|
2016-01-30 20:05:36 +03:00
|
|
|
if (nsCOMPtr<nsPIDOMWindowOuter> window = mFrameElement->OwnerDoc()->GetWindow()) {
|
2015-04-21 17:33:56 +03:00
|
|
|
nsCOMPtr<EventTarget> eventTarget = window->GetTopWindowRoot();
|
|
|
|
if (eventTarget) {
|
|
|
|
eventTarget->AddEventListener(NS_LITERAL_STRING("MozUpdateWindowPos"),
|
|
|
|
this, false, false);
|
|
|
|
}
|
|
|
|
}
|
2015-04-21 17:33:56 +03:00
|
|
|
if (nsIPresShell* shell = mFrameElement->OwnerDoc()->GetShell()) {
|
|
|
|
mPresShellWithRefreshListener = shell;
|
|
|
|
shell->AddPostRefreshObserver(this);
|
|
|
|
}
|
2015-12-11 19:17:33 +03:00
|
|
|
|
|
|
|
RefPtr<AudioChannelService> acs = AudioChannelService::GetOrCreate();
|
|
|
|
if (acs) {
|
|
|
|
acs->RegisterTabParent(this);
|
|
|
|
}
|
2015-04-21 17:33:56 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-31 23:39:02 +03:00
|
|
|
void
|
|
|
|
TabParent::RemoveWindowListeners()
|
|
|
|
{
|
|
|
|
if (mFrameElement && mFrameElement->OwnerDoc()->GetWindow()) {
|
2016-01-30 20:05:36 +03:00
|
|
|
nsCOMPtr<nsPIDOMWindowOuter> window = mFrameElement->OwnerDoc()->GetWindow();
|
2015-03-31 23:39:02 +03:00
|
|
|
nsCOMPtr<EventTarget> eventTarget = window->GetTopWindowRoot();
|
|
|
|
if (eventTarget) {
|
|
|
|
eventTarget->RemoveEventListener(NS_LITERAL_STRING("MozUpdateWindowPos"),
|
|
|
|
this, false);
|
|
|
|
}
|
|
|
|
}
|
2015-04-21 17:33:56 +03:00
|
|
|
if (mPresShellWithRefreshListener) {
|
|
|
|
mPresShellWithRefreshListener->RemovePostRefreshObserver(this);
|
|
|
|
mPresShellWithRefreshListener = nullptr;
|
|
|
|
}
|
2015-12-11 19:17:33 +03:00
|
|
|
|
|
|
|
RefPtr<AudioChannelService> acs = AudioChannelService::GetOrCreate();
|
|
|
|
if (acs) {
|
|
|
|
acs->UnregisterTabParent(this);
|
|
|
|
}
|
2015-04-21 17:33:56 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
TabParent::DidRefresh()
|
|
|
|
{
|
|
|
|
if (mChromeOffset != -GetChildProcessOffset()) {
|
|
|
|
UpdatePosition();
|
|
|
|
}
|
2015-03-31 23:39:02 +03:00
|
|
|
}
|
|
|
|
|
2013-04-26 04:53:26 +04:00
|
|
|
void
|
|
|
|
TabParent::GetAppType(nsAString& aOut)
|
|
|
|
{
|
|
|
|
aOut.Truncate();
|
|
|
|
nsCOMPtr<Element> elem = do_QueryInterface(mFrameElement);
|
|
|
|
if (!elem) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
elem->GetAttr(kNameSpaceID_None, nsGkAtoms::mozapptype, aOut);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2016-01-05 12:59:30 +03:00
|
|
|
TabParent::IsVisible() const
|
2013-04-26 04:53:26 +04:00
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsFrameLoader> frameLoader = GetFrameLoader();
|
2013-04-26 04:53:26 +04:00
|
|
|
if (!frameLoader) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool visible = false;
|
|
|
|
frameLoader->GetVisible(&visible);
|
|
|
|
return visible;
|
|
|
|
}
|
|
|
|
|
2011-01-06 07:54:47 +03:00
|
|
|
void
|
2015-08-28 10:18:00 +03:00
|
|
|
TabParent::DestroyInternal()
|
2011-01-06 07:54:47 +03:00
|
|
|
{
|
2015-08-18 20:27:07 +03:00
|
|
|
IMEStateManager::OnTabParentDestroying(this);
|
|
|
|
|
2015-04-21 17:33:56 +03:00
|
|
|
RemoveWindowListeners();
|
|
|
|
|
2011-01-06 07:54:47 +03:00
|
|
|
// If this fails, it's most likely due to a content-process crash,
|
|
|
|
// and auto-cleanup will kick in. Otherwise, the child side will
|
|
|
|
// destroy itself and send back __delete__().
|
2015-11-02 08:53:26 +03:00
|
|
|
Unused << SendDestroy();
|
2011-01-06 07:54:47 +03:00
|
|
|
|
2012-07-20 10:48:27 +04:00
|
|
|
if (RenderFrameParent* frame = GetRenderFrame()) {
|
2014-12-19 02:23:39 +03:00
|
|
|
RemoveTabParentFromTable(frame->GetLayersId());
|
2012-07-20 10:48:27 +04:00
|
|
|
frame->Destroy();
|
2011-01-06 07:54:47 +03:00
|
|
|
}
|
2015-01-29 22:41:56 +03:00
|
|
|
|
|
|
|
// Let all PluginWidgets know we are tearing down. Prevents
|
|
|
|
// these objects from sending async events after the child side
|
|
|
|
// is shut down.
|
2015-10-07 21:30:33 +03:00
|
|
|
const ManagedContainer<PPluginWidgetParent>& kids =
|
|
|
|
ManagedPPluginWidgetParent();
|
|
|
|
for (auto iter = kids.ConstIter(); !iter.Done(); iter.Next()) {
|
|
|
|
static_cast<mozilla::plugins::PluginWidgetParent*>(
|
|
|
|
iter.Get()->GetKey())->ParentDestroy();
|
2015-01-29 22:41:56 +03:00
|
|
|
}
|
2015-08-28 10:18:00 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
TabParent::Destroy()
|
|
|
|
{
|
2016-04-05 00:08:17 +03:00
|
|
|
// Aggressively release the window to avoid leaking the world in shutdown
|
|
|
|
// corner cases.
|
|
|
|
mBrowserDOMWindow = nullptr;
|
|
|
|
|
2015-08-28 10:18:00 +03:00
|
|
|
if (mIsDestroyed) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
DestroyInternal();
|
|
|
|
|
|
|
|
mIsDestroyed = true;
|
|
|
|
|
|
|
|
if (XRE_IsParentProcess()) {
|
|
|
|
ContentParent::NotifyTabDestroying(this->GetTabId(), Manager()->AsContentParent()->ChildID());
|
|
|
|
} else {
|
|
|
|
ContentParent::NotifyTabDestroying(this->GetTabId(), Manager()->ChildID());
|
|
|
|
}
|
2015-01-29 22:41:56 +03:00
|
|
|
|
2013-01-10 17:22:14 +04:00
|
|
|
mMarkedDestroying = true;
|
2011-01-06 07:54:47 +03:00
|
|
|
}
|
|
|
|
|
2015-08-31 13:21:40 +03:00
|
|
|
void
|
|
|
|
TabParent::Detach()
|
|
|
|
{
|
|
|
|
if (mIsDetached) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
RemoveWindowListeners();
|
|
|
|
if (RenderFrameParent* frame = GetRenderFrame()) {
|
|
|
|
RemoveTabParentFromTable(frame->GetLayersId());
|
|
|
|
}
|
|
|
|
mIsDetached = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
TabParent::Attach(nsFrameLoader* aFrameLoader)
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(mIsDetached);
|
|
|
|
if (!mIsDetached) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
Element* ownerElement = aFrameLoader->GetOwnerContent();
|
|
|
|
SetOwnerElement(ownerElement);
|
|
|
|
if (RenderFrameParent* frame = GetRenderFrame()) {
|
|
|
|
AddTabParentToTable(frame->GetLayersId(), this);
|
|
|
|
frame->OwnerContentChanged(ownerElement);
|
|
|
|
}
|
|
|
|
mIsDetached = false;
|
|
|
|
}
|
|
|
|
|
2012-07-17 22:27:27 +04:00
|
|
|
bool
|
|
|
|
TabParent::Recv__delete__()
|
|
|
|
{
|
2015-07-04 04:29:00 +03:00
|
|
|
if (XRE_IsParentProcess()) {
|
2014-10-29 21:11:00 +03:00
|
|
|
ContentParent::DeallocateTabId(mTabId,
|
2015-08-28 10:18:00 +03:00
|
|
|
Manager()->AsContentParent()->ChildID(),
|
|
|
|
mMarkedDestroying);
|
2014-06-11 09:44:03 +04:00
|
|
|
}
|
2014-10-29 21:11:00 +03:00
|
|
|
else {
|
2015-08-28 10:18:00 +03:00
|
|
|
Manager()->AsContentBridgeParent()->NotifyTabDestroyed();
|
|
|
|
ContentParent::DeallocateTabId(mTabId,
|
|
|
|
Manager()->ChildID(),
|
|
|
|
mMarkedDestroying);
|
2014-10-29 21:11:00 +03:00
|
|
|
}
|
|
|
|
|
2012-07-17 22:27:27 +04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2010-04-12 04:34:02 +04:00
|
|
|
void
|
|
|
|
TabParent::ActorDestroy(ActorDestroyReason why)
|
|
|
|
{
|
2015-08-18 20:27:07 +03:00
|
|
|
// Even though TabParent::Destroy calls this, we need to do it here too in
|
|
|
|
// case of a crash.
|
2015-07-01 16:19:11 +03:00
|
|
|
IMEStateManager::OnTabParentDestroying(this);
|
|
|
|
|
2015-08-28 10:18:00 +03:00
|
|
|
// Prevent executing ContentParent::NotifyTabDestroying in
|
|
|
|
// TabParent::Destroy() called by frameLoader->DestroyComplete() below
|
|
|
|
// when tab crashes in contentprocess because ContentParent::ActorDestroy()
|
|
|
|
// in main process will be triggered before this function
|
|
|
|
// and remove the process information that
|
|
|
|
// ContentParent::NotifyTabDestroying need from mContentParentMap.
|
|
|
|
|
|
|
|
// When tab crashes in content process,
|
|
|
|
// there is no need to call ContentParent::NotifyTabDestroying
|
|
|
|
// because the jobs in ContentParent::NotifyTabDestroying
|
|
|
|
// will be done by ContentParent::ActorDestroy.
|
|
|
|
if (XRE_IsContentProcess() && why == AbnormalShutdown && !mIsDestroyed) {
|
|
|
|
DestroyInternal();
|
|
|
|
mIsDestroyed = true;
|
|
|
|
}
|
|
|
|
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsFrameLoader> frameLoader = GetFrameLoader(true);
|
2014-09-19 04:07:56 +04:00
|
|
|
nsCOMPtr<nsIObserverService> os = services::GetObserverService();
|
2010-08-06 02:11:23 +04:00
|
|
|
if (frameLoader) {
|
2013-09-04 02:11:22 +04:00
|
|
|
nsCOMPtr<Element> frameElement(mFrameElement);
|
2013-11-06 21:21:15 +04:00
|
|
|
ReceiveMessage(CHILD_PROCESS_SHUTDOWN_MESSAGE, false, nullptr, nullptr,
|
|
|
|
nullptr);
|
2015-02-27 08:35:26 +03:00
|
|
|
frameLoader->DestroyComplete();
|
2012-08-02 18:26:57 +04:00
|
|
|
|
2014-09-19 04:07:56 +04:00
|
|
|
if (why == AbnormalShutdown && os) {
|
2013-04-26 04:53:26 +04:00
|
|
|
os->NotifyObservers(NS_ISUPPORTS_CAST(nsIFrameLoader*, frameLoader),
|
|
|
|
"oop-frameloader-crashed", nullptr);
|
2013-09-04 02:11:22 +04:00
|
|
|
nsContentUtils::DispatchTrustedEvent(frameElement->OwnerDoc(), frameElement,
|
|
|
|
NS_LITERAL_STRING("oop-browser-crashed"),
|
|
|
|
true, true);
|
2012-08-02 18:26:57 +04:00
|
|
|
}
|
2015-02-27 08:35:26 +03:00
|
|
|
|
|
|
|
mFrameLoader = nullptr;
|
2010-04-12 04:34:02 +04:00
|
|
|
}
|
2013-04-26 04:53:26 +04:00
|
|
|
|
2014-09-19 04:07:56 +04:00
|
|
|
if (os) {
|
|
|
|
os->NotifyObservers(NS_ISUPPORTS_CAST(nsITabParent*, this), "ipc:browser-destroyed", nullptr);
|
|
|
|
}
|
2010-04-12 04:34:02 +04:00
|
|
|
}
|
|
|
|
|
2009-11-05 21:14:22 +03:00
|
|
|
bool
|
2015-07-13 13:07:49 +03:00
|
|
|
TabParent::RecvMoveFocus(const bool& aForward, const bool& aForDocumentNavigation)
|
2009-11-05 21:14:22 +03:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIFocusManager> fm = do_GetService(FOCUSMANAGER_CONTRACTID);
|
|
|
|
if (fm) {
|
|
|
|
nsCOMPtr<nsIDOMElement> dummy;
|
2015-07-13 13:07:49 +03:00
|
|
|
|
|
|
|
uint32_t type = aForward ?
|
|
|
|
(aForDocumentNavigation ? static_cast<uint32_t>(nsIFocusManager::MOVEFOCUS_FORWARDDOC) :
|
|
|
|
static_cast<uint32_t>(nsIFocusManager::MOVEFOCUS_FORWARD)) :
|
|
|
|
(aForDocumentNavigation ? static_cast<uint32_t>(nsIFocusManager::MOVEFOCUS_BACKWARDDOC) :
|
|
|
|
static_cast<uint32_t>(nsIFocusManager::MOVEFOCUS_BACKWARD));
|
2013-07-24 03:39:17 +04:00
|
|
|
nsCOMPtr<nsIDOMElement> frame = do_QueryInterface(mFrameElement);
|
|
|
|
fm->MoveFocus(nullptr, frame, type, nsIFocusManager::FLAG_BYKEY,
|
2009-11-05 21:14:22 +03:00
|
|
|
getter_AddRefs(dummy));
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2016-05-11 12:44:57 +03:00
|
|
|
bool
|
|
|
|
TabParent::RecvSizeShellTo(const uint32_t& aFlags, const int32_t& aWidth, const int32_t& aHeight,
|
|
|
|
const int32_t& aShellItemWidth, const int32_t& aShellItemHeight)
|
|
|
|
{
|
|
|
|
NS_ENSURE_TRUE(mFrameElement, true);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocShell> docShell = mFrameElement->OwnerDoc()->GetDocShell();
|
|
|
|
NS_ENSURE_TRUE(docShell, true);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
|
|
|
|
nsresult rv = docShell->GetTreeOwner(getter_AddRefs(treeOwner));
|
|
|
|
NS_ENSURE_SUCCESS(rv, true);
|
|
|
|
|
|
|
|
int32_t width = aWidth;
|
|
|
|
int32_t height = aHeight;
|
|
|
|
|
|
|
|
if (aFlags & nsIEmbeddingSiteWindow::DIM_FLAGS_IGNORE_CX) {
|
|
|
|
width = mDimensions.width;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (aFlags & nsIEmbeddingSiteWindow::DIM_FLAGS_IGNORE_CY) {
|
|
|
|
height = mDimensions.height;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIXULWindow> xulWin(do_GetInterface(treeOwner));
|
|
|
|
NS_ENSURE_TRUE(xulWin, true);
|
|
|
|
xulWin->SizeShellToWithLimit(width, height, aShellItemWidth, aShellItemHeight);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2009-11-17 17:22:23 +03:00
|
|
|
bool
|
2010-07-19 22:33:33 +04:00
|
|
|
TabParent::RecvEvent(const RemoteDOMEvent& aEvent)
|
2009-11-17 17:22:23 +03:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIDOMEvent> event = do_QueryInterface(aEvent.mEvent);
|
|
|
|
NS_ENSURE_TRUE(event, true);
|
|
|
|
|
2013-03-09 15:34:29 +04:00
|
|
|
nsCOMPtr<mozilla::dom::EventTarget> target = do_QueryInterface(mFrameElement);
|
2009-11-17 17:22:23 +03:00
|
|
|
NS_ENSURE_TRUE(target, true);
|
|
|
|
|
2013-03-09 15:34:29 +04:00
|
|
|
event->SetOwner(target);
|
|
|
|
|
2011-09-29 10:19:26 +04:00
|
|
|
bool dummy;
|
2009-11-17 17:22:23 +03:00
|
|
|
target->DispatchEvent(event, &dummy);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-01-16 21:07:50 +03:00
|
|
|
TabParent* TabParent::sNextTabParent;
|
|
|
|
|
|
|
|
/* static */ TabParent*
|
|
|
|
TabParent::GetNextTabParent()
|
|
|
|
{
|
|
|
|
TabParent* result = sNextTabParent;
|
|
|
|
sNextTabParent = nullptr;
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::SendLoadRemoteScript(const nsString& aURL,
|
|
|
|
const bool& aRunInGlobalScope)
|
|
|
|
{
|
2015-01-23 07:00:18 +03:00
|
|
|
if (mCreatingWindow) {
|
2015-01-16 21:07:50 +03:00
|
|
|
mDelayedFrameScripts.AppendElement(FrameScriptInfo(aURL, aRunInGlobalScope));
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
MOZ_ASSERT(mDelayedFrameScripts.IsEmpty());
|
|
|
|
return PBrowserParent::SendLoadRemoteScript(aURL, aRunInGlobalScope);
|
|
|
|
}
|
|
|
|
|
2015-02-11 14:53:00 +03:00
|
|
|
bool
|
2015-04-24 02:41:00 +03:00
|
|
|
TabParent::InitBrowserConfiguration(const nsCString& aURI,
|
2015-02-11 14:53:00 +03:00
|
|
|
BrowserConfiguration& aConfiguration)
|
|
|
|
{
|
2015-04-24 02:41:00 +03:00
|
|
|
return ContentParent::GetBrowserConfiguration(aURI, aConfiguration);
|
2015-02-11 14:53:00 +03:00
|
|
|
}
|
|
|
|
|
2009-07-01 00:39:22 +04:00
|
|
|
void
|
|
|
|
TabParent::LoadURL(nsIURI* aURI)
|
|
|
|
{
|
2013-02-16 02:27:21 +04:00
|
|
|
MOZ_ASSERT(aURI);
|
|
|
|
|
2012-11-10 10:09:24 +04:00
|
|
|
if (mIsDestroyed) {
|
2013-02-16 02:27:21 +04:00
|
|
|
return;
|
2012-04-25 20:35:58 +04:00
|
|
|
}
|
|
|
|
|
2009-07-01 00:39:22 +04:00
|
|
|
nsCString spec;
|
|
|
|
aURI->GetSpec(spec);
|
|
|
|
|
2015-01-23 07:00:18 +03:00
|
|
|
if (mCreatingWindow) {
|
|
|
|
// Don't send the message if the child wants to load its own URL.
|
|
|
|
MOZ_ASSERT(mDelayedURL.IsEmpty());
|
|
|
|
mDelayedURL = spec;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2014-08-23 03:17:18 +04:00
|
|
|
uint32_t appId = OwnOrContainingAppId();
|
|
|
|
if (mSendOfflineStatus && NS_IsAppOffline(appId)) {
|
|
|
|
// If the app is offline in the parent process
|
|
|
|
// pass that state to the child process as well
|
2015-11-02 08:53:26 +03:00
|
|
|
Unused << SendAppOfflineStatus(appId, true);
|
2014-08-23 03:17:18 +04:00
|
|
|
}
|
|
|
|
mSendOfflineStatus = false;
|
|
|
|
|
2015-02-11 14:53:00 +03:00
|
|
|
// This object contains the configuration for this new app.
|
|
|
|
BrowserConfiguration configuration;
|
2015-04-24 02:41:00 +03:00
|
|
|
if (NS_WARN_IF(!InitBrowserConfiguration(spec, configuration))) {
|
2015-02-11 14:53:00 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2015-11-02 08:53:26 +03:00
|
|
|
Unused << SendLoadURL(spec, configuration, GetShowInfo());
|
2013-02-16 02:27:21 +04:00
|
|
|
|
|
|
|
// If this app is a packaged app then we can speed startup by sending over
|
|
|
|
// the file descriptor for the "application.zip" file that it will
|
|
|
|
// invariably request. Only do this once.
|
|
|
|
if (!mAppPackageFileDescriptorSent) {
|
|
|
|
mAppPackageFileDescriptorSent = true;
|
|
|
|
|
|
|
|
nsCOMPtr<mozIApplication> app = GetOwnOrContainingApp();
|
|
|
|
if (app) {
|
|
|
|
nsString manifestURL;
|
|
|
|
nsresult rv = app->GetManifestURL(manifestURL);
|
|
|
|
NS_ENSURE_SUCCESS_VOID(rv);
|
|
|
|
|
|
|
|
if (StringBeginsWith(manifestURL, NS_LITERAL_STRING("app:"))) {
|
|
|
|
nsString basePath;
|
|
|
|
rv = app->GetBasePath(basePath);
|
|
|
|
NS_ENSURE_SUCCESS_VOID(rv);
|
|
|
|
|
|
|
|
nsString appId;
|
|
|
|
rv = app->GetId(appId);
|
|
|
|
NS_ENSURE_SUCCESS_VOID(rv);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIFile> packageFile;
|
|
|
|
rv = NS_NewLocalFile(basePath, false,
|
|
|
|
getter_AddRefs(packageFile));
|
|
|
|
NS_ENSURE_SUCCESS_VOID(rv);
|
|
|
|
|
|
|
|
rv = packageFile->Append(appId);
|
|
|
|
NS_ENSURE_SUCCESS_VOID(rv);
|
|
|
|
|
|
|
|
rv = packageFile->Append(NS_LITERAL_STRING("application.zip"));
|
|
|
|
NS_ENSURE_SUCCESS_VOID(rv);
|
|
|
|
|
|
|
|
nsString path;
|
|
|
|
rv = packageFile->GetPath(path);
|
|
|
|
NS_ENSURE_SUCCESS_VOID(rv);
|
|
|
|
|
2015-08-17 05:25:59 +03:00
|
|
|
#ifndef XP_WIN
|
|
|
|
PRFileDesc* cachedFd = nullptr;
|
|
|
|
gJarHandler->JarCache()->GetFd(packageFile, &cachedFd);
|
|
|
|
|
|
|
|
if (cachedFd) {
|
|
|
|
FileDescriptor::PlatformHandleType handle =
|
|
|
|
FileDescriptor::PlatformHandleType(PR_FileDesc2NativeHandle(cachedFd));
|
2015-11-02 08:53:26 +03:00
|
|
|
Unused << SendCacheFileDescriptor(path, FileDescriptor(handle));
|
2015-08-17 05:25:59 +03:00
|
|
|
} else
|
|
|
|
#endif
|
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<OpenFileAndSendFDRunnable> openFileRunnable =
|
2015-08-17 05:25:59 +03:00
|
|
|
new OpenFileAndSendFDRunnable(path, this);
|
|
|
|
openFileRunnable->Dispatch();
|
|
|
|
}
|
2013-02-16 02:27:21 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2009-07-01 00:39:22 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2015-03-05 12:13:05 +03:00
|
|
|
TabParent::Show(const ScreenIntSize& size, bool aParentIsActive)
|
2009-07-01 00:39:22 +04:00
|
|
|
{
|
2012-09-29 06:16:36 +04:00
|
|
|
mDimensions = size;
|
2014-11-16 21:23:22 +03:00
|
|
|
if (mIsDestroyed) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
TextureFactoryIdentifier textureFactoryIdentifier;
|
|
|
|
uint64_t layersId = 0;
|
|
|
|
bool success = false;
|
|
|
|
RenderFrameParent* renderFrame = nullptr;
|
|
|
|
if (IsInitedByParent()) {
|
2016-03-29 21:32:41 +03:00
|
|
|
// If TabParent is initialized by parent side then the RenderFrame must also
|
|
|
|
// be created here. If TabParent is initialized by child side,
|
|
|
|
// child side will create RenderFrame.
|
|
|
|
MOZ_ASSERT(!GetRenderFrame());
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsFrameLoader> frameLoader = GetFrameLoader();
|
2014-11-16 21:23:22 +03:00
|
|
|
if (frameLoader) {
|
2016-03-29 19:42:05 +03:00
|
|
|
renderFrame = new RenderFrameParent(frameLoader, &success);
|
2014-11-16 21:23:22 +03:00
|
|
|
MOZ_ASSERT(success);
|
2016-03-29 19:42:05 +03:00
|
|
|
layersId = renderFrame->GetLayersId();
|
|
|
|
renderFrame->GetTextureFactoryIdentifier(&textureFactoryIdentifier);
|
2014-12-19 02:23:39 +03:00
|
|
|
AddTabParentToTable(layersId, this);
|
2015-11-02 08:53:26 +03:00
|
|
|
Unused << SendPRenderFrameConstructor(renderFrame);
|
2014-11-16 21:23:22 +03:00
|
|
|
}
|
2016-03-29 21:32:41 +03:00
|
|
|
} else {
|
|
|
|
// Otherwise, the child should have constructed the RenderFrame,
|
|
|
|
// and we should already know about it.
|
|
|
|
MOZ_ASSERT(GetRenderFrame());
|
2012-11-10 10:09:24 +04:00
|
|
|
}
|
2014-11-24 22:05:35 +03:00
|
|
|
|
2016-02-23 19:10:00 +03:00
|
|
|
nsCOMPtr<nsISupports> container = mFrameElement->OwnerDoc()->GetContainer();
|
|
|
|
nsCOMPtr<nsIBaseWindow> baseWindow = do_QueryInterface(container);
|
|
|
|
nsCOMPtr<nsIWidget> mainWidget;
|
|
|
|
baseWindow->GetMainWidget(getter_AddRefs(mainWidget));
|
|
|
|
mSizeMode = mainWidget ? mainWidget->SizeMode() : nsSizeMode_Normal;
|
|
|
|
|
2015-11-02 08:53:26 +03:00
|
|
|
Unused << SendShow(size, GetShowInfo(), textureFactoryIdentifier,
|
2016-02-23 19:10:00 +03:00
|
|
|
layersId, renderFrame, aParentIsActive, mSizeMode);
|
2010-08-21 03:24:40 +04:00
|
|
|
}
|
|
|
|
|
2015-01-13 03:41:53 +03:00
|
|
|
bool
|
|
|
|
TabParent::RecvSetDimensions(const uint32_t& aFlags,
|
|
|
|
const int32_t& aX, const int32_t& aY,
|
|
|
|
const int32_t& aCx, const int32_t& aCy)
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(!(aFlags & nsIEmbeddingSiteWindow::DIM_FLAGS_SIZE_INNER),
|
|
|
|
"We should never see DIM_FLAGS_SIZE_INNER here!");
|
|
|
|
|
|
|
|
NS_ENSURE_TRUE(mFrameElement, true);
|
|
|
|
nsCOMPtr<nsIDocShell> docShell = mFrameElement->OwnerDoc()->GetDocShell();
|
|
|
|
NS_ENSURE_TRUE(docShell, true);
|
|
|
|
nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
|
|
|
|
docShell->GetTreeOwner(getter_AddRefs(treeOwner));
|
|
|
|
nsCOMPtr<nsIBaseWindow> treeOwnerAsWin = do_QueryInterface(treeOwner);
|
|
|
|
NS_ENSURE_TRUE(treeOwnerAsWin, true);
|
|
|
|
|
2016-05-11 12:44:57 +03:00
|
|
|
// We only care about the parameters that actually changed, see more
|
|
|
|
// details in TabChild::SetDimensions.
|
|
|
|
int32_t unused;
|
|
|
|
int32_t x = aX;
|
|
|
|
if (aFlags & nsIEmbeddingSiteWindow::DIM_FLAGS_IGNORE_X) {
|
|
|
|
treeOwnerAsWin->GetPosition(&x, &unused);
|
|
|
|
}
|
|
|
|
|
|
|
|
int32_t y = aY;
|
|
|
|
if (aFlags & nsIEmbeddingSiteWindow::DIM_FLAGS_IGNORE_Y) {
|
|
|
|
treeOwnerAsWin->GetPosition(&unused, &y);
|
|
|
|
}
|
|
|
|
|
|
|
|
int32_t cx = aCx;
|
|
|
|
if (aFlags & nsIEmbeddingSiteWindow::DIM_FLAGS_IGNORE_CX) {
|
|
|
|
treeOwnerAsWin->GetSize(&cx, &unused);
|
|
|
|
}
|
|
|
|
|
|
|
|
int32_t cy = aCy;
|
|
|
|
if (aFlags & nsIEmbeddingSiteWindow::DIM_FLAGS_IGNORE_CY) {
|
|
|
|
treeOwnerAsWin->GetSize(&unused, &cy);
|
|
|
|
}
|
|
|
|
|
2015-01-13 03:41:53 +03:00
|
|
|
if (aFlags & nsIEmbeddingSiteWindow::DIM_FLAGS_POSITION &&
|
|
|
|
aFlags & nsIEmbeddingSiteWindow::DIM_FLAGS_SIZE_OUTER) {
|
2016-05-12 07:08:08 +03:00
|
|
|
treeOwnerAsWin->SetPositionAndSize(x, y, cx, cy, true);
|
2015-01-13 03:41:53 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (aFlags & nsIEmbeddingSiteWindow::DIM_FLAGS_POSITION) {
|
2016-05-11 12:44:57 +03:00
|
|
|
treeOwnerAsWin->SetPosition(x, y);
|
|
|
|
mUpdatedDimensions = false;
|
|
|
|
UpdatePosition();
|
2015-01-13 03:41:53 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (aFlags & nsIEmbeddingSiteWindow::DIM_FLAGS_SIZE_OUTER) {
|
2016-05-11 12:44:57 +03:00
|
|
|
treeOwnerAsWin->SetSize(cx, cy, true);
|
2015-01-13 03:41:53 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
MOZ_ASSERT(false, "Unknown flags!");
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2015-04-21 17:33:56 +03:00
|
|
|
nsresult
|
|
|
|
TabParent::UpdatePosition()
|
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsFrameLoader> frameLoader = GetFrameLoader();
|
2015-04-21 17:33:56 +03:00
|
|
|
if (!frameLoader) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
nsIntRect windowDims;
|
|
|
|
NS_ENSURE_SUCCESS(frameLoader->GetWindowDimensions(windowDims), NS_ERROR_FAILURE);
|
|
|
|
UpdateDimensions(windowDims, mDimensions);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2010-08-21 03:24:40 +04:00
|
|
|
void
|
2015-03-31 23:39:02 +03:00
|
|
|
TabParent::UpdateDimensions(const nsIntRect& rect, const ScreenIntSize& size)
|
2010-08-21 03:24:40 +04:00
|
|
|
{
|
2012-11-10 10:09:24 +04:00
|
|
|
if (mIsDestroyed) {
|
|
|
|
return;
|
|
|
|
}
|
2015-04-21 17:33:56 +03:00
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
2015-06-14 19:19:55 +03:00
|
|
|
if (!widget) {
|
|
|
|
NS_WARNING("No widget found in TabParent::UpdateDimensions");
|
|
|
|
return;
|
2015-04-21 17:33:56 +03:00
|
|
|
}
|
2016-03-08 22:14:43 +03:00
|
|
|
|
|
|
|
hal::ScreenConfiguration config;
|
|
|
|
hal::GetCurrentScreenConfiguration(&config);
|
|
|
|
ScreenOrientationInternal orientation = config.orientation();
|
|
|
|
LayoutDeviceIntPoint clientOffset = widget->GetClientOffset();
|
|
|
|
LayoutDeviceIntPoint chromeOffset = -GetChildProcessOffset();
|
2015-04-21 17:33:56 +03:00
|
|
|
|
2013-01-29 11:49:38 +04:00
|
|
|
if (!mUpdatedDimensions || mOrientation != orientation ||
|
2016-03-08 22:14:43 +03:00
|
|
|
mDimensions != size || !mRect.IsEqualEdges(rect) ||
|
|
|
|
clientOffset != mClientOffset ||
|
2015-03-31 23:39:02 +03:00
|
|
|
chromeOffset != mChromeOffset) {
|
|
|
|
|
2013-01-29 11:49:38 +04:00
|
|
|
mUpdatedDimensions = true;
|
2016-03-08 22:14:43 +03:00
|
|
|
mRect = rect;
|
2013-01-29 11:49:38 +04:00
|
|
|
mDimensions = size;
|
|
|
|
mOrientation = orientation;
|
2016-03-08 22:14:43 +03:00
|
|
|
mClientOffset = clientOffset;
|
2015-03-31 23:39:02 +03:00
|
|
|
mChromeOffset = chromeOffset;
|
2013-01-29 11:49:38 +04:00
|
|
|
|
2015-06-14 19:19:55 +03:00
|
|
|
CSSToLayoutDeviceScale widgetScale = widget->GetDefaultScale();
|
2015-06-08 08:39:28 +03:00
|
|
|
|
|
|
|
LayoutDeviceIntRect devicePixelRect =
|
|
|
|
ViewAs<LayoutDevicePixel>(mRect,
|
|
|
|
PixelCastJustification::LayoutDeviceIsScreenForTabDims);
|
|
|
|
LayoutDeviceIntSize devicePixelSize =
|
2015-11-10 08:37:31 +03:00
|
|
|
ViewAs<LayoutDevicePixel>(mDimensions,
|
2015-06-08 08:39:28 +03:00
|
|
|
PixelCastJustification::LayoutDeviceIsScreenForTabDims);
|
|
|
|
|
|
|
|
CSSRect unscaledRect = devicePixelRect / widgetScale;
|
|
|
|
CSSSize unscaledSize = devicePixelSize / widgetScale;
|
2015-11-02 08:53:26 +03:00
|
|
|
Unused << SendUpdateDimensions(unscaledRect, unscaledSize,
|
2016-03-08 22:14:43 +03:00
|
|
|
orientation, clientOffset, chromeOffset);
|
2012-07-20 10:48:27 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-02-23 19:10:00 +03:00
|
|
|
void
|
|
|
|
TabParent::SizeModeChanged(const nsSizeMode& aSizeMode)
|
|
|
|
{
|
|
|
|
if (!mIsDestroyed && aSizeMode != mSizeMode) {
|
|
|
|
mSizeMode = aSizeMode;
|
|
|
|
Unused << SendSizeModeChanged(aSizeMode);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-05-23 18:36:50 +04:00
|
|
|
void
|
|
|
|
TabParent::UIResolutionChanged()
|
|
|
|
{
|
|
|
|
if (!mIsDestroyed) {
|
|
|
|
// TryCacheDPIAndScale()'s cache is keyed off of
|
|
|
|
// mDPI being greater than 0, so this invalidates it.
|
|
|
|
mDPI = -1;
|
2015-06-08 08:39:39 +03:00
|
|
|
TryCacheDPIAndScale();
|
2015-08-13 17:42:19 +03:00
|
|
|
// If mDPI was set to -1 to invalidate it and then TryCacheDPIAndScale
|
|
|
|
// fails to cache the values, then mDefaultScale.scale might be invalid.
|
|
|
|
// We don't want to send that value to content. Just send -1 for it too in
|
|
|
|
// that case.
|
2015-11-02 08:53:26 +03:00
|
|
|
Unused << SendUIResolutionChanged(mDPI, mDPI < 0 ? -1.0 : mDefaultScale.scale);
|
2014-05-23 18:36:50 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-04-22 17:58:33 +03:00
|
|
|
void
|
|
|
|
TabParent::ThemeChanged()
|
|
|
|
{
|
|
|
|
if (!mIsDestroyed) {
|
|
|
|
// The theme has changed, and any cached values we had sent down
|
|
|
|
// to the child have been invalidated. When this method is called,
|
|
|
|
// LookAndFeel should have the up-to-date values, which we now
|
|
|
|
// send down to the child. We do this for every remote tab for now,
|
|
|
|
// but bug 1156934 has been filed to do it once per content process.
|
2015-11-02 08:53:26 +03:00
|
|
|
Unused << SendThemeChanged(LookAndFeel::GetIntCache());
|
2015-04-22 17:58:33 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-09-18 15:19:13 +03:00
|
|
|
void
|
2016-05-11 15:56:42 +03:00
|
|
|
TabParent::HandleAccessKey(const WidgetKeyboardEvent& aEvent,
|
|
|
|
nsTArray<uint32_t>& aCharCodes,
|
2015-09-18 15:19:13 +03:00
|
|
|
const int32_t& aModifierMask)
|
|
|
|
{
|
|
|
|
if (!mIsDestroyed) {
|
2016-05-11 15:56:42 +03:00
|
|
|
Unused << SendHandleAccessKey(aEvent, aCharCodes, aModifierMask);
|
2015-09-18 15:19:13 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-11-05 21:14:22 +03:00
|
|
|
void
|
|
|
|
TabParent::Activate()
|
|
|
|
{
|
2012-11-10 10:09:24 +04:00
|
|
|
if (!mIsDestroyed) {
|
2015-11-02 08:53:26 +03:00
|
|
|
Unused << SendActivate();
|
2012-11-10 10:09:24 +04:00
|
|
|
}
|
2009-11-05 21:14:22 +03:00
|
|
|
}
|
|
|
|
|
2011-06-18 04:08:32 +04:00
|
|
|
void
|
|
|
|
TabParent::Deactivate()
|
|
|
|
{
|
2012-11-10 10:09:24 +04:00
|
|
|
if (!mIsDestroyed) {
|
2015-11-02 08:53:26 +03:00
|
|
|
Unused << SendDeactivate();
|
2012-11-10 10:09:24 +04:00
|
|
|
}
|
2011-06-18 04:08:32 +04:00
|
|
|
}
|
|
|
|
|
2010-08-13 12:06:40 +04:00
|
|
|
NS_IMETHODIMP
|
2016-01-30 20:05:36 +03:00
|
|
|
TabParent::Init(mozIDOMWindowProxy *window)
|
2010-08-13 12:06:40 +04:00
|
|
|
{
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
TabParent::GetState(uint32_t *aState)
|
2010-08-13 12:06:40 +04:00
|
|
|
{
|
|
|
|
NS_ENSURE_ARG(aState);
|
2010-09-18 06:11:05 +04:00
|
|
|
NS_WARNING("SecurityState not valid here");
|
2010-11-21 22:21:56 +03:00
|
|
|
*aState = 0;
|
2010-08-13 12:06:40 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2013-03-28 09:12:03 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
TabParent::SetDocShell(nsIDocShell *aDocShell)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG(aDocShell);
|
|
|
|
NS_WARNING("No mDocShell member in TabParent so there is no docShell to set");
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2015-05-21 20:04:58 +03:00
|
|
|
a11y::PDocAccessibleParent*
|
|
|
|
TabParent::AllocPDocAccessibleParent(PDocAccessibleParent* aParent,
|
|
|
|
const uint64_t&)
|
|
|
|
{
|
|
|
|
#ifdef ACCESSIBILITY
|
|
|
|
return new a11y::DocAccessibleParent();
|
|
|
|
#else
|
|
|
|
return nullptr;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::DeallocPDocAccessibleParent(PDocAccessibleParent* aParent)
|
|
|
|
{
|
|
|
|
#ifdef ACCESSIBILITY
|
|
|
|
delete static_cast<a11y::DocAccessibleParent*>(aParent);
|
|
|
|
#endif
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::RecvPDocAccessibleConstructor(PDocAccessibleParent* aDoc,
|
|
|
|
PDocAccessibleParent* aParentDoc,
|
|
|
|
const uint64_t& aParentID)
|
|
|
|
{
|
|
|
|
#ifdef ACCESSIBILITY
|
|
|
|
auto doc = static_cast<a11y::DocAccessibleParent*>(aDoc);
|
|
|
|
if (aParentDoc) {
|
2015-07-20 20:46:35 +03:00
|
|
|
// A document should never directly be the parent of another document.
|
|
|
|
// There should always be an outer doc accessible child of the outer
|
|
|
|
// document containing the child.
|
2015-05-21 20:04:58 +03:00
|
|
|
MOZ_ASSERT(aParentID);
|
2015-07-20 20:46:35 +03:00
|
|
|
if (!aParentID) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2015-05-21 20:04:58 +03:00
|
|
|
auto parentDoc = static_cast<a11y::DocAccessibleParent*>(aParentDoc);
|
|
|
|
return parentDoc->AddChildDoc(doc, aParentID);
|
|
|
|
} else {
|
2015-07-20 20:46:35 +03:00
|
|
|
// null aParentDoc means this document is at the top level in the child
|
|
|
|
// process. That means it makes no sense to get an id for an accessible
|
|
|
|
// that is its parent.
|
2015-05-21 20:04:58 +03:00
|
|
|
MOZ_ASSERT(!aParentID);
|
2015-07-20 20:46:35 +03:00
|
|
|
if (aParentID) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2015-06-10 21:11:34 +03:00
|
|
|
doc->SetTopLevel();
|
2015-05-21 20:04:58 +03:00
|
|
|
a11y::DocManager::RemoteDocAdded(doc);
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-10-06 20:10:47 +03:00
|
|
|
a11y::DocAccessibleParent*
|
|
|
|
TabParent::GetTopLevelDocAccessible() const
|
|
|
|
{
|
2015-10-08 17:51:31 +03:00
|
|
|
#ifdef ACCESSIBILITY
|
2015-10-06 20:10:47 +03:00
|
|
|
// XXX Consider managing non top level PDocAccessibles with their parent
|
|
|
|
// document accessible.
|
2015-10-07 21:30:33 +03:00
|
|
|
const ManagedContainer<PDocAccessibleParent>& docs = ManagedPDocAccessibleParent();
|
|
|
|
for (auto iter = docs.ConstIter(); !iter.Done(); iter.Next()) {
|
|
|
|
auto doc = static_cast<a11y::DocAccessibleParent*>(iter.Get()->GetKey());
|
2015-10-06 20:10:47 +03:00
|
|
|
if (!doc->ParentDoc()) {
|
|
|
|
return doc;
|
|
|
|
}
|
|
|
|
}
|
2015-10-13 22:00:35 +03:00
|
|
|
|
2015-10-07 21:30:33 +03:00
|
|
|
MOZ_ASSERT(docs.Count() == 0, "If there isn't a top level accessible doc "
|
|
|
|
"there shouldn't be an accessible doc at all!");
|
2015-10-08 17:51:31 +03:00
|
|
|
#endif
|
2015-10-06 20:10:47 +03:00
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
2010-10-27 02:20:53 +04:00
|
|
|
PDocumentRendererParent*
|
2013-07-08 19:48:39 +04:00
|
|
|
TabParent::AllocPDocumentRendererParent(const nsRect& documentRect,
|
2013-12-26 22:06:53 +04:00
|
|
|
const gfx::Matrix& transform,
|
2013-07-08 19:48:39 +04:00
|
|
|
const nsString& bgcolor,
|
|
|
|
const uint32_t& renderFlags,
|
|
|
|
const bool& flushLayout,
|
|
|
|
const nsIntSize& renderSize)
|
2009-10-29 20:58:31 +03:00
|
|
|
{
|
|
|
|
return new DocumentRendererParent();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2013-07-08 19:48:39 +04:00
|
|
|
TabParent::DeallocPDocumentRendererParent(PDocumentRendererParent* actor)
|
2009-10-29 20:58:31 +03:00
|
|
|
{
|
2009-12-03 11:16:14 +03:00
|
|
|
delete actor;
|
2009-10-29 20:58:31 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-02-18 04:30:06 +04:00
|
|
|
PFilePickerParent*
|
|
|
|
TabParent::AllocPFilePickerParent(const nsString& aTitle, const int16_t& aMode)
|
|
|
|
{
|
|
|
|
return new FilePickerParent(aTitle, aMode);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::DeallocPFilePickerParent(PFilePickerParent* actor)
|
|
|
|
{
|
|
|
|
delete actor;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-09-27 03:21:57 +04:00
|
|
|
auto
|
|
|
|
TabParent::AllocPIndexedDBPermissionRequestParent(const Principal& aPrincipal)
|
|
|
|
-> PIndexedDBPermissionRequestParent*
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
|
|
|
|
|
|
nsCOMPtr<nsIPrincipal> principal(aPrincipal);
|
|
|
|
if (!principal) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIContentParent> manager = Manager();
|
|
|
|
if (manager->IsContentParent()) {
|
|
|
|
if (NS_WARN_IF(!AssertAppPrincipal(manager->AsContentParent(),
|
|
|
|
principal))) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
MOZ_CRASH("Figure out security checks for bridged content!");
|
|
|
|
}
|
|
|
|
|
2015-04-10 19:10:00 +03:00
|
|
|
if (NS_WARN_IF(!mFrameElement)) {
|
2014-09-27 03:21:57 +04:00
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
return
|
2015-04-10 19:10:00 +03:00
|
|
|
mozilla::dom::indexedDB::AllocPIndexedDBPermissionRequestParent(mFrameElement,
|
2014-09-27 03:21:57 +04:00
|
|
|
principal);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::RecvPIndexedDBPermissionRequestConstructor(
|
|
|
|
PIndexedDBPermissionRequestParent* aActor,
|
|
|
|
const Principal& aPrincipal)
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
|
|
MOZ_ASSERT(aActor);
|
|
|
|
|
|
|
|
return
|
|
|
|
mozilla::dom::indexedDB::RecvPIndexedDBPermissionRequestConstructor(aActor);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::DeallocPIndexedDBPermissionRequestParent(
|
|
|
|
PIndexedDBPermissionRequestParent* aActor)
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
|
|
MOZ_ASSERT(aActor);
|
|
|
|
|
|
|
|
return
|
|
|
|
mozilla::dom::indexedDB::DeallocPIndexedDBPermissionRequestParent(aActor);
|
|
|
|
}
|
|
|
|
|
2009-11-05 21:21:09 +03:00
|
|
|
void
|
|
|
|
TabParent::SendMouseEvent(const nsAString& aType, float aX, float aY,
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t aButton, int32_t aClickCount,
|
|
|
|
int32_t aModifiers, bool aIgnoreRootScrollFrame)
|
2009-11-05 21:21:09 +03:00
|
|
|
{
|
2012-11-10 10:09:24 +04:00
|
|
|
if (!mIsDestroyed) {
|
2015-11-02 08:53:26 +03:00
|
|
|
Unused << PBrowserParent::SendMouseEvent(nsString(aType), aX, aY,
|
2012-11-10 10:09:24 +04:00
|
|
|
aButton, aClickCount,
|
|
|
|
aModifiers, aIgnoreRootScrollFrame);
|
|
|
|
}
|
2009-11-05 21:21:09 +03:00
|
|
|
}
|
|
|
|
|
2010-03-19 09:52:18 +03:00
|
|
|
void
|
|
|
|
TabParent::SendKeyEvent(const nsAString& aType,
|
2012-08-22 19:56:38 +04:00
|
|
|
int32_t aKeyCode,
|
|
|
|
int32_t aCharCode,
|
|
|
|
int32_t aModifiers,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool aPreventDefault)
|
2010-03-19 09:52:18 +03:00
|
|
|
{
|
2012-11-10 10:09:24 +04:00
|
|
|
if (!mIsDestroyed) {
|
2015-11-02 08:53:26 +03:00
|
|
|
Unused << PBrowserParent::SendKeyEvent(nsString(aType), aKeyCode, aCharCode,
|
2012-11-10 10:09:24 +04:00
|
|
|
aModifiers, aPreventDefault);
|
|
|
|
}
|
2010-03-19 09:52:18 +03:00
|
|
|
}
|
|
|
|
|
2013-10-02 10:38:27 +04:00
|
|
|
bool TabParent::SendRealMouseEvent(WidgetMouseEvent& event)
|
2011-06-22 04:32:43 +04:00
|
|
|
{
|
2012-11-10 10:09:24 +04:00
|
|
|
if (mIsDestroyed) {
|
|
|
|
return false;
|
|
|
|
}
|
2016-04-18 17:09:02 +03:00
|
|
|
event.mRefPoint += GetChildProcessOffset();
|
2015-04-15 02:29:10 +03:00
|
|
|
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (widget) {
|
2015-05-22 09:00:00 +03:00
|
|
|
// When we mouseenter the tab, the tab's cursor should
|
|
|
|
// become the current cursor. When we mouseexit, we stop.
|
2015-08-29 02:58:31 +03:00
|
|
|
if (eMouseEnterIntoWidget == event.mMessage) {
|
2015-04-15 02:29:10 +03:00
|
|
|
mTabSetsCursor = true;
|
2015-05-20 04:28:57 +03:00
|
|
|
if (mCustomCursor) {
|
|
|
|
widget->SetCursor(mCustomCursor, mCustomCursorHotspotX, mCustomCursorHotspotY);
|
|
|
|
} else if (mCursor != nsCursor(-1)) {
|
2015-04-15 02:29:10 +03:00
|
|
|
widget->SetCursor(mCursor);
|
|
|
|
}
|
2015-08-29 02:58:31 +03:00
|
|
|
} else if (eMouseExitFromWidget == event.mMessage) {
|
2015-04-15 02:29:10 +03:00
|
|
|
mTabSetsCursor = false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-09-28 21:44:37 +03:00
|
|
|
ScrollableLayerGuid guid;
|
|
|
|
uint64_t blockId;
|
|
|
|
ApzAwareEventRoutingToChild(&guid, &blockId, nullptr);
|
|
|
|
|
2015-08-29 02:58:29 +03:00
|
|
|
if (eMouseMove == event.mMessage) {
|
2015-07-28 01:35:51 +03:00
|
|
|
if (event.reason == WidgetMouseEvent::eSynthesized) {
|
2015-09-28 21:44:37 +03:00
|
|
|
return SendSynthMouseMoveEvent(event, guid, blockId);
|
2015-07-28 01:35:51 +03:00
|
|
|
} else {
|
2015-09-28 21:44:37 +03:00
|
|
|
return SendRealMouseMoveEvent(event, guid, blockId);
|
2015-07-28 01:35:51 +03:00
|
|
|
}
|
2015-02-14 02:34:04 +03:00
|
|
|
}
|
2015-09-28 21:44:37 +03:00
|
|
|
|
|
|
|
return SendRealMouseButtonEvent(event, guid, blockId);
|
2011-06-22 04:32:43 +04:00
|
|
|
}
|
|
|
|
|
2015-02-17 05:41:48 +03:00
|
|
|
LayoutDeviceToCSSScale
|
|
|
|
TabParent::GetLayoutDeviceToCSSScale()
|
2013-12-06 03:17:37 +04:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIContent> content = do_QueryInterface(mFrameElement);
|
2015-02-17 05:41:48 +03:00
|
|
|
nsIDocument* doc = (content ? content->OwnerDoc() : nullptr);
|
|
|
|
nsIPresShell* shell = (doc ? doc->GetShell() : nullptr);
|
|
|
|
nsPresContext* ctx = (shell ? shell->GetPresContext() : nullptr);
|
|
|
|
return LayoutDeviceToCSSScale(ctx
|
|
|
|
? (float)ctx->AppUnitsPerDevPixel() / nsPresContext::AppUnitsPerCSSPixel()
|
|
|
|
: 0.0f);
|
|
|
|
}
|
2013-12-06 03:17:37 +04:00
|
|
|
|
2015-04-08 21:48:11 +03:00
|
|
|
bool
|
|
|
|
TabParent::SendRealDragEvent(WidgetDragEvent& event, uint32_t aDragAction,
|
|
|
|
uint32_t aDropEffect)
|
|
|
|
{
|
|
|
|
if (mIsDestroyed) {
|
|
|
|
return false;
|
|
|
|
}
|
2016-04-18 17:09:02 +03:00
|
|
|
event.mRefPoint += GetChildProcessOffset();
|
2015-04-08 21:48:11 +03:00
|
|
|
return PBrowserParent::SendRealDragEvent(event, aDragAction, aDropEffect);
|
|
|
|
}
|
|
|
|
|
2015-02-17 05:41:48 +03:00
|
|
|
CSSPoint TabParent::AdjustTapToChildWidget(const CSSPoint& aPoint)
|
|
|
|
{
|
2015-04-09 06:39:28 +03:00
|
|
|
return aPoint + (LayoutDevicePoint(GetChildProcessOffset()) * GetLayoutDeviceToCSSScale());
|
2013-12-06 03:17:37 +04:00
|
|
|
}
|
|
|
|
|
2013-10-16 13:37:36 +04:00
|
|
|
bool TabParent::SendMouseWheelEvent(WidgetWheelEvent& event)
|
2012-08-12 05:42:34 +04:00
|
|
|
{
|
2012-11-10 10:09:24 +04:00
|
|
|
if (mIsDestroyed) {
|
|
|
|
return false;
|
|
|
|
}
|
2014-12-09 13:40:26 +03:00
|
|
|
|
|
|
|
ScrollableLayerGuid guid;
|
|
|
|
uint64_t blockId;
|
2015-05-14 15:16:00 +03:00
|
|
|
ApzAwareEventRoutingToChild(&guid, &blockId, nullptr);
|
2016-04-18 17:09:02 +03:00
|
|
|
event.mRefPoint += GetChildProcessOffset();
|
2014-12-09 13:40:26 +03:00
|
|
|
return PBrowserParent::SendMouseWheelEvent(event, guid, blockId);
|
2012-08-12 05:42:34 +04:00
|
|
|
}
|
|
|
|
|
2015-03-25 01:00:52 +03:00
|
|
|
bool TabParent::RecvDispatchWheelEvent(const mozilla::WidgetWheelEvent& aEvent)
|
2015-03-07 01:26:59 +03:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
WidgetWheelEvent localEvent(aEvent);
|
2016-04-14 11:03:14 +03:00
|
|
|
localEvent.mWidget = widget;
|
2016-04-18 17:09:02 +03:00
|
|
|
localEvent.mRefPoint -= GetChildProcessOffset();
|
2015-03-07 01:26:59 +03:00
|
|
|
|
2016-03-11 02:25:48 +03:00
|
|
|
widget->DispatchInputEvent(&localEvent);
|
2015-03-07 01:26:59 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-03-25 01:00:52 +03:00
|
|
|
bool
|
|
|
|
TabParent::RecvDispatchMouseEvent(const mozilla::WidgetMouseEvent& aEvent)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
WidgetMouseEvent localEvent(aEvent);
|
2016-04-14 11:03:14 +03:00
|
|
|
localEvent.mWidget = widget;
|
2016-04-18 17:09:02 +03:00
|
|
|
localEvent.mRefPoint -= GetChildProcessOffset();
|
2015-03-25 01:00:52 +03:00
|
|
|
|
|
|
|
widget->DispatchInputEvent(&localEvent);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::RecvDispatchKeyboardEvent(const mozilla::WidgetKeyboardEvent& aEvent)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
WidgetKeyboardEvent localEvent(aEvent);
|
2016-04-14 11:03:14 +03:00
|
|
|
localEvent.mWidget = widget;
|
2016-04-18 17:09:02 +03:00
|
|
|
localEvent.mRefPoint -= GetChildProcessOffset();
|
2015-03-25 01:00:52 +03:00
|
|
|
|
|
|
|
widget->DispatchInputEvent(&localEvent);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-03-20 19:46:29 +04:00
|
|
|
static void
|
|
|
|
DoCommandCallback(mozilla::Command aCommand, void* aData)
|
|
|
|
{
|
|
|
|
static_cast<InfallibleTArray<mozilla::CommandInt>*>(aData)->AppendElement(aCommand);
|
|
|
|
}
|
|
|
|
|
2014-04-22 00:40:09 +04:00
|
|
|
bool
|
|
|
|
TabParent::RecvRequestNativeKeyBindings(const WidgetKeyboardEvent& aEvent,
|
|
|
|
MaybeNativeKeyBinding* aBindings)
|
|
|
|
{
|
2016-02-02 18:36:31 +03:00
|
|
|
AutoTArray<mozilla::CommandInt, 4> singleLine;
|
|
|
|
AutoTArray<mozilla::CommandInt, 4> multiLine;
|
|
|
|
AutoTArray<mozilla::CommandInt, 4> richText;
|
2014-04-22 00:40:09 +04:00
|
|
|
|
|
|
|
*aBindings = mozilla::void_t();
|
|
|
|
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
WidgetKeyboardEvent localEvent(aEvent);
|
|
|
|
|
|
|
|
if (NS_FAILED(widget->AttachNativeKeyEvent(localEvent))) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
widget->ExecuteNativeKeyBinding(nsIWidget::NativeKeyBindingsForSingleLineEditor,
|
|
|
|
localEvent, DoCommandCallback, &singleLine);
|
|
|
|
widget->ExecuteNativeKeyBinding(nsIWidget::NativeKeyBindingsForMultiLineEditor,
|
|
|
|
localEvent, DoCommandCallback, &multiLine);
|
|
|
|
widget->ExecuteNativeKeyBinding(nsIWidget::NativeKeyBindingsForRichTextEditor,
|
|
|
|
localEvent, DoCommandCallback, &richText);
|
|
|
|
|
|
|
|
if (!singleLine.IsEmpty() || !multiLine.IsEmpty() || !richText.IsEmpty()) {
|
|
|
|
*aBindings = NativeKeyBinding(singleLine, multiLine, richText);
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-04-14 18:36:36 +03:00
|
|
|
class SynthesizedEventObserver : public nsIObserver
|
|
|
|
{
|
|
|
|
NS_DECL_ISUPPORTS
|
|
|
|
|
|
|
|
public:
|
|
|
|
SynthesizedEventObserver(TabParent* aTabParent, const uint64_t& aObserverId)
|
|
|
|
: mTabParent(aTabParent)
|
|
|
|
, mObserverId(aObserverId)
|
|
|
|
{
|
|
|
|
MOZ_ASSERT(mTabParent);
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP Observe(nsISupports* aSubject,
|
|
|
|
const char* aTopic,
|
2015-04-15 19:04:12 +03:00
|
|
|
const char16_t* aData) override
|
2015-04-14 18:36:36 +03:00
|
|
|
{
|
|
|
|
if (!mTabParent) {
|
|
|
|
// We already sent the notification
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!mTabParent->SendNativeSynthesisResponse(mObserverId, nsCString(aTopic))) {
|
|
|
|
NS_WARNING("Unable to send native event synthesization response!");
|
|
|
|
}
|
|
|
|
// Null out tabparent to indicate we already sent the response
|
|
|
|
mTabParent = nullptr;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
virtual ~SynthesizedEventObserver() { }
|
|
|
|
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<TabParent> mTabParent;
|
2015-04-14 18:36:36 +03:00
|
|
|
uint64_t mObserverId;
|
|
|
|
};
|
|
|
|
|
|
|
|
NS_IMPL_ISUPPORTS(SynthesizedEventObserver, nsIObserver)
|
|
|
|
|
|
|
|
class MOZ_STACK_CLASS AutoSynthesizedEventResponder
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
AutoSynthesizedEventResponder(TabParent* aTabParent,
|
|
|
|
const uint64_t& aObserverId,
|
|
|
|
const char* aTopic)
|
|
|
|
: mObserver(new SynthesizedEventObserver(aTabParent, aObserverId))
|
|
|
|
, mTopic(aTopic)
|
|
|
|
{ }
|
|
|
|
|
|
|
|
~AutoSynthesizedEventResponder()
|
|
|
|
{
|
|
|
|
// This may be a no-op if the observer already sent a response.
|
|
|
|
mObserver->Observe(nullptr, mTopic, nullptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIObserver* GetObserver()
|
|
|
|
{
|
|
|
|
return mObserver;
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
nsCOMPtr<nsIObserver> mObserver;
|
|
|
|
const char* mTopic;
|
|
|
|
};
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::RecvSynthesizeNativeKeyEvent(const int32_t& aNativeKeyboardLayout,
|
|
|
|
const int32_t& aNativeKeyCode,
|
|
|
|
const uint32_t& aModifierFlags,
|
|
|
|
const nsString& aCharacters,
|
|
|
|
const nsString& aUnmodifiedCharacters,
|
|
|
|
const uint64_t& aObserverId)
|
|
|
|
{
|
|
|
|
AutoSynthesizedEventResponder responder(this, aObserverId, "keyevent");
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (widget) {
|
|
|
|
widget->SynthesizeNativeKeyEvent(aNativeKeyboardLayout, aNativeKeyCode,
|
|
|
|
aModifierFlags, aCharacters, aUnmodifiedCharacters,
|
|
|
|
responder.GetObserver());
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::RecvSynthesizeNativeMouseEvent(const LayoutDeviceIntPoint& aPoint,
|
|
|
|
const uint32_t& aNativeMessage,
|
|
|
|
const uint32_t& aModifierFlags,
|
|
|
|
const uint64_t& aObserverId)
|
|
|
|
{
|
|
|
|
AutoSynthesizedEventResponder responder(this, aObserverId, "mouseevent");
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (widget) {
|
|
|
|
widget->SynthesizeNativeMouseEvent(aPoint, aNativeMessage, aModifierFlags,
|
|
|
|
responder.GetObserver());
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::RecvSynthesizeNativeMouseMove(const LayoutDeviceIntPoint& aPoint,
|
|
|
|
const uint64_t& aObserverId)
|
|
|
|
{
|
|
|
|
AutoSynthesizedEventResponder responder(this, aObserverId, "mousemove");
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (widget) {
|
|
|
|
widget->SynthesizeNativeMouseMove(aPoint, responder.GetObserver());
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::RecvSynthesizeNativeMouseScrollEvent(const LayoutDeviceIntPoint& aPoint,
|
|
|
|
const uint32_t& aNativeMessage,
|
|
|
|
const double& aDeltaX,
|
|
|
|
const double& aDeltaY,
|
|
|
|
const double& aDeltaZ,
|
|
|
|
const uint32_t& aModifierFlags,
|
|
|
|
const uint32_t& aAdditionalFlags,
|
|
|
|
const uint64_t& aObserverId)
|
|
|
|
{
|
|
|
|
AutoSynthesizedEventResponder responder(this, aObserverId, "mousescrollevent");
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (widget) {
|
|
|
|
widget->SynthesizeNativeMouseScrollEvent(aPoint, aNativeMessage,
|
|
|
|
aDeltaX, aDeltaY, aDeltaZ, aModifierFlags, aAdditionalFlags,
|
|
|
|
responder.GetObserver());
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::RecvSynthesizeNativeTouchPoint(const uint32_t& aPointerId,
|
|
|
|
const TouchPointerState& aPointerState,
|
2016-04-15 13:39:36 +03:00
|
|
|
const LayoutDeviceIntPoint& aPoint,
|
2015-04-14 18:36:36 +03:00
|
|
|
const double& aPointerPressure,
|
|
|
|
const uint32_t& aPointerOrientation,
|
|
|
|
const uint64_t& aObserverId)
|
|
|
|
{
|
|
|
|
AutoSynthesizedEventResponder responder(this, aObserverId, "touchpoint");
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (widget) {
|
2016-04-15 13:39:36 +03:00
|
|
|
widget->SynthesizeNativeTouchPoint(aPointerId, aPointerState, aPoint,
|
2015-04-14 18:36:36 +03:00
|
|
|
aPointerPressure, aPointerOrientation, responder.GetObserver());
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2016-04-15 13:39:36 +03:00
|
|
|
TabParent::RecvSynthesizeNativeTouchTap(const LayoutDeviceIntPoint& aPoint,
|
2015-04-14 18:36:36 +03:00
|
|
|
const bool& aLongTap,
|
|
|
|
const uint64_t& aObserverId)
|
|
|
|
{
|
|
|
|
AutoSynthesizedEventResponder responder(this, aObserverId, "touchtap");
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (widget) {
|
2016-04-15 13:39:36 +03:00
|
|
|
widget->SynthesizeNativeTouchTap(aPoint, aLongTap, responder.GetObserver());
|
2015-04-14 18:36:36 +03:00
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::RecvClearNativeTouchSequence(const uint64_t& aObserverId)
|
|
|
|
{
|
|
|
|
AutoSynthesizedEventResponder responder(this, aObserverId, "cleartouch");
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (widget) {
|
|
|
|
widget->ClearNativeTouchSequence(responder.GetObserver());
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2013-10-01 11:22:58 +04:00
|
|
|
bool TabParent::SendRealKeyEvent(WidgetKeyboardEvent& event)
|
2011-06-22 04:32:43 +04:00
|
|
|
{
|
2012-11-10 10:09:24 +04:00
|
|
|
if (mIsDestroyed) {
|
|
|
|
return false;
|
|
|
|
}
|
2016-04-18 17:09:02 +03:00
|
|
|
event.mRefPoint += GetChildProcessOffset();
|
2014-03-20 19:46:29 +04:00
|
|
|
|
|
|
|
MaybeNativeKeyBinding bindings;
|
|
|
|
bindings = void_t();
|
2015-08-29 02:58:27 +03:00
|
|
|
if (event.mMessage == eKeyPress) {
|
2014-03-20 19:46:29 +04:00
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
|
2016-02-02 18:36:31 +03:00
|
|
|
AutoTArray<mozilla::CommandInt, 4> singleLine;
|
|
|
|
AutoTArray<mozilla::CommandInt, 4> multiLine;
|
|
|
|
AutoTArray<mozilla::CommandInt, 4> richText;
|
2014-03-20 19:46:29 +04:00
|
|
|
|
|
|
|
widget->ExecuteNativeKeyBinding(nsIWidget::NativeKeyBindingsForSingleLineEditor,
|
|
|
|
event, DoCommandCallback, &singleLine);
|
|
|
|
widget->ExecuteNativeKeyBinding(nsIWidget::NativeKeyBindingsForMultiLineEditor,
|
|
|
|
event, DoCommandCallback, &multiLine);
|
|
|
|
widget->ExecuteNativeKeyBinding(nsIWidget::NativeKeyBindingsForRichTextEditor,
|
|
|
|
event, DoCommandCallback, &richText);
|
|
|
|
|
|
|
|
if (!singleLine.IsEmpty() || !multiLine.IsEmpty() || !richText.IsEmpty()) {
|
|
|
|
bindings = NativeKeyBinding(singleLine, multiLine, richText);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return PBrowserParent::SendRealKeyEvent(event, bindings);
|
2011-06-22 04:32:43 +04:00
|
|
|
}
|
|
|
|
|
2013-09-27 10:20:57 +04:00
|
|
|
bool TabParent::SendRealTouchEvent(WidgetTouchEvent& event)
|
2012-07-16 06:58:43 +04:00
|
|
|
{
|
2012-11-10 10:09:24 +04:00
|
|
|
if (mIsDestroyed) {
|
|
|
|
return false;
|
|
|
|
}
|
2012-09-12 00:05:52 +04:00
|
|
|
|
2014-01-27 21:41:12 +04:00
|
|
|
// PresShell::HandleEventInternal adds touches on touch end/cancel. This
|
|
|
|
// confuses remote content and the panning and zooming logic into thinking
|
|
|
|
// that the added touches are part of the touchend/cancel, when actually
|
|
|
|
// they're not.
|
2015-09-14 18:14:35 +03:00
|
|
|
if (event.mMessage == eTouchEnd || event.mMessage == eTouchCancel) {
|
2016-03-30 12:44:28 +03:00
|
|
|
for (int i = event.mTouches.Length() - 1; i >= 0; i--) {
|
|
|
|
if (!event.mTouches[i]->mChanged) {
|
|
|
|
event.mTouches.RemoveElementAt(i);
|
2012-12-20 23:54:00 +04:00
|
|
|
}
|
2012-08-29 20:06:11 +04:00
|
|
|
}
|
|
|
|
}
|
2012-09-12 00:05:52 +04:00
|
|
|
|
2013-11-13 22:20:31 +04:00
|
|
|
ScrollableLayerGuid guid;
|
2014-10-24 21:29:30 +04:00
|
|
|
uint64_t blockId;
|
2015-05-14 15:16:00 +03:00
|
|
|
nsEventStatus apzResponse;
|
|
|
|
ApzAwareEventRoutingToChild(&guid, &blockId, &apzResponse);
|
2013-08-14 18:15:27 +04:00
|
|
|
|
2015-02-07 00:46:46 +03:00
|
|
|
if (mIsDestroyed) {
|
2014-01-16 03:07:18 +04:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2015-02-17 05:35:03 +03:00
|
|
|
LayoutDeviceIntPoint offset = GetChildProcessOffset();
|
2016-03-30 12:44:28 +03:00
|
|
|
for (uint32_t i = 0; i < event.mTouches.Length(); i++) {
|
|
|
|
event.mTouches[i]->mRefPoint += offset;
|
2015-02-17 05:35:03 +03:00
|
|
|
}
|
2013-08-14 18:15:27 +04:00
|
|
|
|
2015-09-14 18:14:35 +03:00
|
|
|
return (event.mMessage == eTouchMove) ?
|
2015-05-14 15:16:00 +03:00
|
|
|
PBrowserParent::SendRealTouchMoveEvent(event, guid, blockId, apzResponse) :
|
|
|
|
PBrowserParent::SendRealTouchEvent(event, guid, blockId, apzResponse);
|
2012-07-16 06:58:43 +04:00
|
|
|
}
|
|
|
|
|
2010-02-20 20:05:20 +03:00
|
|
|
bool
|
2010-07-19 22:33:33 +04:00
|
|
|
TabParent::RecvSyncMessage(const nsString& aMessage,
|
2012-08-02 10:02:29 +04:00
|
|
|
const ClonedMessageData& aData,
|
2015-01-16 22:58:52 +03:00
|
|
|
InfallibleTArray<CpowEntry>&& aCpows,
|
2013-11-06 21:21:15 +04:00
|
|
|
const IPC::Principal& aPrincipal,
|
2015-09-10 23:50:58 +03:00
|
|
|
nsTArray<StructuredCloneData>* aRetVal)
|
2010-02-20 20:05:20 +03:00
|
|
|
{
|
2014-06-11 09:44:03 +04:00
|
|
|
// FIXME Permission check for TabParent in Content process
|
2013-11-06 21:21:17 +04:00
|
|
|
nsIPrincipal* principal = aPrincipal;
|
2014-06-14 11:32:24 +04:00
|
|
|
if (Manager()->IsContentParent()) {
|
|
|
|
ContentParent* parent = Manager()->AsContentParent();
|
|
|
|
if (!ContentParent::IgnoreIPCPrincipal() &&
|
|
|
|
parent && principal && !AssertAppPrincipal(parent, principal)) {
|
|
|
|
return false;
|
|
|
|
}
|
2013-11-06 21:21:17 +04:00
|
|
|
}
|
|
|
|
|
2015-09-10 23:50:58 +03:00
|
|
|
StructuredCloneData data;
|
|
|
|
ipc::UnpackClonedMessageDataForParent(aData, data);
|
2015-09-02 19:20:30 +03:00
|
|
|
|
2015-01-27 00:32:31 +03:00
|
|
|
CrossProcessCpowHolder cpows(Manager(), aCpows);
|
2015-09-10 23:50:58 +03:00
|
|
|
return ReceiveMessage(aMessage, true, &data, &cpows, aPrincipal, aRetVal);
|
2010-02-20 20:05:20 +03:00
|
|
|
}
|
|
|
|
|
2013-10-01 20:15:06 +04:00
|
|
|
bool
|
2014-10-08 08:32:45 +04:00
|
|
|
TabParent::RecvRpcMessage(const nsString& aMessage,
|
|
|
|
const ClonedMessageData& aData,
|
2015-01-16 22:58:52 +03:00
|
|
|
InfallibleTArray<CpowEntry>&& aCpows,
|
2014-10-08 08:32:45 +04:00
|
|
|
const IPC::Principal& aPrincipal,
|
2015-09-10 23:50:58 +03:00
|
|
|
nsTArray<StructuredCloneData>* aRetVal)
|
2013-10-01 20:15:06 +04:00
|
|
|
{
|
2014-06-11 09:44:03 +04:00
|
|
|
// FIXME Permission check for TabParent in Content process
|
2013-11-06 21:21:17 +04:00
|
|
|
nsIPrincipal* principal = aPrincipal;
|
2014-06-14 11:32:24 +04:00
|
|
|
if (Manager()->IsContentParent()) {
|
|
|
|
ContentParent* parent = Manager()->AsContentParent();
|
|
|
|
if (!ContentParent::IgnoreIPCPrincipal() &&
|
|
|
|
parent && principal && !AssertAppPrincipal(parent, principal)) {
|
|
|
|
return false;
|
|
|
|
}
|
2013-11-06 21:21:17 +04:00
|
|
|
}
|
|
|
|
|
2015-09-10 23:50:58 +03:00
|
|
|
StructuredCloneData data;
|
|
|
|
ipc::UnpackClonedMessageDataForParent(aData, data);
|
2015-09-02 19:20:30 +03:00
|
|
|
|
2015-01-27 00:32:31 +03:00
|
|
|
CrossProcessCpowHolder cpows(Manager(), aCpows);
|
2015-09-10 23:50:58 +03:00
|
|
|
return ReceiveMessage(aMessage, true, &data, &cpows, aPrincipal, aRetVal);
|
2013-10-01 20:15:06 +04:00
|
|
|
}
|
|
|
|
|
2010-02-20 20:05:20 +03:00
|
|
|
bool
|
2010-07-19 22:33:33 +04:00
|
|
|
TabParent::RecvAsyncMessage(const nsString& aMessage,
|
2015-01-16 22:58:52 +03:00
|
|
|
InfallibleTArray<CpowEntry>&& aCpows,
|
2016-04-09 16:50:59 +03:00
|
|
|
const IPC::Principal& aPrincipal,
|
|
|
|
const ClonedMessageData& aData)
|
2012-08-02 10:02:29 +04:00
|
|
|
{
|
2014-06-11 09:44:03 +04:00
|
|
|
// FIXME Permission check for TabParent in Content process
|
2013-11-06 21:21:17 +04:00
|
|
|
nsIPrincipal* principal = aPrincipal;
|
2014-06-14 11:32:24 +04:00
|
|
|
if (Manager()->IsContentParent()) {
|
|
|
|
ContentParent* parent = Manager()->AsContentParent();
|
|
|
|
if (!ContentParent::IgnoreIPCPrincipal() &&
|
|
|
|
parent && principal && !AssertAppPrincipal(parent, principal)) {
|
|
|
|
return false;
|
|
|
|
}
|
2013-11-06 21:21:17 +04:00
|
|
|
}
|
|
|
|
|
2015-09-10 23:50:58 +03:00
|
|
|
StructuredCloneData data;
|
|
|
|
ipc::UnpackClonedMessageDataForParent(aData, data);
|
2015-09-02 19:20:30 +03:00
|
|
|
|
2015-01-27 00:32:31 +03:00
|
|
|
CrossProcessCpowHolder cpows(Manager(), aCpows);
|
2015-09-10 23:50:58 +03:00
|
|
|
return ReceiveMessage(aMessage, false, &data, &cpows, aPrincipal, nullptr);
|
2010-03-30 00:29:45 +04:00
|
|
|
}
|
|
|
|
|
2011-06-22 04:32:43 +04:00
|
|
|
bool
|
2014-05-28 05:12:29 +04:00
|
|
|
TabParent::RecvSetCursor(const uint32_t& aCursor, const bool& aForce)
|
2011-06-22 04:32:43 +04:00
|
|
|
{
|
2015-04-15 02:29:10 +03:00
|
|
|
mCursor = static_cast<nsCursor>(aCursor);
|
2015-05-20 04:28:57 +03:00
|
|
|
mCustomCursor = nullptr;
|
2015-04-15 02:29:10 +03:00
|
|
|
|
2011-06-22 04:32:43 +04:00
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (widget) {
|
2014-05-28 05:12:29 +04:00
|
|
|
if (aForce) {
|
|
|
|
widget->ClearCachedCursor();
|
|
|
|
}
|
2015-04-15 02:29:10 +03:00
|
|
|
if (mTabSetsCursor) {
|
|
|
|
widget->SetCursor(mCursor);
|
|
|
|
}
|
2011-06-22 04:32:43 +04:00
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-05-20 04:28:57 +03:00
|
|
|
bool
|
|
|
|
TabParent::RecvSetCustomCursor(const nsCString& aCursorData,
|
|
|
|
const uint32_t& aWidth,
|
|
|
|
const uint32_t& aHeight,
|
|
|
|
const uint32_t& aStride,
|
|
|
|
const uint8_t& aFormat,
|
|
|
|
const uint32_t& aHotspotX,
|
|
|
|
const uint32_t& aHotspotY,
|
|
|
|
const bool& aForce)
|
|
|
|
{
|
|
|
|
mCursor = nsCursor(-1);
|
|
|
|
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (widget) {
|
|
|
|
if (aForce) {
|
|
|
|
widget->ClearCachedCursor();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (mTabSetsCursor) {
|
2015-09-23 21:49:05 +03:00
|
|
|
const gfx::IntSize size(aWidth, aHeight);
|
2015-05-20 04:28:57 +03:00
|
|
|
|
2016-05-09 01:33:00 +03:00
|
|
|
RefPtr<gfx::DataSourceSurface> customCursor =
|
|
|
|
gfx::CreateDataSourceSurfaceFromData(size,
|
|
|
|
static_cast<gfx::SurfaceFormat>(aFormat),
|
|
|
|
reinterpret_cast<const uint8_t*>(aCursorData.BeginReading()),
|
|
|
|
aStride);
|
2015-05-20 04:28:57 +03:00
|
|
|
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<gfxDrawable> drawable = new gfxSurfaceDrawable(customCursor, size);
|
2015-05-20 04:28:57 +03:00
|
|
|
nsCOMPtr<imgIContainer> cursorImage(image::ImageOps::CreateFromDrawable(drawable));
|
|
|
|
widget->SetCursor(cursorImage, aHotspotX, aHotspotY);
|
|
|
|
mCustomCursor = cursorImage;
|
|
|
|
mCustomCursorHotspotX = aHotspotX;
|
|
|
|
mCustomCursorHotspotY = aHotspotY;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-01-23 00:27:23 +04:00
|
|
|
nsIXULBrowserWindow*
|
|
|
|
TabParent::GetXULBrowserWindow()
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIContent> frame = do_QueryInterface(mFrameElement);
|
|
|
|
if (!frame) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocShell> docShell = frame->OwnerDoc()->GetDocShell();
|
|
|
|
if (!docShell) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDocShellTreeOwner> treeOwner;
|
|
|
|
docShell->GetTreeOwner(getter_AddRefs(treeOwner));
|
|
|
|
if (!treeOwner) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIXULWindow> window = do_GetInterface(treeOwner);
|
|
|
|
if (!window) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIXULBrowserWindow> xulBrowserWindow;
|
|
|
|
window->GetXULBrowserWindow(getter_AddRefs(xulBrowserWindow));
|
|
|
|
return xulBrowserWindow;
|
|
|
|
}
|
|
|
|
|
2013-07-25 23:45:31 +04:00
|
|
|
bool
|
|
|
|
TabParent::RecvSetStatus(const uint32_t& aType, const nsString& aStatus)
|
|
|
|
{
|
2014-01-23 00:27:23 +04:00
|
|
|
nsCOMPtr<nsIXULBrowserWindow> xulBrowserWindow = GetXULBrowserWindow();
|
|
|
|
if (!xulBrowserWindow) {
|
|
|
|
return true;
|
2013-07-25 23:45:31 +04:00
|
|
|
}
|
2014-01-23 00:27:23 +04:00
|
|
|
|
|
|
|
switch (aType) {
|
|
|
|
case nsIWebBrowserChrome::STATUS_SCRIPT:
|
|
|
|
xulBrowserWindow->SetJSStatus(aStatus);
|
|
|
|
break;
|
|
|
|
case nsIWebBrowserChrome::STATUS_LINK:
|
|
|
|
xulBrowserWindow->SetOverLink(aStatus, nullptr);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2016-04-12 23:47:25 +03:00
|
|
|
TabParent::RecvShowTooltip(const uint32_t& aX, const uint32_t& aY, const nsString& aTooltip,
|
|
|
|
const nsString& aDirection)
|
2014-01-23 00:27:23 +04:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIXULBrowserWindow> xulBrowserWindow = GetXULBrowserWindow();
|
|
|
|
if (!xulBrowserWindow) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2016-04-12 23:47:25 +03:00
|
|
|
xulBrowserWindow->ShowTooltip(aX, aY, aTooltip, aDirection);
|
2014-01-23 00:27:23 +04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::RecvHideTooltip()
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIXULBrowserWindow> xulBrowserWindow = GetXULBrowserWindow();
|
|
|
|
if (!xulBrowserWindow) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
xulBrowserWindow->HideTooltip();
|
2013-07-25 23:45:31 +04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2010-09-24 07:28:15 +04:00
|
|
|
bool
|
2015-07-17 07:30:01 +03:00
|
|
|
TabParent::RecvNotifyIMEFocus(const ContentCache& aContentCache,
|
|
|
|
const IMENotification& aIMENotification,
|
2015-05-28 07:51:40 +03:00
|
|
|
nsIMEUpdatePreference* aPreference)
|
2010-09-24 07:28:15 +04:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
2012-11-13 17:04:44 +04:00
|
|
|
if (!widget) {
|
2014-02-26 04:48:02 +04:00
|
|
|
*aPreference = nsIMEUpdatePreference();
|
2010-09-24 07:28:15 +04:00
|
|
|
return true;
|
2012-11-13 17:04:44 +04:00
|
|
|
}
|
2010-09-24 07:28:15 +04:00
|
|
|
|
2015-07-17 07:30:01 +03:00
|
|
|
mContentCache.AssignContent(aContentCache, &aIMENotification);
|
|
|
|
IMEStateManager::NotifyIME(aIMENotification, widget, true);
|
2010-09-24 07:28:15 +04:00
|
|
|
|
2015-07-17 07:30:01 +03:00
|
|
|
if (aIMENotification.mMessage == NOTIFY_IME_OF_FOCUS) {
|
2012-11-13 17:04:44 +04:00
|
|
|
*aPreference = widget->GetIMEUpdatePreference();
|
2010-09-24 07:28:15 +04:00
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2015-06-05 12:28:20 +03:00
|
|
|
TabParent::RecvNotifyIMETextChange(const ContentCache& aContentCache,
|
2015-07-17 07:30:01 +03:00
|
|
|
const IMENotification& aIMENotification)
|
2010-09-24 07:28:15 +04:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget)
|
|
|
|
return true;
|
|
|
|
|
2014-02-26 04:48:02 +04:00
|
|
|
#ifdef DEBUG
|
|
|
|
nsIMEUpdatePreference updatePreference = widget->GetIMEUpdatePreference();
|
|
|
|
NS_ASSERTION(updatePreference.WantTextChange(),
|
2014-01-29 13:32:39 +04:00
|
|
|
"Don't call Send/RecvNotifyIMETextChange without NOTIFY_TEXT_CHANGE");
|
2016-01-28 07:28:53 +03:00
|
|
|
MOZ_ASSERT(!aIMENotification.mTextChangeData.mCausedOnlyByComposition ||
|
2014-02-26 04:48:02 +04:00
|
|
|
updatePreference.WantChangesCausedByComposition(),
|
|
|
|
"The widget doesn't want text change notification caused by composition");
|
|
|
|
#endif
|
2014-01-29 13:32:39 +04:00
|
|
|
|
2015-07-17 07:30:01 +03:00
|
|
|
mContentCache.AssignContent(aContentCache, &aIMENotification);
|
|
|
|
mContentCache.MaybeNotifyIME(widget, aIMENotification);
|
2010-09-24 07:28:15 +04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2013-11-07 04:11:11 +04:00
|
|
|
bool
|
2015-07-17 07:30:01 +03:00
|
|
|
TabParent::RecvNotifyIMECompositionUpdate(
|
|
|
|
const ContentCache& aContentCache,
|
|
|
|
const IMENotification& aIMENotification)
|
2013-11-07 04:11:11 +04:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return true;
|
|
|
|
}
|
2015-06-05 12:28:20 +03:00
|
|
|
|
2015-07-17 07:30:01 +03:00
|
|
|
mContentCache.AssignContent(aContentCache, &aIMENotification);
|
|
|
|
mContentCache.MaybeNotifyIME(widget, aIMENotification);
|
2013-11-07 04:11:11 +04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2010-09-24 07:28:15 +04:00
|
|
|
bool
|
2015-06-05 12:28:20 +03:00
|
|
|
TabParent::RecvNotifyIMESelection(const ContentCache& aContentCache,
|
2015-07-17 07:30:01 +03:00
|
|
|
const IMENotification& aIMENotification)
|
2010-09-24 07:28:15 +04:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget)
|
|
|
|
return true;
|
|
|
|
|
2015-07-17 07:30:01 +03:00
|
|
|
mContentCache.AssignContent(aContentCache, &aIMENotification);
|
2015-10-10 04:21:01 +03:00
|
|
|
mContentCache.MaybeNotifyIME(widget, aIMENotification);
|
2010-09-24 07:28:15 +04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2015-06-05 12:28:20 +03:00
|
|
|
TabParent::RecvUpdateContentCache(const ContentCache& aContentCache)
|
2010-09-24 07:28:15 +04:00
|
|
|
{
|
2015-06-05 12:28:20 +03:00
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-06-05 12:28:20 +03:00
|
|
|
mContentCache.AssignContent(aContentCache);
|
2010-09-24 07:28:15 +04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-09-11 17:46:17 +04:00
|
|
|
bool
|
|
|
|
TabParent::RecvNotifyIMEMouseButtonEvent(
|
|
|
|
const IMENotification& aIMENotification,
|
|
|
|
bool* aConsumedByIME)
|
|
|
|
{
|
|
|
|
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
*aConsumedByIME = false;
|
|
|
|
return true;
|
|
|
|
}
|
2015-06-27 03:23:31 +03:00
|
|
|
nsresult rv = IMEStateManager::NotifyIME(aIMENotification, widget, true);
|
2014-09-11 17:46:17 +04:00
|
|
|
*aConsumedByIME = rv == NS_SUCCESS_EVENT_CONSUMED;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-12-15 12:37:00 +03:00
|
|
|
bool
|
2015-07-17 07:30:01 +03:00
|
|
|
TabParent::RecvNotifyIMEPositionChange(const ContentCache& aContentCache,
|
|
|
|
const IMENotification& aIMENotification)
|
2014-12-15 12:37:00 +03:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-07-17 07:30:01 +03:00
|
|
|
mContentCache.AssignContent(aContentCache, &aIMENotification);
|
2015-10-10 04:21:01 +03:00
|
|
|
mContentCache.MaybeNotifyIME(widget, aIMENotification);
|
2014-12-15 12:37:00 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-07-11 04:53:55 +03:00
|
|
|
bool
|
2015-08-26 15:56:59 +03:00
|
|
|
TabParent::RecvOnEventNeedingAckHandled(const EventMessage& aMessage)
|
2015-07-11 04:53:55 +03:00
|
|
|
{
|
|
|
|
// This is called when the child process receives WidgetCompositionEvent or
|
|
|
|
// WidgetSelectionEvent.
|
2015-07-11 04:53:55 +03:00
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-07-22 08:51:36 +03:00
|
|
|
// While calling OnEventNeedingAckHandled(), TabParent *might* be destroyed
|
2015-07-11 04:53:55 +03:00
|
|
|
// since it may send notifications to IME.
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<TabParent> kungFuDeathGrip(this);
|
2015-07-22 08:51:36 +03:00
|
|
|
mContentCache.OnEventNeedingAckHandled(widget, aMessage);
|
2015-07-11 04:53:55 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
Bug 1257759 part.5 PluginInstanceChild should post received native key event to chrome process if the key combination may be a shortcut key r=jimm
When PluginInstanceChild receives native key events, it should post the events to the chrome process first for checking if the key combination is reserved. However, posting all key events to the chrome process may make damage to the performance of text input. Therefore, this patch starts to post a key event whose key combination may be a shortcut key. However, for avoiding to shuffle the event order, it posts following key events until all posted key events are handled by the chrome process.
For receiving response from widget, this patch defines nsIKeyEventInPluginCallback. It's specified by nsIWidget::OnWindowedPluginKeyEvent() for ensuring the caller will receive the reply. Basically, the caller of nsIWidget::OnWindowedPluginKeyEvent() should reply to the child process. However, if the widget is a PuppetWidget, it cannot return the result synchronously. Therefore, PuppetWidget::OnWindowedPluginKeyEvent() returns NS_SUCCESS_EVENT_HANDLED_ASYNCHRONOUSLY and stores the callback to mKeyEventInPluginCallbacks. Then, TabParent::HandledWindowedPluginKeyEvent() will call PuppetWidget::HandledWindowedPluginKeyEvent().
MozReview-Commit-ID: G6brOU26NwQ
--HG--
extra : rebase_source : 8140456de278956d2d594e85c7b397ae366b4962
2016-04-19 14:09:37 +03:00
|
|
|
void
|
|
|
|
TabParent::HandledWindowedPluginKeyEvent(const NativeEventData& aKeyEventData,
|
|
|
|
bool aIsConsumed)
|
|
|
|
{
|
|
|
|
bool ok = SendHandledWindowedPluginKeyEvent(aKeyEventData, aIsConsumed);
|
|
|
|
NS_WARN_IF(!ok);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::RecvOnWindowedPluginKeyEvent(const NativeEventData& aKeyEventData)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (NS_WARN_IF(!widget)) {
|
|
|
|
// Notifies the plugin process of the key event being not consumed by us.
|
|
|
|
HandledWindowedPluginKeyEvent(aKeyEventData, false);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
nsresult rv = widget->OnWindowedPluginKeyEvent(aKeyEventData, this);
|
|
|
|
if (NS_WARN_IF(NS_FAILED(rv))) {
|
|
|
|
// Notifies the plugin process of the key event being not consumed by us.
|
|
|
|
HandledWindowedPluginKeyEvent(aKeyEventData, false);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// If the key event is posted to another process, we need to wait a call
|
|
|
|
// of HandledWindowedPluginKeyEvent(). So, nothing to do here in this case.
|
|
|
|
if (rv == NS_SUCCESS_EVENT_HANDLED_ASYNCHRONOUSLY) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Otherwise, the key event is handled synchronously. Let's notify the
|
|
|
|
// plugin process of the key event's result.
|
|
|
|
bool consumed = (rv == NS_SUCCESS_EVENT_CONSUMED);
|
|
|
|
HandledWindowedPluginKeyEvent(aKeyEventData, consumed);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2013-09-21 02:07:51 +04:00
|
|
|
bool
|
|
|
|
TabParent::RecvRequestFocus(const bool& aCanRaise)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIFocusManager> fm = nsFocusManager::GetFocusManager();
|
|
|
|
if (!fm) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIContent> content = do_QueryInterface(mFrameElement);
|
|
|
|
if (!content || !content->OwnerDoc()) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint32_t flags = nsIFocusManager::FLAG_NOSCROLL;
|
|
|
|
if (aCanRaise)
|
|
|
|
flags |= nsIFocusManager::FLAG_RAISE;
|
|
|
|
|
|
|
|
nsCOMPtr<nsIDOMElement> node = do_QueryInterface(mFrameElement);
|
|
|
|
fm->SetFocus(node, flags);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-12-09 18:48:27 +03:00
|
|
|
bool
|
|
|
|
TabParent::RecvEnableDisableCommands(const nsString& aAction,
|
2015-01-16 22:58:52 +03:00
|
|
|
nsTArray<nsCString>&& aEnabledCommands,
|
|
|
|
nsTArray<nsCString>&& aDisabledCommands)
|
2014-12-09 18:48:27 +03:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIRemoteBrowser> remoteBrowser = do_QueryInterface(mFrameElement);
|
|
|
|
if (remoteBrowser) {
|
2015-11-03 21:29:19 +03:00
|
|
|
UniquePtr<const char*[]> enabledCommands, disabledCommands;
|
2014-12-09 18:48:27 +03:00
|
|
|
|
|
|
|
if (aEnabledCommands.Length()) {
|
2015-11-03 21:29:19 +03:00
|
|
|
enabledCommands = MakeUnique<const char*[]>(aEnabledCommands.Length());
|
2014-12-09 18:48:27 +03:00
|
|
|
for (uint32_t c = 0; c < aEnabledCommands.Length(); c++) {
|
|
|
|
enabledCommands[c] = aEnabledCommands[c].get();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (aDisabledCommands.Length()) {
|
2015-11-03 21:29:19 +03:00
|
|
|
disabledCommands = MakeUnique<const char*[]>(aDisabledCommands.Length());
|
2014-12-09 18:48:27 +03:00
|
|
|
for (uint32_t c = 0; c < aDisabledCommands.Length(); c++) {
|
|
|
|
disabledCommands[c] = aDisabledCommands[c].get();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
remoteBrowser->EnableDisableCommands(aAction,
|
2015-11-03 21:29:19 +03:00
|
|
|
aEnabledCommands.Length(), enabledCommands.get(),
|
|
|
|
aDisabledCommands.Length(), disabledCommands.get());
|
2014-12-09 18:48:27 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-02-17 05:41:49 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
TabParent::GetChildProcessOffset(int32_t* aOutCssX, int32_t* aOutCssY)
|
|
|
|
{
|
|
|
|
NS_ENSURE_ARG(aOutCssX);
|
|
|
|
NS_ENSURE_ARG(aOutCssY);
|
|
|
|
CSSPoint offset = LayoutDevicePoint(GetChildProcessOffset())
|
|
|
|
* GetLayoutDeviceToCSSScale();
|
|
|
|
*aOutCssX = offset.x;
|
|
|
|
*aOutCssY = offset.y;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2015-02-15 21:52:28 +03:00
|
|
|
LayoutDeviceIntPoint
|
2013-11-22 06:58:20 +04:00
|
|
|
TabParent::GetChildProcessOffset()
|
|
|
|
{
|
|
|
|
// The "toplevel widget" in child processes is always at position
|
|
|
|
// 0,0. Map the event coordinates to match that.
|
|
|
|
|
2015-02-15 21:52:28 +03:00
|
|
|
LayoutDeviceIntPoint offset(0, 0);
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsFrameLoader> frameLoader = GetFrameLoader();
|
2013-11-22 06:58:20 +04:00
|
|
|
if (!frameLoader) {
|
|
|
|
return offset;
|
|
|
|
}
|
|
|
|
nsIFrame* targetFrame = frameLoader->GetPrimaryFrameOfOwningContent();
|
|
|
|
if (!targetFrame) {
|
|
|
|
return offset;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Find out how far we're offset from the nearest widget.
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return offset;
|
|
|
|
}
|
|
|
|
nsPoint pt = nsLayoutUtils::GetEventCoordinatesRelativeTo(widget,
|
2015-02-02 01:27:31 +03:00
|
|
|
LayoutDeviceIntPoint(0, 0),
|
2013-11-22 06:58:20 +04:00
|
|
|
targetFrame);
|
|
|
|
|
2015-02-15 21:52:28 +03:00
|
|
|
return LayoutDeviceIntPoint::FromAppUnitsToNearest(
|
|
|
|
pt, targetFrame->PresContext()->AppUnitsPerDevPixel());
|
2013-11-22 06:58:20 +04:00
|
|
|
}
|
|
|
|
|
2014-03-18 19:16:47 +04:00
|
|
|
bool
|
|
|
|
TabParent::RecvReplyKeyEvent(const WidgetKeyboardEvent& event)
|
|
|
|
{
|
|
|
|
NS_ENSURE_TRUE(mFrameElement, true);
|
|
|
|
|
|
|
|
WidgetKeyboardEvent localEvent(event);
|
2016-03-22 10:01:46 +03:00
|
|
|
// Mark the event as not to be dispatched to remote process again.
|
|
|
|
localEvent.StopCrossProcessForwarding();
|
2014-03-18 19:16:47 +04:00
|
|
|
|
|
|
|
// Here we convert the WidgetEvent that we received to an nsIDOMEvent
|
|
|
|
// to be able to dispatch it to the <browser> element as the target element.
|
|
|
|
nsIDocument* doc = mFrameElement->OwnerDoc();
|
|
|
|
nsIPresShell* presShell = doc->GetShell();
|
|
|
|
NS_ENSURE_TRUE(presShell, true);
|
|
|
|
nsPresContext* presContext = presShell->GetPresContext();
|
|
|
|
NS_ENSURE_TRUE(presContext, true);
|
|
|
|
|
|
|
|
EventDispatcher::Dispatch(mFrameElement, presContext, &localEvent);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-11-03 10:05:38 +03:00
|
|
|
bool
|
|
|
|
TabParent::RecvDispatchAfterKeyboardEvent(const WidgetKeyboardEvent& aEvent)
|
|
|
|
{
|
|
|
|
NS_ENSURE_TRUE(mFrameElement, true);
|
|
|
|
|
|
|
|
WidgetKeyboardEvent localEvent(aEvent);
|
2016-04-14 11:03:14 +03:00
|
|
|
localEvent.mWidget = GetWidget();
|
2014-11-03 10:05:38 +03:00
|
|
|
|
|
|
|
nsIDocument* doc = mFrameElement->OwnerDoc();
|
|
|
|
nsCOMPtr<nsIPresShell> presShell = doc->GetShell();
|
|
|
|
NS_ENSURE_TRUE(presShell, true);
|
|
|
|
|
|
|
|
if (mFrameElement &&
|
|
|
|
PresShell::BeforeAfterKeyboardEventEnabled() &&
|
2015-08-29 02:58:27 +03:00
|
|
|
localEvent.mMessage != eKeyPress) {
|
2014-11-03 10:05:38 +03:00
|
|
|
presShell->DispatchAfterKeyboardEvent(mFrameElement, localEvent,
|
2016-03-22 10:47:52 +03:00
|
|
|
aEvent.DefaultPrevented());
|
2014-11-03 10:05:38 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2016-05-11 15:56:42 +03:00
|
|
|
bool
|
|
|
|
TabParent::RecvAccessKeyNotHandled(const WidgetKeyboardEvent& aEvent)
|
|
|
|
{
|
|
|
|
NS_ENSURE_TRUE(mFrameElement, true);
|
|
|
|
|
|
|
|
WidgetKeyboardEvent localEvent(aEvent);
|
|
|
|
localEvent.mMessage = eAccessKeyNotFound;
|
|
|
|
localEvent.mAccessKeyForwardedToChild = false;
|
|
|
|
|
|
|
|
// Here we convert the WidgetEvent that we received to an nsIDOMEvent
|
|
|
|
// to be able to dispatch it to the <browser> element as the target element.
|
|
|
|
nsIDocument* doc = mFrameElement->OwnerDoc();
|
|
|
|
nsIPresShell* presShell = doc->GetShell();
|
|
|
|
NS_ENSURE_TRUE(presShell, true);
|
|
|
|
|
|
|
|
if (presShell->CanDispatchEvent()) {
|
|
|
|
nsPresContext* presContext = presShell->GetPresContext();
|
|
|
|
NS_ENSURE_TRUE(presContext, true);
|
|
|
|
|
|
|
|
EventDispatcher::Dispatch(mFrameElement, presContext, &localEvent);
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2010-09-24 07:28:15 +04:00
|
|
|
bool
|
2013-10-01 11:23:00 +04:00
|
|
|
TabParent::HandleQueryContentEvent(WidgetQueryContentEvent& aEvent)
|
2010-09-24 07:28:15 +04:00
|
|
|
{
|
2015-06-05 12:28:19 +03:00
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
if (NS_WARN_IF(!mContentCache.HandleQueryContentEvent(aEvent, widget)) ||
|
|
|
|
NS_WARN_IF(!aEvent.mSucceeded)) {
|
|
|
|
return true;
|
|
|
|
}
|
2015-08-22 04:34:51 +03:00
|
|
|
switch (aEvent.mMessage) {
|
2015-09-11 15:21:26 +03:00
|
|
|
case eQueryTextRect:
|
2015-09-10 04:40:06 +03:00
|
|
|
case eQueryCaretRect:
|
2015-09-10 04:40:06 +03:00
|
|
|
case eQueryEditorRect:
|
2015-06-05 12:28:19 +03:00
|
|
|
aEvent.mReply.mRect -= GetChildProcessOffset();
|
2015-06-05 12:28:19 +03:00
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
2010-09-24 07:28:15 +04:00
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2010-09-24 07:34:26 +04:00
|
|
|
bool
|
2013-10-01 11:23:00 +04:00
|
|
|
TabParent::SendCompositionEvent(WidgetCompositionEvent& event)
|
2010-09-24 07:34:26 +04:00
|
|
|
{
|
2012-11-10 10:09:24 +04:00
|
|
|
if (mIsDestroyed) {
|
|
|
|
return false;
|
|
|
|
}
|
2014-10-07 14:01:50 +04:00
|
|
|
|
2015-06-05 12:28:19 +03:00
|
|
|
if (!mContentCache.OnCompositionEvent(event)) {
|
2010-09-24 07:34:26 +04:00
|
|
|
return true;
|
2015-02-17 05:30:55 +03:00
|
|
|
}
|
2010-09-24 07:34:26 +04:00
|
|
|
return PBrowserParent::SendCompositionEvent(event);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2013-10-01 11:23:01 +04:00
|
|
|
TabParent::SendSelectionEvent(WidgetSelectionEvent& event)
|
2010-09-24 07:34:26 +04:00
|
|
|
{
|
2012-11-10 10:09:24 +04:00
|
|
|
if (mIsDestroyed) {
|
|
|
|
return false;
|
|
|
|
}
|
2015-06-05 12:28:20 +03:00
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return true;
|
|
|
|
}
|
2015-07-11 04:53:55 +03:00
|
|
|
mContentCache.OnSelectionEvent(event);
|
2015-07-17 05:25:00 +03:00
|
|
|
if (NS_WARN_IF(!PBrowserParent::SendSelectionEvent(event))) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
event.mSucceeded = true;
|
|
|
|
return true;
|
2010-09-24 07:34:26 +04:00
|
|
|
}
|
|
|
|
|
2012-06-23 05:27:30 +04:00
|
|
|
/*static*/ TabParent*
|
|
|
|
TabParent::GetFrom(nsFrameLoader* aFrameLoader)
|
|
|
|
{
|
|
|
|
if (!aFrameLoader) {
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2012-06-23 05:27:30 +04:00
|
|
|
}
|
|
|
|
PBrowserParent* remoteBrowser = aFrameLoader->GetRemoteBrowser();
|
|
|
|
return static_cast<TabParent*>(remoteBrowser);
|
|
|
|
}
|
|
|
|
|
2015-02-06 00:47:32 +03:00
|
|
|
/*static*/ TabParent*
|
|
|
|
TabParent::GetFrom(nsIFrameLoader* aFrameLoader)
|
|
|
|
{
|
|
|
|
if (!aFrameLoader)
|
|
|
|
return nullptr;
|
|
|
|
return GetFrom(static_cast<nsFrameLoader*>(aFrameLoader));
|
|
|
|
}
|
|
|
|
|
|
|
|
/*static*/ TabParent*
|
|
|
|
TabParent::GetFrom(nsITabParent* aTabParent)
|
|
|
|
{
|
|
|
|
return static_cast<TabParent*>(aTabParent);
|
|
|
|
}
|
|
|
|
|
|
|
|
/*static*/ TabParent*
|
|
|
|
TabParent::GetFrom(PBrowserParent* aTabParent)
|
|
|
|
{
|
|
|
|
return static_cast<TabParent*>(aTabParent);
|
|
|
|
}
|
|
|
|
|
2012-06-23 05:27:30 +04:00
|
|
|
/*static*/ TabParent*
|
|
|
|
TabParent::GetFrom(nsIContent* aContent)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIFrameLoaderOwner> loaderOwner = do_QueryInterface(aContent);
|
|
|
|
if (!loaderOwner) {
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2012-06-23 05:27:30 +04:00
|
|
|
}
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsFrameLoader> frameLoader = loaderOwner->GetFrameLoader();
|
2012-06-23 05:27:30 +04:00
|
|
|
return GetFrom(frameLoader);
|
|
|
|
}
|
|
|
|
|
2014-10-29 21:11:00 +03:00
|
|
|
/*static*/ TabId
|
|
|
|
TabParent::GetTabIdFrom(nsIDocShell *docShell)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsITabChild> tabChild(TabChild::GetFrom(docShell));
|
|
|
|
if (tabChild) {
|
|
|
|
return static_cast<TabChild*>(tabChild.get())->GetTabId();
|
|
|
|
}
|
|
|
|
return TabId(0);
|
|
|
|
}
|
|
|
|
|
2012-07-20 10:48:27 +04:00
|
|
|
RenderFrameParent*
|
|
|
|
TabParent::GetRenderFrame()
|
|
|
|
{
|
2015-12-22 18:14:23 +03:00
|
|
|
PRenderFrameParent* p = LoneManagedOrNullAsserts(ManagedPRenderFrameParent());
|
2015-10-08 03:15:56 +03:00
|
|
|
return static_cast<RenderFrameParent*>(p);
|
2012-07-20 10:48:27 +04:00
|
|
|
}
|
|
|
|
|
2010-09-24 07:28:15 +04:00
|
|
|
bool
|
2015-12-11 09:15:58 +03:00
|
|
|
TabParent::RecvRequestIMEToCommitComposition(const bool& aCancel,
|
|
|
|
bool* aIsCommitted,
|
|
|
|
nsString* aCommittedString)
|
2010-09-24 07:28:15 +04:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
2015-06-05 12:28:19 +03:00
|
|
|
if (!widget) {
|
2015-12-11 09:15:58 +03:00
|
|
|
*aIsCommitted = false;
|
2010-09-24 07:28:15 +04:00
|
|
|
return true;
|
2015-06-05 12:28:19 +03:00
|
|
|
}
|
2015-12-11 09:15:58 +03:00
|
|
|
|
|
|
|
*aIsCommitted =
|
|
|
|
mContentCache.RequestIMEToCommitComposition(widget, aCancel,
|
|
|
|
*aCommittedString);
|
2010-09-24 07:28:15 +04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-02-20 19:37:02 +03:00
|
|
|
bool
|
|
|
|
TabParent::RecvStartPluginIME(const WidgetKeyboardEvent& aKeyboardEvent,
|
|
|
|
const int32_t& aPanelX, const int32_t& aPanelY,
|
|
|
|
nsString* aCommitted)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
widget->StartPluginIME(aKeyboardEvent,
|
2015-12-22 06:08:56 +03:00
|
|
|
(int32_t&)aPanelX,
|
2015-02-20 19:37:02 +03:00
|
|
|
(int32_t&)aPanelY,
|
|
|
|
*aCommitted);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::RecvSetPluginFocused(const bool& aFocused)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
widget->SetPluginFocused((bool&)aFocused);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-12-29 16:57:38 +03:00
|
|
|
bool
|
2016-02-02 11:05:56 +03:00
|
|
|
TabParent::RecvSetCandidateWindowForPlugin(
|
|
|
|
const CandidateWindowPosition& aPosition)
|
2015-12-29 16:57:38 +03:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2016-02-02 11:05:56 +03:00
|
|
|
widget->SetCandidateWindowForPlugin(aPosition);
|
2015-12-29 16:57:38 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-12-29 16:57:38 +03:00
|
|
|
bool
|
|
|
|
TabParent::RecvDefaultProcOfPluginEvent(const WidgetPluginEvent& aEvent)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
widget->DefaultProcOfPluginEvent(aEvent);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2010-09-24 07:28:15 +04:00
|
|
|
bool
|
2012-08-22 19:56:38 +04:00
|
|
|
TabParent::RecvGetInputContext(int32_t* aIMEEnabled,
|
2015-12-11 09:15:57 +03:00
|
|
|
int32_t* aIMEOpen)
|
2010-09-24 07:28:15 +04:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
2011-06-30 01:24:47 +04:00
|
|
|
if (!widget) {
|
2011-11-27 15:51:53 +04:00
|
|
|
*aIMEEnabled = IMEState::DISABLED;
|
|
|
|
*aIMEOpen = IMEState::OPEN_STATE_NOT_SUPPORTED;
|
2010-11-23 09:48:45 +03:00
|
|
|
return true;
|
2011-06-30 01:24:47 +04:00
|
|
|
}
|
2010-11-23 09:48:45 +03:00
|
|
|
|
2011-11-27 15:51:52 +04:00
|
|
|
InputContext context = widget->GetInputContext();
|
2012-08-22 19:56:38 +04:00
|
|
|
*aIMEEnabled = static_cast<int32_t>(context.mIMEState.mEnabled);
|
|
|
|
*aIMEOpen = static_cast<int32_t>(context.mIMEState.mOpen);
|
2010-09-24 07:28:15 +04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2012-08-22 19:56:38 +04:00
|
|
|
TabParent::RecvSetInputContext(const int32_t& aIMEEnabled,
|
|
|
|
const int32_t& aIMEOpen,
|
2011-11-27 15:51:52 +04:00
|
|
|
const nsString& aType,
|
2012-08-27 06:16:22 +04:00
|
|
|
const nsString& aInputmode,
|
2011-11-27 15:51:52 +04:00
|
|
|
const nsString& aActionHint,
|
2012-08-22 19:56:38 +04:00
|
|
|
const int32_t& aCause,
|
|
|
|
const int32_t& aFocusChange)
|
2010-09-24 07:28:15 +04:00
|
|
|
{
|
2011-11-27 15:51:52 +04:00
|
|
|
InputContext context;
|
2011-11-27 15:51:53 +04:00
|
|
|
context.mIMEState.mEnabled = static_cast<IMEState::Enabled>(aIMEEnabled);
|
|
|
|
context.mIMEState.mOpen = static_cast<IMEState::Open>(aIMEOpen);
|
2010-11-23 09:48:03 +03:00
|
|
|
context.mHTMLInputType.Assign(aType);
|
2012-08-27 06:16:22 +04:00
|
|
|
context.mHTMLInputInputmode.Assign(aInputmode);
|
2011-11-27 15:51:52 +04:00
|
|
|
context.mActionHint.Assign(aActionHint);
|
2014-08-28 09:06:41 +04:00
|
|
|
context.mOrigin = InputContext::ORIGIN_CONTENT;
|
|
|
|
|
2011-11-27 15:51:52 +04:00
|
|
|
InputContextAction action(
|
|
|
|
static_cast<InputContextAction::Cause>(aCause),
|
|
|
|
static_cast<InputContextAction::FocusChange>(aFocusChange));
|
2010-11-23 09:48:03 +03:00
|
|
|
|
2015-07-01 16:19:11 +03:00
|
|
|
IMEStateManager::SetInputContextForChildProcess(this, context, action);
|
2010-10-18 20:37:00 +04:00
|
|
|
|
2010-09-24 07:28:15 +04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-04-05 01:50:42 +04:00
|
|
|
bool
|
|
|
|
TabParent::RecvIsParentWindowMainWidgetVisible(bool* aIsVisible)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIContent> frame = do_QueryInterface(mFrameElement);
|
|
|
|
if (!frame)
|
|
|
|
return true;
|
|
|
|
nsCOMPtr<nsIDOMWindowUtils> windowUtils =
|
|
|
|
do_QueryInterface(frame->OwnerDoc()->GetWindow());
|
|
|
|
nsresult rv = windowUtils->GetIsParentWindowMainWidgetVisible(aIsVisible);
|
|
|
|
return NS_SUCCEEDED(rv);
|
|
|
|
}
|
|
|
|
|
2010-12-03 04:24:04 +03:00
|
|
|
bool
|
|
|
|
TabParent::RecvGetDPI(float* aValue)
|
|
|
|
{
|
2013-05-02 03:06:19 +04:00
|
|
|
TryCacheDPIAndScale();
|
2012-05-08 20:20:35 +04:00
|
|
|
|
2015-02-10 01:34:50 +03:00
|
|
|
MOZ_ASSERT(mDPI > 0,
|
|
|
|
"Must not ask for DPI before OwnerElement is received!");
|
2010-12-09 21:57:05 +03:00
|
|
|
*aValue = mDPI;
|
2010-12-03 04:24:04 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2013-05-02 03:06:19 +04:00
|
|
|
bool
|
|
|
|
TabParent::RecvGetDefaultScale(double* aValue)
|
|
|
|
{
|
|
|
|
TryCacheDPIAndScale();
|
|
|
|
|
2015-02-10 01:34:50 +03:00
|
|
|
MOZ_ASSERT(mDefaultScale.scale > 0,
|
|
|
|
"Must not ask for scale before OwnerElement is received!");
|
2013-09-18 04:45:19 +04:00
|
|
|
*aValue = mDefaultScale.scale;
|
2013-05-02 03:06:19 +04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-05-08 04:29:00 +03:00
|
|
|
bool
|
|
|
|
TabParent::RecvGetMaxTouchPoints(uint32_t* aTouchPoints)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (widget) {
|
|
|
|
*aTouchPoints = widget->GetMaxTouchPoints();
|
|
|
|
} else {
|
|
|
|
*aTouchPoints = 0;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-07-09 17:48:57 +03:00
|
|
|
already_AddRefed<nsIWidget>
|
|
|
|
TabParent::GetTopLevelWidget()
|
2011-07-22 04:49:35 +04:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIContent> content = do_QueryInterface(mFrameElement);
|
|
|
|
if (content) {
|
2011-10-18 15:19:44 +04:00
|
|
|
nsIPresShell* shell = content->OwnerDoc()->GetShell();
|
|
|
|
if (shell) {
|
2013-01-05 07:12:24 +04:00
|
|
|
nsViewManager* vm = shell->GetViewManager();
|
2011-10-18 15:19:44 +04:00
|
|
|
nsCOMPtr<nsIWidget> widget;
|
|
|
|
vm->GetRootWidget(getter_AddRefs(widget));
|
2015-07-09 17:48:57 +03:00
|
|
|
return widget.forget();
|
2011-07-22 04:49:35 +04:00
|
|
|
}
|
|
|
|
}
|
2015-07-09 17:48:57 +03:00
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::RecvGetWidgetNativeData(WindowsHandle* aValue)
|
|
|
|
{
|
|
|
|
*aValue = 0;
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetTopLevelWidget();
|
|
|
|
if (widget) {
|
|
|
|
*aValue = reinterpret_cast<WindowsHandle>(
|
|
|
|
widget->GetNativeData(NS_NATIVE_SHAREABLE_WINDOW));
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-08-12 18:00:26 +03:00
|
|
|
bool
|
|
|
|
TabParent::RecvSetNativeChildOfShareableWindow(const uintptr_t& aChildWindow)
|
|
|
|
{
|
|
|
|
#if defined(XP_WIN)
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetTopLevelWidget();
|
|
|
|
if (widget) {
|
|
|
|
// Note that this call will probably cause a sync native message to the
|
|
|
|
// process that owns the child window.
|
|
|
|
widget->SetNativeData(NS_NATIVE_CHILD_OF_SHAREABLE_WINDOW, aChildWindow);
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
#else
|
|
|
|
NS_NOTREACHED(
|
|
|
|
"TabParent::RecvSetNativeChildOfShareableWindow not implemented!");
|
|
|
|
return false;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2015-07-09 17:48:57 +03:00
|
|
|
bool
|
|
|
|
TabParent::RecvDispatchFocusToTopLevelWindow()
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetTopLevelWidget();
|
|
|
|
if (widget) {
|
|
|
|
widget->SetFocus(false);
|
|
|
|
}
|
2015-01-30 19:37:03 +03:00
|
|
|
return true;
|
2011-07-22 04:49:35 +04:00
|
|
|
}
|
|
|
|
|
2010-03-30 00:29:45 +04:00
|
|
|
bool
|
|
|
|
TabParent::ReceiveMessage(const nsString& aMessage,
|
2011-09-29 10:19:26 +04:00
|
|
|
bool aSync,
|
2015-09-10 23:50:58 +03:00
|
|
|
StructuredCloneData* aData,
|
2013-07-11 02:05:39 +04:00
|
|
|
CpowHolder* aCpows,
|
2013-11-06 21:21:15 +04:00
|
|
|
nsIPrincipal* aPrincipal,
|
2015-09-10 23:50:58 +03:00
|
|
|
nsTArray<StructuredCloneData>* aRetVal)
|
2010-02-20 20:05:20 +03:00
|
|
|
{
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsFrameLoader> frameLoader = GetFrameLoader(true);
|
2010-08-06 02:11:23 +04:00
|
|
|
if (frameLoader && frameLoader->GetFrameMessageManager()) {
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsFrameMessageManager> manager =
|
2011-06-16 22:21:08 +04:00
|
|
|
frameLoader->GetFrameMessageManager();
|
2010-08-06 02:11:23 +04:00
|
|
|
|
|
|
|
manager->ReceiveMessage(mFrameElement,
|
2015-04-16 18:17:54 +03:00
|
|
|
frameLoader,
|
2010-08-06 02:11:23 +04:00
|
|
|
aMessage,
|
|
|
|
aSync,
|
2015-09-10 23:50:58 +03:00
|
|
|
aData,
|
2013-07-11 02:05:39 +04:00
|
|
|
aCpows,
|
2013-11-06 21:21:15 +04:00
|
|
|
aPrincipal,
|
2015-04-30 06:39:59 +03:00
|
|
|
aRetVal);
|
2010-02-20 20:05:20 +03:00
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2010-06-25 02:20:42 +04:00
|
|
|
// nsIAuthPromptProvider
|
|
|
|
|
|
|
|
// This method is largely copied from nsDocShell::GetAuthPrompt
|
|
|
|
NS_IMETHODIMP
|
2012-08-22 19:56:38 +04:00
|
|
|
TabParent::GetAuthPrompt(uint32_t aPromptReason, const nsIID& iid,
|
2010-06-25 02:20:42 +04:00
|
|
|
void** aResult)
|
|
|
|
{
|
|
|
|
// we're either allowing auth, or it's a proxy request
|
|
|
|
nsresult rv;
|
|
|
|
nsCOMPtr<nsIPromptFactory> wwatch =
|
|
|
|
do_GetService(NS_WINDOWWATCHER_CONTRACTID, &rv);
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
2016-01-30 20:05:36 +03:00
|
|
|
nsCOMPtr<nsPIDOMWindowOuter> window;
|
2010-06-25 02:20:42 +04:00
|
|
|
nsCOMPtr<nsIContent> frame = do_QueryInterface(mFrameElement);
|
|
|
|
if (frame)
|
2016-01-30 20:05:36 +03:00
|
|
|
window = frame->OwnerDoc()->GetWindow();
|
2010-06-25 02:20:42 +04:00
|
|
|
|
|
|
|
// Get an auth prompter for our window so that the parenting
|
|
|
|
// of the dialogs works as it should when using tabs.
|
2014-11-04 22:51:06 +03:00
|
|
|
nsCOMPtr<nsISupports> prompt;
|
|
|
|
rv = wwatch->GetPrompt(window, iid, getter_AddRefs(prompt));
|
|
|
|
NS_ENSURE_SUCCESS(rv, rv);
|
|
|
|
|
|
|
|
nsCOMPtr<nsILoginManagerPrompter> prompter = do_QueryInterface(prompt);
|
|
|
|
if (prompter) {
|
|
|
|
nsCOMPtr<nsIDOMElement> browser = do_QueryInterface(mFrameElement);
|
|
|
|
prompter->SetE10sData(browser, nullptr);
|
|
|
|
}
|
|
|
|
|
|
|
|
*aResult = prompt.forget().take();
|
|
|
|
return NS_OK;
|
2010-06-25 02:20:42 +04:00
|
|
|
}
|
|
|
|
|
2014-02-24 00:19:43 +04:00
|
|
|
PColorPickerParent*
|
|
|
|
TabParent::AllocPColorPickerParent(const nsString& aTitle,
|
|
|
|
const nsString& aInitialColor)
|
|
|
|
{
|
|
|
|
return new ColorPickerParent(aTitle, aInitialColor);
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::DeallocPColorPickerParent(PColorPickerParent* actor)
|
|
|
|
{
|
|
|
|
delete actor;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-01-16 01:10:39 +04:00
|
|
|
PRenderFrameParent*
|
2014-11-16 21:23:22 +03:00
|
|
|
TabParent::AllocPRenderFrameParent()
|
2014-01-16 01:10:39 +04:00
|
|
|
{
|
|
|
|
MOZ_ASSERT(ManagedPRenderFrameParent().IsEmpty());
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsFrameLoader> frameLoader = GetFrameLoader();
|
2014-11-16 21:23:22 +03:00
|
|
|
uint64_t layersId = 0;
|
|
|
|
bool success = false;
|
2015-07-22 00:34:36 +03:00
|
|
|
|
|
|
|
PRenderFrameParent* renderFrame =
|
2016-03-29 19:42:05 +03:00
|
|
|
new RenderFrameParent(frameLoader, &success);
|
2015-07-22 00:34:36 +03:00
|
|
|
if (success) {
|
2016-03-29 19:42:05 +03:00
|
|
|
RenderFrameParent* rfp = static_cast<RenderFrameParent*>(renderFrame);
|
|
|
|
layersId = rfp->GetLayersId();
|
2014-12-19 02:23:39 +03:00
|
|
|
AddTabParentToTable(layersId, this);
|
2014-11-16 21:23:22 +03:00
|
|
|
}
|
2015-07-22 00:34:36 +03:00
|
|
|
return renderFrame;
|
2010-08-21 03:24:41 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
2013-07-08 19:48:39 +04:00
|
|
|
TabParent::DeallocPRenderFrameParent(PRenderFrameParent* aFrame)
|
2010-08-21 03:24:41 +04:00
|
|
|
{
|
|
|
|
delete aFrame;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-11-16 21:23:22 +03:00
|
|
|
bool
|
2016-03-29 21:32:41 +03:00
|
|
|
TabParent::SetRenderFrame(PRenderFrameParent* aRFParent)
|
2014-11-16 21:23:22 +03:00
|
|
|
{
|
2016-03-29 21:32:41 +03:00
|
|
|
if (IsInitedByParent()) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
RefPtr<nsFrameLoader> frameLoader = GetFrameLoader();
|
|
|
|
|
|
|
|
if (!frameLoader) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
RenderFrameParent* renderFrame = static_cast<RenderFrameParent*>(aRFParent);
|
|
|
|
bool success = renderFrame->Init(frameLoader);
|
|
|
|
if (!success) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
uint64_t layersId = renderFrame->GetLayersId();
|
|
|
|
AddTabParentToTable(layersId, this);
|
2015-03-11 01:21:02 +03:00
|
|
|
|
|
|
|
if (mNeedLayerTreeReadyNotification) {
|
|
|
|
RequestNotifyLayerTreeReady();
|
|
|
|
mNeedLayerTreeReadyNotification = false;
|
|
|
|
}
|
|
|
|
|
2015-07-10 19:38:44 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2016-03-29 21:32:41 +03:00
|
|
|
bool
|
|
|
|
TabParent::GetRenderFrameInfo(TextureFactoryIdentifier* aTextureFactoryIdentifier,
|
|
|
|
uint64_t* aLayersId)
|
|
|
|
{
|
|
|
|
RenderFrameParent* rfp = GetRenderFrame();
|
|
|
|
if (!rfp) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
*aLayersId = rfp->GetLayersId();
|
|
|
|
rfp->GetTextureFactoryIdentifier(aTextureFactoryIdentifier);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-07-10 19:38:44 +03:00
|
|
|
bool
|
|
|
|
TabParent::RecvAudioChannelActivityNotification(const uint32_t& aAudioChannel,
|
|
|
|
const bool& aActive)
|
|
|
|
{
|
|
|
|
if (aAudioChannel >= NUMBER_OF_AUDIO_CHANNELS) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIObserverService> os = services::GetObserverService();
|
|
|
|
if (os) {
|
|
|
|
nsAutoCString topic;
|
|
|
|
topic.Assign("audiochannel-activity-");
|
|
|
|
topic.Append(AudioChannelService::GetAudioChannelTable()[aAudioChannel].tag);
|
|
|
|
|
|
|
|
os->NotifyObservers(NS_ISUPPORTS_CAST(nsITabParent*, this),
|
|
|
|
topic.get(),
|
|
|
|
aActive ? MOZ_UTF16("active") : MOZ_UTF16("inactive"));
|
|
|
|
}
|
|
|
|
|
2011-10-17 18:59:28 +04:00
|
|
|
return true;
|
2010-10-19 12:21:31 +04:00
|
|
|
}
|
|
|
|
|
2010-08-06 02:11:23 +04:00
|
|
|
already_AddRefed<nsFrameLoader>
|
2015-02-27 08:35:26 +03:00
|
|
|
TabParent::GetFrameLoader(bool aUseCachedFrameLoaderAfterDestroy) const
|
2010-08-06 02:11:23 +04:00
|
|
|
{
|
2015-02-27 08:35:26 +03:00
|
|
|
if (mIsDestroyed && !aUseCachedFrameLoaderAfterDestroy) {
|
|
|
|
return nullptr;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (mFrameLoader) {
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsFrameLoader> fl = mFrameLoader;
|
2015-02-27 08:35:26 +03:00
|
|
|
return fl.forget();
|
|
|
|
}
|
2010-08-06 02:11:23 +04:00
|
|
|
nsCOMPtr<nsIFrameLoaderOwner> frameLoaderOwner = do_QueryInterface(mFrameElement);
|
2012-07-30 18:20:58 +04:00
|
|
|
return frameLoaderOwner ? frameLoaderOwner->GetFrameLoader() : nullptr;
|
2010-08-06 02:11:23 +04:00
|
|
|
}
|
|
|
|
|
2012-04-25 20:35:58 +04:00
|
|
|
void
|
2013-05-02 03:06:19 +04:00
|
|
|
TabParent::TryCacheDPIAndScale()
|
2012-04-25 20:35:58 +04:00
|
|
|
{
|
|
|
|
if (mDPI > 0) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
2012-05-08 20:20:35 +04:00
|
|
|
|
2012-04-25 20:35:58 +04:00
|
|
|
if (widget) {
|
|
|
|
mDPI = widget->GetDPI();
|
2013-05-02 03:06:19 +04:00
|
|
|
mDefaultScale = widget->GetDefaultScale();
|
2012-04-25 20:35:58 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-09-24 07:28:15 +04:00
|
|
|
already_AddRefed<nsIWidget>
|
|
|
|
TabParent::GetWidget() const
|
|
|
|
{
|
2015-06-18 16:19:31 +03:00
|
|
|
if (!mFrameElement) {
|
2012-07-30 18:20:58 +04:00
|
|
|
return nullptr;
|
2015-06-18 16:19:31 +03:00
|
|
|
}
|
|
|
|
nsCOMPtr<nsIWidget> widget = nsContentUtils::WidgetForDocument(mFrameElement->OwnerDoc());
|
2012-04-25 20:35:58 +04:00
|
|
|
return widget.forget();
|
2010-09-24 07:28:15 +04:00
|
|
|
}
|
|
|
|
|
2015-02-07 00:46:46 +03:00
|
|
|
void
|
|
|
|
TabParent::ApzAwareEventRoutingToChild(ScrollableLayerGuid* aOutTargetGuid,
|
2015-05-14 15:16:00 +03:00
|
|
|
uint64_t* aOutInputBlockId,
|
|
|
|
nsEventStatus* aOutApzResponse)
|
2012-07-20 10:48:27 +04:00
|
|
|
{
|
2015-11-27 19:33:50 +03:00
|
|
|
// Let the widget know that the event will be sent to the child process,
|
|
|
|
// which will (hopefully) send a confirmation notice back to APZ.
|
|
|
|
// Do this even if APZ is off since we need it for swipe gesture support on
|
|
|
|
// OS X without APZ.
|
|
|
|
InputAPZContext::SetRoutedToChildProcess();
|
|
|
|
|
2015-06-04 23:51:10 +03:00
|
|
|
if (AsyncPanZoomEnabled()) {
|
2014-12-16 10:31:12 +03:00
|
|
|
if (aOutTargetGuid) {
|
|
|
|
*aOutTargetGuid = InputAPZContext::GetTargetLayerGuid();
|
2015-02-06 17:26:44 +03:00
|
|
|
|
|
|
|
// There may be cases where the APZ hit-testing code came to a different
|
|
|
|
// conclusion than the main-thread hit-testing code as to where the event
|
|
|
|
// is destined. In such cases the layersId of the APZ result may not match
|
|
|
|
// the layersId of this renderframe. In such cases the main-thread hit-
|
|
|
|
// testing code "wins" so we need to update the guid to reflect this.
|
|
|
|
if (RenderFrameParent* rfp = GetRenderFrame()) {
|
|
|
|
if (aOutTargetGuid->mLayersId != rfp->GetLayersId()) {
|
|
|
|
*aOutTargetGuid = ScrollableLayerGuid(rfp->GetLayersId(), 0, FrameMetrics::NULL_SCROLL_ID);
|
|
|
|
}
|
|
|
|
}
|
2014-12-16 10:31:12 +03:00
|
|
|
}
|
|
|
|
if (aOutInputBlockId) {
|
|
|
|
*aOutInputBlockId = InputAPZContext::GetInputBlockId();
|
|
|
|
}
|
2015-05-14 15:16:00 +03:00
|
|
|
if (aOutApzResponse) {
|
|
|
|
*aOutApzResponse = InputAPZContext::GetApzResponse();
|
|
|
|
}
|
2015-06-15 19:18:50 +03:00
|
|
|
} else {
|
|
|
|
if (aOutInputBlockId) {
|
|
|
|
*aOutInputBlockId = 0;
|
|
|
|
}
|
|
|
|
if (aOutApzResponse) {
|
|
|
|
*aOutApzResponse = nsEventStatus_eIgnore;
|
|
|
|
}
|
2012-07-20 10:48:27 +04:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-06-13 02:01:25 +04:00
|
|
|
bool
|
|
|
|
TabParent::RecvBrowserFrameOpenWindow(PBrowserParent* aOpener,
|
2016-03-31 07:58:05 +03:00
|
|
|
PRenderFrameParent* aRenderFrame,
|
2012-06-13 02:01:25 +04:00
|
|
|
const nsString& aURL,
|
|
|
|
const nsString& aName,
|
|
|
|
const nsString& aFeatures,
|
2016-03-31 07:58:05 +03:00
|
|
|
bool* aOutWindowOpened,
|
|
|
|
TextureFactoryIdentifier* aTextureFactoryIdentifier,
|
|
|
|
uint64_t* aLayersId)
|
2012-06-13 02:01:25 +04:00
|
|
|
{
|
2013-09-10 08:18:46 +04:00
|
|
|
BrowserElementParent::OpenWindowResult opened =
|
2015-02-06 00:47:32 +03:00
|
|
|
BrowserElementParent::OpenWindowOOP(TabParent::GetFrom(aOpener),
|
2016-03-31 07:58:05 +03:00
|
|
|
this, aRenderFrame, aURL, aName, aFeatures,
|
|
|
|
aTextureFactoryIdentifier, aLayersId);
|
2015-03-30 17:00:42 +03:00
|
|
|
*aOutWindowOpened = (opened == BrowserElementParent::OPEN_WINDOW_ADDED);
|
2012-06-13 02:01:25 +04:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-08-28 08:10:48 +03:00
|
|
|
bool
|
|
|
|
TabParent::RecvRespondStartSwipeEvent(const uint64_t& aInputBlockId,
|
|
|
|
const bool& aStartSwipe)
|
|
|
|
{
|
|
|
|
if (nsCOMPtr<nsIWidget> widget = GetWidget()) {
|
|
|
|
widget->ReportSwipeStarted(aInputBlockId, aStartSwipe);
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-01-11 05:10:57 +04:00
|
|
|
already_AddRefed<nsILoadContext>
|
|
|
|
TabParent::GetLoadContext()
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsILoadContext> loadContext;
|
|
|
|
if (mLoadContext) {
|
|
|
|
loadContext = mLoadContext;
|
|
|
|
} else {
|
|
|
|
loadContext = new LoadContext(GetOwnerElement(),
|
|
|
|
true /* aIsContent */,
|
|
|
|
mChromeFlags & nsIWebBrowserChrome::CHROME_PRIVATE_WINDOW,
|
2014-02-11 21:00:54 +04:00
|
|
|
mChromeFlags & nsIWebBrowserChrome::CHROME_REMOTE_WINDOW,
|
2015-11-03 13:53:41 +03:00
|
|
|
OriginAttributesRef());
|
2014-01-11 05:10:57 +04:00
|
|
|
mLoadContext = loadContext;
|
|
|
|
}
|
|
|
|
return loadContext.forget();
|
|
|
|
}
|
|
|
|
|
2014-01-24 13:02:23 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
TabParent::InjectTouchEvent(const nsAString& aType,
|
|
|
|
uint32_t* aIdentifiers,
|
|
|
|
int32_t* aXs,
|
|
|
|
int32_t* aYs,
|
|
|
|
uint32_t* aRxs,
|
|
|
|
uint32_t* aRys,
|
|
|
|
float* aRotationAngles,
|
|
|
|
float* aForces,
|
|
|
|
uint32_t aCount,
|
|
|
|
int32_t aModifiers)
|
|
|
|
{
|
2015-08-26 15:56:59 +03:00
|
|
|
EventMessage msg;
|
|
|
|
nsContentUtils::GetEventMessageAndAtom(aType, eTouchEventClass, &msg);
|
2015-09-14 18:14:35 +03:00
|
|
|
if (msg != eTouchStart && msg != eTouchMove &&
|
2015-09-14 18:14:35 +03:00
|
|
|
msg != eTouchEnd && msg != eTouchCancel) {
|
2014-01-24 13:02:23 +04:00
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
2014-01-28 15:42:44 +04:00
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
if (!widget) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
WidgetTouchEvent event(true, msg, widget);
|
2016-03-31 11:03:00 +03:00
|
|
|
event.mModifiers = aModifiers;
|
2016-03-28 07:29:42 +03:00
|
|
|
event.mTime = PR_IntervalNow();
|
2014-01-24 13:02:23 +04:00
|
|
|
|
2014-06-02 13:34:53 +04:00
|
|
|
nsCOMPtr<nsIContent> content = do_QueryInterface(mFrameElement);
|
|
|
|
if (!content || !content->OwnerDoc()) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
|
|
|
|
nsIDocument* doc = content->OwnerDoc();
|
|
|
|
if (!doc || !doc->GetShell()) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
nsPresContext* presContext = doc->GetShell()->GetPresContext();
|
|
|
|
|
2016-03-30 12:44:28 +03:00
|
|
|
event.mTouches.SetCapacity(aCount);
|
2014-01-24 13:02:23 +04:00
|
|
|
for (uint32_t i = 0; i < aCount; ++i) {
|
2014-06-02 13:34:53 +04:00
|
|
|
LayoutDeviceIntPoint pt =
|
|
|
|
LayoutDeviceIntPoint::FromAppUnitsRounded(
|
|
|
|
CSSPoint::ToAppUnits(CSSPoint(aXs[i], aYs[i])),
|
|
|
|
presContext->AppUnitsPerDevPixel());
|
|
|
|
|
2015-11-10 08:37:31 +03:00
|
|
|
LayoutDeviceIntPoint radius =
|
|
|
|
LayoutDeviceIntPoint::FromAppUnitsRounded(
|
|
|
|
CSSPoint::ToAppUnits(CSSPoint(aRxs[i], aRys[i])),
|
|
|
|
presContext->AppUnitsPerDevPixel());
|
|
|
|
|
|
|
|
RefPtr<Touch> t =
|
|
|
|
new Touch(aIdentifiers[i], pt, radius, aRotationAngles[i], aForces[i]);
|
2014-01-28 15:42:44 +04:00
|
|
|
|
|
|
|
// Consider all injected touch events as changedTouches. For more details
|
|
|
|
// about the meaning of changedTouches for each event, see
|
|
|
|
// https://developer.mozilla.org/docs/Web/API/TouchEvent.changedTouches
|
|
|
|
t->mChanged = true;
|
2016-03-30 12:44:28 +03:00
|
|
|
event.mTouches.AppendElement(t);
|
2014-01-24 13:02:23 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
SendRealTouchEvent(event);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
TabParent::GetUseAsyncPanZoom(bool* useAsyncPanZoom)
|
|
|
|
{
|
2015-06-04 23:51:10 +03:00
|
|
|
*useAsyncPanZoom = AsyncPanZoomEnabled();
|
2014-01-24 13:02:23 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2015-09-04 16:42:01 +03:00
|
|
|
// defined in nsITabParent
|
2014-02-20 15:26:13 +04:00
|
|
|
NS_IMETHODIMP
|
2015-09-04 16:42:01 +03:00
|
|
|
TabParent::SetDocShellIsActive(bool isActive)
|
2014-02-20 15:26:13 +04:00
|
|
|
{
|
2015-09-04 16:42:01 +03:00
|
|
|
mDocShellIsActive = isActive;
|
2015-11-10 05:38:21 +03:00
|
|
|
Unused << SendSetDocShellIsActive(isActive, true);
|
2015-09-04 16:42:01 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
TabParent::GetDocShellIsActive(bool* aIsActive)
|
|
|
|
{
|
|
|
|
*aIsActive = mDocShellIsActive;
|
2014-02-20 15:26:13 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2015-11-10 05:38:21 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
TabParent::SetDocShellIsActiveAndForeground(bool isActive)
|
|
|
|
{
|
|
|
|
mDocShellIsActive = isActive;
|
|
|
|
Unused << SendSetDocShellIsActive(isActive, false);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2015-08-20 00:08:41 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
TabParent::SuppressDisplayport(bool aEnabled)
|
|
|
|
{
|
|
|
|
if (IsDestroyed()) {
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2016-02-26 18:52:06 +03:00
|
|
|
#ifdef DEBUG
|
2015-08-20 00:08:41 +03:00
|
|
|
if (aEnabled) {
|
|
|
|
mActiveSupressDisplayportCount++;
|
|
|
|
} else {
|
|
|
|
mActiveSupressDisplayportCount--;
|
|
|
|
}
|
|
|
|
MOZ_ASSERT(mActiveSupressDisplayportCount >= 0);
|
2016-02-26 18:52:06 +03:00
|
|
|
#endif
|
2015-08-20 00:08:41 +03:00
|
|
|
|
2015-11-02 08:53:26 +03:00
|
|
|
Unused << SendSuppressDisplayport(aEnabled);
|
2015-08-20 00:08:41 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2015-01-22 12:40:17 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
TabParent::GetTabId(uint64_t* aId)
|
|
|
|
{
|
|
|
|
*aId = GetTabId();
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2015-05-13 23:44:39 +03:00
|
|
|
NS_IMETHODIMP
|
|
|
|
TabParent::GetHasContentOpener(bool* aResult)
|
|
|
|
{
|
|
|
|
*aResult = mHasContentOpener;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
TabParent::SetHasContentOpener(bool aHasContentOpener)
|
|
|
|
{
|
|
|
|
mHasContentOpener = aHasContentOpener;
|
|
|
|
}
|
|
|
|
|
2015-07-13 13:07:49 +03:00
|
|
|
NS_IMETHODIMP
|
2015-07-23 17:04:15 +03:00
|
|
|
TabParent::NavigateByKey(bool aForward, bool aForDocumentNavigation)
|
2015-07-13 13:07:49 +03:00
|
|
|
{
|
2015-11-02 08:53:26 +03:00
|
|
|
Unused << SendNavigateByKey(aForward, aForDocumentNavigation);
|
2015-07-13 13:07:49 +03:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2015-03-21 19:28:04 +03:00
|
|
|
class LayerTreeUpdateRunnable final
|
2016-04-26 03:23:21 +03:00
|
|
|
: public mozilla::Runnable
|
2015-02-27 08:30:44 +03:00
|
|
|
{
|
|
|
|
uint64_t mLayersId;
|
|
|
|
bool mActive;
|
|
|
|
|
|
|
|
public:
|
|
|
|
explicit LayerTreeUpdateRunnable(uint64_t aLayersId, bool aActive)
|
|
|
|
: mLayersId(aLayersId), mActive(aActive) {}
|
|
|
|
|
|
|
|
private:
|
|
|
|
NS_IMETHOD Run() {
|
|
|
|
MOZ_ASSERT(NS_IsMainThread());
|
|
|
|
TabParent* tabParent = TabParent::GetTabParentFromLayersId(mLayersId);
|
|
|
|
if (tabParent) {
|
|
|
|
tabParent->LayerTreeUpdate(mActive);
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
// This observer runs on the compositor thread, so we dispatch a runnable to the
|
|
|
|
// main thread to actually dispatch the event.
|
|
|
|
class LayerTreeUpdateObserver : public CompositorUpdateObserver
|
|
|
|
{
|
|
|
|
virtual void ObserveUpdate(uint64_t aLayersId, bool aActive) {
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<LayerTreeUpdateRunnable> runnable = new LayerTreeUpdateRunnable(aLayersId, aActive);
|
2015-02-27 08:30:44 +03:00
|
|
|
NS_DispatchToMainThread(runnable);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::RequestNotifyLayerTreeReady()
|
|
|
|
{
|
|
|
|
RenderFrameParent* frame = GetRenderFrame();
|
2016-03-29 21:32:41 +03:00
|
|
|
if (!frame || !frame->IsInitted()) {
|
2015-03-11 01:21:02 +03:00
|
|
|
mNeedLayerTreeReadyNotification = true;
|
|
|
|
} else {
|
2016-03-22 21:08:38 +03:00
|
|
|
CompositorBridgeParent::RequestNotifyLayerTreeReady(
|
|
|
|
frame->GetLayersId(),
|
|
|
|
new LayerTreeUpdateObserver());
|
2015-02-27 08:30:44 +03:00
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::RequestNotifyLayerTreeCleared()
|
|
|
|
{
|
|
|
|
RenderFrameParent* frame = GetRenderFrame();
|
|
|
|
if (!frame) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2016-03-22 21:08:38 +03:00
|
|
|
CompositorBridgeParent::RequestNotifyLayerTreeCleared(
|
|
|
|
frame->GetLayersId(),
|
|
|
|
new LayerTreeUpdateObserver());
|
2015-02-27 08:30:44 +03:00
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::LayerTreeUpdate(bool aActive)
|
|
|
|
{
|
|
|
|
nsCOMPtr<mozilla::dom::EventTarget> target = do_QueryInterface(mFrameElement);
|
|
|
|
if (!target) {
|
|
|
|
NS_WARNING("Could not locate target for layer tree message.");
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<Event> event = NS_NewDOMEvent(mFrameElement, nullptr, nullptr);
|
2015-02-27 08:30:44 +03:00
|
|
|
if (aActive) {
|
|
|
|
event->InitEvent(NS_LITERAL_STRING("MozLayerTreeReady"), true, false);
|
|
|
|
} else {
|
|
|
|
event->InitEvent(NS_LITERAL_STRING("MozLayerTreeCleared"), true, false);
|
|
|
|
}
|
|
|
|
event->SetTrusted(true);
|
2016-02-12 18:40:07 +03:00
|
|
|
event->WidgetEventPtr()->mFlags.mOnlyChromeDispatch = true;
|
2015-02-27 08:30:44 +03:00
|
|
|
bool dummy;
|
|
|
|
mFrameElement->DispatchEvent(event, &dummy);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-04-14 03:06:03 +03:00
|
|
|
void
|
|
|
|
TabParent::SwapLayerTreeObservers(TabParent* aOther)
|
|
|
|
{
|
|
|
|
if (IsDestroyed() || aOther->IsDestroyed()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
RenderFrameParent* rfp = GetRenderFrame();
|
|
|
|
RenderFrameParent* otherRfp = aOther->GetRenderFrame();
|
2016-03-22 21:08:38 +03:00
|
|
|
if (!rfp || !otherRfp) {
|
2015-04-14 03:06:03 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-03-22 21:08:38 +03:00
|
|
|
CompositorBridgeParent::SwapLayerTreeObservers(
|
|
|
|
rfp->GetLayersId(),
|
|
|
|
otherRfp->GetLayersId());
|
2015-04-14 03:06:03 +03:00
|
|
|
}
|
|
|
|
|
2014-05-23 22:19:00 +04:00
|
|
|
bool
|
|
|
|
TabParent::RecvRemotePaintIsReady()
|
|
|
|
{
|
|
|
|
nsCOMPtr<mozilla::dom::EventTarget> target = do_QueryInterface(mFrameElement);
|
|
|
|
if (!target) {
|
|
|
|
NS_WARNING("Could not locate target for MozAfterRemotePaint message.");
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<Event> event = NS_NewDOMEvent(mFrameElement, nullptr, nullptr);
|
2014-05-23 22:19:00 +04:00
|
|
|
event->InitEvent(NS_LITERAL_STRING("MozAfterRemotePaint"), false, false);
|
|
|
|
event->SetTrusted(true);
|
2016-02-12 18:40:07 +03:00
|
|
|
event->WidgetEventPtr()->mFlags.mOnlyChromeDispatch = true;
|
2014-05-23 22:19:00 +04:00
|
|
|
bool dummy;
|
|
|
|
mFrameElement->DispatchEvent(event, &dummy);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-11-12 23:59:19 +03:00
|
|
|
mozilla::plugins::PPluginWidgetParent*
|
|
|
|
TabParent::AllocPPluginWidgetParent()
|
|
|
|
{
|
|
|
|
return new mozilla::plugins::PluginWidgetParent();
|
|
|
|
}
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::DeallocPPluginWidgetParent(mozilla::plugins::PPluginWidgetParent* aActor)
|
|
|
|
{
|
|
|
|
delete aActor;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2015-03-31 23:39:02 +03:00
|
|
|
nsresult
|
|
|
|
TabParent::HandleEvent(nsIDOMEvent* aEvent)
|
|
|
|
{
|
|
|
|
nsAutoString eventType;
|
|
|
|
aEvent->GetType(eventType);
|
|
|
|
|
|
|
|
if (eventType.EqualsLiteral("MozUpdateWindowPos") && !mIsDestroyed) {
|
|
|
|
// This event is sent when the widget moved. Therefore we only update
|
|
|
|
// the position.
|
2015-04-21 17:33:56 +03:00
|
|
|
return UpdatePosition();
|
2015-03-31 23:39:02 +03:00
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
2015-03-21 19:28:04 +03:00
|
|
|
class FakeChannel final : public nsIChannel,
|
2015-03-27 21:52:19 +03:00
|
|
|
public nsIAuthPromptCallback,
|
|
|
|
public nsIInterfaceRequestor,
|
|
|
|
public nsILoadContext
|
2014-06-11 09:44:36 +04:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
FakeChannel(const nsCString& aUri, uint64_t aCallbackId, Element* aElement)
|
|
|
|
: mCallbackId(aCallbackId)
|
|
|
|
, mElement(aElement)
|
|
|
|
{
|
|
|
|
NS_NewURI(getter_AddRefs(mUri), aUri);
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_DECL_ISUPPORTS
|
2015-03-21 19:28:04 +03:00
|
|
|
#define NO_IMPL override { return NS_ERROR_NOT_IMPLEMENTED; }
|
2014-06-11 09:44:36 +04:00
|
|
|
NS_IMETHOD GetName(nsACString&) NO_IMPL
|
|
|
|
NS_IMETHOD IsPending(bool*) NO_IMPL
|
|
|
|
NS_IMETHOD GetStatus(nsresult*) NO_IMPL
|
|
|
|
NS_IMETHOD Cancel(nsresult) NO_IMPL
|
|
|
|
NS_IMETHOD Suspend() NO_IMPL
|
|
|
|
NS_IMETHOD Resume() NO_IMPL
|
|
|
|
NS_IMETHOD GetLoadGroup(nsILoadGroup**) NO_IMPL
|
|
|
|
NS_IMETHOD SetLoadGroup(nsILoadGroup*) NO_IMPL
|
|
|
|
NS_IMETHOD SetLoadFlags(nsLoadFlags) NO_IMPL
|
|
|
|
NS_IMETHOD GetLoadFlags(nsLoadFlags*) NO_IMPL
|
|
|
|
NS_IMETHOD GetOriginalURI(nsIURI**) NO_IMPL
|
|
|
|
NS_IMETHOD SetOriginalURI(nsIURI*) NO_IMPL
|
2015-03-21 19:28:04 +03:00
|
|
|
NS_IMETHOD GetURI(nsIURI** aUri) override
|
2014-06-11 09:44:36 +04:00
|
|
|
{
|
2015-04-19 20:22:35 +03:00
|
|
|
nsCOMPtr<nsIURI> copy = mUri;
|
|
|
|
copy.forget(aUri);
|
2014-06-11 09:44:36 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
NS_IMETHOD GetOwner(nsISupports**) NO_IMPL
|
|
|
|
NS_IMETHOD SetOwner(nsISupports*) NO_IMPL
|
2015-03-21 19:28:04 +03:00
|
|
|
NS_IMETHOD GetLoadInfo(nsILoadInfo** aLoadInfo) override
|
2014-07-10 10:56:36 +04:00
|
|
|
{
|
2015-04-19 20:22:35 +03:00
|
|
|
nsCOMPtr<nsILoadInfo> copy = mLoadInfo;
|
|
|
|
copy.forget(aLoadInfo);
|
2014-07-10 10:56:36 +04:00
|
|
|
return NS_OK;
|
|
|
|
}
|
2015-03-21 19:28:04 +03:00
|
|
|
NS_IMETHOD SetLoadInfo(nsILoadInfo* aLoadInfo) override
|
2014-07-10 10:56:36 +04:00
|
|
|
{
|
|
|
|
mLoadInfo = aLoadInfo;
|
|
|
|
return NS_OK;
|
|
|
|
}
|
2015-03-21 19:28:04 +03:00
|
|
|
NS_IMETHOD GetNotificationCallbacks(nsIInterfaceRequestor** aRequestor) override
|
2014-06-11 09:44:36 +04:00
|
|
|
{
|
|
|
|
NS_ADDREF(*aRequestor = this);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
NS_IMETHOD SetNotificationCallbacks(nsIInterfaceRequestor*) NO_IMPL
|
|
|
|
NS_IMETHOD GetSecurityInfo(nsISupports**) NO_IMPL
|
|
|
|
NS_IMETHOD GetContentType(nsACString&) NO_IMPL
|
|
|
|
NS_IMETHOD SetContentType(const nsACString&) NO_IMPL
|
|
|
|
NS_IMETHOD GetContentCharset(nsACString&) NO_IMPL
|
|
|
|
NS_IMETHOD SetContentCharset(const nsACString&) NO_IMPL
|
|
|
|
NS_IMETHOD GetContentLength(int64_t*) NO_IMPL
|
|
|
|
NS_IMETHOD SetContentLength(int64_t) NO_IMPL
|
|
|
|
NS_IMETHOD Open(nsIInputStream**) NO_IMPL
|
2015-05-15 23:21:20 +03:00
|
|
|
NS_IMETHOD Open2(nsIInputStream**) NO_IMPL
|
2014-06-11 09:44:36 +04:00
|
|
|
NS_IMETHOD AsyncOpen(nsIStreamListener*, nsISupports*) NO_IMPL
|
2015-05-15 23:21:20 +03:00
|
|
|
NS_IMETHOD AsyncOpen2(nsIStreamListener*) NO_IMPL
|
2014-06-11 09:44:36 +04:00
|
|
|
NS_IMETHOD GetContentDisposition(uint32_t*) NO_IMPL
|
|
|
|
NS_IMETHOD SetContentDisposition(uint32_t) NO_IMPL
|
|
|
|
NS_IMETHOD GetContentDispositionFilename(nsAString&) NO_IMPL
|
|
|
|
NS_IMETHOD SetContentDispositionFilename(const nsAString&) NO_IMPL
|
|
|
|
NS_IMETHOD GetContentDispositionHeader(nsACString&) NO_IMPL
|
2015-03-21 19:28:04 +03:00
|
|
|
NS_IMETHOD OnAuthAvailable(nsISupports *aContext, nsIAuthInformation *aAuthInfo) override;
|
|
|
|
NS_IMETHOD OnAuthCancelled(nsISupports *aContext, bool userCancel) override;
|
|
|
|
NS_IMETHOD GetInterface(const nsIID & uuid, void **result) override
|
2014-06-11 09:44:36 +04:00
|
|
|
{
|
|
|
|
return QueryInterface(uuid, result);
|
|
|
|
}
|
2016-01-30 20:05:36 +03:00
|
|
|
NS_IMETHOD GetAssociatedWindow(mozIDOMWindowProxy**) NO_IMPL
|
|
|
|
NS_IMETHOD GetTopWindow(mozIDOMWindowProxy**) NO_IMPL
|
2015-03-21 19:28:04 +03:00
|
|
|
NS_IMETHOD GetTopFrameElement(nsIDOMElement** aElement) override
|
2014-06-11 09:44:36 +04:00
|
|
|
{
|
|
|
|
nsCOMPtr<nsIDOMElement> elem = do_QueryInterface(mElement);
|
|
|
|
elem.forget(aElement);
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
NS_IMETHOD GetNestedFrameId(uint64_t*) NO_IMPL
|
|
|
|
NS_IMETHOD IsAppOfType(uint32_t, bool*) NO_IMPL
|
|
|
|
NS_IMETHOD GetIsContent(bool*) NO_IMPL
|
|
|
|
NS_IMETHOD GetUsePrivateBrowsing(bool*) NO_IMPL
|
|
|
|
NS_IMETHOD SetUsePrivateBrowsing(bool) NO_IMPL
|
|
|
|
NS_IMETHOD SetPrivateBrowsing(bool) NO_IMPL
|
2016-02-18 05:55:57 +03:00
|
|
|
NS_IMETHOD GetIsInIsolatedMozBrowserElement(bool*) NO_IMPL
|
2014-06-11 09:44:36 +04:00
|
|
|
NS_IMETHOD GetAppId(uint32_t*) NO_IMPL
|
2015-09-23 11:10:21 +03:00
|
|
|
NS_IMETHOD GetOriginAttributes(JS::MutableHandleValue) NO_IMPL
|
2014-06-11 09:44:36 +04:00
|
|
|
NS_IMETHOD GetUseRemoteTabs(bool*) NO_IMPL
|
|
|
|
NS_IMETHOD SetRemoteTabs(bool) NO_IMPL
|
|
|
|
#undef NO_IMPL
|
|
|
|
|
|
|
|
protected:
|
2014-06-23 23:56:07 +04:00
|
|
|
~FakeChannel() {}
|
|
|
|
|
2014-06-11 09:44:36 +04:00
|
|
|
nsCOMPtr<nsIURI> mUri;
|
|
|
|
uint64_t mCallbackId;
|
|
|
|
nsCOMPtr<Element> mElement;
|
2014-07-10 10:56:36 +04:00
|
|
|
nsCOMPtr<nsILoadInfo> mLoadInfo;
|
2014-06-11 09:44:36 +04:00
|
|
|
};
|
|
|
|
|
|
|
|
NS_IMPL_ISUPPORTS(FakeChannel, nsIChannel, nsIAuthPromptCallback,
|
|
|
|
nsIRequest, nsIInterfaceRequestor, nsILoadContext);
|
|
|
|
|
|
|
|
bool
|
|
|
|
TabParent::RecvAsyncAuthPrompt(const nsCString& aUri,
|
|
|
|
const nsString& aRealm,
|
|
|
|
const uint64_t& aCallbackId)
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIAuthPrompt2> authPrompt;
|
|
|
|
GetAuthPrompt(nsIAuthPromptProvider::PROMPT_NORMAL,
|
|
|
|
NS_GET_IID(nsIAuthPrompt2),
|
|
|
|
getter_AddRefs(authPrompt));
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<FakeChannel> channel = new FakeChannel(aUri, aCallbackId, mFrameElement);
|
2014-06-11 09:44:36 +04:00
|
|
|
uint32_t promptFlags = nsIAuthInformation::AUTH_HOST;
|
|
|
|
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsAuthInformationHolder> holder =
|
2014-06-11 09:44:36 +04:00
|
|
|
new nsAuthInformationHolder(promptFlags, aRealm,
|
|
|
|
EmptyCString());
|
|
|
|
|
|
|
|
uint32_t level = nsIAuthPrompt2::LEVEL_NONE;
|
|
|
|
nsCOMPtr<nsICancelable> dummy;
|
|
|
|
nsresult rv =
|
|
|
|
authPrompt->AsyncPromptAuth(channel, channel, nullptr,
|
|
|
|
level, holder, getter_AddRefs(dummy));
|
|
|
|
|
|
|
|
return rv == NS_OK;
|
|
|
|
}
|
|
|
|
|
2015-04-08 21:48:11 +03:00
|
|
|
bool
|
|
|
|
TabParent::RecvInvokeDragSession(nsTArray<IPCDataTransfer>&& aTransfers,
|
|
|
|
const uint32_t& aAction,
|
|
|
|
const nsCString& aVisualDnDData,
|
|
|
|
const uint32_t& aWidth, const uint32_t& aHeight,
|
|
|
|
const uint32_t& aStride, const uint8_t& aFormat,
|
|
|
|
const int32_t& aDragAreaX, const int32_t& aDragAreaY)
|
|
|
|
{
|
|
|
|
mInitialDataTransferItems.Clear();
|
2015-08-01 03:03:37 +03:00
|
|
|
nsIPresShell* shell = mFrameElement->OwnerDoc()->GetShell();
|
|
|
|
if (!shell) {
|
|
|
|
if (Manager()->IsContentParent()) {
|
2015-11-02 08:53:26 +03:00
|
|
|
Unused << Manager()->AsContentParent()->SendEndDragSession(true, true);
|
2015-08-01 03:03:37 +03:00
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
2015-04-08 21:48:11 +03:00
|
|
|
|
2015-08-01 03:03:37 +03:00
|
|
|
EventStateManager* esm = shell->GetPresContext()->EventStateManager();
|
2015-04-08 21:48:11 +03:00
|
|
|
for (uint32_t i = 0; i < aTransfers.Length(); ++i) {
|
2016-02-24 03:31:29 +03:00
|
|
|
mInitialDataTransferItems.AppendElement(mozilla::Move(aTransfers[i].items()));
|
2015-04-08 21:48:11 +03:00
|
|
|
}
|
|
|
|
if (Manager()->IsContentParent()) {
|
|
|
|
nsCOMPtr<nsIDragService> dragService =
|
|
|
|
do_GetService("@mozilla.org/widget/dragservice;1");
|
|
|
|
if (dragService) {
|
|
|
|
dragService->MaybeAddChildProcess(Manager()->AsContentParent());
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-04-14 13:50:59 +03:00
|
|
|
if (aVisualDnDData.IsEmpty() ||
|
|
|
|
(aVisualDnDData.Length() < aHeight * aStride)) {
|
2015-04-08 21:48:11 +03:00
|
|
|
mDnDVisualization = nullptr;
|
|
|
|
} else {
|
|
|
|
mDnDVisualization =
|
2016-05-09 01:33:00 +03:00
|
|
|
gfx::CreateDataSourceSurfaceFromData(gfx::IntSize(aWidth, aHeight),
|
|
|
|
static_cast<gfx::SurfaceFormat>(aFormat),
|
|
|
|
reinterpret_cast<const uint8_t*>(aVisualDnDData.BeginReading()),
|
|
|
|
aStride);
|
2015-04-08 21:48:11 +03:00
|
|
|
}
|
|
|
|
mDragAreaX = aDragAreaX;
|
|
|
|
mDragAreaY = aDragAreaY;
|
2015-10-07 18:17:42 +03:00
|
|
|
|
2015-04-08 21:48:11 +03:00
|
|
|
esm->BeginTrackingRemoteDragGesture(mFrameElement);
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
|
|
|
TabParent::AddInitialDnDDataTo(DataTransfer* aDataTransfer)
|
|
|
|
{
|
|
|
|
for (uint32_t i = 0; i < mInitialDataTransferItems.Length(); ++i) {
|
2016-02-24 03:31:29 +03:00
|
|
|
nsTArray<IPCDataTransferItem>& itemArray = mInitialDataTransferItems[i];
|
|
|
|
for (auto& item : itemArray) {
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsVariantCC> variant = new nsVariantCC();
|
2015-04-08 21:48:11 +03:00
|
|
|
// Special case kFilePromiseMime so that we get the right
|
|
|
|
// nsIFlavorDataProvider for it.
|
2016-02-24 03:31:29 +03:00
|
|
|
if (item.flavor().EqualsLiteral(kFilePromiseMime)) {
|
2015-10-18 08:24:48 +03:00
|
|
|
RefPtr<nsISupports> flavorDataProvider =
|
2015-04-08 21:48:11 +03:00
|
|
|
new nsContentAreaDragDropDataProvider();
|
|
|
|
variant->SetAsISupports(flavorDataProvider);
|
2016-02-24 03:31:29 +03:00
|
|
|
} else if (item.data().type() == IPCDataTransferData::TnsString) {
|
|
|
|
variant->SetAsAString(item.data().get_nsString());
|
|
|
|
} else if (item.data().type() == IPCDataTransferData::TPBlobParent) {
|
|
|
|
auto* parent = static_cast<BlobParent*>(item.data().get_PBlobParent());
|
|
|
|
RefPtr<BlobImpl> impl = parent->GetBlobImpl();
|
|
|
|
variant->SetAsISupports(impl);
|
2016-04-21 21:11:14 +03:00
|
|
|
} else if (item.data().type() == IPCDataTransferData::TnsCString) {
|
|
|
|
if (nsContentUtils::IsFlavorImage(item.flavor())) {
|
|
|
|
// An image! Get the imgIContainer for it and set it in the variant.
|
|
|
|
nsCOMPtr<imgIContainer> imageContainer;
|
|
|
|
nsresult rv =
|
|
|
|
nsContentUtils::DataTransferItemToImage(item,
|
|
|
|
getter_AddRefs(imageContainer));
|
|
|
|
if (NS_FAILED(rv)) {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
variant->SetAsISupports(imageContainer);
|
|
|
|
} else {
|
|
|
|
variant->SetAsACString(item.data().get_nsCString());
|
2016-02-24 03:31:29 +03:00
|
|
|
}
|
2015-04-08 21:48:11 +03:00
|
|
|
}
|
2016-02-24 03:31:29 +03:00
|
|
|
|
2015-04-08 21:48:11 +03:00
|
|
|
// Using system principal here, since once the data is on parent process
|
|
|
|
// side, it can be handled as being from browser chrome or OS.
|
2016-04-21 21:11:14 +03:00
|
|
|
aDataTransfer->SetDataWithPrincipalFromOtherProcess(NS_ConvertUTF8toUTF16(item.flavor()),
|
|
|
|
variant, i,
|
|
|
|
nsContentUtils::GetSystemPrincipal());
|
2015-04-08 21:48:11 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
mInitialDataTransferItems.Clear();
|
|
|
|
}
|
|
|
|
|
|
|
|
void
|
2015-10-18 08:24:48 +03:00
|
|
|
TabParent::TakeDragVisualization(RefPtr<mozilla::gfx::SourceSurface>& aSurface,
|
2015-04-08 21:48:11 +03:00
|
|
|
int32_t& aDragAreaX, int32_t& aDragAreaY)
|
|
|
|
{
|
|
|
|
aSurface = mDnDVisualization.forget();
|
|
|
|
aDragAreaX = mDragAreaX;
|
|
|
|
aDragAreaY = mDragAreaY;
|
|
|
|
}
|
|
|
|
|
2015-06-04 23:51:10 +03:00
|
|
|
bool
|
|
|
|
TabParent::AsyncPanZoomEnabled() const
|
|
|
|
{
|
|
|
|
nsCOMPtr<nsIWidget> widget = GetWidget();
|
|
|
|
return widget && widget->AsyncPanZoomEnabled();
|
|
|
|
}
|
|
|
|
|
2015-08-06 00:25:39 +03:00
|
|
|
NS_IMETHODIMP
|
2015-08-06 17:44:16 +03:00
|
|
|
TabParent::StartPersistence(uint64_t aOuterWindowID,
|
|
|
|
nsIWebBrowserPersistDocumentReceiver* aRecv)
|
2015-08-06 00:25:39 +03:00
|
|
|
{
|
2015-09-21 15:54:00 +03:00
|
|
|
nsCOMPtr<nsIContentParent> manager = Manager();
|
|
|
|
if (!manager->IsContentParent()) {
|
|
|
|
return NS_ERROR_UNEXPECTED;
|
|
|
|
}
|
2015-08-06 00:25:39 +03:00
|
|
|
auto* actor = new WebBrowserPersistDocumentParent();
|
|
|
|
actor->SetOnReady(aRecv);
|
2015-09-21 15:54:00 +03:00
|
|
|
return manager->AsContentParent()
|
|
|
|
->SendPWebBrowserPersistDocumentConstructor(actor, this, aOuterWindowID)
|
2015-08-06 00:25:39 +03:00
|
|
|
? NS_OK : NS_ERROR_FAILURE;
|
|
|
|
// (The actor will be destroyed on constructor failure.)
|
|
|
|
}
|
|
|
|
|
2015-10-30 16:24:57 +03:00
|
|
|
ShowInfo
|
|
|
|
TabParent::GetShowInfo()
|
|
|
|
{
|
|
|
|
TryCacheDPIAndScale();
|
|
|
|
if (mFrameElement) {
|
|
|
|
nsAutoString name;
|
|
|
|
mFrameElement->GetAttr(kNameSpaceID_None, nsGkAtoms::name, name);
|
|
|
|
bool allowFullscreen =
|
|
|
|
mFrameElement->HasAttr(kNameSpaceID_None, nsGkAtoms::allowfullscreen) ||
|
|
|
|
mFrameElement->HasAttr(kNameSpaceID_None, nsGkAtoms::mozallowfullscreen);
|
|
|
|
bool isPrivate = mFrameElement->HasAttr(kNameSpaceID_None, nsGkAtoms::mozprivatebrowsing);
|
|
|
|
return ShowInfo(name, allowFullscreen, isPrivate, false,
|
|
|
|
mDPI, mDefaultScale.scale);
|
|
|
|
}
|
|
|
|
|
|
|
|
return ShowInfo(EmptyString(), false, false, false,
|
|
|
|
mDPI, mDefaultScale.scale);
|
|
|
|
}
|
|
|
|
|
2015-12-11 19:17:33 +03:00
|
|
|
void
|
2016-01-30 20:05:36 +03:00
|
|
|
TabParent::AudioChannelChangeNotification(nsPIDOMWindowOuter* aWindow,
|
2015-12-11 19:17:33 +03:00
|
|
|
AudioChannel aAudioChannel,
|
|
|
|
float aVolume,
|
|
|
|
bool aMuted)
|
|
|
|
{
|
|
|
|
if (!mFrameElement || !mFrameElement->OwnerDoc()) {
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2016-01-30 20:05:36 +03:00
|
|
|
nsCOMPtr<nsPIDOMWindowOuter> window = mFrameElement->OwnerDoc()->GetWindow();
|
2015-12-11 19:17:33 +03:00
|
|
|
while (window) {
|
|
|
|
if (window == aWindow) {
|
|
|
|
Unused << SendAudioChannelChangeNotification(static_cast<uint32_t>(aAudioChannel),
|
|
|
|
aVolume, aMuted);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2016-04-25 17:17:32 +03:00
|
|
|
nsCOMPtr<nsPIDOMWindowOuter> win = window->GetScriptableParentOrNull();
|
|
|
|
if (!win) {
|
2015-12-11 19:17:33 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
window = win;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2016-04-14 21:03:00 +03:00
|
|
|
bool
|
|
|
|
TabParent::RecvGetTabCount(uint32_t* aValue)
|
|
|
|
{
|
2016-04-25 16:33:00 +03:00
|
|
|
*aValue = 0;
|
|
|
|
|
2016-04-14 21:03:00 +03:00
|
|
|
nsCOMPtr<nsIXULBrowserWindow> xulBrowserWindow = GetXULBrowserWindow();
|
2016-04-25 16:33:00 +03:00
|
|
|
NS_ENSURE_TRUE(xulBrowserWindow, true);
|
2016-04-14 21:03:00 +03:00
|
|
|
|
|
|
|
uint32_t tabCount;
|
|
|
|
nsresult rv = xulBrowserWindow->GetTabCount(&tabCount);
|
2016-04-25 16:33:00 +03:00
|
|
|
NS_ENSURE_SUCCESS(rv, true);
|
2016-04-14 21:03:00 +03:00
|
|
|
|
|
|
|
*aValue = tabCount;
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
2014-06-11 09:44:36 +04:00
|
|
|
NS_IMETHODIMP
|
|
|
|
FakeChannel::OnAuthAvailable(nsISupports *aContext, nsIAuthInformation *aAuthInfo)
|
|
|
|
{
|
|
|
|
nsAuthInformationHolder* holder =
|
|
|
|
static_cast<nsAuthInformationHolder*>(aAuthInfo);
|
|
|
|
|
|
|
|
if (!net::gNeckoChild->SendOnAuthAvailable(mCallbackId,
|
|
|
|
holder->User(),
|
|
|
|
holder->Password(),
|
|
|
|
holder->Domain())) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
NS_IMETHODIMP
|
|
|
|
FakeChannel::OnAuthCancelled(nsISupports *aContext, bool userCancel)
|
|
|
|
{
|
|
|
|
if (!net::gNeckoChild->SendOnAuthCancelled(mCallbackId, userCancel)) {
|
|
|
|
return NS_ERROR_FAILURE;
|
|
|
|
}
|
|
|
|
return NS_OK;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2015-07-13 18:25:42 +03:00
|
|
|
} // namespace dom
|
2009-07-01 00:39:22 +04:00
|
|
|
} // namespace mozilla
|