Bug 1275833 - Add window.customElements and CustomElementsRegistry interface for custom element v1. r=smaug, wchen

--HG--
extra : rebase_source : 5bed500eee0d4902703e4e2159e291779ff69ab5
This commit is contained in:
John Dai 2016-07-24 23:38:00 +02:00
Родитель b0b2cf9184
Коммит 7f2bb4c2c9
13 изменённых файлов: 210 добавлений и 3 удалений

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

@ -0,0 +1,98 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* 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/CustomElementsRegistry.h"
#include "mozilla/dom/CustomElementsRegistryBinding.h"
#include "mozilla/dom/WebComponentsBinding.h"
namespace mozilla {
namespace dom {
// Only needed for refcounted objects.
NS_IMPL_CYCLE_COLLECTION_WRAPPERCACHE(CustomElementsRegistry, mWindow)
NS_IMPL_CYCLE_COLLECTING_ADDREF(CustomElementsRegistry)
NS_IMPL_CYCLE_COLLECTING_RELEASE(CustomElementsRegistry)
NS_INTERFACE_MAP_BEGIN_CYCLE_COLLECTION(CustomElementsRegistry)
NS_WRAPPERCACHE_INTERFACE_MAP_ENTRY
NS_INTERFACE_MAP_ENTRY(nsISupports)
NS_INTERFACE_MAP_END
/* static */ bool
CustomElementsRegistry::IsCustomElementsEnabled(JSContext* aCx, JSObject* aObject)
{
JS::Rooted<JSObject*> obj(aCx, aObject);
if (Preferences::GetBool("dom.webcomponents.customelements.enabled") ||
nsDocument::IsWebComponentsEnabled(aCx, obj)) {
return true;
}
return false;
}
/* static */ already_AddRefed<CustomElementsRegistry>
CustomElementsRegistry::Create(nsPIDOMWindowInner* aWindow)
{
MOZ_ASSERT(aWindow);
MOZ_ASSERT(aWindow->IsInnerWindow());
if (!aWindow->GetDocShell()) {
return nullptr;
}
RefPtr<CustomElementsRegistry> customElementsRegistry =
new CustomElementsRegistry(aWindow);
return customElementsRegistry.forget();
}
CustomElementsRegistry::CustomElementsRegistry(nsPIDOMWindowInner* aWindow)
: mWindow(aWindow)
{
}
CustomElementsRegistry::~CustomElementsRegistry()
{
}
JSObject*
CustomElementsRegistry::WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto)
{
return CustomElementsRegistryBinding::Wrap(aCx, this, aGivenProto);
}
nsISupports* CustomElementsRegistry::GetParentObject() const
{
return mWindow;
}
void CustomElementsRegistry::Define(const nsAString& aName,
Function& aFunctionConstructor,
const ElementDefinitionOptions& aOptions,
ErrorResult& aRv)
{
// TODO: This function will be implemented in bug 1275835
aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
}
void
CustomElementsRegistry::Get(JSContext* aCx, const nsAString& aName,
JS::MutableHandle<JS::Value> aRetVal,
ErrorResult& aRv)
{
// TODO: This function will be implemented in bug 1275838
aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
}
already_AddRefed<Promise>
CustomElementsRegistry::WhenDefined(const nsAString& name, ErrorResult& aRv)
{
// TODO: This function will be implemented in bug 1275839
aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
return nullptr;
}
} // namespace dom
} // namespace mozilla

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

