Files
palemoon27/dom/html/HTMLExtAppElement.cpp
T
roytam1 8a5ab88480 import changes from `dev' branch of rmottola/Arctic-Fox:
- Bug 1179718 - Add a CheckAllPermissions extended attribute to WebIDL. r=bz (ccaf27417)
- Bug 1178513 - Add <extapp> element and interfaces to be used by ACL. r=khuey (146b766c7)
- Bug 1184647. Cloning an image should ensure that the clone tries to load the src, if any. r=smaug (7e532fdb6)
- Bug 1142717, part 1 - Remove unused forward declaration of xpc_GetJSPrivate. r=bholley (9ed60f8c9)
- Bug 1037329 - Part 1: Implement SystemUpdate API. r=baku (b446efdb5)
- Bug 1037329 - Part 2: Enable SystemUpdate API on b2g. r=fabrice (570fc0e98)
- Bug 1142717, part 2 - Use nsRefPtr for obj in XPCWrappedNative::InitTearOff. r=bholley (6e262259e)
- Bug 1142717, part 2b - Rename obj to qiResult in InitTearOff. r=bholley (ad76ada13)
- Bug 1142717, part 3 - Make XPCWrappedNativeTearOff::mNative a smart pointer. r=bholley (7ad2c24b8)
- Bug 1142717, part 4 - Add MOZ_COUNT_CTOR/DTOR for XPCWrappedNativeTearOff. r=bholley (67aeaf0c3)
- Bug 1142717, part 5 - Eliminate XPC_WRAPPED_NATIVE_TEAROFFS_PER_CHUNK. r=bholley (251bd5478)
- Bug 1184630 - Remove the unused XPCWrappedNative::LocateTearOff(). r=gabor (de125f7df)
2021-01-14 23:56:03 +08:00

186 lines
5.0 KiB
C++

/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* 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/. */
#include "mozilla/dom/HTMLExtAppElement.h"
#include "mozilla/dom/HTMLUnknownElement.h"
#include "mozilla/dom/HTMLExtAppElementBinding.h"
#include "mozilla/dom/ExternalAppEvent.h"
#include "nsGkAtoms.h"
#include "nsIAtom.h"
#include "nsIPermissionManager.h"
#include "nsStyleConsts.h"
#include "nsRuleData.h"
nsGenericHTMLElement*
NS_NewHTMLExtAppElement(already_AddRefed<mozilla::dom::NodeInfo>&& aNodeInfo,
mozilla::dom::FromParser aFromParser) {
// Return HTMLUnknownElement if the document doesn't have the 'external-app' permission.
nsCOMPtr<nsIPermissionManager> permissionManager =
mozilla::services::GetPermissionManager();
nsRefPtr<mozilla::dom::NodeInfo> ni = aNodeInfo;
nsIPrincipal* principal = ni->GetDocument()->NodePrincipal();
already_AddRefed<mozilla::dom::NodeInfo> aarni = ni.forget();
if (!permissionManager) {
return new HTMLUnknownElement(aarni);
}
uint32_t perm = nsIPermissionManager::UNKNOWN_ACTION;
permissionManager->TestExactPermissionFromPrincipal(principal,
"external-app",
&perm);
if (perm != nsIPermissionManager::ALLOW_ACTION) {
return new HTMLUnknownElement(aarni);
}
return new HTMLExtAppElement(aarni);
}
namespace mozilla {
namespace dom {
HTMLExtAppElement::HTMLExtAppElement(already_AddRefed<mozilla::dom::NodeInfo>& aNodeInfo)
: nsGenericHTMLElement(aNodeInfo)
{
mCustomEventDispatch = new nsCustomEventDispatch(this);
mCustomPropertyBag = new nsCustomPropertyBag();
nsCOMPtr<nsIExternalApplication> app =
do_CreateInstance(NS_EXTERNALAPP_CONTRACTID);
if (app) {
nsresult rv = app->Init(OwnerDoc()->GetInnerWindow(), mCustomPropertyBag, mCustomEventDispatch);
if (NS_SUCCEEDED(rv)) {
mApp = app;
}
}
}
HTMLExtAppElement::~HTMLExtAppElement()
{
mCustomEventDispatch->ClearEventTarget();
}
void
HTMLExtAppElement::GetCustomProperty(const nsAString& aName, nsString& aReturn)
{
mCustomPropertyBag->GetCustomProperty(aName, aReturn);
}
void
HTMLExtAppElement::PostMessage(const nsAString& aMessage, ErrorResult& aRv)
{
if (!mApp) {
aRv.Throw(NS_ERROR_UNEXPECTED);
return;
}
aRv = mApp->PostMessage(aMessage);
}
NS_IMPL_ADDREF_INHERITED(HTMLExtAppElement, Element)
NS_IMPL_RELEASE_INHERITED(HTMLExtAppElement, Element)
NS_IMPL_CYCLE_COLLECTION_CLASS(HTMLExtAppElement)
NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN_INHERITED(HTMLExtAppElement,
nsGenericHTMLElement)
NS_IMPL_CYCLE_COLLECTION_UNLINK_END
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INHERITED(HTMLExtAppElement,
nsGenericHTMLElement)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE_END
// QueryInterface implementation for HTMLExtAppElement
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION_INHERITED(HTMLExtAppElement)
NS_INTERFACE_MAP_END_INHERITING(nsGenericHTMLElement)
NS_IMPL_ELEMENT_CLONE(HTMLExtAppElement)
JSObject*
HTMLExtAppElement::WrapNode(JSContext *aCx, JS::Handle<JSObject*> aGivenProto)
{
return HTMLExtAppElementBinding::Wrap(aCx, this, aGivenProto);
}
} // namespace dom
} // namespace mozilla
NS_IMPL_ISUPPORTS(nsCustomPropertyBag, nsICustomPropertyBag)
nsCustomPropertyBag::nsCustomPropertyBag()
{
}
nsCustomPropertyBag::~nsCustomPropertyBag()
{
}
NS_IMETHODIMP
nsCustomPropertyBag::SetProperty(const nsAString& aName, const nsAString& aValue)
{
mBag.Put(nsString(aName), new nsString(aValue));
return NS_OK;
}
NS_IMETHODIMP
nsCustomPropertyBag::RemoveProperty(const nsAString& aName)
{
mBag.Remove(nsString(aName));
return NS_OK;
}
void
nsCustomPropertyBag::GetCustomProperty(const nsAString& aName, nsString& aReturn)
{
nsString* value;
if (!mBag.Get(nsString(aName), &value)) {
aReturn.Truncate();
return;
}
MOZ_ASSERT(value);
aReturn.Assign(*value);
}
NS_IMPL_ISUPPORTS(nsCustomEventDispatch, nsICustomEventDispatch)
nsCustomEventDispatch::nsCustomEventDispatch(mozilla::dom::EventTarget* aEventTarget)
: mEventTarget(aEventTarget)
{
MOZ_ASSERT(mEventTarget);
}
void
nsCustomEventDispatch::ClearEventTarget()
{
mEventTarget = nullptr;
}
nsCustomEventDispatch::~nsCustomEventDispatch()
{
}
NS_IMETHODIMP
nsCustomEventDispatch::DispatchExternalEvent(const nsAString& value)
{
if (!mEventTarget) {
return NS_OK;
}
mozilla::dom::ExternalAppEventInit init;
init.mData = value;
nsRefPtr<mozilla::dom::ExternalAppEvent> event =
mozilla::dom::ExternalAppEvent::Constructor(mEventTarget,
NS_LITERAL_STRING("externalappevent"),
init);
bool defaultActionEnabled;
return mEventTarget->DispatchEvent(event, &defaultActionEnabled);
}