diff options
Diffstat (limited to 'WebCore/html')
-rw-r--r-- | WebCore/html/HTMLCanvasElement.cpp | 26 | ||||
-rw-r--r-- | WebCore/html/HTMLCanvasElement.h | 5 | ||||
-rw-r--r-- | WebCore/html/HTMLElement.cpp | 4 | ||||
-rw-r--r-- | WebCore/html/HTMLFormControlElement.cpp | 8 | ||||
-rw-r--r-- | WebCore/html/HTMLFormControlElement.h | 1 | ||||
-rw-r--r-- | WebCore/html/MediaDocument.cpp | 79 |
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()); |