@ -0,0 +1,61 @@
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim:set ts=2 sw=2 sts=2 et cindent: */
/* 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/. */
#ifndef mozilla_dom_CustomElementsRegistry_h
#define mozilla_dom_CustomElementsRegistry_h
#include "js/TypeDecls.h"
#include "mozilla/Attributes.h"
#include "mozilla/ErrorResult.h"
#include "mozilla/dom/BindingDeclarations.h"
#include "nsCycleCollectionParticipant.h"
#include "nsWrapperCache.h"
#include "mozilla/dom/FunctionBinding.h"
namespace mozilla {
namespace dom {
struct ElementDefinitionOptions;
struct LifecycleCallbacks;
class Function;
class Promise;
class CustomElementsRegistry final : public nsISupports,
public nsWrapperCache
{
public:
NS_DECL_CYCLE_COLLECTING_ISUPPORTS
NS_DECL_CYCLE_COLLECTION_SCRIPT_HOLDER_CLASS(CustomElementsRegistry)
public:
static bool IsCustomElementsEnabled(JSContext* aCx, JSObject* aObject);
static already_AddRefed<CustomElementsRegistry> Create(nsPIDOMWindowInner* aWindow);
already_AddRefed<nsIDocument> GetOwnerDocument() const;
private:
explicit CustomElementsRegistry(nsPIDOMWindowInner* aWindow);
~CustomElementsRegistry();
nsCOMPtr<nsPIDOMWindowInner> mWindow;
public:
nsISupports* GetParentObject() const;
virtual JSObject* WrapObject(JSContext* aCx, JS::Handle<JSObject*> aGivenProto) override;
void Define(const nsAString& aName, Function& aFunctionConstructor,
const ElementDefinitionOptions& aOptions, ErrorResult& aRv);
void Get(JSContext* cx, const nsAString& name,
JS::MutableHandle<JS::Value> aRetVal, ErrorResult& aRv);
already_AddRefed<Promise> WhenDefined(const nsAString& name, ErrorResult& aRv);
};
} // namespace dom
} // namespace mozilla
#endif // mozilla_dom_CustomElementsRegistry_h

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

@ -156,6 +156,7 @@ EXPORTS.mozilla.dom += [
'ChromeNodeList.h', 'ChromeNodeList.h',
'ChromeUtils.h', 'ChromeUtils.h',
'Comment.h', 'Comment.h',
'CustomElementsRegistry.h',
'DirectionalityUtils.h', 'DirectionalityUtils.h',
'DocumentFragment.h', 'DocumentFragment.h',
'DocumentType.h', 'DocumentType.h',
@ -216,6 +217,7 @@ UNIFIED_SOURCES += [
'ChromeUtils.cpp', 'ChromeUtils.cpp',
'Comment.cpp', 'Comment.cpp',
'Crypto.cpp', 'Crypto.cpp',
'CustomElementsRegistry.cpp',
'DirectionalityUtils.cpp', 'DirectionalityUtils.cpp',
'DocumentFragment.cpp', 'DocumentFragment.cpp',
'DocumentType.cpp', 'DocumentType.cpp',

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

@ -4768,7 +4768,8 @@ nsDocument::SetScriptGlobalObject(nsIScriptGlobalObject *aScriptGlobalObject)
} }
MaybeRescheduleAnimationFrameNotifications(); MaybeRescheduleAnimationFrameNotifications();
if (Preferences::GetBool("dom.webcomponents.enabled")) { if (Preferences::GetBool("dom.webcomponents.enabled") ||
Preferences::GetBool("dom.webcomponents.customelements.enabled")) {
mRegistry = new Registry(); mRegistry = new Registry();
} }
} }

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

