From dfe289850f068f19ba4a83ab4e7e22a7e09c13c9 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Sat, 26 Jan 2013 13:17:21 -0600 Subject: Rename a number of libraries and executables to avoid conflicts with KDE4 --- khtml/xml/CMakeLists.txt | 43 - khtml/xml/Makefile.am | 48 - khtml/xml/dom2_eventsimpl.cpp | 969 ------------- khtml/xml/dom2_eventsimpl.h | 513 ------- khtml/xml/dom2_rangeimpl.cpp | 1640 --------------------- khtml/xml/dom2_rangeimpl.h | 127 -- khtml/xml/dom2_traversalimpl.cpp | 667 --------- khtml/xml/dom2_traversalimpl.h | 196 --- khtml/xml/dom2_viewsimpl.cpp | 50 - khtml/xml/dom2_viewsimpl.h | 50 - khtml/xml/dom_docimpl.cpp | 2892 -------------------------------------- khtml/xml/dom_docimpl.h | 763 ---------- khtml/xml/dom_elementimpl.cpp | 1301 ----------------- khtml/xml/dom_elementimpl.h | 392 ------ khtml/xml/dom_nodeimpl.cpp | 2068 --------------------------- khtml/xml/dom_nodeimpl.h | 736 ---------- khtml/xml/dom_restyler.cpp | 122 -- khtml/xml/dom_restyler.h | 102 -- khtml/xml/dom_stringimpl.cpp | 460 ------ khtml/xml/dom_stringimpl.h | 104 -- khtml/xml/dom_textimpl.cpp | 522 ------- khtml/xml/dom_textimpl.h | 176 --- khtml/xml/dom_xmlimpl.cpp | 498 ------- khtml/xml/dom_xmlimpl.h | 181 --- khtml/xml/xml_tokenizer.cpp | 609 -------- khtml/xml/xml_tokenizer.h | 198 --- 26 files changed, 15427 deletions(-) delete mode 100644 khtml/xml/CMakeLists.txt delete mode 100644 khtml/xml/Makefile.am delete mode 100644 khtml/xml/dom2_eventsimpl.cpp delete mode 100644 khtml/xml/dom2_eventsimpl.h delete mode 100644 khtml/xml/dom2_rangeimpl.cpp delete mode 100644 khtml/xml/dom2_rangeimpl.h delete mode 100644 khtml/xml/dom2_traversalimpl.cpp delete mode 100644 khtml/xml/dom2_traversalimpl.h delete mode 100644 khtml/xml/dom2_viewsimpl.cpp delete mode 100644 khtml/xml/dom2_viewsimpl.h delete mode 100644 khtml/xml/dom_docimpl.cpp delete mode 100644 khtml/xml/dom_docimpl.h delete mode 100644 khtml/xml/dom_elementimpl.cpp delete mode 100644 khtml/xml/dom_elementimpl.h delete mode 100644 khtml/xml/dom_nodeimpl.cpp delete mode 100644 khtml/xml/dom_nodeimpl.h delete mode 100644 khtml/xml/dom_restyler.cpp delete mode 100644 khtml/xml/dom_restyler.h delete mode 100644 khtml/xml/dom_stringimpl.cpp delete mode 100644 khtml/xml/dom_stringimpl.h delete mode 100644 khtml/xml/dom_textimpl.cpp delete mode 100644 khtml/xml/dom_textimpl.h delete mode 100644 khtml/xml/dom_xmlimpl.cpp delete mode 100644 khtml/xml/dom_xmlimpl.h delete mode 100644 khtml/xml/xml_tokenizer.cpp delete mode 100644 khtml/xml/xml_tokenizer.h (limited to 'khtml/xml') diff --git a/khtml/xml/CMakeLists.txt b/khtml/xml/CMakeLists.txt deleted file mode 100644 index 82fe99d4c..000000000 --- a/khtml/xml/CMakeLists.txt +++ /dev/null @@ -1,43 +0,0 @@ -################################################# -# -# (C) 2010 Serghei Amelian -# serghei (DOT) amelian (AT) gmail.com -# -# Improvements and feedback are welcome -# -# This file is released under GPL >= 2 -# -################################################# - -include_directories( - ${TQT_INCLUDE_DIRS} - ${CMAKE_CURRENT_BINARY_DIR} - ${CMAKE_BINARY_DIR} - ${CMAKE_BINARY_DIR}/kjs - ${CMAKE_BINARY_DIR}/tdecore - ${CMAKE_SOURCE_DIR} - ${CMAKE_SOURCE_DIR}/dcop - ${CMAKE_SOURCE_DIR}/khtml - ${CMAKE_SOURCE_DIR}/tdecore - ${CMAKE_SOURCE_DIR}/tdeui - ${CMAKE_SOURCE_DIR}/kio - ${CMAKE_SOURCE_DIR}/kio/kio - ${CMAKE_SOURCE_DIR}/kwallet/client - ${CMAKE_SOURCE_DIR}/kutils -) - - -##### khtmlxml-static ############################ - -set( target khtmlxml ) - -set( ${target}_SRCS - dom_docimpl.cpp dom_nodeimpl.cpp dom_textimpl.cpp - dom_elementimpl.cpp dom_stringimpl.cpp dom2_rangeimpl.cpp - dom2_traversalimpl.cpp xml_tokenizer.cpp dom_xmlimpl.cpp - dom2_eventsimpl.cpp dom2_viewsimpl.cpp dom_restyler.cpp -) - -tde_add_library( ${target} STATIC_PIC AUTOMOC - SOURCES ${${target}_SRCS} -) diff --git a/khtml/xml/Makefile.am b/khtml/xml/Makefile.am deleted file mode 100644 index 17a9779aa..000000000 --- a/khtml/xml/Makefile.am +++ /dev/null @@ -1,48 +0,0 @@ -# This file is part of the KDE libraries -# Copyright (C) 1997 Martin Jones (mjones@kde.org) -# (C) 1997 Torben Weis (weis@kde.org) - -# This library is free software; you can redistribute it and/or -# modify it under the terms of the GNU Library General Public -# License as published by the Free Software Foundation; either -# version 2 of the License, or (at your option) any later version. - -# This library is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -# Library General Public License for more details. - -# You should have received a copy of the GNU Library General Public License -# along with this library; see the file COPYING.LIB. If not, write to -# the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, -# Boston, MA 02110-1301, USA. - -KDE_CXXFLAGS = $(WOVERLOADED_VIRTUAL) - -noinst_LTLIBRARIES = libkhtmlxml.la -libkhtmlxml_la_SOURCES = \ - dom_docimpl.cpp dom_nodeimpl.cpp dom_textimpl.cpp \ - dom_elementimpl.cpp dom_stringimpl.cpp dom2_rangeimpl.cpp \ - dom2_traversalimpl.cpp xml_tokenizer.cpp dom_xmlimpl.cpp \ - dom2_eventsimpl.cpp dom2_viewsimpl.cpp dom_restyler.cpp - -#libkhtmlxml_la_LDFLAGS = -no-undefined -libkhtmlxml_la_METASOURCES = AUTO - -noinst_HEADERS = \ - dom_docimpl.h dom_nodeimpl.h dom_textimpl.h \ - dom_elementimpl.h dom_stringimpl.h dom2_rangeimpl.h \ - dom2_traversalimpl.h xml_tokenizer.h dom_xmlimpl.h \ - dom2_eventsimpl.h dom2_viewsimpl.h dom_restyler.h - -INCLUDES = -I$(top_srcdir)/kimgio -I$(top_srcdir)/kio -I$(top_srcdir)/dcop \ - -I$(top_srcdir)/khtml -I$(top_srcdir) -I$(top_srcdir)/kwallet/client \ - -I$(top_srcdir)/kutils -I$(top_builddir)/kjs $(all_includes) - -SRCDOC_DEST=$(kde_htmldir)/en/tdelibs/khtml - -## generate lib documentation -srcdoc: - $(mkinstalldirs) $(SRCDOC_DEST) - kdoc -H -d $(SRCDOC_DEST) tdecore -lqt - diff --git a/khtml/xml/dom2_eventsimpl.cpp b/khtml/xml/dom2_eventsimpl.cpp deleted file mode 100644 index 5121e9caf..000000000 --- a/khtml/xml/dom2_eventsimpl.cpp +++ /dev/null @@ -1,969 +0,0 @@ -/** - * This file is part of the DOM implementation for KDE. - * - * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * (C) 2001 Tobias Anton (anton@stud.fbi.fh-darmstadt.de) - * (C) 2003 Apple Computer, Inc. - * (C) 2006 Maksim Orlovich (maksim@kde.org) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "dom/dom2_views.h" - -#include "xml/dom2_eventsimpl.h" -#include "xml/dom_stringimpl.h" -#include "xml/dom_nodeimpl.h" -#include "xml/dom_docimpl.h" -#include "rendering/render_layer.h" -#include "khtmlview.h" - -#include - -using namespace DOM; -using namespace khtml; - -EventImpl::EventImpl() -{ - m_type = 0; - m_canBubble = false; - m_cancelable = false; - - m_propagationStopped = false; - m_defaultPrevented = false; - m_id = UNKNOWN_EVENT; - m_currentTarget = 0; - m_eventPhase = 0; - m_target = 0; - m_createTime = TQDateTime::currentDateTime(); - m_defaultHandled = false; -} - -EventImpl::EventImpl(EventId _id, bool canBubbleArg, bool cancelableArg) -{ - DOMString t = EventImpl::idToType(_id); - m_type = t.implementation(); - if (m_type) - m_type->ref(); - m_canBubble = canBubbleArg; - m_cancelable = cancelableArg; - - m_propagationStopped = false; - m_defaultPrevented = false; - m_id = _id; - m_currentTarget = 0; - m_eventPhase = 0; - m_target = 0; - m_createTime = TQDateTime::currentDateTime(); - m_defaultHandled = false; -} - -EventImpl::~EventImpl() -{ - if (m_type) - m_type->deref(); - if (m_target) - m_target->deref(); -} - -void EventImpl::setTarget(NodeImpl *_target) -{ - if (m_target) - m_target->deref(); - m_target = _target; - if (m_target) - m_target->ref(); -} - -DOMTimeStamp EventImpl::timeStamp() -{ - TQDateTime epoch(TQDate(1970,1,1),TQTime(0,0)); - // ### kjs does not yet support long long (?) so the value wraps around - return epoch.secsTo(m_createTime)*1000+m_createTime.time().msec(); -} - -void EventImpl::initEvent(const DOMString &eventTypeArg, bool canBubbleArg, bool cancelableArg) -{ - // ### ensure this is not called after we have been dispatched (also for subclasses) - - if (m_type) - m_type->deref(); - - m_type = eventTypeArg.implementation(); - if (m_type) - m_type->ref(); - - m_id = typeToId(eventTypeArg); - - m_canBubble = canBubbleArg; - m_cancelable = cancelableArg; -} - -EventImpl::EventId EventImpl::typeToId(DOMString type) -{ - if (type == "DOMFocusIn") - return DOMFOCUSIN_EVENT; - else if (type == "DOMFocusOut") - return DOMFOCUSOUT_EVENT; - else if (type == "DOMActivate") - return DOMACTIVATE_EVENT; - else if (type == "click") - return CLICK_EVENT; - else if (type == "mousedown") - return MOUSEDOWN_EVENT; - else if (type == "mouseup") - return MOUSEUP_EVENT; - else if (type == "mouseover") - return MOUSEOVER_EVENT; - else if (type == "mousemove") - return MOUSEMOVE_EVENT; - else if (type == "mouseout") - return MOUSEOUT_EVENT; - else if (type == "DOMSubtreeModified") - return DOMSUBTREEMODIFIED_EVENT; - else if (type == "DOMNodeInserted") - return DOMNODEINSERTED_EVENT; - else if (type == "DOMNodeRemoved") - return DOMNODEREMOVED_EVENT; - else if (type == "DOMNodeRemovedFromDocument") - return DOMNODEREMOVEDFROMDOCUMENT_EVENT; - else if (type == "DOMNodeInsertedIntoDocument") - return DOMNODEINSERTEDINTODOCUMENT_EVENT; - else if (type == "DOMAttrModified") - return DOMATTRMODIFIED_EVENT; - else if (type == "DOMCharacterDataModified") - return DOMCHARACTERDATAMODIFIED_EVENT; - else if (type == "load") - return LOAD_EVENT; - else if (type == "unload") - return UNLOAD_EVENT; - else if (type == "abort") - return ABORT_EVENT; - else if (type == "error") - return ERROR_EVENT; - else if (type == "select") - return SELECT_EVENT; - else if (type == "change") - return CHANGE_EVENT; - else if (type == "submit") - return SUBMIT_EVENT; - else if (type == "reset") - return RESET_EVENT; - else if (type == "focus") - return FOCUS_EVENT; - else if (type == "blur") - return BLUR_EVENT; - else if (type == "resize") - return RESIZE_EVENT; - else if (type == "scroll") - return SCROLL_EVENT; - else if ( type == "keydown" ) - return KEYDOWN_EVENT; - else if ( type == "keyup" ) - return KEYUP_EVENT; - else if ( type == "textInput" ) - return KEYPRESS_EVENT; - else if ( type == "keypress" ) - return KEYPRESS_EVENT; - else if ( type == "readystatechange" ) - return KHTML_READYSTATECHANGE_EVENT; - else if ( type == "dblclick" ) - return KHTML_ECMA_DBLCLICK_EVENT; - - // ignore: KHTML_CLICK_EVENT - return UNKNOWN_EVENT; -} - -DOMString EventImpl::idToType(EventImpl::EventId id) -{ - switch (id) { - case DOMFOCUSIN_EVENT: - return "DOMFocusIn"; - case DOMFOCUSOUT_EVENT: - return "DOMFocusOut"; - case DOMACTIVATE_EVENT: - return "DOMActivate"; - case CLICK_EVENT: - return "click"; - case MOUSEDOWN_EVENT: - return "mousedown"; - case MOUSEUP_EVENT: - return "mouseup"; - case MOUSEOVER_EVENT: - return "mouseover"; - case MOUSEMOVE_EVENT: - return "mousemove"; - case MOUSEOUT_EVENT: - return "mouseout"; - case DOMSUBTREEMODIFIED_EVENT: - return "DOMSubtreeModified"; - case DOMNODEINSERTED_EVENT: - return "DOMNodeInserted"; - case DOMNODEREMOVED_EVENT: - return "DOMNodeRemoved"; - case DOMNODEREMOVEDFROMDOCUMENT_EVENT: - return "DOMNodeRemovedFromDocument"; - case DOMNODEINSERTEDINTODOCUMENT_EVENT: - return "DOMNodeInsertedIntoDocument"; - case DOMATTRMODIFIED_EVENT: - return "DOMAttrModified"; - case DOMCHARACTERDATAMODIFIED_EVENT: - return "DOMCharacterDataModified"; - case LOAD_EVENT: - return "load"; - case UNLOAD_EVENT: - return "unload"; - case ABORT_EVENT: - return "abort"; - case ERROR_EVENT: - return "error"; - case SELECT_EVENT: - return "select"; - case CHANGE_EVENT: - return "change"; - case SUBMIT_EVENT: - return "submit"; - case RESET_EVENT: - return "reset"; - case FOCUS_EVENT: - return "focus"; - case BLUR_EVENT: - return "blur"; - case RESIZE_EVENT: - return "resize"; - case SCROLL_EVENT: - return "scroll"; - case KEYDOWN_EVENT: - return "keydown"; - case KEYUP_EVENT: - return "keyup"; - case KEYPRESS_EVENT: - return "keypress"; //DOM3 ev. suggests textInput, but it's better for compat this way - - //khtml extensions - case KHTML_ECMA_DBLCLICK_EVENT: - return "dblclick"; - case KHTML_ECMA_CLICK_EVENT: - return "click"; - case KHTML_DRAGDROP_EVENT: - return "khtml_dragdrop"; - case KHTML_MOVE_EVENT: - return "khtml_move"; - case KHTML_READYSTATECHANGE_EVENT: - return "readystatechange"; - - default: - return DOMString(); - break; - } -} - -bool EventImpl::isUIEvent() const -{ - return false; -} - -bool EventImpl::isMouseEvent() const -{ - return false; -} - -bool EventImpl::isMutationEvent() const -{ - return false; -} - -bool EventImpl::isTextInputEvent() const -{ - return false; -} - -bool EventImpl::isKeyboardEvent() const -{ - return false; -} - -// ----------------------------------------------------------------------------- - -UIEventImpl::UIEventImpl(EventId _id, bool canBubbleArg, bool cancelableArg, - AbstractViewImpl *viewArg, long detailArg) - : EventImpl(_id,canBubbleArg,cancelableArg) -{ - m_view = viewArg; - if (m_view) - m_view->ref(); - m_detail = detailArg; -} - -UIEventImpl::~UIEventImpl() -{ - if (m_view) - m_view->deref(); -} - -void UIEventImpl::initUIEvent(const DOMString &typeArg, - bool canBubbleArg, - bool cancelableArg, - const AbstractView &viewArg, - long detailArg) -{ - EventImpl::initEvent(typeArg,canBubbleArg,cancelableArg); - - if (m_view) - m_view->deref(); - - m_view = viewArg.handle(); - if (m_view) - m_view->ref(); - m_detail = detailArg; -} - -bool UIEventImpl::isUIEvent() const -{ - return true; -} - -// ----------------------------------------------------------------------------- - -MouseEventImpl::MouseEventImpl() -{ - m_screenX = 0; - m_screenY = 0; - m_clientX = 0; - m_clientY = 0; - m_pageX = 0; - m_pageY = 0; - m_ctrlKey = false; - m_altKey = false; - m_shiftKey = false; - m_metaKey = false; - m_button = 0; - m_relatedTarget = 0; - m_qevent = 0; - m_isDoubleClick = false; -} - -MouseEventImpl::MouseEventImpl(EventId _id, - bool canBubbleArg, - bool cancelableArg, - AbstractViewImpl *viewArg, - long detailArg, - long screenXArg, - long screenYArg, - long clientXArg, - long clientYArg, - long pageXArg, - long pageYArg, - bool ctrlKeyArg, - bool altKeyArg, - bool shiftKeyArg, - bool metaKeyArg, - unsigned short buttonArg, - NodeImpl *relatedTargetArg, - TQMouseEvent *qe, - bool isDoubleClick) - : UIEventImpl(_id,canBubbleArg,cancelableArg,viewArg,detailArg) -{ - m_screenX = screenXArg; - m_screenY = screenYArg; - m_clientX = clientXArg; - m_clientY = clientYArg; - m_pageX = pageXArg; - m_pageY = pageYArg; - m_ctrlKey = ctrlKeyArg; - m_altKey = altKeyArg; - m_shiftKey = shiftKeyArg; - m_metaKey = metaKeyArg; - m_button = buttonArg; - m_relatedTarget = relatedTargetArg; - if (m_relatedTarget) - m_relatedTarget->ref(); - computeLayerPos(); - m_qevent = qe; - m_isDoubleClick = isDoubleClick; -} - -MouseEventImpl::~MouseEventImpl() -{ - if (m_relatedTarget) - m_relatedTarget->deref(); -} - -void MouseEventImpl::computeLayerPos() -{ - m_layerX = m_pageX; - m_layerY = m_pageY; - - DocumentImpl* doc = view() ? view()->document() : 0; - if (doc) { - khtml::RenderObject::NodeInfo renderInfo(true, false); - doc->renderer()->layer()->nodeAtPoint(renderInfo, m_pageX, m_pageY); - - NodeImpl *node = renderInfo.innerNonSharedNode(); - while (node && !node->renderer()) - node = node->parent(); - - if (node) { - node->renderer()->enclosingLayer()->updateLayerPosition(); - for (RenderLayer* layer = node->renderer()->enclosingLayer(); layer; - layer = layer->parent()) { - m_layerX -= layer->xPos(); - m_layerY -= layer->yPos(); - } - } - } -} - -void MouseEventImpl::initMouseEvent(const DOMString &typeArg, - bool canBubbleArg, - bool cancelableArg, - const AbstractView &viewArg, - long detailArg, - long screenXArg, - long screenYArg, - long clientXArg, - long clientYArg, - bool ctrlKeyArg, - bool altKeyArg, - bool shiftKeyArg, - bool metaKeyArg, - unsigned short buttonArg, - const Node &relatedTargetArg) -{ - UIEventImpl::initUIEvent(typeArg,canBubbleArg,cancelableArg,viewArg,detailArg); - - if (m_relatedTarget) - m_relatedTarget->deref(); - - m_screenX = screenXArg; - m_screenY = screenYArg; - m_clientX = clientXArg; - m_clientY = clientYArg; - m_pageX = clientXArg; - m_pageY = clientYArg; - KHTMLView* v; - if ( view() && view()->document() && ( v = view()->document()->view() ) ) { - m_pageX += v->contentsX(); - m_pageY += v->contentsY(); - } - m_ctrlKey = ctrlKeyArg; - m_altKey = altKeyArg; - m_shiftKey = shiftKeyArg; - m_metaKey = metaKeyArg; - m_button = buttonArg; - m_relatedTarget = relatedTargetArg.handle(); - if (m_relatedTarget) - m_relatedTarget->ref(); - - - // ### make this on-demand. its soo sloooow - computeLayerPos(); - m_qevent = 0; -} - -bool MouseEventImpl::isMouseEvent() const -{ - return true; -} - -//--------------------------------------------------------------------------------------------- -/* This class is used to do remapping between different encodings reasonably compactly */ - -template -class IDTranslator -{ -public: - struct Info { - MemL l; - R r; - }; - - IDTranslator(const Info* table) { - for (const Info* cursor = table; cursor->l; ++cursor) { - m_lToR.insert(cursor->l, cursor->r); - m_rToL.insert(cursor->r, cursor->l); - } - } - - L toLeft(R r) { - TQMapIterator i( m_rToL.find(r) ); - if (i != m_rToL.end()) - return *i; - return L(); - } - - R toRight(L l) { - TQMapIterator i = m_lToR.find(l); - if (i != m_lToR.end()) - return *i; - return R(); - } - -private: - TQMap m_lToR; - TQMap m_rToL; -}; - -#define MAKE_TRANSLATOR(name,L,R,MR,table) static IDTranslator* s_##name; \ - static IDTranslator* name() { if (!s_##name) s_##name = new IDTranslator(table); \ - return s_##name; } - -//--------------------------------------------------------------------------------------------- - -/* Mapping between special Qt keycodes and virtual DOM codes */ -IDTranslator::Info virtKeyToQtKeyTable[] = -{ - {KeyEventBaseImpl::DOM_VK_BACK_SPACE, Qt::Key_Backspace}, - {KeyEventBaseImpl::DOM_VK_ENTER, Qt::Key_Enter}, - {KeyEventBaseImpl::DOM_VK_ENTER, Qt::Key_Return}, - {KeyEventBaseImpl::DOM_VK_NUM_LOCK, Qt::Key_NumLock}, - {KeyEventBaseImpl::DOM_VK_RIGHT_ALT, Qt::Key_Alt}, - {KeyEventBaseImpl::DOM_VK_LEFT_CONTROL, Qt::Key_Control}, - {KeyEventBaseImpl::DOM_VK_LEFT_SHIFT, Qt::Key_Shift}, - {KeyEventBaseImpl::DOM_VK_META, Qt::Key_Meta}, - {KeyEventBaseImpl::DOM_VK_CAPS_LOCK, Qt::Key_CapsLock}, - {KeyEventBaseImpl::DOM_VK_DELETE, Qt::Key_Delete}, - {KeyEventBaseImpl::DOM_VK_END, Qt::Key_End}, - {KeyEventBaseImpl::DOM_VK_ESCAPE, Qt::Key_Escape}, - {KeyEventBaseImpl::DOM_VK_HOME, Qt::Key_Home}, - {KeyEventBaseImpl::DOM_VK_PAUSE, Qt::Key_Pause}, - {KeyEventBaseImpl::DOM_VK_PRINTSCREEN, Qt::Key_Print}, - {KeyEventBaseImpl::DOM_VK_SCROLL_LOCK, Qt::Key_ScrollLock}, - {KeyEventBaseImpl::DOM_VK_LEFT, Qt::Key_Left}, - {KeyEventBaseImpl::DOM_VK_RIGHT, Qt::Key_Right}, - {KeyEventBaseImpl::DOM_VK_UP, Qt::Key_Up}, - {KeyEventBaseImpl::DOM_VK_DOWN, Qt::Key_Down}, - {KeyEventBaseImpl::DOM_VK_PAGE_DOWN, TQt::Key_Next}, - {KeyEventBaseImpl::DOM_VK_PAGE_UP, TQt::Key_Prior}, - {KeyEventBaseImpl::DOM_VK_F1, Qt::Key_F1}, - {KeyEventBaseImpl::DOM_VK_F2, Qt::Key_F2}, - {KeyEventBaseImpl::DOM_VK_F3, Qt::Key_F3}, - {KeyEventBaseImpl::DOM_VK_F4, Qt::Key_F4}, - {KeyEventBaseImpl::DOM_VK_F5, Qt::Key_F5}, - {KeyEventBaseImpl::DOM_VK_F6, Qt::Key_F6}, - {KeyEventBaseImpl::DOM_VK_F7, Qt::Key_F7}, - {KeyEventBaseImpl::DOM_VK_F8, Qt::Key_F8}, - {KeyEventBaseImpl::DOM_VK_F9, Qt::Key_F9}, - {KeyEventBaseImpl::DOM_VK_F10, Qt::Key_F10}, - {KeyEventBaseImpl::DOM_VK_F11, Qt::Key_F11}, - {KeyEventBaseImpl::DOM_VK_F12, Qt::Key_F12}, - {KeyEventBaseImpl::DOM_VK_F13, Qt::Key_F13}, - {KeyEventBaseImpl::DOM_VK_F14, Qt::Key_F14}, - {KeyEventBaseImpl::DOM_VK_F15, Qt::Key_F15}, - {KeyEventBaseImpl::DOM_VK_F16, Qt::Key_F16}, - {KeyEventBaseImpl::DOM_VK_F17, Qt::Key_F17}, - {KeyEventBaseImpl::DOM_VK_F18, Qt::Key_F18}, - {KeyEventBaseImpl::DOM_VK_F19, Qt::Key_F19}, - {KeyEventBaseImpl::DOM_VK_F20, Qt::Key_F20}, - {KeyEventBaseImpl::DOM_VK_F21, Qt::Key_F21}, - {KeyEventBaseImpl::DOM_VK_F22, Qt::Key_F22}, - {KeyEventBaseImpl::DOM_VK_F23, Qt::Key_F23}, - {KeyEventBaseImpl::DOM_VK_F24, Qt::Key_F24}, - {0, 0} -}; - -MAKE_TRANSLATOR(virtKeyToQtKey, unsigned, unsigned, unsigned, virtKeyToQtKeyTable) - -KeyEventBaseImpl::KeyEventBaseImpl(EventId id, bool canBubbleArg, bool cancelableArg, AbstractViewImpl *viewArg, - TQKeyEvent *key) : - UIEventImpl(id, canBubbleArg, cancelableArg, viewArg, 0) -{ - m_synthetic = false; - - //Here, we need to map Qt's internal info to browser-style info. - m_keyEvent = new TQKeyEvent(key->type(), key->key(), key->ascii(), key->state(), key->text(), key->isAutoRepeat(), key->count() ); - - m_detail = key->count(); - m_keyVal = key->ascii(); - m_virtKeyVal = virtKeyToQtKey()->toLeft(key->key()); - - // m_keyVal should contain the unicode value - // of the pressed key if available. - if (m_virtKeyVal == DOM_VK_UNDEFINED && !key->text().isEmpty()) - m_keyVal = TQString(key->text()).unicode()[0]; - - // key->state returns enum ButtonState, which is ShiftButton, ControlButton and AltButton or'ed together. - m_modifier = key->state(); -} - -KeyEventBaseImpl::~KeyEventBaseImpl() -{ - delete m_keyEvent; -} - -void KeyEventBaseImpl::initKeyBaseEvent(const DOMString &typeArg, - bool canBubbleArg, - bool cancelableArg, - const AbstractView &viewArg, - unsigned long keyValArg, - unsigned long virtKeyValArg, - unsigned long modifiersArg) -{ - m_synthetic = true; - delete m_keyEvent; - m_keyEvent = 0; - initUIEvent(typeArg, canBubbleArg, cancelableArg, viewArg, 1); - m_virtKeyVal = virtKeyValArg; - m_keyVal = keyValArg; - m_modifier = modifiersArg; -} - -bool KeyEventBaseImpl::checkModifier(unsigned long modifierArg) -{ - return ((m_modifier & modifierArg) == modifierArg); -} - -void KeyEventBaseImpl::initModifier(unsigned long modifierArg, - bool valueArg) -{ - if (valueArg) - m_modifier |= modifierArg; - else - m_modifier &= (modifierArg ^ 0xFFFFFFFF); -} - -void KeyEventBaseImpl::buildQKeyEvent() const -{ - delete m_keyEvent; - - assert(m_synthetic); - //IMPORTANT: we ignore modifers on purpose. - //this is to prevent a website from synthesizing something - //like Ctrl-V or Shift-Insert and stealing contents of the user's clipboard. - unsigned modifiers = 0; - - int key = 0; - int ascii = 0; - TQString text; - if (m_virtKeyVal) - key = virtKeyToQtKey()->toRight(m_virtKeyVal); - if (!key) { - ascii = m_keyVal; //###? - key = m_keyVal; - text = TQChar(key); - } - - //Neuter F keys as well. - if (key >= Qt::Key_F1 && key <= Qt::Key_F35) - key = Qt::Key_ScrollLock; - - m_keyEvent = new TQKeyEvent(id() == KEYUP_EVENT ? TQEvent::KeyRelease : TQEvent::KeyPress, - key, ascii, modifiers, text); -} - -//------------------------------------------------------------------------------ - - -static const IDTranslator::Info keyIdentifiersToVirtKeysTable[] = { - {"Alt", KeyEventBaseImpl::DOM_VK_LEFT_ALT}, - {"Control", KeyEventBaseImpl::DOM_VK_LEFT_CONTROL}, - {"Shift", KeyEventBaseImpl::DOM_VK_LEFT_SHIFT}, - {"Meta", KeyEventBaseImpl::DOM_VK_META}, - {"\0x08", KeyEventBaseImpl::DOM_VK_SPACE}, //1-char virt! - {"CapsLock", KeyEventBaseImpl::DOM_VK_CAPS_LOCK}, - {"\x7F", KeyEventBaseImpl::DOM_VK_DELETE}, //1-char virt! - {"End", KeyEventBaseImpl::DOM_VK_END}, - {"Enter", KeyEventBaseImpl::DOM_VK_ENTER}, - {"\x1b", KeyEventBaseImpl::DOM_VK_ESCAPE}, //1-char virt! - {"Home", KeyEventBaseImpl::DOM_VK_HOME}, - {"NumLock", KeyEventBaseImpl::DOM_VK_NUM_LOCK}, - {"Pause", KeyEventBaseImpl::DOM_VK_PAUSE}, - {"PrintScreen", KeyEventBaseImpl::DOM_VK_PRINTSCREEN}, - {"Scroll", KeyEventBaseImpl::DOM_VK_SCROLL_LOCK}, - {" ", KeyEventBaseImpl::DOM_VK_SPACE}, //1-char virt! - {"\t", KeyEventBaseImpl::DOM_VK_TAB}, //1-char virt! - {"Left", KeyEventBaseImpl::DOM_VK_LEFT}, - {"Left", KeyEventBaseImpl::DOM_VK_LEFT}, - {"Right", KeyEventBaseImpl::DOM_VK_RIGHT}, - {"Up", KeyEventBaseImpl::DOM_VK_UP}, - {"Down", KeyEventBaseImpl::DOM_VK_DOWN}, - {"PageDown", KeyEventBaseImpl::DOM_VK_PAGE_DOWN}, - {"PageUp", KeyEventBaseImpl::DOM_VK_PAGE_UP}, - {"F1", KeyEventBaseImpl::DOM_VK_F1}, - {"F2", KeyEventBaseImpl::DOM_VK_F2}, - {"F3", KeyEventBaseImpl::DOM_VK_F3}, - {"F4", KeyEventBaseImpl::DOM_VK_F4}, - {"F5", KeyEventBaseImpl::DOM_VK_F5}, - {"F6", KeyEventBaseImpl::DOM_VK_F6}, - {"F7", KeyEventBaseImpl::DOM_VK_F7}, - {"F8", KeyEventBaseImpl::DOM_VK_F8}, - {"F9", KeyEventBaseImpl::DOM_VK_F9}, - {"F10", KeyEventBaseImpl::DOM_VK_F10}, - {"F11", KeyEventBaseImpl::DOM_VK_F11}, - {"F12", KeyEventBaseImpl::DOM_VK_F12}, - {"F13", KeyEventBaseImpl::DOM_VK_F13}, - {"F14", KeyEventBaseImpl::DOM_VK_F14}, - {"F15", KeyEventBaseImpl::DOM_VK_F15}, - {"F16", KeyEventBaseImpl::DOM_VK_F16}, - {"F17", KeyEventBaseImpl::DOM_VK_F17}, - {"F18", KeyEventBaseImpl::DOM_VK_F18}, - {"F19", KeyEventBaseImpl::DOM_VK_F19}, - {"F20", KeyEventBaseImpl::DOM_VK_F20}, - {"F21", KeyEventBaseImpl::DOM_VK_F21}, - {"F22", KeyEventBaseImpl::DOM_VK_F22}, - {"F23", KeyEventBaseImpl::DOM_VK_F23}, - {"F24", KeyEventBaseImpl::DOM_VK_F24}, - {0, 0} -}; - -MAKE_TRANSLATOR(keyIdentifiersToVirtKeys, TQCString, unsigned, const char*, keyIdentifiersToVirtKeysTable) - -/** These are the modifiers we currently support */ -static const IDTranslator::Info keyModifiersToCodeTable[] = { - {"Alt", TQt::AltButton}, - {"Control", TQt::ControlButton}, - {"Shift", TQt::ShiftButton}, - {"Meta", TQt::MetaButton}, - {0, 0} -}; - -MAKE_TRANSLATOR(keyModifiersToCode, TQCString, unsigned, const char*, keyModifiersToCodeTable) - -KeyboardEventImpl::KeyboardEventImpl() : m_keyLocation(DOM_KEY_LOCATION_STANDARD) -{} - -DOMString KeyboardEventImpl::keyIdentifier() const -{ - if (unsigned special = virtKeyVal()) - if (const char* id = keyIdentifiersToVirtKeys()->toLeft(special)) - return TQString::fromLatin1(id); - - if (unsigned unicode = keyVal()) - return TQString(TQChar(unicode)); - - return "Unidentified"; -} - -bool KeyboardEventImpl::getModifierState (const DOMString& keyIdentifierArg) const -{ - unsigned mask = keyModifiersToCode()->toRight(keyIdentifierArg.string().latin1()); - return m_modifier & mask; -} - -bool KeyboardEventImpl::isKeyboardEvent() const -{ - return true; -} - -void KeyboardEventImpl::initKeyboardEvent(const DOMString &typeArg, - bool canBubbleArg, - bool cancelableArg, - const AbstractView &viewArg, - const DOMString &keyIdentifierArg, - unsigned long keyLocationArg, - const DOMString& modifiersList) -{ - unsigned keyVal = 0; - unsigned virtKeyVal = 0; - - m_keyLocation = keyLocationArg; - - //Figure out the code information from the key identifier. - if (keyIdentifierArg.length() == 1) { - //Likely to be normal unicode id, unless it's one of the few - //special values. - unsigned short code = keyIdentifierArg.unicode()[0]; - if (code > 0x20 && code != 0x7F) - keyVal = code; - } - - if (!keyVal) //One of special keys, likely. - virtKeyVal = keyIdentifiersToVirtKeys()->toRight(keyIdentifierArg.string().latin1()); - - //Process modifier list. - TQStringList mods = - TQStringList::split(' ', - modifiersList.string().stripWhiteSpace().simplifyWhiteSpace()); - - unsigned modifiers = 0; - for (TQStringList::Iterator i = mods.begin(); i != mods.end(); ++i) - if (unsigned mask = keyModifiersToCode()->toRight((*i).latin1())) - modifiers |= mask; - - initKeyBaseEvent(typeArg, canBubbleArg, cancelableArg, viewArg, - keyVal, virtKeyVal, modifiers); -} - -KeyboardEventImpl::KeyboardEventImpl(TQKeyEvent* key, DOM::AbstractViewImpl* view) : - KeyEventBaseImpl(key->type() == TQEvent::KeyRelease ? KEYUP_EVENT : KEYDOWN_EVENT, true, true, view, key) -{ - //Try to put something reasonable in location... - //we don't know direction, so guess left - m_keyLocation = DOM_KEY_LOCATION_STANDARD; - switch (m_virtKeyVal) { - case DOM_VK_LEFT_ALT: - case DOM_VK_LEFT_SHIFT: - case DOM_VK_LEFT_CONTROL: - case DOM_VK_META: - m_keyLocation = DOM_KEY_LOCATION_LEFT; - } -} - -int KeyboardEventImpl::keyCode() const -{ - //Keycode on key events always identifies the -key- and not the input, - //so e.g. 'a' will get 'A' - if (m_virtKeyVal != DOM_VK_UNDEFINED) - return m_virtKeyVal; - else - return TQChar((unsigned short)m_keyVal).upper().unicode(); -} - -int KeyboardEventImpl::charCode() const -{ - //IE doesn't support charCode at all, and mozilla returns 0 - //on key events. So return 0 here - return 0; -} - - -// ----------------------------------------------------------------------------- -TextEventImpl::TextEventImpl() -{} - -bool TextEventImpl::isTextInputEvent() const -{ - return true; -} - -TextEventImpl::TextEventImpl(TQKeyEvent* key, DOM::AbstractViewImpl* view) : - KeyEventBaseImpl(KEYPRESS_EVENT, true, true, view, key) -{ - m_outputString = TQString(key->text()); -} - -void TextEventImpl::initTextEvent(const DOMString &typeArg, - bool canBubbleArg, - bool cancelableArg, - const AbstractView &viewArg, - const DOMString& text) -{ - m_outputString = text; - - //See whether we can get a key out of this. - unsigned keyCode = 0; - if (text.length() == 1) - keyCode = text.unicode()[0].unicode(); - initKeyBaseEvent(typeArg, canBubbleArg, cancelableArg, viewArg, - keyCode, 0, 0); -} - -int TextEventImpl::keyCode() const -{ - //Mozilla returns 0 here unless this is a non-unicode key. - //IE stuffs everything here, and so we try to match it.. - if (m_keyVal) - return m_keyVal; - return m_virtKeyVal; -} - -int TextEventImpl::charCode() const -{ - //On text events, in Mozilla charCode is 0 for non-unicode keys, - //and the unicode key otherwise... IE doesn't support this. - if (m_virtKeyVal) - return 0; - return m_keyVal; -} - - -// ----------------------------------------------------------------------------- -MutationEventImpl::MutationEventImpl() -{ - m_relatedNode = 0; - m_prevValue = 0; - m_newValue = 0; - m_attrName = 0; - m_attrChange = 0; -} - -MutationEventImpl::MutationEventImpl(EventId _id, - bool canBubbleArg, - bool cancelableArg, - const Node &relatedNodeArg, - const DOMString &prevValueArg, - const DOMString &newValueArg, - const DOMString &attrNameArg, - unsigned short attrChangeArg) - : EventImpl(_id,canBubbleArg,cancelableArg) -{ - m_relatedNode = relatedNodeArg.handle(); - if (m_relatedNode) - m_relatedNode->ref(); - m_prevValue = prevValueArg.implementation(); - if (m_prevValue) - m_prevValue->ref(); - m_newValue = newValueArg.implementation(); - if (m_newValue) - m_newValue->ref(); - m_attrName = attrNameArg.implementation(); - if (m_attrName) - m_attrName->ref(); - m_attrChange = attrChangeArg; -} - -MutationEventImpl::~MutationEventImpl() -{ - if (m_relatedNode) - m_relatedNode->deref(); - if (m_prevValue) - m_prevValue->deref(); - if (m_newValue) - m_newValue->deref(); - if (m_attrName) - m_attrName->deref(); -} - -void MutationEventImpl::initMutationEvent(const DOMString &typeArg, - bool canBubbleArg, - bool cancelableArg, - const Node &relatedNodeArg, - const DOMString &prevValueArg, - const DOMString &newValueArg, - const DOMString &attrNameArg, - unsigned short attrChangeArg) -{ - EventImpl::initEvent(typeArg,canBubbleArg,cancelableArg); - - if (m_relatedNode) - m_relatedNode->deref(); - if (m_prevValue) - m_prevValue->deref(); - if (m_newValue) - m_newValue->deref(); - if (m_attrName) - m_attrName->deref(); - - m_relatedNode = relatedNodeArg.handle(); - if (m_relatedNode) - m_relatedNode->ref(); - m_prevValue = prevValueArg.implementation(); - if (m_prevValue) - m_prevValue->ref(); - m_newValue = newValueArg.implementation(); - if (m_newValue) - m_newValue->ref(); - m_attrName = attrNameArg.implementation(); - if (m_newValue) - m_newValue->ref(); - m_attrChange = attrChangeArg; -} - -bool MutationEventImpl::isMutationEvent() const -{ - return true; -} - diff --git a/khtml/xml/dom2_eventsimpl.h b/khtml/xml/dom2_eventsimpl.h deleted file mode 100644 index fab2225e5..000000000 --- a/khtml/xml/dom2_eventsimpl.h +++ /dev/null @@ -1,513 +0,0 @@ -/* - * This file is part of the DOM implementation for KDE. - * - * Copyright (C) 2001 Peter Kelly (pmk@post.com) - * (C) 2001 Tobias Anton (anton@stud.fbi.fh-darmstadt.de) - * (C) 2002 Apple Computer, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - * - */ - -#ifndef _DOM_EventsImpl_h_ -#define _DOM_EventsImpl_h_ - -#include "dom/dom2_events.h" -#include "xml/dom2_viewsimpl.h" - -class KHTMLPart; -class TQMouseEvent; - -namespace DOM { - -class AbstractViewImpl; -class DOMStringImpl; -class NodeImpl; - -// ### support user-defined events - -class EventImpl : public khtml::Shared -{ -public: - enum EventId { - UNKNOWN_EVENT = 0, - // UI events - DOMFOCUSIN_EVENT, - DOMFOCUSOUT_EVENT, - DOMACTIVATE_EVENT, - // Mouse events - CLICK_EVENT, - MOUSEDOWN_EVENT, - MOUSEUP_EVENT, - MOUSEOVER_EVENT, - MOUSEMOVE_EVENT, - MOUSEOUT_EVENT, - // Mutation events - DOMSUBTREEMODIFIED_EVENT, - DOMNODEINSERTED_EVENT, - DOMNODEREMOVED_EVENT, - DOMNODEREMOVEDFROMDOCUMENT_EVENT, - DOMNODEINSERTEDINTODOCUMENT_EVENT, - DOMATTRMODIFIED_EVENT, - DOMCHARACTERDATAMODIFIED_EVENT, - // HTML events - LOAD_EVENT, - UNLOAD_EVENT, - ABORT_EVENT, - ERROR_EVENT, - SELECT_EVENT, - CHANGE_EVENT, - SUBMIT_EVENT, - RESET_EVENT, - FOCUS_EVENT, - BLUR_EVENT, - RESIZE_EVENT, - SCROLL_EVENT, - // keyboard events - KEYDOWN_EVENT, - KEYUP_EVENT, - KEYPRESS_EVENT, //Mostly corresponds to DOM3 textInput event. - // khtml events (not part of DOM) - KHTML_ECMA_DBLCLICK_EVENT, // for html ondblclick - KHTML_ECMA_CLICK_EVENT, // for html onclick - KHTML_DRAGDROP_EVENT, - KHTML_MOVE_EVENT, - // XMLHttpRequest events - KHTML_READYSTATECHANGE_EVENT - }; - - EventImpl(); - EventImpl(EventId _id, bool canBubbleArg, bool cancelableArg); - virtual ~EventImpl(); - - EventId id() const { return m_id; } - - DOMString type() const { return m_type; } - NodeImpl *target() const { return m_target; } - void setTarget(NodeImpl *_target); - NodeImpl *currentTarget() const { return m_currentTarget; } - void setCurrentTarget(NodeImpl *_currentTarget) { m_currentTarget = _currentTarget; } - unsigned short eventPhase() const { return m_eventPhase; } - void setEventPhase(unsigned short _eventPhase) { m_eventPhase = _eventPhase; } - bool bubbles() const { return m_canBubble; } - bool cancelable() const { return m_cancelable; } - DOMTimeStamp timeStamp(); - void stopPropagation(bool stop) { m_propagationStopped = stop; } - void preventDefault(bool prevent) { if ( m_cancelable ) m_defaultPrevented = prevent; } - - void initEvent(const DOMString &eventTypeArg, bool canBubbleArg, bool cancelableArg); - - virtual bool isUIEvent() const; - virtual bool isMouseEvent() const; - virtual bool isMutationEvent() const; - virtual bool isTextInputEvent() const; - virtual bool isKeyboardEvent() const; - bool isKeyRelatedEvent() const { return isTextInputEvent() || isKeyboardEvent(); } - - bool propagationStopped() const { return m_propagationStopped; } - bool defaultPrevented() const { return m_defaultPrevented; } - - static EventId typeToId(DOMString type); - static DOMString idToType(EventId id); - - void setDefaultHandled() { m_defaultHandled = true; } - bool defaultHandled() const { return m_defaultHandled; } - - DOMString message() const { return m_message; } - void setMessage(const DOMString &_message) { m_message = _message; } - -protected: - DOMStringImpl *m_type; - bool m_canBubble; - bool m_cancelable; - - bool m_propagationStopped; - bool m_defaultPrevented; - bool m_defaultHandled; - EventId m_id : 6; - unsigned short m_eventPhase : 2; - NodeImpl *m_currentTarget; // ref > 0 maintained externally - NodeImpl *m_target; - TQDateTime m_createTime; - DOMString m_message; -}; - - - -class UIEventImpl : public EventImpl -{ -public: - UIEventImpl() : m_view(0), m_detail(0) {} - UIEventImpl(EventId _id, - bool canBubbleArg, - bool cancelableArg, - AbstractViewImpl *viewArg, - long detailArg); - virtual ~UIEventImpl(); - AbstractViewImpl *view() const { return m_view; } - long detail() const { return m_detail; } - void initUIEvent(const DOMString &typeArg, - bool canBubbleArg, - bool cancelableArg, - const AbstractView &viewArg, - long detailArg); - virtual bool isUIEvent() const; - -protected: - AbstractViewImpl *m_view; - long m_detail; - -}; - -// Introduced in DOM Level 2: - internal -class MouseEventImpl : public UIEventImpl { -public: - MouseEventImpl(); - MouseEventImpl(EventId _id, - bool canBubbleArg, - bool cancelableArg, - AbstractViewImpl *viewArg, - long detailArg, - long screenXArg, - long screenYArg, - long clientXArg, - long clientYArg, - long pageXArg, - long pageYArg, - bool ctrlKeyArg, - bool altKeyArg, - bool shiftKeyArg, - bool metaKeyArg, - unsigned short buttonArg, - NodeImpl *relatedTargetArg, - TQMouseEvent *qe = 0, - bool isDoubleClick = false); - virtual ~MouseEventImpl(); - long screenX() const { return m_screenX; } - long screenY() const { return m_screenY; } - long clientX() const { return m_clientX; } - long clientY() const { return m_clientY; } - long layerX() const { return m_layerX; } // non-DOM extension - long layerY() const { return m_layerY; } // non-DOM extension - long pageX() const { return m_pageX; } // non-DOM extension - long pageY() const { return m_pageY; } // non-DOM extension - bool isDoubleClick() const { return m_isDoubleClick; } // non-DOM extension - bool ctrlKey() const { return m_ctrlKey; } - bool shiftKey() const { return m_shiftKey; } - bool altKey() const { return m_altKey; } - bool metaKey() const { return m_metaKey; } - unsigned short button() const { return m_button; } - NodeImpl *relatedTarget() const { return m_relatedTarget; } - - void computeLayerPos(); - - void initMouseEvent(const DOMString &typeArg, - bool canBubbleArg, - bool cancelableArg, - const AbstractView &viewArg, - long detailArg, - long screenXArg, - long screenYArg, - long clientXArg, - long clientYArg, - bool ctrlKeyArg, - bool altKeyArg, - bool shiftKeyArg, - bool metaKeyArg, - unsigned short buttonArg, - const Node &relatedTargetArg); - virtual bool isMouseEvent() const; - - TQMouseEvent *qEvent() const { return m_qevent; } -protected: - long m_screenX; - long m_screenY; - long m_clientX; - long m_clientY; - long m_layerX; - long m_layerY; - long m_pageX; - long m_pageY; - bool m_ctrlKey : 1; - bool m_altKey : 1; - bool m_shiftKey : 1; - bool m_metaKey : 1; - bool m_isDoubleClick : 1; - unsigned short m_button; - NodeImpl *m_relatedTarget; - TQMouseEvent *m_qevent; -}; - - -class KeyEventBaseImpl : public UIEventImpl { -public: - // VirtualKeyCode - enum KeyCodes { - DOM_VK_UNDEFINED = 0x0, - DOM_VK_RIGHT_ALT = 0x12, - DOM_VK_LEFT_ALT = 0x12, - DOM_VK_LEFT_CONTROL = 0x11, - DOM_VK_RIGHT_CONTROL = 0x11, - DOM_VK_LEFT_SHIFT = 0x10, - DOM_VK_RIGHT_SHIFT = 0x10, - DOM_VK_META = 0x9D, - DOM_VK_BACK_SPACE = 0x08, - DOM_VK_CAPS_LOCK = 0x14, - DOM_VK_DELETE = 0x7F, - DOM_VK_END = 0x23, - DOM_VK_ENTER = 0x0D, - DOM_VK_ESCAPE = 0x1B, - DOM_VK_HOME = 0x24, - DOM_VK_NUM_LOCK = 0x90, - DOM_VK_PAUSE = 0x13, - DOM_VK_PRINTSCREEN = 0x9A, - DOM_VK_SCROLL_LOCK = 0x91, - DOM_VK_SPACE = 0x20, - DOM_VK_TAB = 0x09, - DOM_VK_LEFT = 0x25, - DOM_VK_RIGHT = 0x27, - DOM_VK_UP = 0x26, - DOM_VK_DOWN = 0x28, - DOM_VK_PAGE_DOWN = 0x22, - DOM_VK_PAGE_UP = 0x21, - DOM_VK_F1 = 0x70, - DOM_VK_F2 = 0x71, - DOM_VK_F3 = 0x72, - DOM_VK_F4 = 0x73, - DOM_VK_F5 = 0x74, - DOM_VK_F6 = 0x75, - DOM_VK_F7 = 0x76, - DOM_VK_F8 = 0x77, - DOM_VK_F9 = 0x78, - DOM_VK_F10 = 0x79, - DOM_VK_F11 = 0x7A, - DOM_VK_F12 = 0x7B, - DOM_VK_F13 = 0xF000, - DOM_VK_F14 = 0xF001, - DOM_VK_F15 = 0xF002, - DOM_VK_F16 = 0xF003, - DOM_VK_F17 = 0xF004, - DOM_VK_F18 = 0xF005, - DOM_VK_F19 = 0xF006, - DOM_VK_F20 = 0xF007, - DOM_VK_F21 = 0xF008, - DOM_VK_F22 = 0xF009, - DOM_VK_F23 = 0xF00A, - DOM_VK_F24 = 0xF00B - }; - - void initKeyBaseEvent(const DOMString &typeArg, - bool canBubbleArg, - bool cancelableArg, - const AbstractView &viewArg, - unsigned long keyVal, - unsigned long virtKeyVal, - unsigned long modifiers); - - bool ctrlKey() const { return m_modifier & TQt::ControlButton; } - bool shiftKey() const { return m_modifier & TQt::ShiftButton; } - bool altKey() const { return m_modifier & TQt::AltButton; } - bool metaKey() const { return m_modifier & TQt::MetaButton; } - - bool inputGenerated() const { return m_virtKeyVal == 0; } - unsigned long keyVal() const { return m_keyVal; } - unsigned long virtKeyVal() const { return m_virtKeyVal; } - - TQKeyEvent *qKeyEvent() const { if (!m_keyEvent) buildQKeyEvent(); return m_keyEvent; } - - //Legacy key stuff... - virtual int keyCode() const = 0; - virtual int charCode() const = 0; - - //### KDE4: remove these 2 - void initModifier(unsigned long modifierArg, bool valueArg); - bool checkModifier(unsigned long modifierArg); - - ~KeyEventBaseImpl(); - - //Returns true if the event was synthesized by client use of DOM - bool isSynthetic() const { return m_synthetic; } -protected: - KeyEventBaseImpl(): m_keyEvent(0), m_keyVal(0), m_virtKeyVal(0), m_modifier(0), m_synthetic(false) - { m_detail = 0; } - - KeyEventBaseImpl(EventId id, - bool canBubbleArg, - bool cancelableArg, - AbstractViewImpl *viewArg, - TQKeyEvent *key); - - - mutable TQKeyEvent *m_keyEvent; - unsigned long m_keyVal; //Unicode key value - unsigned long m_virtKeyVal; //Virtual key value for keys like arrows, Fn, etc. - - // bitfield containing state of modifiers. not part of the dom. - unsigned long m_modifier; - - bool m_synthetic; - - void buildQKeyEvent() const; //Construct a Qt key event from m_keyVal/m_virtKeyVal -}; - -class TextEventImpl : public KeyEventBaseImpl { -public: - TextEventImpl(); - - TextEventImpl(TQKeyEvent* key, DOM::AbstractViewImpl* view); - - void initTextEvent(const DOMString &typeArg, - bool canBubbleArg, - bool cancelableArg, - const AbstractView &viewArg, - const DOMString& text); - - virtual bool isTextInputEvent() const; - - //Legacy key stuff... - int keyCode() const; - int charCode() const; - - DOMString data() const { return m_outputString; } -private: - DOMString m_outputString; -}; - -class KeyboardEventImpl : public KeyEventBaseImpl { -public: - KeyboardEventImpl(); - KeyboardEventImpl(TQKeyEvent* key, DOM::AbstractViewImpl* view); - - virtual bool isKeyboardEvent() const; - - enum KeyLocation { - DOM_KEY_LOCATION_STANDARD = 0x00, - DOM_KEY_LOCATION_LEFT = 0x01, - DOM_KEY_LOCATION_RIGHT = 0x02, - DOM_KEY_LOCATION_NUMPAD = 0x03 - }; - - //Legacy key stuff... - int keyCode() const; - int charCode() const; - - DOMString keyIdentifier() const; - unsigned long keyLocation() const { return m_keyLocation; } - - bool getModifierState(const DOMString& keyIdentifierArg) const; - - void initKeyboardEvent(const DOMString &typeArg, - bool canBubbleArg, - bool cancelableArg, - const AbstractView &viewArg, - const DOMString &keyIdentifierArg, - unsigned long keyLocationArg, - const DOMString& modifiersList); - - //### KDE4: remove this, it's only for compatibility with - //the old TextEvent wrapper - void initKeyboardEvent(const DOMString &typeArg, - bool canBubbleArg, - bool cancelableArg, - const AbstractView &viewArg, - unsigned long keyVal, - unsigned long virtKeyVal, - unsigned long modifiers, - unsigned long keyLocationArg) { - initKeyBaseEvent(typeArg, canBubbleArg, cancelableArg, viewArg, - keyVal, virtKeyVal, modifiers); - m_keyLocation = keyLocationArg; - } -private: - unsigned long m_keyLocation; -}; - - - -class MutationEventImpl : public EventImpl { -// ### fire these during parsing (if necessary) -public: - MutationEventImpl(); - MutationEventImpl(EventId _id, - bool canBubbleArg, - bool cancelableArg, - const Node &relatedNodeArg, - const DOMString &prevValueArg, - const DOMString &newValueArg, - const DOMString &attrNameArg, - unsigned short attrChangeArg); - ~MutationEventImpl(); - - Node relatedNode() const { return m_relatedNode; } - DOMString prevValue() const { return m_prevValue; } - DOMString newValue() const { return m_newValue; } - DOMString attrName() const { return m_attrName; } - unsigned short attrChange() const { return m_attrChange; } - void initMutationEvent(const DOMString &typeArg, - bool canBubbleArg, - bool cancelableArg, - const Node &relatedNodeArg, - const DOMString &prevValueArg, - const DOMString &newValueArg, - const DOMString &attrNameArg, - unsigned short attrChangeArg); - virtual bool isMutationEvent() const; -protected: - NodeImpl *m_relatedNode; - DOMStringImpl *m_prevValue; - DOMStringImpl *m_newValue; - DOMStringImpl *m_attrName; - unsigned short m_attrChange; -}; - - -class RegisteredEventListener { -public: - RegisteredEventListener() : id(EventImpl::EventId(0)), useCapture(false), listener(0) {} - - RegisteredEventListener(EventImpl::EventId _id, EventListener *_listener, bool _useCapture) - : id(_id), useCapture(_useCapture), listener(_listener) { if (listener) listener->ref(); } - - ~RegisteredEventListener() { if (listener) listener->deref(); listener = 0; } - - bool operator==(const RegisteredEventListener &other) const - { return id == other.id && listener == other.listener && useCapture == other.useCapture; } - - - EventImpl::EventId id : 6; - bool useCapture; - EventListener *listener; - - RegisteredEventListener( const RegisteredEventListener &other ) : - id(other.id), useCapture(other.useCapture), listener(other.listener) - { if (listener) listener->ref(); } - - RegisteredEventListener & operator=( const RegisteredEventListener &other ) { - id = other.id; - useCapture = other.useCapture; - if (other.listener) - other.listener->ref(); - if (listener) - listener->deref(); - listener = other.listener; - return *this; - } -}; - - - -} //namespace -#endif diff --git a/khtml/xml/dom2_rangeimpl.cpp b/khtml/xml/dom2_rangeimpl.cpp deleted file mode 100644 index b160ce23f..000000000 --- a/khtml/xml/dom2_rangeimpl.cpp +++ /dev/null @@ -1,1640 +0,0 @@ -/** - * This file is part of the DOM implementation for KDE. - * - * (C) 1999-2003 Lars Knoll (knoll@kde.org) - * (C) 2001-2003 Dirk Mueller (mueller@kde.org) - * (C) 2000 Gunnstein Lye (gunnstein@netcom.no) - * (C) 2000 Frederik Holljen (frederik.holljen@hig.no) - * (C) 2001 Peter Kelly (pmk@post.com) - * Copyright (C) 2003 Apple Computer, Inc. - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "dom/dom_exception.h" -#include "dom_docimpl.h" -#include "dom2_rangeimpl.h" -#include "dom_textimpl.h" -#include "dom_xmlimpl.h" -#include "html/html_elementimpl.h" -#include "misc/htmltags.h" - -using namespace DOM; - - -RangeImpl::RangeImpl(DocumentImpl *_ownerDocument) -{ - m_ownerDocument = _ownerDocument; - m_ownerDocument->ref(); - m_startContainer = _ownerDocument; - m_startContainer->ref(); - m_endContainer = _ownerDocument; - m_endContainer->ref(); - m_startOffset = 0; - m_endOffset = 0; - m_detached = false; -} - -RangeImpl::RangeImpl(DocumentImpl *_ownerDocument, - NodeImpl *_startContainer, long _startOffset, - NodeImpl *_endContainer, long _endOffset) -{ - m_ownerDocument = _ownerDocument; - m_ownerDocument->ref(); - m_startContainer = _startContainer; - m_startContainer->ref(); - m_startOffset = _startOffset; - m_endContainer = _endContainer; - m_endContainer->ref(); - m_endOffset = _endOffset; - m_detached = false; -} - -RangeImpl::~RangeImpl() -{ - m_ownerDocument->deref(); - int exceptioncode = 0; - if (!m_detached) - detach(exceptioncode); -} - -NodeImpl *RangeImpl::startContainer(int &exceptioncode) const -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return 0; - } - - return m_startContainer; -} - -long RangeImpl::startOffset(int &exceptioncode) const -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return 0; - } - - return m_startOffset; -} - -NodeImpl *RangeImpl::endContainer(int &exceptioncode) const -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return 0; - } - - return m_endContainer; -} - -long RangeImpl::endOffset(int &exceptioncode) const -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return 0; - } - - return m_endOffset; -} - -NodeImpl *RangeImpl::commonAncestorContainer(int &exceptioncode) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return 0; - } - - NodeImpl *com = commonAncestorContainer(m_startContainer,m_endContainer); - if (!com) // should never happen - exceptioncode = DOMException::WRONG_DOCUMENT_ERR; - return com; -} - -NodeImpl *RangeImpl::commonAncestorContainer(NodeImpl *containerA, NodeImpl *containerB) -{ - NodeImpl *parentStart; - - for (parentStart = containerA; parentStart; parentStart = parentStart->parentNode()) { - NodeImpl *parentEnd = containerB; - while( parentEnd && (parentStart != parentEnd) ) - parentEnd = parentEnd->parentNode(); - - if(parentStart == parentEnd) break; - } - - return parentStart; -} - -bool RangeImpl::collapsed(int &exceptioncode) const -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return 0; - } - - return (m_startContainer == m_endContainer && m_startOffset == m_endOffset); -} - -void RangeImpl::setStart( NodeImpl *refNode, long offset, int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return; - } - - if (!refNode) { - exceptioncode = DOMException::NOT_FOUND_ERR; - return; - } - - if (refNode->getDocument() != m_ownerDocument) { - exceptioncode = DOMException::WRONG_DOCUMENT_ERR; - return; - } - - checkNodeWOffset( refNode, offset, exceptioncode ); - if (exceptioncode) - return; - - setStartContainer(refNode); - m_startOffset = offset; - - // check if different root container - NodeImpl *endRootContainer = m_endContainer; - while (endRootContainer->parentNode()) - endRootContainer = endRootContainer->parentNode(); - NodeImpl *startRootContainer = m_startContainer; - while (startRootContainer->parentNode()) - startRootContainer = startRootContainer->parentNode(); - if (startRootContainer != endRootContainer) - collapse(true,exceptioncode); - // check if new start after end - else if (compareBoundaryPoints(m_startContainer,m_startOffset,m_endContainer,m_endOffset) > 0) - collapse(true,exceptioncode); -} - -void RangeImpl::setEnd( NodeImpl *refNode, long offset, int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return; - } - - if (!refNode) { - exceptioncode = DOMException::NOT_FOUND_ERR; - return; - } - - if (refNode->getDocument() != m_ownerDocument) { - exceptioncode = DOMException::WRONG_DOCUMENT_ERR; - return; - } - - checkNodeWOffset( refNode, offset, exceptioncode ); - if (exceptioncode) - return; - - setEndContainer(refNode); - m_endOffset = offset; - - // check if different root container - NodeImpl *endRootContainer = m_endContainer; - while (endRootContainer->parentNode()) - endRootContainer = endRootContainer->parentNode(); - NodeImpl *startRootContainer = m_startContainer; - while (startRootContainer->parentNode()) - startRootContainer = startRootContainer->parentNode(); - if (startRootContainer != endRootContainer) - collapse(false,exceptioncode); - // check if new end before start - if (compareBoundaryPoints(m_startContainer,m_startOffset,m_endContainer,m_endOffset) > 0) - collapse(false,exceptioncode); -} - -void RangeImpl::collapse( bool toStart, int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return; - } - - if( toStart ) // collapse to start - { - setEndContainer(m_startContainer); - m_endOffset = m_startOffset; - } - else // collapse to end - { - setStartContainer(m_endContainer); - m_startOffset = m_endOffset; - } -} - -short RangeImpl::compareBoundaryPoints( Range::CompareHow how, RangeImpl *sourceRange, int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return 0; - } - - if (!sourceRange) { - exceptioncode = DOMException::NOT_FOUND_ERR; - return 0; - } - - NodeImpl *thisCont = commonAncestorContainer(exceptioncode); - NodeImpl *sourceCont = sourceRange->commonAncestorContainer(exceptioncode); - if (exceptioncode) - return 0; - - if (thisCont->getDocument() != sourceCont->getDocument()) { - exceptioncode = DOMException::WRONG_DOCUMENT_ERR; - return 0; - } - - NodeImpl *thisTop = thisCont; - NodeImpl *sourceTop = sourceCont; - while (thisTop->parentNode()) - thisTop = thisTop->parentNode(); - while (sourceTop->parentNode()) - sourceTop = sourceTop->parentNode(); - if (thisTop != sourceTop) { // in different DocumentFragments - exceptioncode = DOMException::WRONG_DOCUMENT_ERR; - return 0; - } - - switch(how) - { - case Range::START_TO_START: - return compareBoundaryPoints( m_startContainer, m_startOffset, - sourceRange->startContainer(exceptioncode), sourceRange->startOffset(exceptioncode) ); - break; - case Range::START_TO_END: - return compareBoundaryPoints( m_startContainer, m_startOffset, - sourceRange->endContainer(exceptioncode), sourceRange->endOffset(exceptioncode) ); - break; - case Range::END_TO_END: - return compareBoundaryPoints( m_endContainer, m_endOffset, - sourceRange->endContainer(exceptioncode), sourceRange->endOffset(exceptioncode) ); - break; - case Range::END_TO_START: - return compareBoundaryPoints( m_endContainer, m_endOffset, - sourceRange->startContainer(exceptioncode), sourceRange->startOffset(exceptioncode) ); - break; - default: - exceptioncode = DOMException::SYNTAX_ERR; - return 0; - } -} - -short RangeImpl::compareBoundaryPoints( NodeImpl *containerA, long offsetA, NodeImpl *containerB, long offsetB ) -{ - // see DOM2 traversal & range section 2.5 - - // case 1: both points have the same container - if( containerA == containerB ) - { - if( offsetA == offsetB ) return 0; // A is equal to B - if( offsetA < offsetB ) return -1; // A is before B - else return 1; // A is after B - } - - // case 2: node C (container B or an ancestor) is a child node of A - NodeImpl *c = containerB; - while (c && c->parentNode() != containerA) - c = c->parentNode(); - if (c) { - int offsetC = 0; - NodeImpl* n = containerA->firstChild(); - while (n != c) { - offsetC++; - n = n->nextSibling(); - } - - if( offsetA <= offsetC ) return -1; // A is before B - else return 1; // A is after B - } - - // case 3: node C (container A or an ancestor) is a child node of B - c = containerA; - while (c && c->parentNode() != containerB) - c = c->parentNode(); - if (c) { - int offsetC = 0; - NodeImpl* n = containerB->firstChild(); - while (n != c) { - offsetC++; - n = n->nextSibling(); - } - - if( offsetC < offsetB ) return -1; // A is before B - else return 1; // A is after B - } - - // case 4: containers A & B are siblings, or children of siblings - // ### we need to do a traversal here instead - NodeImpl *cmnRoot = commonAncestorContainer(containerA,containerB); - if (!cmnRoot) return -1; // Whatever... - NodeImpl *childA = containerA; - while (childA->parentNode() != cmnRoot) - childA = childA->parentNode(); - NodeImpl *childB = containerB; - while (childB->parentNode() != cmnRoot) - childB = childB->parentNode(); - - NodeImpl *n = cmnRoot->firstChild(); - int i = 0; - int childAOffset = -1; - int childBOffset = -1; - while (childAOffset < 0 || childBOffset < 0) { - if (n == childA) - childAOffset = i; - if (n == childB) - childBOffset = i; - n = n->nextSibling(); - i++; - } - - if( childAOffset == childBOffset ) return 0; // A is equal to B - if( childAOffset < childBOffset ) return -1; // A is before B - else return 1; // A is after B -} - -bool RangeImpl::boundaryPointsValid( ) -{ - short valid = compareBoundaryPoints( m_startContainer, m_startOffset, - m_endContainer, m_endOffset ); - if( valid == 1 ) return false; - else return true; - -} - -void RangeImpl::deleteContents( int &exceptioncode ) { - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return; - } - - checkDeleteExtract(exceptioncode); - if (exceptioncode) - return; - - processContents(DELETE_CONTENTS,exceptioncode); -} - -DocumentFragmentImpl *RangeImpl::processContents ( ActionType action, int &exceptioncode ) -{ - // ### when mutation events are implemented, we will have to take into account - // situations where the tree is being transformed while we delete - ugh! - - // ### perhaps disable node deletion notification for this range while we do this? - - if (collapsed(exceptioncode)) - return 0; - if (exceptioncode) - return 0; - - NodeImpl *cmnRoot = commonAncestorContainer(exceptioncode); - if (exceptioncode) - return 0; - - // what is the highest node that partially selects the start of the range? - NodeImpl *partialStart = 0; - if (m_startContainer != cmnRoot) { - partialStart = m_startContainer; - while (partialStart->parentNode() != cmnRoot) - partialStart = partialStart->parentNode(); - } - - // what is the highest node that partially selects the end of the range? - NodeImpl *partialEnd = 0; - if (m_endContainer != cmnRoot) { - partialEnd = m_endContainer; - while (partialEnd->parentNode() != cmnRoot) - partialEnd = partialEnd->parentNode(); - } - - DocumentFragmentImpl *fragment = 0; - if (action == EXTRACT_CONTENTS || action == CLONE_CONTENTS) - fragment = new DocumentFragmentImpl(m_ownerDocument); - - // Simple case: the start and end containers are the same. We just grab - // everything >= start offset and < end offset - if (m_startContainer == m_endContainer) { - if(m_startContainer->nodeType() == Node::TEXT_NODE || - m_startContainer->nodeType() == Node::CDATA_SECTION_NODE || - m_startContainer->nodeType() == Node::COMMENT_NODE) { - - if (action == EXTRACT_CONTENTS || action == CLONE_CONTENTS) { - CharacterDataImpl *c = static_cast(m_startContainer->cloneNode(true)); - c->deleteData(m_endOffset,static_cast(m_startContainer)->length()-m_endOffset,exceptioncode); - c->deleteData(0,m_startOffset,exceptioncode); - fragment->appendChild(c,exceptioncode); - } - if (action == EXTRACT_CONTENTS || action == DELETE_CONTENTS) - static_cast(m_startContainer)->deleteData(m_startOffset,m_endOffset-m_startOffset,exceptioncode); - } - else if (m_startContainer->nodeType() == Node::PROCESSING_INSTRUCTION_NODE) { - // ### operate just on data ? - } - else { - NodeImpl *n = m_startContainer->firstChild(); - unsigned long i; - for(i = 0; i < m_startOffset; i++) // skip until m_startOffset - n = n->nextSibling(); - while (n && i < m_endOffset) { // delete until m_endOffset - NodeImpl *next = n->nextSibling(); - if (action == EXTRACT_CONTENTS) - fragment->appendChild(n,exceptioncode); // will remove n from its parent - else if (action == CLONE_CONTENTS) - fragment->appendChild(n->cloneNode(true),exceptioncode); - else - m_startContainer->removeChild(n,exceptioncode); - n = next; - i++; - } - } - collapse(true,exceptioncode); - return fragment; - } - - // Complex case: Start and end containers are different. - // There are three possiblities here: - // 1. Start container == cmnRoot (End container must be a descendant) - // 2. End container == cmnRoot (Start container must be a descendant) - // 3. Neither is cmnRoot, they are both descendants - // - // In case 3, we grab everything after the start (up until a direct child - // of cmnRoot) into leftContents, and everything before the end (up until - // a direct child of cmnRoot) into rightContents. Then we process all - // cmnRoot children between leftContents and rightContents - // - // In case 1 or 2, we skip either processing of leftContents or rightContents, - // in which case the last lot of nodes either goes from the first or last - // child of cmnRoot. - // - // These are deleted, cloned, or extracted (i.e. both) depending on action. - - NodeImpl *leftContents = 0; - if (m_startContainer != cmnRoot) { - // process the left-hand side of the range, up until the last ancestor of - // m_startContainer before cmnRoot - if(m_startContainer->nodeType() == Node::TEXT_NODE || - m_startContainer->nodeType() == Node::CDATA_SECTION_NODE || - m_startContainer->nodeType() == Node::COMMENT_NODE) { - - if (action == EXTRACT_CONTENTS || action == CLONE_CONTENTS) { - CharacterDataImpl *c = static_cast(m_startContainer->cloneNode(true)); - c->deleteData(0,m_startOffset,exceptioncode); - leftContents = c; - } - if (action == EXTRACT_CONTENTS || action == DELETE_CONTENTS) - static_cast(m_startContainer)->deleteData( - m_startOffset,static_cast(m_startContainer)->length()-m_startOffset,exceptioncode); - } - else if (m_startContainer->nodeType() == Node::PROCESSING_INSTRUCTION_NODE) { - // ### operate just on data ? - // leftContents = ... - } - else { - if (action == EXTRACT_CONTENTS || action == CLONE_CONTENTS) - leftContents = m_startContainer->cloneNode(false); - NodeImpl *n = m_startContainer->firstChild(); - unsigned long i; - for(i = 0; i < m_startOffset; i++) // skip until m_startOffset - n = n->nextSibling(); - while (n) { // process until end - NodeImpl *next = n->nextSibling(); - if (action == EXTRACT_CONTENTS) - leftContents->appendChild(n,exceptioncode); // will remove n from m_startContainer - else if (action == CLONE_CONTENTS) - leftContents->appendChild(n->cloneNode(true),exceptioncode); - else - m_startContainer->removeChild(n,exceptioncode); - n = next; - } - } - - NodeImpl *leftParent = m_startContainer->parentNode(); - NodeImpl *n = m_startContainer->nextSibling(); - for (; leftParent != cmnRoot; leftParent = leftParent->parentNode()) { - if (action == EXTRACT_CONTENTS || action == CLONE_CONTENTS) { - NodeImpl *leftContentsParent = leftParent->cloneNode(false); - leftContentsParent->appendChild(leftContents,exceptioncode); - leftContents = leftContentsParent; - } - - NodeImpl *next; - for (; n; n = next ) { - next = n->nextSibling(); - if (action == EXTRACT_CONTENTS) - leftContents->appendChild(n,exceptioncode); // will remove n from leftParent - else if (action == CLONE_CONTENTS) - leftContents->appendChild(n->cloneNode(true),exceptioncode); - else - leftParent->removeChild(n,exceptioncode); - } - n = leftParent->nextSibling(); - } - } - - NodeImpl *rightContents = 0; - if (m_endContainer != cmnRoot) { - // delete the right-hand side of the range, up until the last ancestor of - // m_endContainer before cmnRoot - if(m_endContainer->nodeType() == Node::TEXT_NODE || - m_endContainer->nodeType() == Node::CDATA_SECTION_NODE || - m_endContainer->nodeType() == Node::COMMENT_NODE) { - - if (action == EXTRACT_CONTENTS || action == CLONE_CONTENTS) { - CharacterDataImpl *c = static_cast(m_endContainer->cloneNode(true)); - c->deleteData(m_endOffset,static_cast(m_endContainer)->length()-m_endOffset,exceptioncode); - rightContents = c; - } - if (action == EXTRACT_CONTENTS || action == DELETE_CONTENTS) - static_cast(m_endContainer)->deleteData(0,m_endOffset,exceptioncode); - } - else if (m_startContainer->nodeType() == Node::PROCESSING_INSTRUCTION_NODE) { - // ### operate just on data ? - // rightContents = ... - } - else { - if (action == EXTRACT_CONTENTS || action == CLONE_CONTENTS) - rightContents = m_endContainer->cloneNode(false); - NodeImpl *n = m_endContainer->firstChild(); - unsigned long i; - for(i = 0; i+1 < m_endOffset; i++) // skip to m_endOffset - n = n->nextSibling(); - NodeImpl *prev; - for (; n; n = prev ) { - prev = n->previousSibling(); - if (action == EXTRACT_CONTENTS) - rightContents->insertBefore(n,rightContents->firstChild(),exceptioncode); // will remove n from its parent - else if (action == CLONE_CONTENTS) - rightContents->insertBefore(n->cloneNode(true),rightContents->firstChild(),exceptioncode); - else - m_endContainer->removeChild(n,exceptioncode); - } - } - - NodeImpl *rightParent = m_endContainer->parentNode(); - NodeImpl *n = m_endContainer->previousSibling(); - for (; rightParent != cmnRoot; rightParent = rightParent->parentNode()) { - if (action == EXTRACT_CONTENTS || action == CLONE_CONTENTS) { - NodeImpl *rightContentsParent = rightParent->cloneNode(false); - rightContentsParent->appendChild(rightContents,exceptioncode); - rightContents = rightContentsParent; - } - - NodeImpl *prev; - for (; n; n = prev ) { - prev = n->previousSibling(); - if (action == EXTRACT_CONTENTS) - rightContents->insertBefore(n,rightContents->firstChild(),exceptioncode); // will remove n from its parent - else if (action == CLONE_CONTENTS) - rightContents->insertBefore(n->cloneNode(true),rightContents->firstChild(),exceptioncode); - else - rightParent->removeChild(n,exceptioncode); - - } - n = rightParent->previousSibling(); - } - } - - // delete all children of cmnRoot between the start and end container - - NodeImpl *processStart; // child of cmnRooot - if (m_startContainer == cmnRoot) { - unsigned long i; - processStart = m_startContainer->firstChild(); - for (i = 0; i < m_startOffset; i++) - processStart = processStart->nextSibling(); - } - else { - processStart = m_startContainer; - while (processStart->parentNode() != cmnRoot) - processStart = processStart->parentNode(); - processStart = processStart->nextSibling(); - } - NodeImpl *processEnd; // child of cmnRooot - if (m_endContainer == cmnRoot) { - unsigned long i; - processEnd = m_endContainer->firstChild(); - for (i = 0; i < m_endOffset; i++) - processEnd = processEnd->nextSibling(); - } - else { - processEnd = m_endContainer; - while (processEnd->parentNode() != cmnRoot) - processEnd = processEnd->parentNode(); - } - - // Now add leftContents, stuff in between, and rightContents to the fragment - // (or just delete the stuff in between) - - if ((action == EXTRACT_CONTENTS || action == CLONE_CONTENTS) && leftContents) - fragment->appendChild(leftContents,exceptioncode); - - NodeImpl *next; - NodeImpl *n; - if (processStart) { - for (n = processStart; n && n != processEnd; n = next) { - next = n->nextSibling(); - - if (action == EXTRACT_CONTENTS) - fragment->appendChild(n,exceptioncode); // will remove from cmnRoot - else if (action == CLONE_CONTENTS) - fragment->appendChild(n->cloneNode(true),exceptioncode); - else - cmnRoot->removeChild(n,exceptioncode); - } - } - - if ((action == EXTRACT_CONTENTS || action == CLONE_CONTENTS) && rightContents) - fragment->appendChild(rightContents,exceptioncode); - - // collapse to the proper position - see spec section 2.6 - if (action == EXTRACT_CONTENTS || action == DELETE_CONTENTS) { - if (!partialStart && !partialEnd) - collapse(true,exceptioncode); - else if (partialStart) { - setStartContainer(partialStart->parentNode()); - setEndContainer(partialStart->parentNode()); - m_startOffset = m_endOffset = partialStart->nodeIndex()+1; - } - else if (partialEnd) { - setStartContainer(partialEnd->parentNode()); - setEndContainer(partialEnd->parentNode()); - m_startOffset = m_endOffset = partialEnd->nodeIndex(); - } - } - return fragment; -} - - -DocumentFragmentImpl *RangeImpl::extractContents( int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return 0; - } - - checkDeleteExtract(exceptioncode); - if (exceptioncode) - return 0; - - return processContents(EXTRACT_CONTENTS,exceptioncode); -} - -DocumentFragmentImpl *RangeImpl::cloneContents( int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return 0; - } - - return processContents(CLONE_CONTENTS,exceptioncode); -} - -void RangeImpl::insertNode( NodeImpl *newNode, int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return; - } - - // NO_MODIFICATION_ALLOWED_ERR: Raised if an ancestor container of either boundary-point of - // the Range is read-only. - NodeImpl *n = m_startContainer; - while (n && !n->isReadOnly()) - n = n->parentNode(); - if (n) { - exceptioncode = DOMException::NO_MODIFICATION_ALLOWED_ERR; - return; - } - - n = m_endContainer; - while (n && !n->isReadOnly()) - n = n->parentNode(); - if (n) { - exceptioncode = DOMException::NO_MODIFICATION_ALLOWED_ERR; - return; - } - - // WRONG_DOCUMENT_ERR: Raised if newParent and the container of the start of the Range were - // not created from the same document. - if (newNode->getDocument() != m_startContainer->getDocument()) { - exceptioncode = DOMException::WRONG_DOCUMENT_ERR; - return; - } - - - // HIERARCHY_REQUEST_ERR: Raised if the container of the start of the Range is of a type that - // does not allow children of the type of newNode or if newNode is an ancestor of the container. - - // an extra one here - if a text node is going to split, it must have a parent to insert into - if (m_startContainer->nodeType() == Node::TEXT_NODE && !m_startContainer->parentNode()) { - exceptioncode = DOMException::HIERARCHY_REQUEST_ERR; - return; - } - - // In the case where the container is a text node, we check against the container's parent, because - // text nodes get split up upon insertion. - NodeImpl *checkAgainst; - if (m_startContainer->nodeType() == Node::TEXT_NODE) - checkAgainst = m_startContainer->parentNode(); - else - checkAgainst = m_startContainer; - - if (newNode->nodeType() == Node::DOCUMENT_FRAGMENT_NODE) { - // check each child node, not the DocumentFragment itself - NodeImpl *c; - for (c = newNode->firstChild(); c; c = c->nextSibling()) { - if (!checkAgainst->childTypeAllowed(c->nodeType())) { - exceptioncode = DOMException::HIERARCHY_REQUEST_ERR; - return; - } - } - } - else { - if (!checkAgainst->childTypeAllowed(newNode->nodeType())) { - exceptioncode = DOMException::HIERARCHY_REQUEST_ERR; - return; - } - } - - for (n = m_startContainer; n; n = n->parentNode()) { - if (n == newNode) { - exceptioncode = DOMException::HIERARCHY_REQUEST_ERR; - return; - } - } - - // INVALID_NODE_TYPE_ERR: Raised if newNode is an Attr, Entity, Notation, or Document node. - if( newNode->nodeType() == Node::ATTRIBUTE_NODE || - newNode->nodeType() == Node::ENTITY_NODE || - newNode->nodeType() == Node::NOTATION_NODE || - newNode->nodeType() == Node::DOCUMENT_NODE) { - exceptioncode = RangeException::INVALID_NODE_TYPE_ERR + RangeException::_EXCEPTION_OFFSET; - return; - } - - if( m_startContainer->nodeType() == Node::TEXT_NODE || - m_startContainer->nodeType() == Node::CDATA_SECTION_NODE ) - { - TextImpl *newText = static_cast(m_startContainer)->splitText(m_startOffset,exceptioncode); - if (exceptioncode) - return; - m_startContainer->parentNode()->insertBefore( newNode, newText, exceptioncode ); - } - else { - m_startContainer->insertBefore( newNode, m_startContainer->childNode( m_startOffset ), exceptioncode ); - } -} - -DOMString RangeImpl::toString( int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return DOMString(); - } - - DOMString text = ""; - NodeImpl *n = m_startContainer; - - /* This function converts a dom range to the plain text string that the user would see in this - * portion of rendered html. - * - * There are several ways ranges can be used. - * - * The simplest is the start and endContainer is a text node. The start and end offset is the - * number of characters into the text to remove/truncate. - * - * The next case is the start and endContainer is, well, a container, such a P tag or DIV tag. - * In this case the start and end offset is the number of children into the container to start - * from and end at. - * - * The other cases are different arrangements of the first two. - * - * psuedo code: - * - * if start container is not text: - * count through the children to find where we start (m_startOffset children) - * - * loop from the start position: - * if the current node is text, add the text to our variable 'text', truncating/removing if at the end/start. - * - * if the node has children, step to the first child. - * if the node has no children but does have siblings, step to the next sibling - * until we find a sibling, go to next the parent but: - * make sure this sibling isn't past the end of where we are supposed to go. (position > endOffset and the parent is the endContainer) - * - */ - - - if( m_startContainer == m_endContainer && m_startOffset >= m_endOffset) - return text; - - - if(n->firstChild()) { - n = n->firstChild(); - int current_offset = m_startOffset; - while(current_offset-- && n) { - n = n->nextSibling(); - } - } - - while(n) { - if(n->nodeType() == DOM::Node::TEXT_NODE || - n->nodeType() == DOM::Node::CDATA_SECTION_NODE) { - - DOMString str; - str = static_cast(n)->string(); - if( n == m_endContainer || n == m_startContainer) - str = str.copy(); //copy if we are going to modify. - - if (n == m_endContainer) - str.truncate(m_endOffset); - if (n == m_startContainer) - str.remove(0,m_startOffset); - text += str; - if (n == m_endContainer) - break; - } - - - NodeImpl *next = n->firstChild(); - if(!next) - next = n->nextSibling(); - - while( !next && n->parentNode() ) { - if (n == m_endContainer) return text; - n = n->parentNode(); - if (n == m_endContainer) return text; - next = n->nextSibling(); - } - - if(n->parentNode() == m_endContainer) { - if(!next) break; - unsigned long current_offset = 0; - NodeImpl *it = n; - while((it = it->previousSibling())) ++current_offset; - if(current_offset >= m_endOffset) { - break; - } - } - - n = next; - } - return text; -} - -DOMString RangeImpl::toHTML( int &exceptioncode ) -{ - bool hasHtmlTag = false; - bool hasBodyTag = false; - //FIXME: What is this section of code below exactly? Do I want it here? - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return DOMString(); - } - DOMString text = ""; - NodeImpl *n = m_startContainer; - int num_tables=0; - bool in_li = false; //whether we have an li in the text, without an ol/ul - int depth_difference = 0; - int lowest_depth_difference = 0; - - if( m_startContainer == m_endContainer && m_startOffset >= m_endOffset) - return text; - - while(n) { - /* First, we could have an tag otherstuff */ - if(n->nodeType() == DOM::Node::ELEMENT_NODE) { - int elementId = static_cast(n)->id(); - if(elementId == ID_TABLE) num_tables++; - if(elementId == ID_BODY) hasBodyTag = true; - if(elementId == ID_HTML) hasHtmlTag = true; - if(elementId == ID_LI) in_li=true; - if(num_tables==0 && ( elementId == ID_TD || elementId == ID_TR || elementId == ID_TH || elementId == ID_TBODY || elementId == ID_TFOOT || elementId == ID_THEAD)) num_tables++; - if(!( !n->hasChildNodes() && (elementId == ID_H1 || elementId == ID_H2 || elementId == ID_H3 || elementId == ID_H4 || elementId ==ID_H5))) { //Don't add

