summaryrefslogtreecommitdiffstats
path: root/WebCore/html
diff options
context:
space:
mode:
Diffstat (limited to 'WebCore/html')
-rw-r--r--WebCore/html/HTMLCanvasElement.cpp26
-rw-r--r--WebCore/html/HTMLCanvasElement.h5
-rw-r--r--WebCore/html/HTMLElement.cpp4
-rw-r--r--WebCore/html/HTMLFormControlElement.cpp8
-rw-r--r--WebCore/html/HTMLFormControlElement.h1
-rw-r--r--WebCore/html/MediaDocument.cpp79
6 files changed, 73 insertions, 50 deletions
diff --git a/WebCore/html/HTMLCanvasElement.cpp b/WebCore/html/HTMLCanvasElement.cpp
index fea70d1..e8ffe5e 100644
--- a/WebCore/html/HTMLCanvasElement.cpp
+++ b/WebCore/html/HTMLCanvasElement.cpp
@@ -71,7 +71,6 @@ static const float MaxSkiaDim = 32767.0F; // Maximum width/height in CSS pixels.
HTMLCanvasElement::HTMLCanvasElement(const QualifiedName& tagName, Document* document)
: HTMLElement(tagName, document)
- , m_observer(0)
, m_size(DefaultWidth, DefaultHeight)
, m_ignoreReset(false)
, m_pageScaleFactor(document->frame() ? document->frame()->page()->chrome()->scaleFactor() : 1)
@@ -93,8 +92,9 @@ PassRefPtr<HTMLCanvasElement> HTMLCanvasElement::create(const QualifiedName& tag
HTMLCanvasElement::~HTMLCanvasElement()
{
- if (m_observer)
- m_observer->canvasDestroyed(this);
+ HashSet<CanvasObserver*>::iterator end = m_observers.end();
+ for (HashSet<CanvasObserver*>::iterator it = m_observers.begin(); it != end; ++it)
+ (*it)->canvasDestroyed(this);
}
void HTMLCanvasElement::parseMappedAttribute(Attribute* attr)
@@ -117,6 +117,16 @@ RenderObject* HTMLCanvasElement::createRenderer(RenderArena* arena, RenderStyle*
return HTMLElement::createRenderer(arena, style);
}
+void HTMLCanvasElement::addObserver(CanvasObserver* observer)
+{
+ m_observers.add(observer);
+}
+
+void HTMLCanvasElement::removeObserver(CanvasObserver* observer)
+{
+ m_observers.remove(observer);
+}
+
void HTMLCanvasElement::setHeight(int value)
{
setAttribute(heightAttr, String::number(value));
@@ -200,8 +210,9 @@ void HTMLCanvasElement::didDraw(const FloatRect& rect)
ro->repaintRectangle(enclosingIntRect(m_dirtyRect));
}
- if (m_observer)
- m_observer->canvasChanged(this, rect);
+ HashSet<CanvasObserver*>::iterator end = m_observers.end();
+ for (HashSet<CanvasObserver*>::iterator it = m_observers.begin(); it != end; ++it)
+ (*it)->canvasChanged(this, rect);
}
void HTMLCanvasElement::reset()
@@ -238,8 +249,9 @@ void HTMLCanvasElement::reset()
}
}
- if (m_observer)
- m_observer->canvasResized(this);
+ HashSet<CanvasObserver*>::iterator end = m_observers.end();
+ for (HashSet<CanvasObserver*>::iterator it = m_observers.begin(); it != end; ++it)
+ (*it)->canvasResized(this);
}
void HTMLCanvasElement::paint(GraphicsContext* context, const IntRect& r)
diff --git a/WebCore/html/HTMLCanvasElement.h b/WebCore/html/HTMLCanvasElement.h
index e6c0155..30f0d35 100644
--- a/WebCore/html/HTMLCanvasElement.h
+++ b/WebCore/html/HTMLCanvasElement.h
@@ -65,7 +65,8 @@ public:
static PassRefPtr<HTMLCanvasElement> create(const QualifiedName&, Document*);
virtual ~HTMLCanvasElement();
- void setObserver(CanvasObserver* observer) { m_observer = observer; }
+ void addObserver(CanvasObserver* observer);
+ void removeObserver(CanvasObserver* observer);
// Attributes and functions exposed to script
int width() const { return size().width(); }
@@ -154,7 +155,7 @@ private:
void setSurfaceSize(const IntSize&);
bool hasCreatedImageBuffer() const { return m_hasCreatedImageBuffer; }
- CanvasObserver* m_observer;
+ HashSet<CanvasObserver*> m_observers;
IntSize m_size;
diff --git a/WebCore/html/HTMLElement.cpp b/WebCore/html/HTMLElement.cpp
index 4dcf998..0bd6ba5 100644
--- a/WebCore/html/HTMLElement.cpp
+++ b/WebCore/html/HTMLElement.cpp
@@ -474,7 +474,7 @@ void HTMLElement::setOuterText(const String &text, ExceptionCode& ec)
// Is previous node a text node? If so, merge into it.
Node* prev = t->previousSibling();
if (prev && prev->isTextNode()) {
- Text* textPrev = static_cast<Text*>(prev);
+ RefPtr<Text> textPrev = static_cast<Text*>(prev);
textPrev->appendData(t->data(), ec);
if (ec)
return;
@@ -487,7 +487,7 @@ void HTMLElement::setOuterText(const String &text, ExceptionCode& ec)
// Is next node a text node? If so, merge it in.
Node* next = t->nextSibling();
if (next && next->isTextNode()) {
- Text* textNext = static_cast<Text*>(next);
+ RefPtr<Text> textNext = static_cast<Text*>(next);
t->appendData(textNext->data(), ec);
if (ec)
return;
diff --git a/WebCore/html/HTMLFormControlElement.cpp b/WebCore/html/HTMLFormControlElement.cpp
index 2f5d414..daf4b93 100644
--- a/WebCore/html/HTMLFormControlElement.cpp
+++ b/WebCore/html/HTMLFormControlElement.cpp
@@ -152,6 +152,13 @@ void HTMLFormControlElement::attach()
focus();
}
+void HTMLFormControlElement::willMoveToNewOwnerDocument()
+{
+ if (fastHasAttribute(formAttr))
+ document()->unregisterFormElementWithFormAttribute(this);
+ HTMLElement::willMoveToNewOwnerDocument();
+}
+
void HTMLFormControlElement::insertedIntoTree(bool deep)
{
if (fastHasAttribute(formAttr)) {
@@ -482,6 +489,7 @@ void HTMLFormControlElement::attributeChanged(Attribute* attr, bool preserveDecl
m_form->registerFormElement(this);
else
document()->checkedRadioButtons().addButton(this);
+ document()->unregisterFormElementWithFormAttribute(this);
} else
resetFormOwner(0);
}
diff --git a/WebCore/html/HTMLFormControlElement.h b/WebCore/html/HTMLFormControlElement.h
index 568f63e..c5ed013 100644
--- a/WebCore/html/HTMLFormControlElement.h
+++ b/WebCore/html/HTMLFormControlElement.h
@@ -109,6 +109,7 @@ protected:
virtual void attach();
virtual void insertedIntoTree(bool deep);
virtual void removedFromTree(bool deep);
+ virtual void willMoveToNewOwnerDocument();
virtual bool isKeyboardFocusable(KeyboardEvent*) const;
virtual bool isMouseFocusable() const;
diff --git a/WebCore/html/MediaDocument.cpp b/WebCore/html/MediaDocument.cpp
index af66795..d6fe6dd 100644
--- a/WebCore/html/MediaDocument.cpp
+++ b/WebCore/html/MediaDocument.cpp
@@ -131,47 +131,52 @@ PassRefPtr<DocumentParser> MediaDocument::createParser()
return MediaDocumentParser::create(this);
}
+static inline HTMLVideoElement* descendentVideoElement(Node* node)
+{
+ ASSERT(node);
+
+ if (node->hasTagName(videoTag))
+ return static_cast<HTMLVideoElement*>(node);
+
+ RefPtr<NodeList> nodeList = node->getElementsByTagNameNS(videoTag.namespaceURI(), videoTag.localName());
+
+ if (nodeList.get()->length() > 0)
+ return static_cast<HTMLVideoElement*>(nodeList.get()->item(0));
+
+ return 0;
+}
+
void MediaDocument::defaultEventHandler(Event* event)
{
// Match the default Quicktime plugin behavior to allow
// clicking and double-clicking to pause and play the media.
Node* targetNode = event->target()->toNode();
- if (targetNode && targetNode->hasTagName(videoTag)) {
- HTMLVideoElement* video = static_cast<HTMLVideoElement*>(targetNode);
- if (event->type() == eventNames().clickEvent) {
- if (!video->canPlay()) {
- video->pause(event->fromUserGesture());
- event->setDefaultHandled();
- }
- } else if (event->type() == eventNames().dblclickEvent) {
- if (video->canPlay()) {
- video->play(event->fromUserGesture());
- event->setDefaultHandled();
- }
- }
- }
+ if (!targetNode)
+ return;
+
+ HTMLVideoElement* video = descendentVideoElement(targetNode);
+ if (!video)
+ return;
- if (event->type() == eventNames().keydownEvent && event->isKeyboardEvent()) {
- HTMLVideoElement* video = 0;
- if (targetNode) {
- if (targetNode->hasTagName(videoTag))
- video = static_cast<HTMLVideoElement*>(targetNode);
- else {
- RefPtr<NodeList> nodeList = targetNode->getElementsByTagName("video");
- if (nodeList.get()->length() > 0)
- video = static_cast<HTMLVideoElement*>(nodeList.get()->item(0));
- }
+ if (event->type() == eventNames().clickEvent) {
+ if (!video->canPlay()) {
+ video->pause(event->fromUserGesture());
+ event->setDefaultHandled();
}
- if (video) {
- KeyboardEvent* keyboardEvent = static_cast<KeyboardEvent*>(event);
- if (keyboardEvent->keyIdentifier() == "U+0020") { // space
- if (video->paused()) {
- if (video->canPlay())
- video->play(event->fromUserGesture());
- } else
- video->pause(event->fromUserGesture());
- event->setDefaultHandled();
- }
+ } else if (event->type() == eventNames().dblclickEvent) {
+ if (video->canPlay()) {
+ video->play(event->fromUserGesture());
+ event->setDefaultHandled();
+ }
+ } else if (event->type() == eventNames().keydownEvent && event->isKeyboardEvent()) {
+ KeyboardEvent* keyboardEvent = static_cast<KeyboardEvent*>(event);
+ if (keyboardEvent->keyIdentifier() == "U+0020") { // space
+ if (video->paused()) {
+ if (video->canPlay())
+ video->play(event->fromUserGesture());
+ } else
+ video->pause(event->fromUserGesture());
+ event->setDefaultHandled();
}
}
}
@@ -196,11 +201,7 @@ void MediaDocument::replaceMediaElementTimerFired(Timer<MediaDocument>*)
htmlBody->setAttribute(marginwidthAttr, "0");
htmlBody->setAttribute(marginheightAttr, "0");
- RefPtr<NodeList> nodeList = htmlBody->getElementsByTagName("video");
-
- if (nodeList.get()->length() > 0) {
- HTMLVideoElement* videoElement = static_cast<HTMLVideoElement*>(nodeList.get()->item(0));
-
+ if (HTMLVideoElement* videoElement = descendentVideoElement(htmlBody)) {
RefPtr<Element> element = Document::createElement(embedTag, false);
HTMLEmbedElement* embedElement = static_cast<HTMLEmbedElement*>(element.get());