@ -1565,6 +1565,7 @@ nsGlobalWindow::CleanUp()
mScrollbars = nullptr; mScrollbars = nullptr;
mLocation = nullptr; mLocation = nullptr;
mHistory = nullptr; mHistory = nullptr;
mCustomElements = nullptr;
mFrames = nullptr; mFrames = nullptr;
mWindowUtils = nullptr; mWindowUtils = nullptr;
mApplicationCache = nullptr; mApplicationCache = nullptr;
@ -1695,6 +1696,7 @@ nsGlobalWindow::FreeInnerObjects()
mLocation = nullptr; mLocation = nullptr;
mHistory = nullptr; mHistory = nullptr;
mCustomElements = nullptr;
if (mNavigator) { if (mNavigator) {
mNavigator->OnNavigation(); mNavigator->OnNavigation();
@ -1877,6 +1879,7 @@ NS_IMPL_CYCLE_COLLECTION_TRAVERSE_BEGIN_INTERNAL(nsGlobalWindow)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLocation) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLocation)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mHistory) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mHistory)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mCustomElements)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLocalStorage) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mLocalStorage)
NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSessionStorage) NS_IMPL_CYCLE_COLLECTION_TRAVERSE(mSessionStorage)
@ -1950,6 +1953,7 @@ NS_IMPL_CYCLE_COLLECTION_UNLINK_BEGIN(nsGlobalWindow)
} }
NS_IMPL_CYCLE_COLLECTION_UNLINK(mLocation) NS_IMPL_CYCLE_COLLECTION_UNLINK(mLocation)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mHistory) NS_IMPL_CYCLE_COLLECTION_UNLINK(mHistory)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mCustomElements)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mLocalStorage) NS_IMPL_CYCLE_COLLECTION_UNLINK(mLocalStorage)
NS_IMPL_CYCLE_COLLECTION_UNLINK(mSessionStorage) NS_IMPL_CYCLE_COLLECTION_UNLINK(mSessionStorage)
if (tmp->mApplicationCache) { if (tmp->mApplicationCache) {
@ -3832,6 +3836,17 @@ nsGlobalWindow::GetHistory(ErrorResult& aError)
return mHistory; return mHistory;
} }
CustomElementsRegistry*
nsGlobalWindow::CustomElements()
{
MOZ_RELEASE_ASSERT(IsInnerWindow());
if (!mCustomElements) {
mCustomElements = CustomElementsRegistry::Create(AsInner());
}
return mCustomElements;
}
Performance* Performance*
nsPIDOMWindowInner::GetPerformance() nsPIDOMWindowInner::GetPerformance()
{ {

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

@ -106,6 +106,7 @@ class BarProp;
struct ChannelPixelLayout; struct ChannelPixelLayout;
class Console; class Console;
class Crypto; class Crypto;
class CustomElementsRegistry;
class External; class External;
class Function; class Function;
class Gamepad; class Gamepad;
@ -877,6 +878,7 @@ public:
nsLocation* GetLocation(mozilla::ErrorResult& aError); nsLocation* GetLocation(mozilla::ErrorResult& aError);
nsIDOMLocation* GetLocation() override; nsIDOMLocation* GetLocation() override;
nsHistory* GetHistory(mozilla::ErrorResult& aError); nsHistory* GetHistory(mozilla::ErrorResult& aError);
mozilla::dom::CustomElementsRegistry* CustomElements() override;
mozilla::dom::BarProp* GetLocationbar(mozilla::ErrorResult& aError); mozilla::dom::BarProp* GetLocationbar(mozilla::ErrorResult& aError);
mozilla::dom::BarProp* GetMenubar(mozilla::ErrorResult& aError); mozilla::dom::BarProp* GetMenubar(mozilla::ErrorResult& aError);
mozilla::dom::BarProp* GetPersonalbar(mozilla::ErrorResult& aError); mozilla::dom::BarProp* GetPersonalbar(mozilla::ErrorResult& aError);
@ -1837,6 +1839,7 @@ protected:
uint32_t mTimeoutFiringDepth; uint32_t mTimeoutFiringDepth;
RefPtr<nsLocation> mLocation; RefPtr<nsLocation> mLocation;
RefPtr<nsHistory> mHistory; RefPtr<nsHistory> mHistory;
RefPtr<mozilla::dom::CustomElementsRegistry> mCustomElements;
// These member variables are used on both inner and the outer windows. // These member variables are used on both inner and the outer windows.
nsCOMPtr<nsIPrincipal> mDocumentPrincipal; nsCOMPtr<nsIPrincipal> mDocumentPrincipal;

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

@ -44,6 +44,7 @@ class AudioContext;
class Element; class Element;
class Performance; class Performance;
class ServiceWorkerRegistration; class ServiceWorkerRegistration;
class CustomElementsRegistry;
} // namespace dom } // namespace dom
namespace gfx { namespace gfx {
class VRDeviceProxy; class VRDeviceProxy;
@ -96,7 +97,7 @@ public:
const nsPIDOMWindowOuter* AsOuter() const; const nsPIDOMWindowOuter* AsOuter() const;
virtual nsPIDOMWindowOuter* GetPrivateRoot() = 0; virtual nsPIDOMWindowOuter* GetPrivateRoot() = 0;
virtual mozilla::dom::CustomElementsRegistry* CustomElements() = 0;
// Outer windows only. // Outer windows only.
virtual void ActivateOrDeactivate(bool aActivate) = 0; virtual void ActivateOrDeactivate(bool aActivate) = 0;

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

@ -0,0 +1,20 @@
/* 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/. */
// https://html.spec.whatwg.org/#dom-window-customelements
[Func="CustomElementsRegistry::IsCustomElementsEnabled"]
interface CustomElementsRegistry {
[Throws]
void define(DOMString name, Function functionConstructor,
optional ElementDefinitionOptions options);
[Throws]
any get(DOMString name);
[Throws]
Promise<void> whenDefined(DOMString name);
};
dictionary ElementDefinitionOptions {
DOMString extends;
};

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

@ -261,7 +261,8 @@ partial interface Document {
//http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html#dfn-document-register //http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/custom/index.html#dfn-document-register
partial interface Document { partial interface Document {
[Throws, Func="nsDocument::IsWebComponentsEnabled"] // this is deprecated from CustomElements v0
[Throws, Func="CustomElementsRegistry::IsCustomElementsEnabled"]
object registerElement(DOMString name, optional ElementRegistrationOptions options); object registerElement(DOMString name, optional ElementRegistrationOptions options);
}; };

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

@ -36,6 +36,8 @@ typedef any Transferable;
[PutForwards=href, Unforgeable, Throws, [PutForwards=href, Unforgeable, Throws,
CrossOriginReadable, CrossOriginWritable] readonly attribute Location? location; CrossOriginReadable, CrossOriginWritable] readonly attribute Location? location;
[Throws] readonly attribute History history; [Throws] readonly attribute History history;
[Func="CustomElementsRegistry::IsCustomElementsEnabled"]
readonly attribute CustomElementsRegistry customElements;
[Replaceable, Throws] readonly attribute BarProp locationbar; [Replaceable, Throws] readonly attribute BarProp locationbar;
[Replaceable, Throws] readonly attribute BarProp menubar; [Replaceable, Throws] readonly attribute BarProp menubar;
[Replaceable, Throws] readonly attribute BarProp personalbar; [Replaceable, Throws] readonly attribute BarProp personalbar;

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

@ -107,6 +107,7 @@ WEBIDL_FILES = [
'CSSTransition.webidl', 'CSSTransition.webidl',
'CSSValue.webidl', 'CSSValue.webidl',
'CSSValueList.webidl', 'CSSValueList.webidl',
'CustomElementsRegistry.webidl',
'DataContainerEvent.webidl', 'DataContainerEvent.webidl',
'DataTransfer.webidl', 'DataTransfer.webidl',
'DataTransferItem.webidl', 'DataTransferItem.webidl',

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

@ -1179,6 +1179,7 @@ pref("dom.event.highrestimestamp.enabled", false);
#endif #endif
pref("dom.webcomponents.enabled", false); pref("dom.webcomponents.enabled", false);
pref("dom.webcomponents.customelements.enabled", false);
pref("javascript.enabled", true); pref("javascript.enabled", true);
pref("javascript.options.strict", false); pref("javascript.options.strict", false);

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

@ -50,6 +50,7 @@ user_pref("media.gmp-manager.url.override", "http://%(server)s/dummy-gmp-manager
user_pref("dom.w3c_touch_events.enabled", 1); user_pref("dom.w3c_touch_events.enabled", 1);
user_pref("dom.undo_manager.enabled", true); user_pref("dom.undo_manager.enabled", true);
user_pref("dom.webcomponents.enabled", true); user_pref("dom.webcomponents.enabled", true);
user_pref("dom.webcomponents.customelements.enabled", true);
user_pref("dom.htmlimports.enabled", true); user_pref("dom.htmlimports.enabled", true);
// Existing tests assume there is no font size inflation. // Existing tests assume there is no font size inflation.
user_pref("font.size.inflation.emPerLine", 0); user_pref("font.size.inflation.emPerLine", 0);