etc. Just skip these nodes just to make the output html a bit nicer. - text += static_cast(n)->openTagStartToString(true /*safely expand img urls*/); // adds "hasChildNodes()) { - depth_difference++; - text += ">"; - } else { - text += "/>"; - } - } - } else - if(n->nodeType() == DOM::Node::TEXT_NODE || - n->nodeType() == DOM::Node::CDATA_SECTION_NODE) { - if(n->nodeType() == DOM::Node::CDATA_SECTION_NODE) text += "(n)->toString(startOffset, endOffset); //Note this should always work since CDataImpl inherits TextImpl - if(n->nodeType() == DOM::Node::CDATA_SECTION_NODE) text += " ]]>"; - if(n == m_endContainer) { - break; - } - } - if(n->parentNode() == m_endContainer && !n->nextSibling()) { - break; - } - - //if (n == m_endContainer) break; - NodeImpl *next = n->firstChild(); - if(next) { - if(n == m_startContainer) { - //This is the start of our selection, so we have to move to where we have started selecting. - //For example, if 'n' is "hello how are you? " - //then this has four children. If our selection started on the image, then we need to start from there. - unsigned long current_offset = 0; - while(current_offset < m_startOffset && next) { - next = next->nextSibling(); - ++current_offset; - } - } - } else { - next = n->nextSibling(); - - if(n->parentNode() == m_endContainer) { - unsigned long current_offset = 1; - NodeImpl *it = n; - while((it = it->previousSibling())) ++current_offset; - - if(current_offset >= m_endOffset) { - break; - } - } - } - - while( !next && n->parentNode() ) { - n = n->parentNode(); - if(n->nodeType() == DOM::Node::ELEMENT_NODE) { - text += "(n)->tagName(); - int elementId = static_cast(n)->id(); - if(elementId == ID_TABLE) num_tables--; - depth_difference--; - if(lowest_depth_difference > depth_difference) lowest_depth_difference=depth_difference; - if(num_tables==0 && ( elementId == ID_TD || elementId == ID_TR || elementId == ID_TH || elementId == ID_TBODY || elementId == ID_TFOOT || elementId == ID_THEAD)) num_tables--; - if(elementId == ID_OL || elementId == ID_UL) in_li=false; - text += ">"; - } - next = n->nextSibling(); - } - n = next; - } - - //We have the html in the selection. But now we need to properly add the opening and closing tags. - //For example say we have: "Hello Mr. John How are you?" and we select "John" or even - //"John How" and copy. We want to return "John" and "John How" respectively - - //To do this, we need to go up the tree from the start, and prepend those tags. - //Imagine our selection was this: - // - // hello

