Diff
Modified: trunk/Source/WebCore/ChangeLog (141174 => 141175)
--- trunk/Source/WebCore/ChangeLog 2013-01-30 00:00:39 UTC (rev 141174)
+++ trunk/Source/WebCore/ChangeLog 2013-01-30 00:02:15 UTC (rev 141175)
@@ -1,3 +1,40 @@
+2013-01-29 Elliott Sprehn <espr...@chromium.org>
+ Refactor ShadowRoot exception handling
+ https://bugs.webkit.org/show_bug.cgi?id=108209
+
+ Reviewed by Dimitri Glazkov.
+
+ Many of the exception cases for ShadowRoot are actually impossible and
+ should be asserts instead. We can also move the one case of exception logic,
+ for elements that don't allow author shadows into Element::createShadowRoot
+ instead of having it all over the ShadowRoot and ElementShadow classes. This
+ is the first step in centralizing all ShadowRoot creation inside ElementShadow.
+
+ No new tests, covered by existing tests.
+
+ * WebCore.exp.in:
+ * dom/Element.cpp:
+ (WebCore::Element::createShadowRoot): Be explicit about what kind of ShadowRoot you're creating.
+ (WebCore::Element::ensureUserAgentShadowRoot): No more exceptions.
+ * dom/ElementShadow.cpp:
+ (WebCore::ElementShadow::addShadowRoot): This never actually throws exceptions, remove ExceptionCode.
+ * dom/ElementShadow.h:
+ (ElementShadow):
+ * dom/ShadowRoot.cpp:
+ (WebCore::determineUsageType): Merge with Element::createShadowRoot.
+ (WebCore):
+ (WebCore::ShadowRoot::ShadowRoot): Moved Histogram logic here since it's actually about the constructor anyway.
+ (WebCore::ShadowRoot::create): Removed overload that made the code less obvious.
+ * dom/ShadowRoot.h:
+ (ShadowRoot):
+ * html/HTMLKeygenElement.cpp:
+ (WebCore::HTMLKeygenElement::HTMLKeygenElement):
+ * html/shadow/TextFieldDecorationElement.cpp:
+ (WebCore::getDecorationRootAndDecoratedRoot):
+ * testing/Internals.cpp:
+ (WebCore::Internals::ensureShadowRoot):
+ (WebCore::Internals::createShadowRoot):
+
2013-01-29 Mark Lam <mark....@apple.com>
Change DatabaseContext lookup to be thread-safe.
Modified: trunk/Source/WebCore/WebCore.exp.in (141174 => 141175)
--- trunk/Source/WebCore/WebCore.exp.in 2013-01-30 00:00:39 UTC (rev 141174)
+++ trunk/Source/WebCore/WebCore.exp.in 2013-01-30 00:02:15 UTC (rev 141175)
@@ -83,7 +83,6 @@
__ZN7WebCore10ScrollView24windowResizerRectChangedEv
__ZN7WebCore10ScrollView8addChildEN3WTF10PassRefPtrINS_6WidgetEEE
__ZNK7WebCore14ScrollableArea17reportMemoryUsageEPN3WTF16MemoryObjectInfoE
-__ZN7WebCore10ShadowRoot6createEPNS_7ElementERi
__ZN7WebCore10deleteFileERKN3WTF6StringE
__ZN7WebCore10setCookiesEPNS_8DocumentERKNS_4KURLERKN3WTF6StringE
__ZN7WebCore10toDocumentEN3JSC7JSValueE
@@ -898,6 +897,7 @@
__ZN7WebCore7Element9innerTextEv
__ZN7WebCore7Element9setPseudoERKN3WTF12AtomicStringE
__ZNK7WebCore7Element13pseudoElementENS_8PseudoIdE
+__ZN7WebCore7Element16createShadowRootERi
__ZN7WebCore7IntRect5scaleEf
__ZN7WebCore7IntRect5uniteERKS0_
__ZN7WebCore7IntRect9intersectERKS0_
Modified: trunk/Source/WebCore/dom/Element.cpp (141174 => 141175)
--- trunk/Source/WebCore/dom/Element.cpp 2013-01-30 00:00:39 UTC (rev 141174)
+++ trunk/Source/WebCore/dom/Element.cpp 2013-01-30 00:02:15 UTC (rev 141175)
@@ -1450,7 +1450,19 @@
PassRefPtr<ShadowRoot> Element::createShadowRoot(ExceptionCode& ec)
{
- return ShadowRoot::create(this, ec);
+#if ENABLE(SHADOW_DOM)
+ if (RuntimeEnabledFeatures::authorShadowDOMForAnyElementEnabled())
+ return ShadowRoot::create(this, ShadowRoot::AuthorShadowRoot);
+#endif
+
+ // Since some elements recreates shadow root dynamically, multiple shadow
+ // subtrees won't work well in that element. Until they are fixed, we disable
+ // adding author shadow root for them.
+ if (!areAuthorShadowsAllowed()) {
+ ec = HIERARCHY_REQUEST_ERR;
+ return 0;
+ }
+ return ShadowRoot::create(this, ShadowRoot::AuthorShadowRoot);
}
ShadowRoot* Element::shadowRoot() const
@@ -1480,7 +1492,7 @@
{
if (ShadowRoot* shadowRoot = userAgentShadowRoot())
return shadowRoot;
- ShadowRoot* shadowRoot = ShadowRoot::create(this, ShadowRoot::UserAgentShadowRoot, ASSERT_NO_EXCEPTION).get();
+ ShadowRoot* shadowRoot = ShadowRoot::create(this, ShadowRoot::UserAgentShadowRoot).get();
didAddUserAgentShadowRoot(shadowRoot);
return shadowRoot;
}
Modified: trunk/Source/WebCore/dom/ElementShadow.cpp (141174 => 141175)
--- trunk/Source/WebCore/dom/ElementShadow.cpp 2013-01-30 00:00:39 UTC (rev 141174)
+++ trunk/Source/WebCore/dom/ElementShadow.cpp 2013-01-30 00:02:15 UTC (rev 141175)
@@ -32,32 +32,13 @@
namespace WebCore {
-static bool validateShadowRoot(Document* document, ShadowRoot* shadowRoot, ExceptionCode& ec)
+void ElementShadow::addShadowRoot(Element* shadowHost, PassRefPtr<ShadowRoot> shadowRoot, ShadowRoot::ShadowRootType type)
{
- if (!shadowRoot)
- return true;
-
- if (shadowRoot->host()) {
- ec = HIERARCHY_REQUEST_ERR;
- return false;
- }
-
- if (shadowRoot->document() != document) {
- ec = WRONG_DOCUMENT_ERR;
- return false;
- }
-
- return true;
-}
-
-void ElementShadow::addShadowRoot(Element* shadowHost, PassRefPtr<ShadowRoot> shadowRoot, ShadowRoot::ShadowRootType type, ExceptionCode& ec)
-{
ASSERT(shadowHost);
ASSERT(shadowRoot);
+ ASSERT(!shadowRoot->host());
+ ASSERT(shadowHost->document() == shadowRoot->document());
- if (!validateShadowRoot(shadowHost->document(), shadowRoot.get(), ec))
- return;
-
if (type == ShadowRoot::AuthorShadowRoot)
shadowHost->willAddAuthorShadowRoot();
Modified: trunk/Source/WebCore/dom/ElementShadow.h (141174 => 141175)
--- trunk/Source/WebCore/dom/ElementShadow.h 2013-01-30 00:00:39 UTC (rev 141174)
+++ trunk/Source/WebCore/dom/ElementShadow.h 2013-01-30 00:02:15 UTC (rev 141175)
@@ -56,7 +56,7 @@
ShadowRoot* oldestShadowRoot() const { return m_shadowRoots.tail(); }
ElementShadow* containingShadow() const;
- void addShadowRoot(Element* shadowHost, PassRefPtr<ShadowRoot>, ShadowRoot::ShadowRootType, ExceptionCode&);
+ void addShadowRoot(Element* shadowHost, PassRefPtr<ShadowRoot>, ShadowRoot::ShadowRootType);
void attach();
void detach();
Modified: trunk/Source/WebCore/dom/ShadowRoot.cpp (141174 => 141175)
--- trunk/Source/WebCore/dom/ShadowRoot.cpp 2013-01-30 00:00:39 UTC (rev 141174)
+++ trunk/Source/WebCore/dom/ShadowRoot.cpp 2013-01-30 00:02:15 UTC (rev 141175)
@@ -63,6 +63,23 @@
COMPILE_ASSERT(sizeof(ShadowRoot) == sizeof(SameSizeAsShadowRoot), shadowroot_should_stay_small);
+enum ShadowRootUsageOriginType {
+ ShadowRootUsageOriginWeb = 0,
+ ShadowRootUsageOriginNotWeb,
+ ShadowRootUsageOriginTypes
+};
+
+static inline ShadowRootUsageOriginType determineUsageType(Document* document)
+{
+ // Enables only on CHROMIUM since this cost won't worth paying for platforms which don't collect this metrics.
+#if PLATFORM(CHROMIUM)
+ return document->url().string().startsWith("http") ? ShadowRootUsageOriginWeb : ShadowRootUsageOriginNotWeb;
+#else
+ UNUSED_PARAM(document);
+ return ShadowRootUsageOriginWeb;
+#endif
+}
+
ShadowRoot::ShadowRoot(Document* document, ShadowRootType type)
: DocumentFragment(document, CreateShadowRoot)
, TreeScope(this, document)
@@ -76,6 +93,9 @@
{
ASSERT(document);
setTreeScope(this);
+
+ if (type == ShadowRoot::AuthorShadowRoot)
+ HistogramSupport::histogramEnumeration("WebCore.ShadowRoot.constructor", determineUsageType(document), ShadowRootUsageOriginTypes);
}
ShadowRoot::~ShadowRoot()
@@ -94,62 +114,16 @@
clearRareData();
}
-static bool allowsAuthorShadowRoot(Element* element)
+PassRefPtr<ShadowRoot> ShadowRoot::create(Element* element, ShadowRootType type)
{
-#if ENABLE(SHADOW_DOM)
- if (RuntimeEnabledFeatures::authorShadowDOMForAnyElementEnabled())
- return true;
-#endif
- return element->areAuthorShadowsAllowed();
-}
+ ASSERT(element);
-enum ShadowRootUsageOriginType {
- ShadowRootUsageOriginWeb = 0,
- ShadowRootUsageOriginNotWeb,
- ShadowRootUsageOriginTypes
-};
-
-static inline ShadowRootUsageOriginType determineUsageType(Element* host)
-{
- // Enables only on CHROMIUM since this cost won't worth paying for platforms which don't collect this metrics.
-#if PLATFORM(CHROMIUM)
- if (!host)
- return ShadowRootUsageOriginWeb;
- return host->document()->url().string().startsWith("http") ? ShadowRootUsageOriginWeb : ShadowRootUsageOriginNotWeb;
-#else
- UNUSED_PARAM(host);
- return ShadowRootUsageOriginWeb;
-#endif
-}
-
-PassRefPtr<ShadowRoot> ShadowRoot::create(Element* element, ExceptionCode& ec)
-{
- HistogramSupport::histogramEnumeration("WebCore.ShadowRoot.constructor", determineUsageType(element), ShadowRootUsageOriginTypes);
- return create(element, AuthorShadowRoot, ec);
-}
-
-PassRefPtr<ShadowRoot> ShadowRoot::create(Element* element, ShadowRootType type, ExceptionCode& ec)
-{
- if (!element) {
- ec = HIERARCHY_REQUEST_ERR;
- return 0;
- }
-
- // Since some elements recreates shadow root dynamically, multiple shadow subtrees won't work well in that element.
- // Until they are fixed, we disable adding author shadow root for them.
- if (type == AuthorShadowRoot && !allowsAuthorShadowRoot(element)) {
- ec = HIERARCHY_REQUEST_ERR;
- return 0;
- }
-
RefPtr<ShadowRoot> shadowRoot = adoptRef(new ShadowRoot(element->document(), type));
- ec = 0;
- element->ensureShadow()->addShadowRoot(element, shadowRoot, type, ec);
- if (ec)
- return 0;
+ element->ensureShadow()->addShadowRoot(element, shadowRoot, type);
ASSERT(element == shadowRoot->host());
ASSERT(element->shadow());
+
return shadowRoot.release();
}
Modified: trunk/Source/WebCore/dom/ShadowRoot.h (141174 => 141175)
--- trunk/Source/WebCore/dom/ShadowRoot.h 2013-01-30 00:00:39 UTC (rev 141174)
+++ trunk/Source/WebCore/dom/ShadowRoot.h 2013-01-30 00:02:15 UTC (rev 141175)
@@ -46,8 +46,6 @@
class ShadowRoot : public DocumentFragment, public TreeScope, public DoublyLinkedListNode<ShadowRoot> {
friend class WTF::DoublyLinkedListNode<ShadowRoot>;
public:
- static PassRefPtr<ShadowRoot> create(Element*, ExceptionCode&);
-
// FIXME: We will support multiple shadow subtrees, however current implementation does not work well
// if a shadow root is dynamically created. So we prohibit multiple shadow subtrees
// in several elements for a while.
@@ -56,7 +54,7 @@
UserAgentShadowRoot = 0,
AuthorShadowRoot
};
- static PassRefPtr<ShadowRoot> create(Element*, ShadowRootType, ExceptionCode& = ASSERT_NO_EXCEPTION);
+ static PassRefPtr<ShadowRoot> create(Element*, ShadowRootType);
void recalcStyle(StyleChange);
Modified: trunk/Source/WebCore/html/HTMLKeygenElement.cpp (141174 => 141175)
--- trunk/Source/WebCore/html/HTMLKeygenElement.cpp 2013-01-30 00:00:39 UTC (rev 141174)
+++ trunk/Source/WebCore/html/HTMLKeygenElement.cpp 2013-01-30 00:02:15 UTC (rev 141175)
@@ -82,9 +82,7 @@
option->appendChild(Text::create(document, keys[i]), ec);
}
- ASSERT(!shadow());
- RefPtr<ShadowRoot> root = ShadowRoot::create(this, ShadowRoot::UserAgentShadowRoot);
- root->appendChild(select, ec);
+ ensureUserAgentShadowRoot()->appendChild(select, ec);
}
PassRefPtr<HTMLKeygenElement> HTMLKeygenElement::create(const QualifiedName& tagName, Document* document, HTMLFormElement* form)
Modified: trunk/Source/WebCore/html/shadow/TextFieldDecorationElement.cpp (141174 => 141175)
--- trunk/Source/WebCore/html/shadow/TextFieldDecorationElement.cpp 2013-01-30 00:00:39 UTC (rev 141174)
+++ trunk/Source/WebCore/html/shadow/TextFieldDecorationElement.cpp 2013-01-30 00:02:15 UTC (rev 141175)
@@ -90,7 +90,7 @@
if (newRoot)
newRoot->removeChild(newRoot->firstChild());
else
- newRoot = ShadowRoot::create(input, ShadowRoot::UserAgentShadowRoot, ASSERT_NO_EXCEPTION).get();
+ newRoot = input->ensureUserAgentShadowRoot();
decorationRoot = newRoot;
decoratedRoot = existingRoot;
}
Modified: trunk/Source/WebCore/testing/Internals.cpp (141174 => 141175)
--- trunk/Source/WebCore/testing/Internals.cpp 2013-01-30 00:00:39 UTC (rev 141174)
+++ trunk/Source/WebCore/testing/Internals.cpp 2013-01-30 00:02:15 UTC (rev 141175)
@@ -580,7 +580,7 @@
if (ElementShadow* shadow = host->shadow())
return shadow->youngestShadowRoot();
- return ShadowRoot::create(host, ec).get();
+ return host->createShadowRoot(ec).get();
}
Internals::ShadowRootIfShadowDOMEnabledOrNode* Internals::createShadowRoot(Element* host, ExceptionCode& ec)
@@ -589,7 +589,7 @@
ec = INVALID_ACCESS_ERR;
return 0;
}
- return ShadowRoot::create(host, ec).get();
+ return host->createShadowRoot(ec).get();
}
Internals::ShadowRootIfShadowDOMEnabledOrNode* Internals::shadowRoot(Element* host, ExceptionCode& ec)
Modified: trunk/Source/WebKit/win/ChangeLog (141174 => 141175)
--- trunk/Source/WebKit/win/ChangeLog 2013-01-30 00:00:39 UTC (rev 141174)
+++ trunk/Source/WebKit/win/ChangeLog 2013-01-30 00:02:15 UTC (rev 141175)
@@ -1,3 +1,12 @@
+2013-01-29 Elliott Sprehn <espr...@chromium.org>
+
+ Refactor ShadowRoot exception handling
+ https://bugs.webkit.org/show_bug.cgi?id=108209
+
+ Reviewed by Dimitri Glazkov.
+
+ * WebKit.vcproj/WebKitExports.def.in: Swap ShadowRoot::create export with Element::createShadowRoot.
+
2013-01-29 Nate Chapin <jap...@chromium.org>
Enable reuse of cached main resources
Modified: trunk/Source/WebKit/win/WebKit.vcproj/WebKitExports.def.in (141174 => 141175)
--- trunk/Source/WebKit/win/WebKit.vcproj/WebKitExports.def.in 2013-01-30 00:00:39 UTC (rev 141174)
+++ trunk/Source/WebKit/win/WebKit.vcproj/WebKitExports.def.in 2013-01-30 00:02:15 UTC (rev 141175)
@@ -176,7 +176,7 @@
?create@Range@WebCore@@SA?AV?$PassRefPtr@VRange@WebCore@@@WTF@@V?$PassRefPtr@VDocument@WebCore@@@4@V?$PassRefPtr@VNode@WebCore@@@4@H1H@Z
?create@SerializedScriptValue@WebCore@@SA?AV?$PassRefPtr@VSerializedScriptValue@WebCore@@@WTF@@ABVString@4@@Z
?create@SerializedScriptValue@WebCore@@SA?AV?$PassRefPtr@VSerializedScriptValue@WebCore@@@WTF@@PAVExecState@JSC@@VJSValue@6@PAV?$Vector@V?$RefPtr@VMessagePort@WebCore@@@WTF@@$00@4@PAV?$Vector@V?$RefPtr@VArrayBuffer@WTF@@@WTF@@$00@4@W4SerializationErrorMode@2@@Z
- ?create@ShadowRoot@WebCore@@SA?AV?$PassRefPtr@VShadowRoot@WebCore@@@WTF@@PAVElement@2@AAH@Z
+ ?createShadowRoot@Element@WebCore@@QAE?AV?$PassRefPtr@VShadowRoot@WebCore@@@WTF@@AAH@Z
?createWrapper@WebCore@@YA?AVJSValue@JSC@@PAVExecState@3@PAVJSDOMGlobalObject@1@PAVNode@1@@Z
?deserialize@SerializedScriptValue@WebCore@@QAE?AVJSValue@JSC@@PAVExecState@4@PAVJSGlobalObject@4@PAV?$Vector@V?$RefPtr@VMessagePort@WebCore@@@WTF@@$00@WTF@@W4SerializationErrorMode@2@@Z
?documentState@HistoryItem@WebCore@@QBEABV?$Vector@VString@WTF@@$0A@@WTF@@XZ
@@ -564,7 +564,7 @@
?create@Range@WebCore@@SA?AV?$PassRefPtr@VRange@WebCore@@@WTF@@V?$PassRefPtr@VDocument@WebCore@@@4@V?$PassRefPtr@VNode@WebCore@@@4@H1H@Z
?create@SerializedScriptValue@WebCore@@SA?AV?$PassRefPtr@VSerializedScriptValue@WebCore@@@WTF@@ABVString@4@@Z
?create@SerializedScriptValue@WebCore@@SA?AV?$PassRefPtr@VSerializedScriptValue@WebCore@@@WTF@@PAVExecState@JSC@@VJSValue@6@PAV?$Vector@V?$RefPtr@VMessagePort@WebCore@@@WTF@@$00@4@PAV?$Vector@V?$RefPtr@VArrayBuffer@WTF@@@WTF@@$00@4@W4SerializationErrorMode@2@@Z
- ?create@ShadowRoot@WebCore@@SA?AV?$PassRefPtr@VShadowRoot@WebCore@@@WTF@@PAVElement@2@AAH@Z
+ ?createShadowRoot@Element@WebCore@@QAE?AV?$PassRefPtr@VShadowRoot@WebCore@@@WTF@@AAH@Z
?createWrapper@WebCore@@YA?AVJSValue@JSC@@PAVExecState@3@PAVJSDOMGlobalObject@1@PAVNode@1@@Z
?deserialize@SerializedScriptValue@WebCore@@QAE?AVJSValue@JSC@@PAVExecState@4@PAVJSGlobalObject@4@PAV?$Vector@V?$RefPtr@VMessagePort@WebCore@@@WTF@@$00@WTF@@W4SerializationErrorMode@2@@Z
?documentState@HistoryItem@WebCore@@QBEABV?$Vector@VString@WTF@@$0A@@WTF@@XZ
@@ -950,7 +950,7 @@
?create@Range@WebCore@@SA?AV?$PassRefPtr@VRange@WebCore@@@WTF@@V?$PassRefPtr@VDocument@WebCore@@@4@V?$PassRefPtr@VNode@WebCore@@@4@H1H@Z
?create@SerializedScriptValue@WebCore@@SA?AV?$PassRefPtr@VSerializedScriptValue@WebCore@@@WTF@@ABVString@4@@Z
?create@SerializedScriptValue@WebCore@@SA?AV?$PassRefPtr@VSerializedScriptValue@WebCore@@@WTF@@PAVExecState@JSC@@VJSValue@6@PAV?$Vector@V?$RefPtr@VMessagePort@WebCore@@@WTF@@$00@4@PAV?$Vector@V?$RefPtr@VArrayBuffer@WTF@@@WTF@@$00@4@W4SerializationErrorMode@2@@Z
- ?create@ShadowRoot@WebCore@@SA?AV?$PassRefPtr@VShadowRoot@WebCore@@@WTF@@PAVElement@2@AAH@Z
+ ?createShadowRoot@Element@WebCore@@QAE?AV?$PassRefPtr@VShadowRoot@WebCore@@@WTF@@AAH@Z
?createWrapper@WebCore@@YA?AVJSValue@JSC@@PAVExecState@3@PAVJSDOMGlobalObject@1@PAVNode@1@@Z
?deserialize@SerializedScriptValue@WebCore@@QAE?AVJSValue@JSC@@PAVExecState@4@PAVJSGlobalObject@4@PAV?$Vector@V?$RefPtr@VMessagePort@WebCore@@@WTF@@$00@WTF@@W4SerializationErrorMode@2@@Z
?documentState@HistoryItem@WebCore@@QBEABV?$Vector@VString@WTF@@$0A@@WTF@@XZ
@@ -1336,7 +1336,7 @@
?create@Range@WebCore@@SA?AV?$PassRefPtr@VRange@WebCore@@@WTF@@V?$PassRefPtr@VDocument@WebCore@@@4@V?$PassRefPtr@VNode@WebCore@@@4@H1H@Z
?create@SerializedScriptValue@WebCore@@SA?AV?$PassRefPtr@VSerializedScriptValue@WebCore@@@WTF@@ABVString@4@@Z
?create@SerializedScriptValue@WebCore@@SA?AV?$PassRefPtr@VSerializedScriptValue@WebCore@@@WTF@@PAVExecState@JSC@@VJSValue@6@PAV?$Vector@V?$RefPtr@VMessagePort@WebCore@@@WTF@@$00@4@PAV?$Vector@V?$RefPtr@VArrayBuffer@WTF@@@WTF@@$00@4@W4SerializationErrorMode@2@@Z
- ?create@ShadowRoot@WebCore@@SA?AV?$PassRefPtr@VShadowRoot@WebCore@@@WTF@@PAVElement@2@AAH@Z
+ ?createShadowRoot@Element@WebCore@@QAE?AV?$PassRefPtr@VShadowRoot@WebCore@@@WTF@@AAH@Z
?createWrapper@WebCore@@YA?AVJSValue@JSC@@PAVExecState@3@PAVJSDOMGlobalObject@1@PAVNode@1@@Z
?deserialize@SerializedScriptValue@WebCore@@QAE?AVJSValue@JSC@@PAVExecState@4@PAVJSGlobalObject@4@PAV?$Vector@V?$RefPtr@VMessagePort@WebCore@@@WTF@@$00@WTF@@W4SerializationErrorMode@2@@Z
?documentState@HistoryItem@WebCore@@QBEABV?$Vector@VString@WTF@@$0A@@WTF@@XZ