summaryrefslogtreecommitdiff
path: root/Source/WebCore/html/HTMLFrameSetElement.cpp
diff options
context:
space:
mode:
authorKonstantin Tokarev <annulen@yandex.ru>2016-08-25 19:20:41 +0300
committerKonstantin Tokarev <annulen@yandex.ru>2017-02-02 12:30:55 +0000
commit6882a04fb36642862b11efe514251d32070c3d65 (patch)
treeb7959826000b061fd5ccc7512035c7478742f7b0 /Source/WebCore/html/HTMLFrameSetElement.cpp
parentab6df191029eeeb0b0f16f127d553265659f739e (diff)
downloadqtwebkit-6882a04fb36642862b11efe514251d32070c3d65.tar.gz
Imported QtWebKit TP3 (git b57bc6801f1876c3220d5a4bfea33d620d477443)
Change-Id: I3b1d8a2808782c9f34d50240000e20cb38d3680f Reviewed-by: Konstantin Tokarev <annulen@yandex.ru>
Diffstat (limited to 'Source/WebCore/html/HTMLFrameSetElement.cpp')
-rw-r--r--Source/WebCore/html/HTMLFrameSetElement.cpp181
1 files changed, 91 insertions, 90 deletions
diff --git a/Source/WebCore/html/HTMLFrameSetElement.cpp b/Source/WebCore/html/HTMLFrameSetElement.cpp
index 46144bc23..17a90317f 100644
--- a/Source/WebCore/html/HTMLFrameSetElement.cpp
+++ b/Source/WebCore/html/HTMLFrameSetElement.cpp
@@ -24,27 +24,26 @@
#include "config.h"
#include "HTMLFrameSetElement.h"
-#include "Attribute.h"
#include "CSSPropertyNames.h"
#include "Document.h"
+#include "ElementIterator.h"
#include "Event.h"
#include "EventNames.h"
#include "Frame.h"
#include "FrameLoader.h"
#include "FrameLoaderClient.h"
+#include "HTMLBodyElement.h"
#include "HTMLNames.h"
#include "Length.h"
#include "MouseEvent.h"
-#include "NodeRenderingContext.h"
#include "RenderFrameSet.h"
-#include "ScriptEventListener.h"
#include "Text.h"
namespace WebCore {
using namespace HTMLNames;
-HTMLFrameSetElement::HTMLFrameSetElement(const QualifiedName& tagName, Document* document)
+HTMLFrameSetElement::HTMLFrameSetElement(const QualifiedName& tagName, Document& document)
: HTMLElement(tagName, document)
, m_totalRows(1)
, m_totalCols(1)
@@ -56,13 +55,12 @@ HTMLFrameSetElement::HTMLFrameSetElement(const QualifiedName& tagName, Document*
, m_noresize(false)
{
ASSERT(hasTagName(framesetTag));
-
- setHasCustomStyleCallbacks();
+ setHasCustomStyleResolveCallbacks();
}
-PassRefPtr<HTMLFrameSetElement> HTMLFrameSetElement::create(const QualifiedName& tagName, Document* document)
+Ref<HTMLFrameSetElement> HTMLFrameSetElement::create(const QualifiedName& tagName, Document& document)
{
- return adoptRef(new HTMLFrameSetElement(tagName, document));
+ return adoptRef(*new HTMLFrameSetElement(tagName, document));
}
bool HTMLFrameSetElement::isPresentationAttribute(const QualifiedName& name) const
@@ -72,7 +70,7 @@ bool HTMLFrameSetElement::isPresentationAttribute(const QualifiedName& name) con
return HTMLElement::isPresentationAttribute(name);
}
-void HTMLFrameSetElement::collectStyleForPresentationAttribute(const QualifiedName& name, const AtomicString& value, MutableStylePropertySet* style)
+void HTMLFrameSetElement::collectStyleForPresentationAttribute(const QualifiedName& name, const AtomicString& value, MutableStyleProperties& style)
{
if (name == bordercolorAttr)
addHTMLColorToStyle(style, CSSPropertyBorderColor, value);
@@ -83,149 +81,152 @@ void HTMLFrameSetElement::collectStyleForPresentationAttribute(const QualifiedNa
void HTMLFrameSetElement::parseAttribute(const QualifiedName& name, const AtomicString& value)
{
if (name == rowsAttr) {
+ // FIXME: What is the right thing to do when removing this attribute?
+ // Why not treat it the same way we treat setting it to the empty string?
if (!value.isNull()) {
m_rowLengths = newLengthArray(value.string(), m_totalRows);
+ // FIXME: Would be nice to optimize the case where m_rowLengths did not change.
setNeedsStyleRecalc();
}
- } else if (name == colsAttr) {
+ return;
+ }
+
+ if (name == colsAttr) {
+ // FIXME: What is the right thing to do when removing this attribute?
+ // Why not treat it the same way we treat setting it to the empty string?
if (!value.isNull()) {
m_colLengths = newLengthArray(value.string(), m_totalCols);
+ // FIXME: Would be nice to optimize the case where m_colLengths did not change.
setNeedsStyleRecalc();
}
- } else if (name == frameborderAttr) {
+ return;
+ }
+
+ if (name == frameborderAttr) {
if (!value.isNull()) {
- if (equalIgnoringCase(value, "no") || equalIgnoringCase(value, "0")) {
+ if (equalLettersIgnoringASCIICase(value, "no") || value == "0") {
m_frameborder = false;
m_frameborderSet = true;
- } else if (equalIgnoringCase(value, "yes") || equalIgnoringCase(value, "1")) {
+ } else if (equalLettersIgnoringASCIICase(value, "yes") || value == "1") {
m_frameborderSet = true;
}
} else {
m_frameborder = false;
m_frameborderSet = false;
}
- } else if (name == noresizeAttr) {
+ // FIXME: Do we need to trigger repainting?
+ return;
+ }
+
+ if (name == noresizeAttr) {
+ // FIXME: This should set m_noresize to false if the value is null.
m_noresize = true;
- } else if (name == borderAttr) {
+ return;
+ }
+
+ if (name == borderAttr) {
if (!value.isNull()) {
m_border = value.toInt();
m_borderSet = true;
} else
m_borderSet = false;
- } else if (name == bordercolorAttr)
+ // FIXME: Do we need to trigger repainting?
+ return;
+ }
+
+ if (name == bordercolorAttr) {
m_borderColorSet = !value.isEmpty();
- else if (name == onloadAttr)
- document()->setWindowAttributeEventListener(eventNames().loadEvent, createAttributeEventListener(document()->frame(), name, value));
- else if (name == onbeforeunloadAttr)
- document()->setWindowAttributeEventListener(eventNames().beforeunloadEvent, createAttributeEventListener(document()->frame(), name, value));
- else if (name == onunloadAttr)
- document()->setWindowAttributeEventListener(eventNames().unloadEvent, createAttributeEventListener(document()->frame(), name, value));
- else if (name == onblurAttr)
- document()->setWindowAttributeEventListener(eventNames().blurEvent, createAttributeEventListener(document()->frame(), name, value));
- else if (name == onfocusAttr)
- document()->setWindowAttributeEventListener(eventNames().focusEvent, createAttributeEventListener(document()->frame(), name, value));
- else if (name == onfocusinAttr)
- document()->setWindowAttributeEventListener(eventNames().focusinEvent, createAttributeEventListener(document()->frame(), name, value));
- else if (name == onfocusoutAttr)
- document()->setWindowAttributeEventListener(eventNames().focusoutEvent, createAttributeEventListener(document()->frame(), name, value));
-#if ENABLE(ORIENTATION_EVENTS)
- else if (name == onorientationchangeAttr)
- document()->setWindowAttributeEventListener(eventNames().orientationchangeEvent, createAttributeEventListener(document()->frame(), name, value));
-#endif
- else if (name == onhashchangeAttr)
- document()->setWindowAttributeEventListener(eventNames().hashchangeEvent, createAttributeEventListener(document()->frame(), name, value));
- else if (name == onresizeAttr)
- document()->setWindowAttributeEventListener(eventNames().resizeEvent, createAttributeEventListener(document()->frame(), name, value));
- else if (name == onscrollAttr)
- document()->setWindowAttributeEventListener(eventNames().scrollEvent, createAttributeEventListener(document()->frame(), name, value));
- else if (name == onstorageAttr)
- document()->setWindowAttributeEventListener(eventNames().storageEvent, createAttributeEventListener(document()->frame(), name, value));
- else if (name == ononlineAttr)
- document()->setWindowAttributeEventListener(eventNames().onlineEvent, createAttributeEventListener(document()->frame(), name, value));
- else if (name == onofflineAttr)
- document()->setWindowAttributeEventListener(eventNames().offlineEvent, createAttributeEventListener(document()->frame(), name, value));
- else if (name == onpopstateAttr)
- document()->setWindowAttributeEventListener(eventNames().popstateEvent, createAttributeEventListener(document()->frame(), name, value));
- else
- HTMLElement::parseAttribute(name, value);
+ // FIXME: Clearly wrong: This can overwrite the value inherited from the parent frameset.
+ // FIXME: Do we need to trigger repainting?
+ return;
+ }
+
+ auto& eventName = HTMLBodyElement::eventNameForWindowEventHandlerAttribute(name);
+ if (!eventName.isNull()) {
+ document().setWindowAttributeEventListener(eventName, name, value);
+ return;
+ }
+
+ HTMLElement::parseAttribute(name, value);
}
-bool HTMLFrameSetElement::rendererIsNeeded(const NodeRenderingContext& context)
+bool HTMLFrameSetElement::rendererIsNeeded(const RenderStyle& style)
{
// For compatibility, frames render even when display: none is set.
// However, we delay creating a renderer until stylesheets have loaded.
- return context.style()->isStyleAvailable();
+ return style.isStyleAvailable();
}
-RenderObject *HTMLFrameSetElement::createRenderer(RenderArena *arena, RenderStyle *style)
+RenderPtr<RenderElement> HTMLFrameSetElement::createElementRenderer(Ref<RenderStyle>&& style, const RenderTreePosition&)
{
- if (style->hasContent())
- return RenderObject::createObject(this, style);
+ if (style.get().hasContent())
+ return RenderElement::createFor(*this, WTFMove(style));
- return new (arena) RenderFrameSet(this);
+ return createRenderer<RenderFrameSet>(*this, WTFMove(style));
}
-void HTMLFrameSetElement::attach(const AttachContext& context)
+HTMLFrameSetElement* HTMLFrameSetElement::findContaining(Element* descendant)
{
- // Inherit default settings from parent frameset
+ return ancestorsOfType<HTMLFrameSetElement>(*descendant).first();
+}
+
+void HTMLFrameSetElement::willAttachRenderers()
+{
+ // Inherit default settings from parent frameset.
// FIXME: This is not dynamic.
- for (ContainerNode* node = parentNode(); node; node = node->parentNode()) {
- if (node->hasTagName(framesetTag)) {
- HTMLFrameSetElement* frameset = static_cast<HTMLFrameSetElement*>(node);
- if (!m_frameborderSet)
- m_frameborder = frameset->hasFrameBorder();
- if (m_frameborder) {
- if (!m_borderSet)
- m_border = frameset->border();
- if (!m_borderColorSet)
- m_borderColorSet = frameset->hasBorderColor();
- }
- if (!m_noresize)
- m_noresize = frameset->noResize();
- break;
- }
+ const HTMLFrameSetElement* containingFrameSet = findContaining(this);
+ if (!containingFrameSet)
+ return;
+ if (!m_frameborderSet)
+ m_frameborder = containingFrameSet->hasFrameBorder();
+ if (m_frameborder) {
+ if (!m_borderSet)
+ m_border = containingFrameSet->border();
+ if (!m_borderColorSet)
+ m_borderColorSet = containingFrameSet->hasBorderColor();
}
-
- HTMLElement::attach(context);
+ if (!m_noresize)
+ m_noresize = containingFrameSet->noResize();
}
-void HTMLFrameSetElement::defaultEventHandler(Event* evt)
+void HTMLFrameSetElement::defaultEventHandler(Event* event)
{
- if (evt->isMouseEvent() && !m_noresize && renderer() && renderer()->isFrameSet()) {
- if (toRenderFrameSet(renderer())->userResize(static_cast<MouseEvent*>(evt))) {
- evt->setDefaultHandled();
+ ASSERT(event);
+ if (is<MouseEvent>(*event) && !m_noresize && is<RenderFrameSet>(renderer())) {
+ if (downcast<RenderFrameSet>(*renderer()).userResize(downcast<MouseEvent>(event))) {
+ event->setDefaultHandled();
return;
}
}
- HTMLElement::defaultEventHandler(evt);
+ HTMLElement::defaultEventHandler(event);
}
-bool HTMLFrameSetElement::willRecalcStyle(StyleChange)
+bool HTMLFrameSetElement::willRecalcStyle(Style::Change)
{
if (needsStyleRecalc() && renderer()) {
- renderer()->setNeedsLayout(true);
+ renderer()->setNeedsLayout();
clearNeedsStyleRecalc();
}
return true;
}
-Node::InsertionNotificationRequest HTMLFrameSetElement::insertedInto(ContainerNode* insertionPoint)
+Node::InsertionNotificationRequest HTMLFrameSetElement::insertedInto(ContainerNode& insertionPoint)
{
HTMLElement::insertedInto(insertionPoint);
- if (insertionPoint->inDocument()) {
- if (Frame* frame = document()->frame())
- frame->loader()->client()->dispatchDidBecomeFrameset(document()->isFrameSet());
+ if (insertionPoint.inDocument()) {
+ if (Frame* frame = document().frame())
+ frame->loader().client().dispatchDidBecomeFrameset(document().isFrameSet());
}
return InsertionDone;
}
-void HTMLFrameSetElement::removedFrom(ContainerNode* insertionPoint)
+void HTMLFrameSetElement::removedFrom(ContainerNode& insertionPoint)
{
HTMLElement::removedFrom(insertionPoint);
- if (insertionPoint->inDocument()) {
- if (Frame* frame = document()->frame())
- frame->loader()->client()->dispatchDidBecomeFrameset(document()->isFrameSet());
+ if (insertionPoint.inDocument()) {
+ if (Frame* frame = document().frame())
+ frame->loader().client().dispatchDidBecomeFrameset(document().isFrameSet());
}
}