there - // - // The difference in depths between the start and end is -1, and the lowest depth - // difference from the starting point is -2 - // - // So from the start of the selection, we want to go down to the lowest_depth_difference - // and prepend those tags. (

) - // - // From the end of the selection, we want to also go down to the lowest_depth_difference. - // We know the depth of the end of the selection - i.e. depth_difference. - // - // - n = m_startContainer; - int startdepth = 0; //by definition - we are counting from zero. - while((n = n->parentNode()) && startdepth>lowest_depth_difference) { - if(n->nodeType() == DOM::Node::ELEMENT_NODE) { //This should always be true.. right? - switch (static_cast(n)->id()) { - case ID_TABLE: - num_tables--; - break; - case ID_BODY: - hasBodyTag = true; - break; - case ID_HTML: - hasHtmlTag = true; - break; - case ID_LI: - in_li = true; - break; - } - text = static_cast(n)->openTagStartToString(true /*expand img urls*/)+">" +text; // prepends "" - } - startdepth--; - } - n = m_endContainer; - while( depth_difference>lowest_depth_difference && (n = n->parentNode())) { - if(n->nodeType() == DOM::Node::ELEMENT_NODE) { //This should always be true.. right? - switch (static_cast(n)->id()) { - case ID_TABLE: - num_tables++; - break; - case ID_OL: - case ID_UL: - in_li=false; - break; - } - text += "(n)->tagName(); - text += ">"; - } - depth_difference--; - } - - // Now our text string is the same depth on both sides, with nothing lower (in other words all the - // tags in it match up.) This also means that the end value for n in the first loop is a sibling of the - // end value for n in the second loop. - // - // We now need to go down the tree, and for certain tags, add them in on both ends of the text. - // For example, if have: "hello" and we select "ll", then we want to go down the tree and - // add "" and "" to it, to produce "ll". - // - // I just guessed at which tags you'd want to keep (bold, italic etc) and which you wouldn't (tables etc). - // It's just wild guessing. feel free to change. - // - // Note we can carry on with the value of n - if(n) { - while((n = n->parentNode())) { - if(n->nodeType() == DOM::Node::ELEMENT_NODE) { //This should always be true.. right? - int elementId = static_cast(n)->id(); - switch (elementId) { - case ID_TABLE: - case ID_TD: - case ID_TR: - case ID_TH: - case ID_TBODY: - case ID_TFOOT: - case ID_THEAD: - if(num_tables>0) { - if(elementId == ID_TABLE) num_tables--; - text = static_cast(n)->openTagStartToString(true /*expand img urls*/)+">" +text; - text += "(n)->tagName(); - text += ">"; - - } - break; - - case ID_LI: - if(!in_li) break; - text = static_cast(n)->openTagStartToString(true /*expand img urls*/)+">" +text; - text += "(n)->tagName(); - text += ">"; - break; - - case ID_UL: - case ID_OL: - if(!in_li) break; - in_li = false; - case ID_B: - case ID_I: - case ID_U: - case ID_FONT: - case ID_S: - case ID_STRONG: - case ID_STRIKE: - case ID_DEL: - case ID_A: - case ID_H1: - case ID_H2: - case ID_H3: - case ID_H4: - case ID_H5: - //should small, etc be here? so hard to decide. this is such a hack :( - //There's probably tons of others you'd want here. - text = static_cast(n)->openTagStartToString(true /*expand img urls*/)+">" +text; - text += "(n)->tagName(); - text += ">"; - break; - } - } - } - } - - - if(!hasBodyTag) text = DOMString("") + text + ""; - else if(!hasHtmlTag) { - text = DOMString("\n" - "\n" - "\n" - "\n" - "\n") + - text + - ""; - } - text = DOMString("\n") + text; - - return text; - -} - -DocumentFragment RangeImpl::createContextualFragment ( const DOMString &html, int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return DocumentFragment(); - } - - if (! m_startContainer->isHTMLElement()) { - exceptioncode = DOMException::NOT_SUPPORTED_ERR; - return DocumentFragment(); - } - - HTMLElementImpl *e = static_cast(m_startContainer); - DocumentFragment fragment = e->createContextualFragment(html); - if (fragment.isNull()) { - exceptioncode = DOMException::NOT_SUPPORTED_ERR; - return DocumentFragment(); - } - - return fragment; -} - - -void RangeImpl::detach( int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return; - } - - if (m_startContainer) - m_startContainer->deref(); - m_startContainer = 0; - if (m_endContainer) - m_endContainer->deref(); - m_endContainer = 0; - m_detached = true; -} - -bool RangeImpl::isDetached() const -{ - return m_detached; -} - -void RangeImpl::checkNodeWOffset( NodeImpl *n, int offset, int &exceptioncode) const -{ - if( offset < 0 ) { - exceptioncode = DOMException::INDEX_SIZE_ERR; - } - - switch (n->nodeType()) { - case Node::ENTITY_NODE: - case Node::NOTATION_NODE: - case Node::DOCUMENT_TYPE_NODE: - exceptioncode = RangeException::INVALID_NODE_TYPE_ERR + RangeException::_EXCEPTION_OFFSET; - break; - case Node::TEXT_NODE: - case Node::COMMENT_NODE: - case Node::CDATA_SECTION_NODE: - if ( (unsigned long)offset > static_cast(n)->length() ) - exceptioncode = DOMException::INDEX_SIZE_ERR; - break; - case Node::PROCESSING_INSTRUCTION_NODE: - // ### are we supposed to check with just data or the whole contents? - if ( (unsigned long)offset > static_cast(n)->data().length() ) - exceptioncode = DOMException::INDEX_SIZE_ERR; - break; - default: - if ( (unsigned long)offset > n->childNodeCount() ) - exceptioncode = DOMException::INDEX_SIZE_ERR; - break; - } -} - -void RangeImpl::checkNodeBA( NodeImpl *n, int &exceptioncode ) const -{ - // INVALID_NODE_TYPE_ERR: Raised if the root container of refNode is not an - // Attr, Document or DocumentFragment node or if refNode is a Document, - // DocumentFragment, Attr, Entity, or Notation node. - NodeImpl *root = n; - while (root->parentNode()) - root = root->parentNode(); - if (!(root->nodeType() == Node::ATTRIBUTE_NODE || - root->nodeType() == Node::DOCUMENT_NODE || - root->nodeType() == Node::DOCUMENT_FRAGMENT_NODE)) { - exceptioncode = RangeException::INVALID_NODE_TYPE_ERR + RangeException::_EXCEPTION_OFFSET; - return; - } - - if( n->nodeType() == Node::DOCUMENT_NODE || - n->nodeType() == Node::DOCUMENT_FRAGMENT_NODE || - n->nodeType() == Node::ATTRIBUTE_NODE || - n->nodeType() == Node::ENTITY_NODE || - n->nodeType() == Node::NOTATION_NODE ) - exceptioncode = RangeException::INVALID_NODE_TYPE_ERR + RangeException::_EXCEPTION_OFFSET; - -} - -RangeImpl *RangeImpl::cloneRange(int &exceptioncode) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return 0; - } - - return new RangeImpl(m_ownerDocument,m_startContainer,m_startOffset,m_endContainer,m_endOffset); -} - -void RangeImpl::setStartAfter( NodeImpl *refNode, int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return; - } - - if (!refNode) { - exceptioncode = DOMException::NOT_FOUND_ERR; - return; - } - - if (refNode->getDocument() != m_ownerDocument) { - exceptioncode = DOMException::WRONG_DOCUMENT_ERR; - return; - } - - checkNodeBA( refNode, exceptioncode ); - if (exceptioncode) - return; - - setStart( refNode->parentNode(), refNode->nodeIndex()+1, exceptioncode ); -} - -void RangeImpl::setEndBefore( NodeImpl *refNode, int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return; - } - - if (!refNode) { - exceptioncode = DOMException::NOT_FOUND_ERR; - return; - } - - if (refNode->getDocument() != m_ownerDocument) { - exceptioncode = DOMException::WRONG_DOCUMENT_ERR; - return; - } - - checkNodeBA( refNode, exceptioncode ); - if (exceptioncode) - return; - - setEnd( refNode->parentNode(), refNode->nodeIndex(), exceptioncode ); -} - -void RangeImpl::setEndAfter( NodeImpl *refNode, int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return; - } - - if (!refNode) { - exceptioncode = DOMException::NOT_FOUND_ERR; - return; - } - - if (refNode->getDocument() != m_ownerDocument) { - exceptioncode = DOMException::WRONG_DOCUMENT_ERR; - return; - } - - checkNodeBA( refNode, exceptioncode ); - if (exceptioncode) - return; - - setEnd( refNode->parentNode(), refNode->nodeIndex()+1, exceptioncode ); - -} - -void RangeImpl::selectNode( NodeImpl *refNode, int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return; - } - - if (!refNode) { - exceptioncode = DOMException::NOT_FOUND_ERR; - return; - } - - // INVALID_NODE_TYPE_ERR: Raised if an ancestor of refNode is an Entity, Notation or - // DocumentType node or if refNode is a Document, DocumentFragment, Attr, Entity, or Notation - // node. - NodeImpl *anc; - for (anc = refNode->parentNode(); anc; anc = anc->parentNode()) { - if (anc->nodeType() == Node::ENTITY_NODE || - anc->nodeType() == Node::NOTATION_NODE || - anc->nodeType() == Node::DOCUMENT_TYPE_NODE) { - - exceptioncode = RangeException::INVALID_NODE_TYPE_ERR + RangeException::_EXCEPTION_OFFSET; - return; - } - } - - if (refNode->nodeType() == Node::DOCUMENT_NODE || - refNode->nodeType() == Node::DOCUMENT_FRAGMENT_NODE || - refNode->nodeType() == Node::ATTRIBUTE_NODE || - refNode->nodeType() == Node::ENTITY_NODE || - refNode->nodeType() == Node::NOTATION_NODE) { - - exceptioncode = RangeException::INVALID_NODE_TYPE_ERR + RangeException::_EXCEPTION_OFFSET; - return; - } - - setStartBefore( refNode, exceptioncode ); - if (exceptioncode) - return; - setEndAfter( refNode, exceptioncode ); -} - -void RangeImpl::selectNodeContents( NodeImpl *refNode, int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return; - } - - if (!refNode) { - exceptioncode = DOMException::NOT_FOUND_ERR; - return; - } - - // INVALID_NODE_TYPE_ERR: Raised if refNode or an ancestor of refNode is an Entity, Notation - // or DocumentType node. - NodeImpl *n; - for (n = refNode; n; n = n->parentNode()) { - if (n->nodeType() == Node::ENTITY_NODE || - n->nodeType() == Node::NOTATION_NODE || - n->nodeType() == Node::DOCUMENT_TYPE_NODE) { - - exceptioncode = RangeException::INVALID_NODE_TYPE_ERR + RangeException::_EXCEPTION_OFFSET; - return; - } - } - - setStartContainer(refNode); - m_startOffset = 0; - setEndContainer(refNode); - m_endOffset = refNode->childNodeCount(); -} - -void RangeImpl::surroundContents( NodeImpl *newParent, int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return; - } - - if( !newParent ) { - exceptioncode = DOMException::NOT_FOUND_ERR; - return; - } - - // INVALID_NODE_TYPE_ERR: Raised if node is an Attr, Entity, DocumentType, Notation, - // Document, or DocumentFragment node. - if( newParent->nodeType() == Node::ATTRIBUTE_NODE || - newParent->nodeType() == Node::ENTITY_NODE || - newParent->nodeType() == Node::NOTATION_NODE || - newParent->nodeType() == Node::DOCUMENT_TYPE_NODE || - newParent->nodeType() == Node::DOCUMENT_NODE || - newParent->nodeType() == Node::DOCUMENT_FRAGMENT_NODE) { - exceptioncode = RangeException::INVALID_NODE_TYPE_ERR + RangeException::_EXCEPTION_OFFSET; - return; - } - - // NO_MODIFICATION_ALLOWED_ERR: Raised if an ancestor container of either boundary-point of - // the Range is read-only. - if (readOnly()) { - exceptioncode = DOMException::NO_MODIFICATION_ALLOWED_ERR; - return; - } - - NodeImpl *n = m_startContainer; - while (n && !n->isReadOnly()) - n = n->parentNode(); - if (n) { - exceptioncode = DOMException::NO_MODIFICATION_ALLOWED_ERR; - return; - } - - n = m_endContainer; - while (n && !n->isReadOnly()) - n = n->parentNode(); - if (n) { - exceptioncode = DOMException::NO_MODIFICATION_ALLOWED_ERR; - return; - } - - // WRONG_DOCUMENT_ERR: Raised if newParent and the container of the start of the Range were - // not created from the same document. - if (newParent->getDocument() != m_startContainer->getDocument()) { - exceptioncode = DOMException::WRONG_DOCUMENT_ERR; - return; - } - - // HIERARCHY_REQUEST_ERR: Raised if the container of the start of the Range is of a type that - // does not allow children of the type of newParent or if newParent is an ancestor of the container - // or if node would end up with a child node of a type not allowed by the type of node. - if (!m_startContainer->childTypeAllowed(newParent->nodeType())) { - exceptioncode = DOMException::HIERARCHY_REQUEST_ERR; - return; - } - - for (n = m_startContainer; n; n = n->parentNode()) { - if (n == newParent) { - exceptioncode = DOMException::HIERARCHY_REQUEST_ERR; - return; - } - } - - // ### check if node would end up with a child node of a type not allowed by the type of node - - // BAD_BOUNDARYPOINTS_ERR: Raised if the Range partially selects a non-text node. - if (m_startContainer->nodeType() != Node::TEXT_NODE && - m_startContainer->nodeType() != Node::COMMENT_NODE && - m_startContainer->nodeType() != Node::CDATA_SECTION_NODE && - m_startContainer->nodeType() != Node::PROCESSING_INSTRUCTION_NODE) { - - if (m_startOffset > 0 && m_startOffset < m_startContainer->childNodeCount()) { - exceptioncode = RangeException::BAD_BOUNDARYPOINTS_ERR + RangeException::_EXCEPTION_OFFSET; - return; - } - } - - if (m_endContainer->nodeType() != Node::TEXT_NODE && - m_endContainer->nodeType() != Node::COMMENT_NODE && - m_endContainer->nodeType() != Node::CDATA_SECTION_NODE && - m_endContainer->nodeType() != Node::PROCESSING_INSTRUCTION_NODE) { - - if (m_endOffset > 0 && m_endOffset < m_endContainer->childNodeCount()) { - exceptioncode = RangeException::BAD_BOUNDARYPOINTS_ERR + RangeException::_EXCEPTION_OFFSET; - return; - } - } - - while (newParent->firstChild()) { - newParent->removeChild(newParent->firstChild(),exceptioncode); - if (exceptioncode) - return; - } - DocumentFragmentImpl *fragment = extractContents(exceptioncode); - if (exceptioncode) - return; - insertNode( newParent, exceptioncode ); - if (exceptioncode) - return; - newParent->appendChild( fragment, exceptioncode ); - if (exceptioncode) - return; - selectNode( newParent, exceptioncode ); -} - -void RangeImpl::setStartBefore( NodeImpl *refNode, int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return; - } - - if (!refNode) { - exceptioncode = DOMException::NOT_FOUND_ERR; - return; - } - - if (refNode->getDocument() != m_ownerDocument) { - exceptioncode = DOMException::WRONG_DOCUMENT_ERR; - return; - } - - checkNodeBA( refNode, exceptioncode ); - if (exceptioncode) - return; - - setStart( refNode->parentNode(), refNode->nodeIndex(), exceptioncode ); -} - -void RangeImpl::setStartContainer(NodeImpl *_startContainer) -{ - if (m_startContainer == _startContainer) - return; - - if (m_startContainer) - m_startContainer->deref(); - m_startContainer = _startContainer; - if (m_startContainer) - m_startContainer->ref(); -} - -void RangeImpl::setEndContainer(NodeImpl *_endContainer) -{ - if (m_endContainer == _endContainer) - return; - - if (m_endContainer) - m_endContainer->deref(); - m_endContainer = _endContainer; - if (m_endContainer) - m_endContainer->ref(); -} - -void RangeImpl::checkDeleteExtract(int &exceptioncode) { - - NodeImpl *start; - if (m_startContainer->nodeType() != Node::TEXT_NODE && - m_startContainer->nodeType() != Node::CDATA_SECTION_NODE && - m_startContainer->nodeType() != Node::COMMENT_NODE && - m_startContainer->nodeType() != Node::PROCESSING_INSTRUCTION_NODE) { - - start = m_startContainer->childNode(m_startOffset); - if (!start) { - if (m_startContainer->lastChild()) - start = m_startContainer->lastChild()->traverseNextNode(); - else - start = m_startContainer->traverseNextNode(); - } - } - else - start = m_startContainer; - - NodeImpl *end; - if (m_endContainer->nodeType() != Node::TEXT_NODE && - m_endContainer->nodeType() != Node::CDATA_SECTION_NODE && - m_endContainer->nodeType() != Node::COMMENT_NODE && - m_endContainer->nodeType() != Node::PROCESSING_INSTRUCTION_NODE) { - - end = m_endContainer->childNode(m_endOffset); - if (!end) { - if (m_endContainer->lastChild()) - end = m_endContainer->lastChild()->traverseNextNode(); - else - end = m_endContainer->traverseNextNode(); - } - } - else - end = m_endContainer; - - NodeImpl *n; - for (n = start; n != end; n = n->traverseNextNode()) { - if (n->isReadOnly()) { - exceptioncode = DOMException::NO_MODIFICATION_ALLOWED_ERR; - return; - } - if (n->nodeType() == Node::DOCUMENT_TYPE_NODE) { // ### is this for only directly under the DF, or anywhere? - exceptioncode = DOMException::HIERARCHY_REQUEST_ERR; - return; - } - } - - if (containedByReadOnly()) { - exceptioncode = DOMException::NO_MODIFICATION_ALLOWED_ERR; - return; - } -} - - -bool RangeImpl::containedByReadOnly() { - NodeImpl *n; - for (n = m_startContainer; n; n = n->parentNode()) { - if (n->isReadOnly()) - return true; - } - for (n = m_endContainer; n; n = n->parentNode()) { - if (n->isReadOnly()) - return true; - } - return false; -} - - - - - - - - diff --git a/khtml/xml/dom2_rangeimpl.h b/khtml/xml/dom2_rangeimpl.h deleted file mode 100644 index 35d532f23..000000000 --- a/khtml/xml/dom2_rangeimpl.h +++ /dev/null @@ -1,127 +0,0 @@ -/* - * This file is part of the DOM implementation for KDE. - * - * (C) 1999 Lars Knoll (knoll@kde.org) - * (C) 2000 Gunnstein Lye (gunnstein@netcom.no) - * (C) 2000 Frederik Holljen (frederik.holljen@hig.no) - * (C) 2001 Peter Kelly (pmk@post.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - * - */ - -#ifndef _DOM2_RangeImpl_h_ -#define _DOM2_RangeImpl_h_ - -#include "dom/dom2_range.h" -#include "misc/shared.h" - -namespace DOM { - -class RangeImpl : public khtml::Shared -{ - friend class DocumentImpl; -public: - RangeImpl(DocumentImpl *_ownerDocument); - RangeImpl(DocumentImpl *_ownerDocument, - NodeImpl *_startContainer, long _startOffset, - NodeImpl *_endContainer, long _endOffset); - - ~RangeImpl(); - - NodeImpl *startContainer(int &exceptioncode) const; - long startOffset(int &exceptioncode) const; - NodeImpl *endContainer(int &exceptioncode) const; - long endOffset(int &exceptioncode) const; - bool collapsed(int &exceptioncode) const; - - NodeImpl *commonAncestorContainer(int &exceptioncode); - static NodeImpl *commonAncestorContainer(NodeImpl *containerA, NodeImpl *containerB); - void setStart ( NodeImpl *refNode, long offset, int &exceptioncode ); - void setEnd ( NodeImpl *refNode, long offset, int &exceptioncode ); - void collapse ( bool toStart, int &exceptioncode ); - short compareBoundaryPoints ( Range::CompareHow how, RangeImpl *sourceRange, int &exceptioncode ); - static short compareBoundaryPoints ( NodeImpl *containerA, long offsetA, NodeImpl *containerB, long offsetB ); - bool boundaryPointsValid ( ); - void deleteContents ( int &exceptioncode ); - DocumentFragmentImpl *extractContents ( int &exceptioncode ); - DocumentFragmentImpl *cloneContents ( int &exceptioncode ); - void insertNode( NodeImpl *newNode, int &exceptioncode ); - DOMString toString ( int &exceptioncode ); - /** Converts the selection to HTML. The returned string will have matching - * tags, and all td, tr, etc tags will be inside a table tag. CSS is not - * used at this stage - This needs to be fixed. - * - * This is guaranteed to produce an xml valid snippet, no matter how crappy the input - * html page is. It will have html and body tags. - * - * Any urls in images or links will be expanded to full urls with passwords stripped - * for security reasons. - * - * Note: Originally this function didn't have the exceptioncode argument. I added it - * since all the other functions do. If this is correct, please remove this comment. - * - * @param exceptioncode This will be set if m_detached is true. - * @return A string with html tags for this range. - * - * @since 3.4 - */ - DOMString toHTML ( int &exceptioncode ); - - DocumentFragment createContextualFragment ( const DOMString &html, int &exceptioncode ); - - void detach ( int &exceptioncode ); - bool isDetached() const; - RangeImpl *cloneRange(int &exceptioncode); - - void setStartAfter( NodeImpl *refNode, int &exceptioncode ); - void setEndBefore( NodeImpl *refNode, int &exceptioncode ); - void setEndAfter( NodeImpl *refNode, int &exceptioncode ); - void selectNode( NodeImpl *refNode, int &exceptioncode ); - void selectNodeContents( NodeImpl *refNode, int &exceptioncode ); - void surroundContents( NodeImpl *newParent, int &exceptioncode ); - void setStartBefore( NodeImpl *refNode, int &exceptioncode ); - - enum ActionType { - DELETE_CONTENTS, - EXTRACT_CONTENTS, - CLONE_CONTENTS - }; - DocumentFragmentImpl *processContents ( ActionType action, int &exceptioncode ); - - bool readOnly() { return false; } - -protected: - DocumentImpl *m_ownerDocument; - NodeImpl *m_startContainer; - unsigned long m_startOffset; - NodeImpl *m_endContainer; - unsigned long m_endOffset; - bool m_detached; - -private: - void checkNodeWOffset( NodeImpl *n, int offset, int &exceptioncode) const; - void checkNodeBA( NodeImpl *n, int &exceptioncode ) const; - void setStartContainer(NodeImpl *_startContainer); - void setEndContainer(NodeImpl *_endContainer); - void checkDeleteExtract(int &exceptioncode); - bool containedByReadOnly(); -}; - -} // namespace - -#endif - diff --git a/khtml/xml/dom2_traversalimpl.cpp b/khtml/xml/dom2_traversalimpl.cpp deleted file mode 100644 index 2abdadead..000000000 --- a/khtml/xml/dom2_traversalimpl.cpp +++ /dev/null @@ -1,667 +0,0 @@ -/** - * This file is part of the DOM implementation for KDE. - * - * (C) 1999 Lars Knoll (knoll@kde.org) - * (C) 2000 Frederik Holljen (frederik.holljen@hig.no) - * (C) 2001 Peter Kelly (pmk@post.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "dom/dom_exception.h" -#include "xml/dom_docimpl.h" - -using namespace DOM; - -NodeIteratorImpl::NodeIteratorImpl(NodeImpl *_root, unsigned long _whatToShow, - NodeFilter _filter, bool _entityReferenceExpansion) -{ - m_root = _root; - m_whatToShow = _whatToShow; - m_filter = _filter; - m_expandEntityReferences = _entityReferenceExpansion; - - m_referenceNode = _root; - m_inFront = false; - - m_doc = m_root->getDocument(); - m_doc->attachNodeIterator(this); - m_doc->ref(); - - m_detached = false; -} - -NodeIteratorImpl::~NodeIteratorImpl() -{ - m_doc->detachNodeIterator(this); - m_doc->deref(); -} - -NodeImpl *NodeIteratorImpl::root() -{ - return m_root; -} - -unsigned long NodeIteratorImpl::whatToShow() -{ - return m_whatToShow; -} - -NodeFilter NodeIteratorImpl::filter() -{ - return m_filter; -} - -bool NodeIteratorImpl::expandEntityReferences() -{ - return m_expandEntityReferences; -} - -NodeImpl *NodeIteratorImpl::nextNode( int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return 0; - } - - if (!m_referenceNode) { - m_inFront = true; - return 0; - } - - if (!m_inFront) { - m_inFront = true; - if (isAccepted(m_referenceNode) == NodeFilter::FILTER_ACCEPT) - return m_referenceNode; - } - - NodeImpl *_tempCurrent = getNextNode(m_referenceNode); - while( _tempCurrent ) { - m_referenceNode = _tempCurrent; - if(isAccepted(_tempCurrent) == NodeFilter::FILTER_ACCEPT) - return m_referenceNode; - _tempCurrent = getNextNode(_tempCurrent); - } - - return 0; -} - -NodeImpl *NodeIteratorImpl::getNextNode(NodeImpl *n) -{ - /* 1. my first child - * 2. my next sibling - * 3. my parents sibling, or their parents sibling (loop) - * 4. not found - */ - - if( !n ) - return 0; - - if( n->hasChildNodes() ) - return n->firstChild(); - - if( m_root == n) - return 0; - - if( n->nextSibling() ) - return n->nextSibling(); - - NodeImpl *parent = n->parentNode(); - while( parent ) - { - if( m_root == parent ) - return 0; - - n = parent->nextSibling(); - if( n ) - return n; - - parent = parent->parentNode(); - } - return 0; -} - -NodeImpl *NodeIteratorImpl::previousNode( int &exceptioncode ) -{ - if (m_detached) { - exceptioncode = DOMException::INVALID_STATE_ERR; - return 0; - } - - if (!m_referenceNode) { - m_inFront = false; - return 0; - } - - if (m_inFront) { - m_inFront = false; - if (isAccepted(m_referenceNode) == NodeFilter::FILTER_ACCEPT) - return m_referenceNode; - } - - NodeImpl *_tempCurrent = getPreviousNode(m_referenceNode); - while( _tempCurrent ) { - m_referenceNode = _tempCurrent; - if(isAccepted(_tempCurrent) == NodeFilter::FILTER_ACCEPT) - return m_referenceNode; - _tempCurrent = getPreviousNode(_tempCurrent); - } - - return 0; -} - -NodeImpl *NodeIteratorImpl::getPreviousNode(NodeImpl *n) -{ -/* 1. my previous sibling.lastchild - * 2. my previous sibling - * 3. my parent - */ - NodeImpl *_tempCurrent; - - if( !n || m_root == n ) - return 0; - - _tempCurrent = n->previousSibling(); - if( _tempCurrent ) - { - if( _tempCurrent->lastChild() ) - { - while( _tempCurrent->lastChild() ) - _tempCurrent = _tempCurrent->lastChild(); - return _tempCurrent; - } - else - return _tempCurrent; - } - - return n->parentNode(); - -} - -void NodeIteratorImpl::detach(int &/*exceptioncode*/) -{ - m_doc->detachNodeIterator(this); - m_detached = true; -} - - -void NodeIteratorImpl::notifyBeforeNodeRemoval(NodeImpl *removed) -{ - // make sure the deleted node is with the root (but not the root itself) - if (removed == m_root) - return; - - NodeImpl *maybeRoot = removed->parentNode(); - while (maybeRoot && maybeRoot != m_root) - maybeRoot = maybeRoot->parentNode(); - if (!maybeRoot) - return; - - // did I get deleted, or one of my parents? - NodeImpl *_tempDeleted = m_referenceNode; - while( _tempDeleted && _tempDeleted != removed) - _tempDeleted = _tempDeleted->parentNode(); - - if( !_tempDeleted ) // someone that didn't consern me got deleted - return; - - if( !m_inFront) - { - NodeImpl *_next = getNextNode(_tempDeleted); - if( _next ) - m_referenceNode = _next; - else - { - // deleted node was at end of list - m_inFront = true; - m_referenceNode = getPreviousNode(_tempDeleted); - } - } - else { - NodeImpl *_prev = getPreviousNode(_tempDeleted); - if ( _prev ) - m_referenceNode = _prev; - else - { - // deleted node was at start of list - m_inFront = false; - m_referenceNode = getNextNode(_tempDeleted); - } - } - -} - -short NodeIteratorImpl::isAccepted(NodeImpl *n) -{ - // if XML is implemented we have to check expandEntityRerefences in this function - if( ( ( 1 << ( n->nodeType()-1 ) ) & m_whatToShow) != 0 ) - { - if(!m_filter.isNull()) - return m_filter.acceptNode(n); - else - return NodeFilter::FILTER_ACCEPT; - } - return NodeFilter::FILTER_SKIP; -} - -// -------------------------------------------------------------- - - -NodeFilterImpl::NodeFilterImpl() -{ - m_customNodeFilter = 0; -} - -NodeFilterImpl::~NodeFilterImpl() -{ - if (m_customNodeFilter) - m_customNodeFilter->deref(); -} - -short NodeFilterImpl::acceptNode(const Node &n) -{ - if (m_customNodeFilter) - return m_customNodeFilter->acceptNode(n); - else - return NodeFilter::FILTER_ACCEPT; -} - -void NodeFilterImpl::setCustomNodeFilter(CustomNodeFilter *custom) -{ - m_customNodeFilter = custom; - if (m_customNodeFilter) - m_customNodeFilter->ref(); -} - -CustomNodeFilter *NodeFilterImpl::customNodeFilter() -{ - return m_customNodeFilter; -} - -// -------------------------------------------------------------- - -TreeWalkerImpl::TreeWalkerImpl(NodeImpl *n, long _whatToShow, NodeFilterImpl *f, - bool entityReferenceExpansion) -{ - m_currentNode = n; - m_rootNode = n; - m_whatToShow = _whatToShow; - m_filter = f; - if ( m_filter ) - m_filter->ref(); - m_expandEntityReferences = entityReferenceExpansion; - m_doc = m_rootNode->getDocument(); - m_doc->ref(); -} - -TreeWalkerImpl::~TreeWalkerImpl() -{ - m_doc->deref(); - if ( m_filter ) - m_filter->deref(); -} - -NodeImpl *TreeWalkerImpl::getRoot() const -{ - return m_rootNode; -} - -unsigned long TreeWalkerImpl::getWhatToShow() const -{ - return m_whatToShow; -} - -NodeFilterImpl *TreeWalkerImpl::getFilter() const -{ - return m_filter; -} - -bool TreeWalkerImpl::getExpandEntityReferences() const -{ - return m_expandEntityReferences; -} - -NodeImpl *TreeWalkerImpl::getCurrentNode() const -{ - return m_currentNode; -} - -void TreeWalkerImpl::setWhatToShow(long _whatToShow) -{ - // do some testing wether this is an accepted value - m_whatToShow = _whatToShow; -} - -void TreeWalkerImpl::setFilter(NodeFilterImpl *_filter) -{ - m_filter->deref(); - m_filter = _filter; - if ( m_filter ) - m_filter->ref(); -} - -void TreeWalkerImpl::setExpandEntityReferences(bool value) -{ - m_expandEntityReferences = value; -} - -void TreeWalkerImpl::setCurrentNode( NodeImpl *n ) -{ - if ( n ) - { - //m_rootNode = n; - m_currentNode = n; - } -// else -// throw( DOMException::NOT_SUPPORTED_ERR ); -} - -NodeImpl *TreeWalkerImpl::parentNode( ) -{ - NodeImpl *n = getParentNode( m_currentNode ); - if ( n ) - m_currentNode = n; - return n; -} - - -NodeImpl *TreeWalkerImpl::firstChild( ) -{ - NodeImpl *n = getFirstChild( m_currentNode ); - if ( n ) - m_currentNode = n; - return n; -} - - -NodeImpl *TreeWalkerImpl::lastChild( ) -{ - NodeImpl *n = getLastChild(m_currentNode); - if( n ) - m_currentNode = n; - return n; -} - -NodeImpl *TreeWalkerImpl::previousSibling( ) -{ - NodeImpl *n = getPreviousSibling( m_currentNode ); - if( n ) - m_currentNode = n; - return n; -} - -NodeImpl *TreeWalkerImpl::nextSibling( ) -{ - NodeImpl *n = getNextSibling( m_currentNode ); - if( n ) - m_currentNode = n; - return n; -} - -NodeImpl *TreeWalkerImpl::previousNode( ) -{ -/* 1. my previous sibling.lastchild - * 2. my previous sibling - * 3. my parent - */ - - NodeImpl *n = getPreviousSibling( m_currentNode ); - if( !n ) - { - n = getParentNode( m_currentNode ); - if( n ) //parent - { - m_currentNode = n; - return m_currentNode; - } - else // parent failed.. no previous node - return 0; - } - - NodeImpl *child = getLastChild( n ); - if( child ) // previous siblings last child - { - m_currentNode = child; - return m_currentNode; - } - else // previous sibling - { - m_currentNode = n; - return m_currentNode; - } - return 0; // should never get here! -} - -NodeImpl *TreeWalkerImpl::nextNode( ) -{ -/* 1. my first child - * 2. my next sibling - * 3. my parents sibling, or their parents sibling (loop) - * 4. not found - */ - - NodeImpl *n = getFirstChild( m_currentNode ); - if( n ) // my first child - { - m_currentNode = n; - return n; - } - - n = getNextSibling( m_currentNode ); // my next sibling - if( n ) - { - m_currentNode = n; - return m_currentNode; - } - NodeImpl *parent = getParentNode( m_currentNode ); - while( parent ) // parents sibling - { - n = getNextSibling( parent ); - if( n ) - { - m_currentNode = n; - return m_currentNode; - } - else - parent = getParentNode( parent ); - } - return 0; -} - -short TreeWalkerImpl::isAccepted(NodeImpl *n) -{ - // if XML is implemented we have to check expandEntityRerefences in this function - if( ( ( 1 << ( n->nodeType()-1 ) ) & m_whatToShow) != 0 ) - { - if(m_filter) - return m_filter->acceptNode(n); - else - return NodeFilter::FILTER_ACCEPT; - } - return NodeFilter::FILTER_SKIP; -} - -NodeImpl *TreeWalkerImpl::getParentNode(NodeImpl *n) -{ - short _result = NodeFilter::FILTER_ACCEPT; - - if( n == m_rootNode /*|| !n*/ ) - return 0; - - NodeImpl *_tempCurrent = n->parentNode(); - - if( !_tempCurrent ) - return 0; - - _result = isAccepted( _tempCurrent ); - if ( _result == NodeFilter::FILTER_ACCEPT ) - return _tempCurrent; // match found - - return getParentNode( _tempCurrent ); -} - -NodeImpl *TreeWalkerImpl::getFirstChild(NodeImpl *n) -{ - short _result; - - if( !n || !n->firstChild() ) - return 0; - n = n->firstChild(); - - _result = isAccepted( n ); - - switch( _result ) - { - case NodeFilter::FILTER_ACCEPT: - return n; - break; - case NodeFilter::FILTER_SKIP: - if( n->hasChildNodes() ) - return getFirstChild( n ); - else - return getNextSibling( n ); - break; - - case NodeFilter::FILTER_REJECT: - return getNextSibling( n ); - break; - } - return 0; // should never get here! -} - -NodeImpl *TreeWalkerImpl::getLastChild(NodeImpl *n) -{ - short _result; - - if( !n || !n->lastChild() ) - return 0; - n = n->lastChild(); - _result = isAccepted( n ); - - switch( _result ) - { - case NodeFilter::FILTER_ACCEPT: - return n; - break; - - case NodeFilter::FILTER_SKIP: - if( n->hasChildNodes() ) - return getLastChild( n ); - else - return getPreviousSibling( n ); - break; - - case NodeFilter::FILTER_REJECT: - return getPreviousSibling( n ); - break; - } - return 0; -} - -NodeImpl *TreeWalkerImpl::getPreviousSibling(NodeImpl *n) -{ - short _result; - NodeImpl *_tempCurrent; - - if( !n ) - return 0; - //first the cases if we have a previousSibling - _tempCurrent = n->previousSibling(); - if( _tempCurrent ) - { - _result = isAccepted( _tempCurrent ); - switch ( _result ) - { - case NodeFilter::FILTER_ACCEPT: - return _tempCurrent; - break; - - case NodeFilter::FILTER_SKIP: - { - NodeImpl *nskip = getLastChild( _tempCurrent ); - if( nskip ) - return nskip; - return getPreviousSibling( _tempCurrent ); - break; - } - - case NodeFilter::FILTER_REJECT: - return getPreviousSibling( _tempCurrent ); - break; - } - } - // now the case if we don't have previous sibling - else - { - _tempCurrent = n->parentNode(); - if( !_tempCurrent || _tempCurrent == m_rootNode) - return 0; - _result = isAccepted( _tempCurrent ); - if ( _result == NodeFilter::FILTER_SKIP ) - return getPreviousSibling( _tempCurrent ); - - return 0; - - } - return 0; // should never get here! -} - -NodeImpl *TreeWalkerImpl::getNextSibling(NodeImpl *n) -{ - NodeImpl *_tempCurrent = 0; - short _result; - - if( !n ) - return 0; - - _tempCurrent = n->nextSibling(); - if( _tempCurrent ) - { - _result = isAccepted( _tempCurrent ); - switch ( _result ) - { - case NodeFilter::FILTER_ACCEPT: - return _tempCurrent; - break; - - case NodeFilter::FILTER_SKIP: - { - NodeImpl *nskip = getFirstChild( _tempCurrent ); - if( nskip ) - return nskip; - return getNextSibling( _tempCurrent ); - break; - } - - case NodeFilter::FILTER_REJECT: - return getNextSibling( _tempCurrent ); - break; - } - } - else - { - _tempCurrent = n->parentNode(); - if( !_tempCurrent || _tempCurrent == m_rootNode) - return 0; - _result = isAccepted( _tempCurrent ); - if( _result == NodeFilter::FILTER_SKIP ) - return getNextSibling( _tempCurrent ); - - return 0; - } - return 0; -} - diff --git a/khtml/xml/dom2_traversalimpl.h b/khtml/xml/dom2_traversalimpl.h deleted file mode 100644 index 3c5ea1dac..000000000 --- a/khtml/xml/dom2_traversalimpl.h +++ /dev/null @@ -1,196 +0,0 @@ -/* - * This file is part of the DOM implementation for KDE. - * - * (C) 1999 Lars Knoll (knoll@kde.org) - * (C) 2000 Frederik Holljen (frederik.holljen@hig.no) - * (C) 2001 Peter Kelly (pmk@post.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - * - */ - -#ifndef _DOM2_TraversalImpl_h_ -#define _DOM2_TraversalImpl_h_ - -#include "dom/dom_node.h" -#include "dom/dom_misc.h" -#include "misc/shared.h" -#include "dom/dom2_traversal.h" - -namespace DOM { - -class NodeImpl; -class DocumentImpl; - -class NodeIteratorImpl : public khtml::Shared -{ -public: - NodeIteratorImpl(NodeImpl *_root, unsigned long _whatToShow, NodeFilter _filter, bool _entityReferenceExpansion); - ~NodeIteratorImpl(); - - - NodeImpl *root(); - unsigned long whatToShow(); - NodeFilter filter(); - bool expandEntityReferences(); - - NodeImpl *nextNode(int &exceptioncode); - NodeImpl *previousNode(int &exceptioncode); - void detach(int &exceptioncode); - - - /** - * This function has to be called if you delete a node from the - * document tree and you want the Iterator to react if there - * are any changes concerning it. - */ - void notifyBeforeNodeRemoval(NodeImpl *removed); - - short isAccepted(NodeImpl *n); - NodeImpl *getNextNode(NodeImpl *n); - NodeImpl *getPreviousNode(NodeImpl *n); -protected: - NodeImpl *m_root; - long m_whatToShow; - NodeFilter m_filter; - bool m_expandEntityReferences; - - bool m_inFront; - NodeImpl *m_referenceNode; - bool m_detached; - DocumentImpl *m_doc; -}; - -class NodeFilterImpl : public khtml::Shared -{ -public: - NodeFilterImpl(); - ~NodeFilterImpl(); - - short acceptNode(const Node &n); - - void setCustomNodeFilter(CustomNodeFilter *custom); - CustomNodeFilter *customNodeFilter(); -protected: - CustomNodeFilter *m_customNodeFilter; - -}; - -class TreeWalkerImpl : public khtml::Shared -{ -public: - TreeWalkerImpl(); - TreeWalkerImpl(const TreeWalkerImpl &other); - TreeWalkerImpl(NodeImpl *n, NodeFilter f); - TreeWalkerImpl(NodeImpl *n, long _whatToShow, NodeFilterImpl *f, - bool entityReferenceExpansion); - TreeWalkerImpl & operator = (const TreeWalkerImpl &other); - - - ~TreeWalkerImpl(); - - NodeImpl *getRoot() const; - - unsigned long getWhatToShow() const; - - NodeFilterImpl *getFilter() const; - - bool getExpandEntityReferences() const; - - NodeImpl *getCurrentNode() const; - - void setCurrentNode( NodeImpl *_currentNode); - - NodeImpl *parentNode(); - - NodeImpl *firstChild(); - - NodeImpl *lastChild (); - - NodeImpl *previousSibling (); - - NodeImpl *nextSibling(); - - NodeImpl *previousNode(); - - NodeImpl *nextNode(); - - - /** - * Sets which node types are to be presented via the TreeWalker - */ - void setWhatToShow(long _whatToShow); - void setFilter(NodeFilterImpl *_filter); - void setExpandEntityReferences(bool value); - - NodeImpl *getParentNode(NodeImpl *n); - NodeImpl *getFirstChild(NodeImpl *n); - NodeImpl *getLastChild(NodeImpl *n); - NodeImpl *getPreviousSibling(NodeImpl *n); - NodeImpl *getNextSibling(NodeImpl *n); - - short isAccepted(NodeImpl *n); - -protected: - /** - * This attribute determines which node types are presented via - * the TreeWalker. - * - */ - long m_whatToShow; - - /** - * The filter used to screen nodes. - * - */ - NodeFilterImpl *m_filter; - - /** - * The value of this flag determines whether entity reference - * nodes are expanded. To produce a view of the document that has - * entity references expanded and does not expose the entity - * reference node itself, use the whatToShow flags to hide the - * entity reference node and set expandEntityReferences to true - * when creating the iterator. To produce a view of the document - * that has entity reference nodes but no entity expansion, use - * the whatToShow flags to show the entity reference node and set - * expandEntityReferences to true. - * - * This is not implemented (always true) - */ - bool m_expandEntityReferences; - - /** - * The current node. - * - * The value must not be null. Attempting to set it to null will - * raise a NOT_SUPPORTED_ERR exception. When setting a node, the - * whatToShow flags and any Filter associated with the TreeWalker - * are not checked. The currentNode may be set to any Node of any - * type. - * - */ - NodeImpl *m_currentNode; - - NodeImpl *m_rootNode; - DocumentImpl *m_doc; -}; - - -} // namespace - -#endif - diff --git a/khtml/xml/dom2_viewsimpl.cpp b/khtml/xml/dom2_viewsimpl.cpp deleted file mode 100644 index 2195a9db1..000000000 --- a/khtml/xml/dom2_viewsimpl.cpp +++ /dev/null @@ -1,50 +0,0 @@ -/** - * This file is part of the DOM implementation for KDE. - * - * (C) 2001 Peter Kelly (pmk@post.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - * - */ - -#include "dom2_viewsimpl.h" -#include "dom_elementimpl.h" -#include "dom_docimpl.h" -#include "css/css_renderstyledeclarationimpl.h" -#include "css/cssproperties.h" -#include "css/css_stylesheetimpl.h" - -using namespace khtml; -using namespace DOM; - -AbstractViewImpl::AbstractViewImpl(DocumentImpl *_document) -{ - m_document = _document; -} - -AbstractViewImpl::~AbstractViewImpl() -{ -} - -CSSStyleDeclarationImpl *AbstractViewImpl::getComputedStyle(ElementImpl* elt, DOMStringImpl* /*pseudoElt*/) -{ - if (!elt) - return 0; - - CSSStyleDeclarationImpl* style = new RenderStyleDeclarationImpl( elt ); - return style; -} - diff --git a/khtml/xml/dom2_viewsimpl.h b/khtml/xml/dom2_viewsimpl.h deleted file mode 100644 index caff63e11..000000000 --- a/khtml/xml/dom2_viewsimpl.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * This file is part of the DOM implementation for KDE. - * - * (C) 2001 Peter Kelly (pmk@post.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - * - */ - -#ifndef _DOM_ViewsImpl_h_ -#define _DOM_ViewsImpl_h_ - -#include "dom/dom_misc.h" -#include "css/css_valueimpl.h" -#include "misc/shared.h" - -namespace DOM { - -class DocumentImpl; -class CSSStyleDeclarationImpl; -class ElementImpl; -class DOMStringImpl; - -// Introduced in DOM Level 2: -class AbstractViewImpl : public khtml::Shared -{ -public: - AbstractViewImpl(DocumentImpl *_document); - ~AbstractViewImpl(); - DocumentImpl *document() const { return m_document; } - CSSStyleDeclarationImpl *getComputedStyle(ElementImpl *elt, DOMStringImpl *pseudoElt); -protected: - DocumentImpl *m_document; -}; - -} //namespace -#endif diff --git a/khtml/xml/dom_docimpl.cpp b/khtml/xml/dom_docimpl.cpp deleted file mode 100644 index ff206a1cc..000000000 --- a/khtml/xml/dom_docimpl.cpp +++ /dev/null @@ -1,2892 +0,0 @@ -/** - * This file is part of the DOM implementation for KDE. - * - * Copyright (C) 1999 Lars Knoll (knoll@kde.org) - * (C) 1999 Antti Koivisto (koivisto@kde.org) - * (C) 2001 Dirk Mueller (mueller@kde.org) - * (C) 2002-2006 Apple Computer, Inc. - * (C) 2006 Allan Sandfeld Jensen (kde@carewolf.com) - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Library General Public - * License as published by the Free Software Foundation; either - * version 2 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Library General Public License for more details. - * - * You should have received a copy of the GNU Library General Public License - * along with this library; see the file COPYING.LIB. If not, write to - * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, - * Boston, MA 02110-1301, USA. - */ - -#include "dom/dom_exception.h" - -#include "xml/dom_textimpl.h" -#include "xml/dom_xmlimpl.h" -#include "xml/dom2_rangeimpl.h" -#include "xml/dom2_eventsimpl.h" -#include "xml/xml_tokenizer.h" -#include "html/htmltokenizer.h" -#include "xml/dom_restyler.h" - -#include "css/csshelper.h" -#include "css/cssstyleselector.h" -#include "css/css_stylesheetimpl.h" -#include "misc/htmlhashes.h" -#include "misc/helper.h" -#include "misc/seed.h" -#include "misc/loader.h" -#include "ecma/kjs_proxy.h" -#include "ecma/kjs_binding.h" - -#include -#include -#include -#include -#include - -#include "rendering/counter_tree.h" -#include "rendering/render_canvas.h" -#include "rendering/render_replaced.h" -#include "rendering/render_arena.h" -#include "rendering/render_layer.h" -#include "rendering/render_frames.h" -#include "rendering/render_image.h" - -#include "khtmlview.h" -#include "khtml_part.h" - -#include -#include -#include -#include "khtml_settings.h" -#include "khtmlpart_p.h" - -#include "html/html_baseimpl.h" -#include "html/html_blockimpl.h" -#include "html/html_documentimpl.h" -#include "html/html_formimpl.h" -#include "html/html_headimpl.h" -#include "html/html_imageimpl.h" -#include "html/html_listimpl.h" -#include "html/html_miscimpl.h" -#include "html/html_tableimpl.h" -#include "html/html_objectimpl.h" - -#include -#include - -#include -#include "dom_docimpl.h" - -using namespace DOM; -using namespace khtml; - -// ------------------------------------------------------------------------ - -DOMImplementationImpl *DOMImplementationImpl::m_instance = 0; - -DOMImplementationImpl::DOMImplementationImpl() -{ -} - -DOMImplementationImpl::~DOMImplementationImpl() -{ -} - -bool DOMImplementationImpl::hasFeature ( const DOMString &feature, const DOMString &version ) -{ - // ### update when we (fully) support the relevant features - TQString lower = feature.string().lower(); - if ((lower == "html" || lower == "xml") && - (version.isEmpty() || version == "1.0" || version == "2.0" || version == "null")) - return true; - - // ## Do we support Core Level 3 ? - if ((lower == "core" ) && - (version.isEmpty() || version == "2.0" || version == "null")) - return true; - - if ((lower == "events" || lower == "uievents" || - lower == "mouseevents" || lower == "mutationevents" || - lower == "htmlevents" || lower == "textevents" ) && - (version.isEmpty() || version == "2.0" || version == "3.0" || version == "null")) - return true; - return false; -} - -DocumentTypeImpl *DOMImplementationImpl::createDocumentType( const DOMString &qualifiedName, const DOMString &publicId, - const DOMString &systemId, int &exceptioncode ) -{ - // Not mentioned in spec: throw NAMESPACE_ERR if no qualifiedName supplied - if (qualifiedName.isNull()) { - exceptioncode = DOMException::NAMESPACE_ERR; - return 0; - } - - // INVALID_CHARACTER_ERR: Raised if the specified qualified name contains an illegal character. - if (!Element::khtmlValidQualifiedName(qualifiedName)) { - exceptioncode = DOMException::INVALID_CHARACTER_ERR; - return 0; - } - - // NAMESPACE_ERR: Raised if the qualifiedName is malformed. - // Added special case for the empty string, which seems to be a common pre-DOM2 misuse - if (!qualifiedName.isEmpty() && Element::khtmlMalformedQualifiedName(qualifiedName)) { - exceptioncode = DOMException::NAMESPACE_ERR; - return 0; - } - - return new DocumentTypeImpl(this,0,qualifiedName,publicId,systemId); -} - -DOMImplementationImpl* DOMImplementationImpl::getInterface(const DOMString& /*feature*/) const -{ - // ### - return 0; -} - -DocumentImpl *DOMImplementationImpl::createDocument( const DOMString &namespaceURI, const DOMString &qualifiedName, - const DocumentType &doctype, int &exceptioncode ) -{ - exceptioncode = 0; - - if (!checkQualifiedName(qualifiedName, namespaceURI, 0, true/*nameCanBeNull*/, - true /*nameCanBeEmpty, see #61650*/, &exceptioncode) ) - return 0; - - DocumentTypeImpl *dtype = static_cast(doctype.handle()); - // WRONG_DOCUMENT_ERR: Raised if doctype has already been used with a different document or was - // created from a different implementation. - if (dtype && (dtype->getDocument() || dtype->implementation() != this)) { - exceptioncode = DOMException::WRONG_DOCUMENT_ERR; - return 0; - } - - // ### this is completely broken.. without a view it will not work (Dirk) - DocumentImpl *doc = new DocumentImpl(this, 0); - - // now get the interesting parts of the doctype - // ### create new one if not there (currently always there) - if (doc->doctype() && dtype) - doc->doctype()->copyFrom(*dtype); - - // the document must be created empty if all parameters are null - // (or empty for qName/nsURI as a tolerance) - see DOM 3 Core. - if (dtype || !qualifiedName.isEmpty() || !namespaceURI.isEmpty()) { - ElementImpl *element = doc->createElementNS(namespaceURI,qualifiedName); - doc->appendChild(element,exceptioncode); - if (exceptioncode) { - delete element; - delete doc; - return 0; - } - } - return doc; -} - -CSSStyleSheetImpl *DOMImplementationImpl::createCSSStyleSheet(DOMStringImpl* /*title*/, DOMStringImpl *media, - int &/*exceptioncode*/) -{ - // ### TODO : title should be set, and media could have wrong syntax, in which case we should - // generate an exception. - CSSStyleSheetImpl *parent = 0L; - CSSStyleSheetImpl *sheet = new CSSStyleSheetImpl(parent, DOMString()); - sheet->setMedia(new MediaListImpl(sheet, media)); - return sheet; -} - -DocumentImpl *DOMImplementationImpl::createDocument( KHTMLView *v ) -{ - return new DocumentImpl(this, v); -} - -HTMLDocumentImpl *DOMImplementationImpl::createHTMLDocument( KHTMLView *v ) -{ - return new HTMLDocumentImpl(this, v); -} - -DOMImplementationImpl *DOMImplementationImpl::instance() -{ - if (!m_instance) { - m_instance = new DOMImplementationImpl(); - m_instance->ref(); - } - - return m_instance; -} - -// ------------------------------------------------------------------------ - - -ElementMappingCache::ElementMappingCache():m_dict(257) -{ - m_dict.setAutoDelete(true); -} - -void ElementMappingCache::add(const TQString& id, ElementImpl* nd) -{ - if (id.isEmpty()) return; - - ItemInfo* info = m_dict.find(id); - if (info) - { - info->ref++; - info->nd = 0; //Now ambigous - } - else - { - ItemInfo* info = new ItemInfo(); - info->ref = 1; - info->nd = nd; - m_dict.insert(id, info); - } -} - -void ElementMappingCache::set(const TQString& id, ElementImpl* nd) -{ - if (id.isEmpty()) return; - - ItemInfo* info = m_dict.find(id); - info->nd = nd; -} - -void ElementMappingCache::remove(const TQString& id, ElementImpl* nd) -{ - if (id.isEmpty()) return; - - ItemInfo* info = m_dict.find(id); - info->ref--; - if (info->ref == 0) - { - m_dict.take(id); - delete info; - } - else - { - if (info->nd == nd) - info->nd = 0; - } -} - -bool ElementMappingCache::contains(const TQString& id) -{ - if (id.isEmpty()) return false; - return m_dict.find(id); -} - -ElementMappingCache::ItemInfo* ElementMappingCache::get(const TQString& id) -{ - if (id.isEmpty()) return 0; - return m_dict.find(id); -} - -static KStaticDeleter< TQPtrList > s_changedDocumentsDeleter; -TQPtrList * DocumentImpl::changedDocuments; - -// KHTMLView might be 0 -DocumentImpl::DocumentImpl(DOMImplementationImpl *_implementation, KHTMLView *v) - : NodeBaseImpl( 0 ), m_domtree_version(0), m_counterDict(257), - m_imageLoadEventTimer(0) -{ - m_document.resetSkippingRef(this); //Make getDocument return us.. - m_selfOnlyRefCount = 0; - - m_paintDeviceMetrics = 0; - m_paintDevice = 0; - m_decoderMibEnum = 0; - m_textColor = Qt::black; - - m_view = v; - m_renderArena.reset(); - - KHTMLFactory::ref(); - - if ( v ) { - m_docLoader = new DocLoader(v->part(), this ); - setPaintDevice( TQT_TQPAINTDEVICE(m_view) ); - } - else - m_docLoader = new DocLoader( 0, this ); - - visuallyOrdered = false; - m_bParsing = false; - m_docChanged = false; - m_elemSheet = 0; - m_tokenizer = 0; - - // ### this should be created during parsing a - // not during construction. Not sure who added that and why (Dirk) - m_doctype = new DocumentTypeImpl(_implementation, getDocument(), - DOMString() /* qualifiedName */, - DOMString() /* publicId */, - DOMString() /* systemId */); - m_doctype->ref(); - - m_implementation = _implementation; - m_implementation->ref(); - pMode = Strict; - hMode = XHtml; - m_textColor = "#000000"; - m_attrMap = new IdNameMapping(ATTR_LAST_ATTR+1); - m_elementMap = new IdNameMapping(ID_LAST_TAG+1); - m_namespaceMap = new IdNameMapping(1); - TQString xhtml(XHTML_NAMESPACE); - m_namespaceMap->names.insert(emptyNamespace, new DOMStringImpl("")); - m_namespaceMap->names.insert(xhtmlNamespace, new DOMStringImpl(xhtml.unicode(), xhtml.length())); - m_namespaceMap->names[emptyNamespace]->ref(); - m_namespaceMap->names[xhtmlNamespace]->ref(); - m_namespaceMap->count+=2; - m_focusNode = 0; - m_hoverNode = 0; - m_activeNode = 0; - m_defaultView = new AbstractViewImpl(this); - m_defaultView->ref(); - m_listenerTypes = 0; - m_styleSheets = new StyleSheetListImpl; - m_styleSheets->ref(); - m_addedStyleSheets = 0; - m_inDocument = true; - m_styleSelectorDirty = false; - m_styleSelector = 0; - m_counterDict.setAutoDelete(true); - - m_inStyleRecalc = false; - m_pendingStylesheets = 0; - m_ignorePendingStylesheets = false; - m_async = true; - m_hadLoadError = false; - m_docLoading = false; - m_inSyncLoad = false; - m_loadingXMLDoc = 0; - m_cssTarget = 0; - m_dynamicDomRestyler = new khtml::DynamicDomRestyler(); -} - -void DocumentImpl::removedLastRef() -{ - if (m_selfOnlyRefCount) { - /* In this case, the only references to us are from children, - so we have a cycle. We'll try to break it by disconnecting the - children from us; this sucks/is wrong, but it's pretty much - the best we can do without tracing. - - Of course, if dumping the children causes the refcount from them to - drop to 0 we can get killed right here, so better hold - a temporary reference, too - */ - DocPtr guard(this); - - // we must make sure not to be retaining any of our children through - // these extra pointers or we will create a reference cycle - if (m_doctype) { - m_doctype->deref(); - m_doctype = 0; - } - - if (m_cssTarget) { - m_cssTarget->deref(); - m_cssTarget = 0; - } - - if (m_focusNode) { - m_focusNode->deref(); - m_focusNode = 0; - } - - if (m_hoverNode) { - m_hoverNode->deref(); - m_hoverNode = 0; - } - - if (m_activeNode) { - m_activeNode->deref(); - m_activeNode = 0; - } - - removeChildren(); - - delete m_tokenizer; - m_tokenizer = 0; - } else { - delete this; - } -} - -DocumentImpl::~DocumentImpl() -{ - //Important: if you need to remove stuff here, - //you may also have to fix removedLastRef() above - M.O. - assert( !m_render ); - - TQIntDictIterator it(m_nodeListCache); - for (; it.current(); ++it) - it.current()->deref(); - - if (m_loadingXMLDoc) - m_loadingXMLDoc->deref(this); - if (changedDocuments && m_docChanged) - changedDocuments->remove(this); - delete m_tokenizer; - m_document.resetSkippingRef(0); - delete m_styleSelector; - delete m_docLoader; - if (m_elemSheet ) m_elemSheet->deref(); - if (m_doctype) - m_doctype->deref(); - m_implementation->deref(); - delete m_paintDeviceMetrics; - delete m_elementMap; - delete m_attrMap; - delete m_namespaceMap; - delete m_dynamicDomRestyler; - m_defaultView->deref(); - m_styleSheets->deref(); - if (m_addedStyleSheets) - m_addedStyleSheets->deref(); - if (m_cssTarget) - m_cssTarget->deref(); - if (m_focusNode) - m_focusNode->deref(); - if ( m_hoverNode ) - m_hoverNode->deref(); - if (m_activeNode) - m_activeNode->deref(); - - m_renderArena.reset(); - - KHTMLFactory::deref(); -} - - -DocumentTypeImpl *DocumentImpl::doctype() const -{ - return m_doctype; -} - -DOMImplementationImpl *DocumentImpl::implementation() const -{ - return m_implementation; -} - -ElementImpl *DocumentImpl::documentElement() const -{ - NodeImpl *n = firstChild(); - while (n && n->nodeType() != Node::ELEMENT_NODE) - n = n->nextSibling(); - return static_cast(n); -} - -ElementImpl *DocumentImpl::createElement( const DOMString &name, int* pExceptioncode ) -{ - Id id = getId( NodeImpl::ElementId, name.implementation(), - false /* allocate */, false /*HTMLDocumentImpl::createElement looked for HTML elements already*/, - pExceptioncode); - if ( pExceptioncode && *pExceptioncode ) - return 0; - - XMLElementImpl* e = new XMLElementImpl( getDocument(), id ); - e->setHTMLCompat( htmlMode() != XHtml ); // Not a real HTML element, but inside an html-compat doc all tags are uppercase. - return e; -} - -AttrImpl *DocumentImpl::createAttribute( const DOMString &tagName, int* pExceptioncode ) -{ - Id id = getId( NodeImpl::AttributeId, tagName.implementation(), - false /* allocate */, isHTMLDocument(), pExceptioncode); - if ( pExceptioncode && *pExceptioncode ) - return 0; - AttrImpl* attr = new AttrImpl( 0, getDocument(), id, DOMString("").implementation()); - attr->setHTMLCompat( htmlMode() != XHtml ); - return attr; -} - -DocumentFragmentImpl *DocumentImpl::createDocumentFragment( ) -{ - return new DocumentFragmentImpl( docPtr() ); -} - -CommentImpl *DocumentImpl::createComment ( DOMStringImpl* data ) -{ - return new CommentImpl( docPtr(), data ); -} - -CDATASectionImpl *DocumentImpl::createCDATASection ( DOMStringImpl* data ) -{ - return new CDATASectionImpl( docPtr(), data ); -} - -ProcessingInstructionImpl *DocumentImpl::createProcessingInstruction ( const DOMString &target, DOMStringImpl* data ) -{ - return new ProcessingInstructionImpl( docPtr(),target,data); -} - -EntityReferenceImpl *DocumentImpl::createEntityReference ( const DOMString &name ) -{ - return new EntityReferenceImpl(docPtr(), name.implementation()); -} - -NodeImpl *DocumentImpl::importNode(NodeImpl *importedNode, bool deep, int &exceptioncode) -{ - NodeImpl *result = 0; - - // Not mentioned in spec: throw NOT_FOUND_ERR if evt is null - if (!importedNode) { - exceptioncode = DOMException::NOT_FOUND_ERR; - return 0; - } - - if(importedNode->nodeType() == Node::ELEMENT_NODE) - { - // Why not use cloneNode? - ElementImpl *otherElem = static_cast(importedNode); - NamedAttrMapImpl *otherMap = static_cast(importedNode)->attributes(true); - - ElementImpl *tempElementImpl; - if (!importedNode->localName().isNull()) - tempElementImpl = createElementNS(otherElem->namespaceURI(),otherElem->nodeName()); - else - tempElementImpl = createElement(otherElem->nodeName()); - result = tempElementImpl; - - - if(otherMap) { - for(unsigned long i = 0; i < otherMap->length(); i++) - { - AttrImpl *otherAttr = otherMap->attrAt(i)->createAttr(otherElem,otherElem->docPtr()); - - if (!otherAttr->localName().isNull()) { - // attr was created via createElementNS() - tempElementImpl->setAttributeNS(otherAttr->namespaceURI(), - otherAttr->name(), - otherAttr->nodeValue(), - exceptioncode); - } - else { - // attr was created via createElement() - tempElementImpl->setAttribute(otherAttr->id(), - otherAttr->nodeValue(), - otherAttr->name(), - exceptioncode); - } - - if(exceptioncode != 0) - break; // ### properly cleanup here - } - } - } - else if(importedNode->nodeType() == Node::TEXT_NODE) - { - result = createTextNode(static_cast(importedNode)->string()); - deep = false; - } - else if(importedNode->nodeType() == Node::CDATA_SECTION_NODE) - { - result = createCDATASection(static_cast(importedNode)->string()); - deep = false; - } - else if(importedNode->nodeType() == Node::ENTITY_REFERENCE_NODE) - result = createEntityReference(importedNode->nodeName()); - else if(importedNode->nodeType() == Node::PROCESSING_INSTRUCTION_NODE) - { - result = createProcessingInstruction(importedNode->nodeName(), importedNode->nodeValue().implementation()); - deep = false; - } - else if(importedNode->nodeType() == Node::COMMENT_NODE) - { - result = createComment(static_cast(importedNode)->string()); - deep = false; - } - else if (importedNode->nodeType() == Node::DOCUMENT_FRAGMENT_NODE) - result = createDocumentFragment(); - else - exceptioncode = DOMException::NOT_SUPPORTED_ERR; - - //### FIXME: This should handle Attributes, and a few other things - - if(deep && result) - { - for(Node n = importedNode->firstChild(); !n.isNull(); n = n.nextSibling()) - result->appendChild(importNode(n.handle(), true, exceptioncode), exceptioncode); - } - - return result; -} - -ElementImpl *DocumentImpl::createElementNS( const DOMString &_namespaceURI, const DOMString &_qualifiedName, int* pExceptioncode ) -{ - ElementImpl *e = 0; - int colonPos = -2; - // check NAMESPACE_ERR/INVALID_CHARACTER_ERR - if (pExceptioncode && !checkQualifiedName(_qualifiedName, _namespaceURI, &colonPos, - false/*nameCanBeNull*/, false/*nameCanBeEmpty*/, - pExceptioncode)) - return 0; - DOMString prefix, localName; - splitPrefixLocalName(_qualifiedName.implementation(), prefix, localName, colonPos); - - if ((isHTMLDocument() && _namespaceURI.isNull()) || - (strcasecmp(_namespaceURI, XHTML_NAMESPACE) == 0 && localName == localName.lower())) { - e = createHTMLElement(localName); - if (e) { - int _exceptioncode = 0; - if (!prefix.isNull()) - e->setPrefix(prefix, _exceptioncode); - if ( _exceptioncode ) { - if ( pExceptioncode ) *pExceptioncode = _exceptioncode; - delete e; - return 0; - } - e->setHTMLCompat( _namespaceURI.isNull() && htmlMode() != XHtml ); - } - } - if (!e) { - Id id = getId(NodeImpl::ElementId, _namespaceURI.implementation(), prefix.implementation(), - localName.implementation(), false, false /*HTML already looked up*/); - e = new XMLElementImpl( getDocument(), id, prefix.implementation() ); - } - - return e; -} - -AttrImpl *DocumentImpl::createAttributeNS( const DOMString &_namespaceURI, - const DOMString &_qualifiedName, int* pExceptioncode) -{ - int colonPos = -2; - // check NAMESPACE_ERR/INVALID_CHARACTER_ERR - if (pExceptioncode && !checkQualifiedName(_qualifiedName, _namespaceURI, &colonPos, - false/*nameCanBeNull*/, false/*nameCanBeEmpty*/, - pExceptioncode)) - return 0; - DOMString prefix, localName; - splitPrefixLocalName(_qualifiedName.implementation(), prefix, localName, colonPos); - Id id = getId(NodeImpl::AttributeId, _namespaceURI.implementation(), prefix.implementation(), - localName.implementation(), false, true /*lookupHTML*/); - AttrImpl* attr = new AttrImpl(0, getDocument(), id, DOMString("").implementation(), - prefix.implementation()); - attr->setHTMLCompat( _namespaceURI.isNull() && htmlMode() != XHtml ); - return attr; -} - -ElementImpl *DocumentImpl::getElementById( const DOMString &elementId ) const -{ - TQString stringKey = elementId.string(); - - ElementMappingCache::ItemInfo* info = m_getElementByIdCache.get(stringKey); - - if (!info) - return 0; - - //See if cache has an unambiguous answer. - if (info->nd) - return info->nd; - - //Now we actually have to walk. - TQPtrStack nodeStack; - NodeImpl *current = _first; - - while(1) - { - if(!current) - { - if(nodeStack.isEmpty()) break; - current = nodeStack.pop(); - current = current->nextSibling(); - } - else - { - if(current->isElementNode()) - { - ElementImpl *e = static_cast(current); - if(e->getAttribute(ATTR_ID) == elementId) { - info->nd = e; - return e; - } - } - - NodeImpl *child = current->firstChild(); - if(child) - { - nodeStack.push(current); - current = child; - } - else - { - current = current->nextSibling(); - } - } - } - - assert(0); //If there is no item with such an ID, we should never get here - - //kdDebug() << "WARNING: *DocumentImpl::getElementById not found " << elementId.string() << endl; - - return 0; -} - -void DocumentImpl::setTitle(const DOMString& _title) -{ - if (_title == m_title && !m_title.isNull()) return; - - m_title = _title; - - TQString titleStr = m_title.string(); - for (unsigned int i = 0; i < titleStr.length(); ++i) - if (titleStr[i] < ' ') - titleStr[i] = ' '; - titleStr = titleStr.simplifyWhiteSpace(); - titleStr.compose(); - if ( view() && !view()->part()->parentPart() ) { - if (titleStr.isNull() || titleStr.isEmpty()) { - // empty title... set window caption as the URL - KURL url = m_url; - url.setRef(TQString::null); - url.setQuery(TQString::null); - titleStr = url.prettyURL(); - } - - emit view()->part()->setWindowCaption( KStringHandler::csqueeze( titleStr, 128 ) ); - } -} - -DOMString DocumentImpl::nodeName() const -{ - return "#document"; -} - -unsigned short DocumentImpl::nodeType() const -{ - return Node::DOCUMENT_NODE; -} - -DOMStringImpl* DocumentImpl::textContent() const -{ - return 0; -} - -void DocumentImpl::setTextContent( const DOMString&, int& ) -{} - -ElementImpl *DocumentImpl::createHTMLElement( const DOMString &name ) -{ - uint id = khtml::getTagID( name.string().lower().latin1(), name.string().length() ); -// id = makeId(xhtmlNamespace, id); - - ElementImpl *n = 0; - switch(id) - { - case ID_HTML: - n = new HTMLHtmlElementImpl(docPtr()); - break; - case ID_HEAD: - n = new HTMLHeadElementImpl(docPtr()); - break; - case ID_BODY: - n = new HTMLBodyElementImpl(docPtr()); - break; - -// head elements - case ID_BASE: - n = new HTMLBaseElementImpl(docPtr()); - break; - case ID_LINK: - n = new HTMLLinkElementImpl(docPtr()); - break; - case ID_META: - n = new HTMLMetaElementImpl(docPtr()); - break; - case ID_STYLE: - n = new HTMLStyleElementImpl(docPtr()); - break; - case ID_TITLE: - n = new HTMLTitleElementImpl(docPtr()); - break; - -// frames - case ID_FRAME: - n = new HTMLFrameElementImpl(docPtr()); - break; - case ID_FRAMESET: - n = new HTMLFrameSetElementImpl(docPtr()); - break; - case ID_IFRAME: - n = new HTMLIFrameElementImpl(docPtr()); - break; - -// form elements -// ### FIXME: we need a way to set form dependency after we have made the form elements - case ID_FORM: - n = new HTMLFormElementImpl(docPtr(), false); - break; - case ID_BUTTON: - n = new HTMLButtonElementImpl(docPtr()); - break; - case ID_FIELDSET: - n = new HTMLFieldSetElementImpl(docPtr()); - break; - case ID_INPUT: - n = new HTMLInputElementImpl(docPtr()); - break; - case ID_ISINDEX: - n = new HTMLIsIndexElementImpl(docPtr()); - break; - case ID_LABEL: - n = new HTMLLabelElementImpl(docPtr()); - break; - case ID_LEGEND: - n = new HTMLLegendElementImpl(docPtr()); - break; - case ID_OPTGROUP: - n = new HTMLOptGroupElementImpl(docPtr()); - break; - case ID_OPTION: - n = new HTMLOptionElementImpl(docPtr()); - break; - case ID_SELECT: - n = new HTMLSelectElementImpl(docPtr()); - break; - case ID_TEXTAREA: - n = new HTMLTextAreaElementImpl(docPtr()); - break; - -// lists - case ID_DL: - n = new HTMLDListElementImpl(docPtr()); - break; - case ID_DD: - n = new HTMLGenericElementImpl(docPtr(), id); - break; - case ID_DT: - n = new HTMLGenericElementImpl(docPtr(), id); - break; - case ID_UL: - n = new HTMLUListElementImpl(docPtr()); - break; - case ID_OL: - n = new HTMLOListElementImpl(docPtr()); - break; - case ID_DIR: - n = new HTMLDirectoryElementImpl(docPtr()); - break; - case ID_MENU: - n = new HTMLMenuElementImpl(docPtr()); - break; - case ID_LI: - n = new HTMLLIElementImpl(docPtr()); - break; - -// formatting elements (block) - case ID_DIV: - case ID_P: - n = new HTMLDivElementImpl( docPtr(), id ); - break; - case ID_BLOCKQUOTE: - case ID_H1: - case ID_H2: - case ID_H3: - case ID_H4: - case ID_H5: - case ID_H6: - n = new HTMLGenericElementImpl(docPtr(), id); - break; - case ID_HR: - n = new HTMLHRElementImpl(docPtr()); - break; - case ID_PLAINTEXT: - case ID_XMP: - case ID_PRE: - n = new HTMLPreElementImpl(docPtr(), id); - break; - -// font stuff - case ID_BASEFONT: - n = new HTMLBaseFontElementImpl(docPtr()); - break; - case ID_FONT: - n = new HTMLFontElementImpl(docPtr()); - break; - -// ins/del - case ID_DEL: - case ID_INS: - n = new HTMLGenericElementImpl(docPtr(), id); - break; - -// anchor - case ID_A: - n = new HTMLAnchorElementImpl(docPtr()); - break; - -// images - case ID_IMG: - n = new HTMLImageElementImpl(docPtr()); - break; - case ID_MAP: - n = new HTMLMapElementImpl(docPtr()); - /*n = map;*/ - break; - case ID_AREA: - n = new HTMLAreaElementImpl(docPtr()); - break; - -// objects, applets and scripts - case ID_APPLET: - n = new HTMLAppletElementImpl(docPtr()); - break; - case ID_OBJECT: - n = new HTMLObjectElementImpl(docPtr()); - break; - case ID_EMBED: - n = new HTMLEmbedElementImpl(docPtr()); - break; - case ID_PARAM: - n = new HTMLParamElementImpl(docPtr()); - break; - case ID_SCRIPT: - n = new HTMLScriptElementImpl(docPtr()); - break; - -// tables - case ID_TABLE: - n = new HTMLTableElementImpl(docPtr()); - break; - case ID_CAPTION: - n = new HTMLTableCaptionElementImpl(docPtr()); - break; - case ID_COLGROUP: - case ID_COL: - n = new HTMLTableColElementImpl(docPtr(), id); - break; - case ID_TR: - n = new HTMLTableRowElementImpl(docPtr()); - break; - case ID_TD: - case ID_TH: - n = new HTMLTableCellElementImpl(docPtr(), id); - break; - case ID_THEAD: - case ID_TBODY: - case ID_TFOOT: - n = new HTMLTableSectionElementImpl(docPtr(), id, false); - break; - -// inline elements - case ID_BR: - n = new HTMLBRElementImpl(docPtr()); - break; - case ID_Q: - n = new HTMLGenericElementImpl(docPtr(), id); - break; - -// elements with no special representation in the DOM - -// block: - case ID_ADDRESS: - case ID_CENTER: - n = new HTMLGenericElementImpl(docPtr(), id); - break; -// inline - // %fontstyle - case ID_TT: - case ID_U: - case ID_B: - case ID_I: - case ID_S: - case ID_STRIKE: - case ID_BIG: - case ID_SMALL: - - // %phrase - case ID_EM: - case ID_STRONG: - case ID_DFN: - case ID_CODE: - case ID_SAMP: - case ID_KBD: - case ID_VAR: - case ID_CITE: - case ID_ABBR: - case ID_ACRONYM: - - // %special - case ID_SUB: - case ID_SUP: - case ID_SPAN: - case ID_NOBR: - case ID_WBR: - case ID_BDO: - case ID_NOFRAMES: - n = new HTMLGenericElementImpl(docPtr(), id); - break; - - case ID_MARQUEE: - n = new HTMLMarqueeElementImpl(docPtr()); - break; -// text - case ID_TEXT: - kdDebug( 6020 ) << "Use document->createTextNode()" << endl; - break; - - default: - break; - } - return n; -} - -TQString DocumentImpl::nextState() -{ - TQString state; - if (!m_state.isEmpty()) - { - state = m_state.first(); - m_state.remove(m_state.begin()); - } - return state; -} - -TQStringList DocumentImpl::docState() -{ - TQStringList s; - for (TQPtrListIterator it(m_maintainsState); it.current(); ++it) - s.append(it.current()->state()); - - return s; -} - -bool DocumentImpl::unsubmittedFormChanges() -{ - for (TQPtrListIterator it(m_maintainsState); it.current(); ++it) - if (it.current()->state().right(1)=="M") - return true; - - return false; -} - -RangeImpl *DocumentImpl::createRange() -{ - return new RangeImpl( docPtr() ); -} - -NodeIteratorImpl *DocumentImpl::createNodeIterator(NodeImpl *root, unsigned long whatToShow, - NodeFilter &filter, bool entityReferenceExpansion, - int &exceptioncode) -{ - if (!root) { - exceptioncode = DOMException::NOT_SUPPORTED_ERR; - return 0; - } - - return new NodeIteratorImpl(root,whatToShow,filter,entityReferenceExpansion); -} - -TreeWalkerImpl *DocumentImpl::createTreeWalker(NodeImpl *root, unsigned long whatToShow, NodeFilterImpl *filter, - bool entityReferenceExpansion, int &exceptioncode) -{ - if (!root) { - exceptioncode = DOMException::NOT_SUPPORTED_ERR; - return 0; - } - - return new TreeWalkerImpl( root, whatToShow, filter, entityReferenceExpansion ); -} - -void DocumentImpl::setDocumentChanged(bool b) -{ - if (!changedDocuments) - changedDocuments = s_changedDocumentsDeleter.setObject( changedDocuments, new TQPtrList() ); - - if (b && !m_docChanged) - changedDocuments->append(this); - else if (!b && m_docChanged) - changedDocuments->remove(this); - m_docChanged = b; -} - -void DocumentImpl::recalcStyle( StyleChange change ) -{ -// tqDebug("recalcStyle(%p)", this); -// TQTime qt; -// qt.start(); - if (m_inStyleRecalc) - return; // Guard against re-entrancy. -dwh - - m_inStyleRecalc = true; - - if( !m_render ) goto bail_out; - - if ( change == Force ) { - RenderStyle* oldStyle = m_render->style(); - if ( oldStyle ) oldStyle->ref(); - RenderStyle* _style = new RenderStyle(); - _style->setDisplay(BLOCK); - _style->setVisuallyOrdered( visuallyOrdered ); - // ### make the font stuff _really_ work!!!! - - khtml::FontDef fontDef; - TQFont f = TDEGlobalSettings::generalFont(); - fontDef.family = f.family(); - fontDef.italic = f.italic(); - fontDef.weight = f.weight(); - if (m_view) { - const KHTMLSettings *settings = m_view->part()->settings(); - TQString stdfont = settings->stdFontName(); - if ( !stdfont.isEmpty() ) - fontDef.family = stdfont; - - fontDef.size = m_styleSelector->fontSizes()[3]; - } - - //kdDebug() << "DocumentImpl::attach: setting to charset " << settings->charset() << endl; - _style->setFontDef(fontDef); - _style->htmlFont().update( paintDeviceMetrics() ); - if ( inCompatMode() ) - _style->setHtmlHacks(true); // enable html specific rendering tricks - - StyleChange ch = diff( _style, oldStyle ); - if(m_render && ch != NoChange) - m_render->setStyle(_style); - else - delete _style; - if ( change != Force ) - change = ch; - - if (oldStyle) - oldStyle->deref(); - } - - NodeImpl *n; - for (n = _first; n; n = n->nextSibling()) - if ( change>= Inherit || n->hasChangedChild() || n->changed() ) - n->recalcStyle( change ); - //kdDebug( 6020 ) << "TIME: recalcStyle() dt=" << qt.elapsed() << endl; - - if (changed() && m_view) - m_view->layout(); - -bail_out: - setChanged( false ); - setHasChangedChild( false ); - setDocumentChanged( false ); - - m_inStyleRecalc = false; -} - -void DocumentImpl::updateRendering() -{ - if (!hasChangedChild()) return; - -// TQTime time; -// time.start(); -// kdDebug() << "UPDATERENDERING: "<")); - } - m_tokenizer->write(text, false); -} - -void DocumentImpl::writeln( const DOMString &text ) -{ - write(text); - write(DOMString("\n")); -} - -void DocumentImpl::finishParsing ( ) -{ - if(m_tokenizer) - m_tokenizer->finish(); -} - -void DocumentImpl::setUserStyleSheet( const TQString& sheet ) -{ - if ( m_usersheet != sheet ) { - m_usersheet = sheet; - updateStyleSelector(); - } -} - -CSSStyleSheetImpl* DocumentImpl::elementSheet() -{ - if (!m_elemSheet) { - m_elemSheet = new CSSStyleSheetImpl(this, baseURL().url() ); - m_elemSheet->ref(); - } - return m_elemSheet; -} - -void DocumentImpl::determineParseMode( const TQString &/*str*/ ) -{ - // For XML documents, use strict parse mode - pMode = Strict; - hMode = XHtml; - kdDebug(6020) << " using strict parseMode" << endl; -} - -NodeImpl *DocumentImpl::nextFocusNode(NodeImpl *fromNode) -{ - unsigned short fromTabIndex; - - if (!fromNode) { - // No starting node supplied; begin with the top of the document - NodeImpl *n; - - int lowestTabIndex = 65535; - for (n = this; n != 0; n = n->traverseNextNode()) { - if (n->isTabFocusable()) { - if ((n->tabIndex() > 0) && (n->tabIndex() < lowestTabIndex)) - lowestTabIndex = n->tabIndex(); - } - } - - if (lowestTabIndex == 65535) - lowestTabIndex = 0; - - // Go to the first node in the document that has the desired tab index - for (n = this; n != 0; n = n->traverseNextNode()) { - if (n->isTabFocusable() && (n->tabIndex() == lowestTabIndex)) - return n; - } - - return 0; - } - else { - fromTabIndex = fromNode->tabIndex(); - } - - if (fromTabIndex == 0) { - // Just need to find the next selectable node after fromNode (in document order) that doesn't have a tab index - NodeImpl *n = fromNode->traverseNextNode(); - while (n && !(n->isTabFocusable() && n->tabIndex() == 0)) - n = n->traverseNextNode(); - return n; - } - else { - // Find the lowest tab index out of all the nodes except fromNode, that is greater than or equal to fromNode's - // tab index. For nodes with the same tab index as fromNode, we are only interested in those that come after - // fromNode in document order. - // If we don't find a suitable tab index, the next focus node will be one with a tab index of 0. - unsigned short lowestSuitableTabIndex = 65535; - NodeImpl *n; - - bool reachedFromNode = false; - for (n = this; n != 0; n = n->traverseNextNode()) { - if (n->isTabFocusable() && - ((reachedFromNode && (n->tabIndex() >= fromTabIndex)) || - (!reachedFromNode && (n->tabIndex() > fromTabIndex))) && - (n->tabIndex() < lowestSuitableTabIndex) && - (n != fromNode)) { - - // We found a selectable node with a tab index at least as high as fromNode's. Keep searching though, - // as there may be another node which has a lower tab index but is still suitable for use. - lowestSuitableTabIndex = n->tabIndex(); - } - - if (n == fromNode) - reachedFromNode = true; - } - - if (lowestSuitableTabIndex == 65535) { - // No next node with a tab index -> just take first node with tab index of 0 - NodeImpl *n = this; - while (n && !(n->isTabFocusable() && n->tabIndex() == 0)) - n = n->traverseNextNode(); - return n; - } - - // Search forwards from fromNode - for (n = fromNode->traverseNextNode(); n != 0; n = n->traverseNextNode()) { - if (n->isTabFocusable() && (n->tabIndex() == lowestSuitableTabIndex)) - return n; - } - - // The next node isn't after fromNode, start from the beginning of the document - for (n = this; n != fromNode; n = n->traverseNextNode()) { - if (n->isTabFocusable() && (n->tabIndex() == lowestSuitableTabIndex)) - return n; - } - - assert(false); // should never get here - return 0; - } -} - -NodeImpl *DocumentImpl::previousFocusNode(NodeImpl *fromNode) -{ - NodeImpl *lastNode = this; - while (lastNode->lastChild()) - lastNode = lastNode->lastChild(); - - if (!fromNode) { - // No starting node supplied; begin with the very last node in the document - NodeImpl *n; - - int highestTabIndex = 0; - for (n = lastNode; n != 0; n = n->traversePreviousNode()) { - if (n->isTabFocusable()) { - if (n->tabIndex() == 0) - return n; - else if (n->tabIndex() > highestTabIndex) - highestTabIndex = n->tabIndex(); - } - } - - // No node with a tab index of 0; just go to the last node with the highest tab index - for (n = lastNode; n != 0; n = n->traversePreviousNode()) { - if (n->isTabFocusable() && (n->tabIndex() == highestTabIndex)) - return n; - } - - return 0; - } - else { - unsigned short fromTabIndex = fromNode->tabIndex(); - - if (fromTabIndex == 0) { - // Find the previous selectable node before fromNode (in document order) that doesn't have a tab index - NodeImpl *n = fromNode->traversePreviousNode(); - while (n && !(n->isTabFocusable() && n->tabIndex() == 0)) - n = n->traversePreviousNode(); - if (n) - return n; - - // No previous nodes with a 0 tab index, go to the last node in the document that has the highest tab index - int highestTabIndex = 0; - for (n = this; n != 0; n = n->traverseNextNode()) { - if (n->isTabFocusable() && (n->tabIndex() > highestTabIndex)) - highestTabIndex = n->tabIndex(); - } - - if (highestTabIndex == 0) - return 0; - - for (n = lastNode; n != 0; n = n->traversePreviousNode()) { - if (n->isTabFocusable() && (n->tabIndex() == highestTabIndex)) - return n; - } - - assert(false); // should never get here - return 0; - } - else { - // Find the lowest tab index out of all the nodes except fromNode, that is less than or equal to fromNode's - // tab index. For nodes with the same tab index as fromNode, we are only interested in those before - // fromNode. - // If we don't find a suitable tab index, then there will be no previous focus node. - unsigned short highestSuitableTabIndex = 0; - NodeImpl *n; - - bool reachedFromNode = false; - for (n = this; n != 0; n = n->traverseNextNode()) { - if (n->isTabFocusable() && - ((!reachedFromNode && (n->tabIndex() <= fromTabIndex)) || - (reachedFromNode && (n->tabIndex() < fromTabIndex))) && - (n->tabIndex() > highestSuitableTabIndex) && - (n != fromNode)) { - - // We found a selectable node with a tab index no higher than fromNode's. Keep searching though, as - // there may be another node which has a higher tab index but is still suitable for use. - highestSuitableTabIndex = n->tabIndex(); - } - - if (n == fromNode) - reachedFromNode = true; - } - - if (highestSuitableTabIndex == 0) { - // No previous node with a tab index. Since the order specified by HTML is nodes with tab index > 0 - // first, this means that there is no previous node. - return 0; - } - - // Search backwards from fromNode - for (n = fromNode->traversePreviousNode(); n != 0; n = n->traversePreviousNode()) { - if (n->isTabFocusable() && (n->tabIndex() == highestSuitableTabIndex)) - return n; - } - // The previous node isn't before fromNode, start from the end of the document - for (n = lastNode; n != fromNode; n = n->traversePreviousNode()) { - if (n->isTabFocusable() && (n->tabIndex() == highestSuitableTabIndex)) - return n; - } - - assert(false); // should never get here - return 0; - } - } -} - -ElementImpl* DocumentImpl::findAccessKeyElement(TQChar c) -{ - c = c.upper(); - for( NodeImpl* n = this; - n != NULL; - n = n->traverseNextNode()) { - if( n->isElementNode()) { - ElementImpl* en = static_cast< ElementImpl* >( n ); - DOMString s = en->getAttribute( ATTR_ACCESSKEY ); - if( s.length() == 1 - && s[ 0 ].upper() == c ) - return en; - } - } - return NULL; -} - -int DocumentImpl::nodeAbsIndex(NodeImpl *node) -{ - assert(node->getDocument() == this); - - int absIndex = 0; - for (NodeImpl *n = node; n && n != this; n = n->traversePreviousNode()) - absIndex++; - return absIndex; -} - -NodeImpl *DocumentImpl::nodeWithAbsIndex(int absIndex) -{ - NodeImpl *n = this; - for (int i = 0; n && (i < absIndex); i++) { - n = n->traverseNextNode(); - } - return n; -} - -void DocumentImpl::processHttpEquiv(const DOMString &equiv, const DOMString &content) -{ - assert(!equiv.isNull() && !content.isNull()); - - KHTMLView *v = getDocument()->view(); - - if(strcasecmp(equiv, "refresh") == 0 && v && v->part()->metaRefreshEnabled()) - { - // get delay and url - TQString str = content.string().stripWhiteSpace(); - int pos = str.find(TQRegExp("[;,]")); - if ( pos == -1 ) - pos = str.find(TQRegExp("[ \t]")); - - bool ok = false; - int delay = kMax( 0, content.implementation()->toInt(&ok) ); - if ( !ok && str.length() && str[0] == '.' ) - ok = true; - - if (pos == -1) // There can be no url (David) - { - if(ok) - v->part()->scheduleRedirection(delay, v->part()->url().url() ); - } else { - pos++; - while(pos < (int)str.length() && str[pos].isSpace()) pos++; - str = str.mid(pos); - if(str.find("url", 0, false ) == 0) str = str.mid(3); - str = str.stripWhiteSpace(); - if ( str.length() && str[0] == '=' ) str = str.mid( 1 ).stripWhiteSpace(); - while(str.length() && - (str[str.length()-1] == ';' || str[str.length()-1] == ',')) - str.setLength(str.length()-1); - str = parseURL( DOMString(str) ).string(); - TQString newURL = getDocument()->completeURL( str ); - if ( ok ) - v->part()->scheduleRedirection(delay, getDocument()->completeURL( str ), delay < 2 || newURL == URL().url()); - } - } - else if(strcasecmp(equiv, "expires") == 0) - { - bool relative = false; - TQString str = content.string().stripWhiteSpace(); - time_t expire_date = KRFCDate::parseDate(str); - if (!expire_date) - { - expire_date = str.toULong(); - relative = true; - } - if (!expire_date) - expire_date = 1; // expire now - if (m_docLoader) - m_docLoader->setExpireDate(expire_date, relative); - } - else if(v && (strcasecmp(equiv, "pragma") == 0 || strcasecmp(equiv, "cache-control") == 0)) - { - TQString str = content.string().lower().stripWhiteSpace(); - KURL url = v->part()->url(); - if ((str == "no-cache") && url.protocol().startsWith("http")) - { - TDEIO::http_update_cache(url, true, 0); - } - } - else if( (strcasecmp(equiv, "set-cookie") == 0)) - { - // ### make setCookie work on XML documents too; e.g. in case of - HTMLDocumentImpl *d = static_cast(this); - d->setCookie(content); - } - else if (strcasecmp(equiv, "default-style") == 0) { - // HTML 4.0 14.3.2 - // http://www.hixie.ch/tests/evil/css/import/main/preferred.html - m_preferredStylesheetSet = content; - updateStyleSelector(); - } - else if (strcasecmp(equiv, "content-language") == 0) { - m_contentLanguage = content.string(); - } -} - -bool DocumentImpl::prepareMouseEvent( bool readonly, int _x, int _y, MouseEvent *ev ) -{ - if ( m_render ) { - assert(m_render->isCanvas()); - RenderObject::NodeInfo renderInfo(readonly, ev->type == MousePress); - bool isInside = m_render->layer()->nodeAtPoint(renderInfo, _x, _y); - ev->innerNode = renderInfo.innerNode(); - ev->innerNonSharedNode = renderInfo.innerNonSharedNode(); - - if (renderInfo.URLElement()) { - assert(renderInfo.URLElement()->isElementNode()); - //tqDebug("urlnode: %s (%d)", getTagName(renderInfo.URLElement()->id()).string().latin1(), renderInfo.URLElement()->id()); - - ElementImpl* e = static_cast(renderInfo.URLElement()); - DOMString href = khtml::parseURL(e->getAttribute(ATTR_HREF)); - DOMString target = e->getAttribute(ATTR_TARGET); - - if (!target.isNull() && !href.isNull()) { - ev->target = target; - ev->url = href; - } - else - ev->url = href; - } - - if (!readonly) - updateRendering(); - - return isInside; - } - - - return false; -} - - -// DOM Section 1.1.1 -bool DocumentImpl::childTypeAllowed( unsigned short type ) -{ - switch (type) { - case Node::ATTRIBUTE_NODE: - case Node::CDATA_SECTION_NODE: - case Node::DOCUMENT_FRAGMENT_NODE: - case Node::DOCUMENT_NODE: - case Node::ENTITY_NODE: - case Node::ENTITY_REFERENCE_NODE: - case Node::NOTATION_NODE: - case Node::TEXT_NODE: -// case Node::XPATH_NAMESPACE_NODE: - return false; - case Node::COMMENT_NODE: - case Node::PROCESSING_INSTRUCTION_NODE: - return true; - case Node::DOCUMENT_TYPE_NODE: - case Node::ELEMENT_NODE: - // Documents may contain no more than one of each of these. - // (One Element and one DocumentType.) - for (NodeImpl* c = firstChild(); c; c = c->nextSibling()) - if (c->nodeType() == type) - return false; - return true; - } - return false; -} - -NodeImpl *DocumentImpl::cloneNode ( bool /*deep*/ ) -{ - // Spec says cloning Document nodes is "implementation dependent" - // so we do not support it... - return 0; -} - - -typedef const char* (*NameLookupFunction)(unsigned short id); -typedef int (*IdLookupFunction)(const char *tagStr, int len); - -NodeImpl::Id DocumentImpl::getId( NodeImpl::IdType _type, DOMStringImpl* _nsURI, DOMStringImpl *_prefix, - DOMStringImpl *_name, bool readonly, bool /*lookupHTML*/, int *pExceptioncode) -{ - /*kdDebug() << "DocumentImpl::getId( type: " << _type << ", uri: " << DOMString(_nsURI).string() - << ", prefix: " << DOMString(_prefix).string() << ", name: " << DOMString(_name).string() - << ", readonly: " << readonly - << ", lookupHTML: " << lookupHTML - << ", exceptions: " << (pExceptioncode ? "yes" : "no") - << " )" << endl;*/ - - if(!_name) return 0; - IdNameMapping *map; - IdLookupFunction lookup; - - switch (_type) { - case NodeImpl::ElementId: - map = m_elementMap; - lookup = getTagID; - break; - case NodeImpl::AttributeId: - map = m_attrMap; - lookup = getAttrID; - break; - case NodeImpl::NamespaceId: - if( strcasecmp(_name, XHTML_NAMESPACE) == 0) - return xhtmlNamespace; - if( _name->l == 0) - return emptyNamespace; - // defaultNamespace handled by "if (!_name) return 0" - map = m_namespaceMap; - lookup = 0; - break; - default: - return 0; - } - // Names and attributes with "" - if (_name->l == 0) return 0; - - NodeImpl::Id id, nsid = 0; - TQConstString n(_name->s, _name->l); - bool cs = true; // case sensitive - if (_type != NodeImpl::NamespaceId) { - if (_nsURI) - nsid = getId( NodeImpl::NamespaceId, 0, 0, _nsURI, false, false, 0 ) << 16; - - // Each document maintains a mapping of tag name -> id for every tag name encountered - // in the document. - cs = (htmlMode() == XHtml) || (_nsURI && _type != NodeImpl::AttributeId); - - // First see if it's a HTML element name - // xhtml is lower case - case sensitive, easy to implement - if ( cs && (id = lookup(n.string().ascii(), _name->l)) ) { - map->addAlias(_prefix, _name, cs, id); - return nsid + id; - } - // compatibility: upper case - case insensitive - if ( !cs && (id = lookup(n.string().lower().ascii(), _name->l )) ) { - map->addAlias(_prefix, _name, cs, id); - return nsid + id; - } - } - - // Look in the names array for the name - // compatibility mode has to lookup upper case - TQString name = cs ? n.string() : n.string().upper(); - - if (!_nsURI) { - id = (NodeImpl::Id)(long) map->ids.find( name ); - if (!id && _type != NodeImpl::NamespaceId) { - id = (NodeImpl::Id)(long) map->ids.find( "aliases: " + name ); - } - } else { - id = (NodeImpl::Id)(long) map->ids.find( name ); - if (!readonly && id && _prefix && _prefix->l) { - // we were called in registration mode... check if the alias exists - TQConstString px( _prefix->s, _prefix->l ); - TQString qn("aliases: " + (cs ? px.string() : px.string().upper()) + ":" + name); - if (!map->ids.find( qn )) { - map->ids.insert( qn, (void*)id ); - } - } - } - - if (id) return nsid + id; - - // unknown - if (readonly) return 0; - - if ( pExceptioncode && _type != NodeImpl::NamespaceId && !Element::khtmlValidQualifiedName(_name)) { - *pExceptioncode = DOMException::INVALID_CHARACTER_ERR; - return 0; - } - - // Name not found, so let's add it - NodeImpl::Id cid = map->count++ + map->idStart; - map->names.insert( cid, _name ); - _name->ref(); - - map->ids.insert( name, (void*)cid ); - - // and register an alias if needed for DOM1 methods compatibility - map->addAlias(_prefix, _name, cs, cid); - - return nsid + cid; - } - -NodeImpl::Id DocumentImpl::getId( NodeImpl::IdType _type, DOMStringImpl *_nodeName, bool readonly, bool lookupHTML, int *pExceptioncode) -{ - return getId(_type, 0, 0, _nodeName, readonly, lookupHTML, pExceptioncode); -} - -DOMString DocumentImpl::getName( NodeImpl::IdType _type, NodeImpl::Id _id ) const -{ - IdNameMapping *map; - NameLookupFunction lookup; - bool hasNS = (namespacePart(_id) != defaultNamespace); - switch (_type) { - case NodeImpl::ElementId: - map = m_elementMap; - lookup = getTagName; - break; - case NodeImpl::AttributeId: - map = m_attrMap; - lookup = getAttrName; - break; - case NodeImpl::NamespaceId: - if( _id == xhtmlNamespace ) - return XHTML_NAMESPACE; - else - if( _id == emptyNamespace ) - return DOMString(""); - else - if ( _id == defaultNamespace ) - return DOMString(); - map = m_namespaceMap; - lookup = 0; - break; - default: - return DOMString();; - } - _id = localNamePart(_id) ; - if (_id >= map->idStart) { - return map->names[_id]; - } - else if (lookup) { - // ### put them in a cache - if (hasNS) - return DOMString(lookup(_id)).lower(); - else - return lookup(_id); - } else - return DOMString(); -} - -// This method is called whenever a top-level stylesheet has finished loading. -void DocumentImpl::styleSheetLoaded() -{ - // Make sure we knew this sheet was pending, and that our count isn't out of sync. - assert(m_pendingStylesheets > 0); - - m_pendingStylesheets--; - updateStyleSelector(); -} - -DOMString DocumentImpl::selectedStylesheetSet() const -{ - if (!view()) return DOMString(); - - return view()->part()->d->m_sheetUsed; -} - -void DocumentImpl::setSelectedStylesheetSet(const DOMString& s) -{ - // this code is evil - if (view() && view()->part()->d->m_sheetUsed != s.string()) { - view()->part()->d->m_sheetUsed = s.string(); - updateStyleSelector(); - } -} - -void DocumentImpl::addStyleSheet(StyleSheetImpl *sheet, int *exceptioncode) -{ - int excode = 0; - - if (!m_addedStyleSheets) { - m_addedStyleSheets = new StyleSheetListImpl; - m_addedStyleSheets->ref(); - } - - m_addedStyleSheets->add(sheet); - if (sheet->isCSSStyleSheet()) updateStyleSelector(); - - if (exceptioncode) *exceptioncode = excode; -} - -void DocumentImpl::removeStyleSheet(StyleSheetImpl *sheet, int *exceptioncode) -{ - int excode = 0; - bool removed = false; - bool is_css = sheet->isCSSStyleSheet(); - - if (m_addedStyleSheets) { - bool in_main_list = !sheet->hasOneRef(); - removed = m_addedStyleSheets->styleSheets.removeRef(sheet); - sheet->deref(); - - if (m_addedStyleSheets->styleSheets.count() == 0) { - bool reset = m_addedStyleSheets->hasOneRef(); - m_addedStyleSheets->deref(); - if (reset) m_addedStyleSheets = 0; - } - - // remove from main list, too - if (in_main_list) m_styleSheets->remove(sheet); - } - - if (removed) { - if (is_css) updateStyleSelector(); - } else - excode = DOMException::NOT_FOUND_ERR; - - if (exceptioncode) *exceptioncode = excode; -} - -void DocumentImpl::updateStyleSelector(bool shallow) -{ -// kdDebug() << "PENDING " << m_pendingStylesheets << endl; - - // Don't bother updating, since we haven't loaded all our style info yet. - if (m_pendingStylesheets > 0) - return; - - if (shallow) - rebuildStyleSelector(); - else - recalcStyleSelector(); - recalcStyle(Force); -#if 0 - - m_styleSelectorDirty = true; -#endif - if ( renderer() ) - renderer()->setNeedsLayoutAndMinMaxRecalc(); -} - -void DocumentImpl::recalcStyleSelector() -{ - if ( !m_render || !attached() ) return; - - assert(m_pendingStylesheets==0); - - TQPtrList oldStyleSheets = m_styleSheets->styleSheets; - m_styleSheets->styleSheets.clear(); - TQString sheetUsed = view() ? view()->part()->d->m_sheetUsed.replace("&&", "&") : TQString(); - bool autoselect = sheetUsed.isEmpty(); - if (autoselect && !m_preferredStylesheetSet.isEmpty()) - sheetUsed = m_preferredStylesheetSet.string(); - NodeImpl *n; - for (int i=0 ; i<2 ; i++) { - m_availableSheets.clear(); - m_availableSheets << i18n("Basic Page Style"); - bool canResetSheet = false; - - for (n = this; n; n = n->traverseNextNode()) { - StyleSheetImpl *sheet = 0; - - if (n->nodeType() == Node::PROCESSING_INSTRUCTION_NODE) - { - // Processing instruction (XML documents only) - ProcessingInstructionImpl* pi = static_cast(n); - sheet = pi->sheet(); - if (!sheet && !pi->localHref().isEmpty()) - { - // Processing instruction with reference to an element in this document - e.g. - // , with the element - // heading { color: red; } at some location in - // the document - ElementImpl* elem = getElementById(pi->localHref()); - if (elem) { - DOMString sheetText(""); - NodeImpl *c; - for (c = elem->firstChild(); c; c = c->nextSibling()) { - if (c->nodeType() == Node::TEXT_NODE || c->nodeType() == Node::CDATA_SECTION_NODE) - sheetText += c->nodeValue(); - } - - CSSStyleSheetImpl *cssSheet = new CSSStyleSheetImpl(this); - cssSheet->parseString(sheetText); - pi->setStyleSheet(cssSheet); - sheet = cssSheet; - } - } - - } - else if (n->isHTMLElement() && ( n->id() == ID_LINK || n->id() == ID_STYLE) ) { - TQString title; - if ( n->id() == ID_LINK ) { - HTMLLinkElementImpl* l = static_cast(n); - if (l->isCSSStyleSheet()) { - sheet = l->sheet(); - - if (sheet || l->isLoading() || l->isAlternate() ) - title = l->getAttribute(ATTR_TITLE).string(); - - if ((autoselect || title != sheetUsed) && l->isDisabled()) { - sheet = 0; - } else if (!title.isEmpty() && !l->isAlternate() && sheetUsed.isEmpty()) { - sheetUsed = title; - l->setDisabled(false); - } - } - } - else { - //