Document.cpp 144 KB
Newer Older
1
/*
kocienda's avatar
kocienda committed
2 3
 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
 *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4
 *           (C) 2001 Dirk Mueller (mueller@kde.org)
ap's avatar
ap committed
5
 *           (C) 2006 Alexey Proskuryakov (ap@webkit.org)
6
 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserved.
7
 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/)
levin@chromium.org's avatar
levin@chromium.org committed
8
 * Copyright (C) 2008, 2009 Google Inc. All rights reserved.
kocienda's avatar
kocienda committed
9 10 11 12 13 14 15 16 17 18 19 20 21
 *
 * 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
ddkilzer's avatar
ddkilzer committed
22 23
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
kocienda's avatar
kocienda committed
24 25
 */

mjs's avatar
mjs committed
26
#include "config.h"
darin's avatar
darin committed
27
#include "Document.h"
darin's avatar
darin committed
28

29
#include "AXObjectCache.h"
weinig@apple.com's avatar
weinig@apple.com committed
30
#include "AnimationController.h"
darin@apple.com's avatar
darin@apple.com committed
31
#include "Attr.h"
darin's avatar
darin committed
32
#include "CDATASection.h"
weinig's avatar
weinig committed
33 34
#include "CSSHelper.h"
#include "CSSStyleSelector.h"
35
#include "CSSStyleSheet.h"
darin's avatar
darin committed
36
#include "CSSValueKeywords.h"
weinig@apple.com's avatar
weinig@apple.com committed
37
#include "CString.h"
weinig@apple.com's avatar
weinig@apple.com committed
38
#include "CachedCSSStyleSheet.h"
darin's avatar
darin committed
39
#include "Comment.h"
ap@webkit.org's avatar
ap@webkit.org committed
40
#include "Console.h"
oliver's avatar
oliver committed
41
#include "CookieJar.h"
darin's avatar
darin committed
42
#include "DOMImplementation.h"
weinig@apple.com's avatar
weinig@apple.com committed
43
#include "DOMWindow.h"
darin's avatar
darin committed
44
#include "DocLoader.h"
darin's avatar
darin committed
45
#include "DocumentFragment.h"
darin's avatar
darin committed
46
#include "DocumentLoader.h"
darin's avatar
darin committed
47 48
#include "DocumentType.h"
#include "EditingText.h"
andersca's avatar
andersca committed
49
#include "Editor.h"
50
#include "EntityReference.h"
weinig's avatar
 
weinig committed
51
#include "Event.h"
darin's avatar
darin committed
52
#include "EventHandler.h"
darin's avatar
darin committed
53
#include "EventListener.h"
darin's avatar
darin committed
54
#include "EventNames.h"
darin's avatar
darin committed
55
#include "ExceptionCode.h"
56
#include "FocusController.h"
mjs's avatar
mjs committed
57
#include "Frame.h"
ggaren's avatar
ggaren committed
58
#include "FrameLoader.h"
mjs's avatar
mjs committed
59
#include "FrameTree.h"
darin's avatar
darin committed
60
#include "FrameView.h"
61
#include "HTMLAnchorElement.h"
62
#include "HTMLBodyElement.h"
63
#include "HTMLCanvasElement.h"
darin@apple.com's avatar
darin@apple.com committed
64
#include "HTMLCollection.h"
darin's avatar
darin committed
65 66
#include "HTMLDocument.h"
#include "HTMLElementFactory.h"
darin's avatar
darin committed
67
#include "HTMLFrameOwnerElement.h"
darin's avatar
darin committed
68
#include "HTMLHeadElement.h"
darin's avatar
darin committed
69
#include "HTMLInputElement.h"
70
#include "HTMLLinkElement.h"
71
#include "HTMLMapElement.h"
darin's avatar
darin committed
72
#include "HTMLNameCollection.h"
darin's avatar
darin committed
73
#include "HTMLNames.h"
74
#include "HTMLParser.h"
75
#include "HTMLStyleElement.h"
bdash's avatar
bdash committed
76
#include "HTMLTitleElement.h"
ap's avatar
ap committed
77
#include "HTTPParsers.h"
weinig@apple.com's avatar
weinig@apple.com committed
78
#include "HistoryItem.h"
weinig's avatar
weinig committed
79 80
#include "HitTestRequest.h"
#include "HitTestResult.h"
zimmermann@webkit.org's avatar
zimmermann@webkit.org committed
81
#include "ImageLoader.h"
82
#include "InspectorController.h"
83
#include "InspectorTimelineAgent.h"
weinig's avatar
 
weinig committed
84
#include "KeyboardEvent.h"
darin's avatar
darin committed
85
#include "Logging.h"
darin@apple.com's avatar
darin@apple.com committed
86
#include "MappedAttribute.h"
weinig@apple.com's avatar
weinig@apple.com committed
87
#include "MessageEvent.h"
weinig's avatar
 
weinig committed
88
#include "MouseEvent.h"
darin's avatar
darin committed
89
#include "MouseEventWithHitTestResults.h"
weinig's avatar
 
weinig committed
90
#include "MutationEvent.h"
darin's avatar
darin committed
91
#include "NameNodeList.h"
92 93
#include "NodeFilter.h"
#include "NodeIterator.h"
darin@apple.com's avatar
darin@apple.com committed
94
#include "NodeWithIndex.h"
darin's avatar
darin committed
95
#include "OverflowEvent.h"
96
#include "Page.h"
97
#include "PageGroup.h"
ap@apple.com's avatar
ap@apple.com committed
98
#include "PageTransitionEvent.h"
darin's avatar
darin committed
99
#include "PlatformKeyboardEvent.h"
100
#include "ProcessingInstruction.h"
antti's avatar
antti committed
101
#include "ProgressEvent.h"
weinig's avatar
 
weinig committed
102
#include "RegisteredEventListener.h"
darin's avatar
darin committed
103
#include "RenderArena.h"
104
#include "RenderTextControl.h"
105
#include "RenderView.h"
106
#include "RenderWidget.h"
107
#include "ScriptController.h"
mitz@apple.com's avatar
mitz@apple.com committed
108
#include "ScriptElement.h"
109
#include "ScriptEventListener.h"
weinig's avatar
weinig committed
110
#include "SecurityOrigin.h"
darin's avatar
darin committed
111
#include "SegmentedString.h"
darin's avatar
darin committed
112
#include "SelectionController.h"
ggaren's avatar
ggaren committed
113
#include "Settings.h"
114
#include "StyleSheetList.h"
darin's avatar
darin committed
115
#include "TextEvent.h"
darin's avatar
darin committed
116
#include "TextIterator.h"
darin's avatar
darin committed
117
#include "TextResourceDecoder.h"
118
#include "Timer.h"
119
#include "TransformSource.h"
weinig@apple.com's avatar
weinig@apple.com committed
120
#include "TreeWalker.h"
weinig's avatar
 
weinig committed
121
#include "UIEvent.h"
122 123
#include "WebKitAnimationEvent.h"
#include "WebKitTransitionEvent.h"
darin's avatar
darin committed
124
#include "WheelEvent.h"
weinig's avatar
weinig committed
125
#include "XMLHttpRequest.h"
eric@webkit.org's avatar
eric@webkit.org committed
126
#include "XMLNames.h"
darin's avatar
darin committed
127
#include "XMLTokenizer.h"
128
#include "htmlediting.h"
ap@webkit.org's avatar
ap@webkit.org committed
129
#include <wtf/CurrentTime.h>
dsmith@webkit.org's avatar
dsmith@webkit.org committed
130
#include <wtf/HashFunctions.h>
131 132
#include <wtf/MainThread.h>
#include <wtf/PassRefPtr.h>
weinig@apple.com's avatar
weinig@apple.com committed
133
#include <wtf/StdLibExtras.h>
134

135
#if ENABLE(DATABASE)
136
#include "Database.h"
137 138 139
#include "DatabaseThread.h"
#endif

140 141 142 143
#if ENABLE(SHARED_WORKERS)
#include "SharedWorkerRepository.h"
#endif

144 145 146 147
#if ENABLE(DOM_STORAGE)
#include "StorageEvent.h"
#endif

mjs's avatar
mjs committed
148
#if ENABLE(XPATH)
149 150 151 152
#include "XPathEvaluator.h"
#include "XPathExpression.h"
#include "XPathNSResolver.h"
#include "XPathResult.h"
153
#endif
kocienda's avatar
kocienda committed
154

mjs's avatar
mjs committed
155
#if ENABLE(XSLT)
darin's avatar
darin committed
156
#include "XSLTProcessor.h"
157 158
#endif

mjs's avatar
mjs committed
159
#if ENABLE(XBL)
160
#include "XBLBindingManager.h"
161 162
#endif

mjs's avatar
mjs committed
163
#if ENABLE(SVG)
164
#include "SVGDocumentExtensions.h"
eseidel's avatar
eseidel committed
165
#include "SVGElementFactory.h"
166
#include "SVGNames.h"
darin's avatar
darin committed
167 168
#include "SVGZoomEvent.h"
#include "SVGStyleElement.h"
eseidel's avatar
eseidel committed
169 170
#endif

171
#if ENABLE(WML)
172
#include "WMLDocument.h"
173 174 175 176 177
#include "WMLElement.h"
#include "WMLElementFactory.h"
#include "WMLNames.h"
#endif

178 179 180 181 182 183
#if ENABLE(MATHML)
#include "MathMLElement.h"
#include "MathMLElementFactory.h"
#include "MathMLNames.h"
#endif

184 185 186 187
#if ENABLE(XHTMLMP)
#include "HTMLNoScriptElement.h"
#endif

darin's avatar
darin committed
188
using namespace std;
darin's avatar
darin committed
189 190
using namespace WTF;
using namespace Unicode;
darin's avatar
darin committed
191

darin's avatar
darin committed
192 193
namespace WebCore {

194
using namespace HTMLNames;
kocienda's avatar
kocienda committed
195

196
// #define INSTRUMENT_LAYOUT_SCHEDULING 1
hyatt's avatar
hyatt committed
197

198 199 200
// This amount of time must have elapsed before we will even consider scheduling a layout without a delay.
// FIXME: For faster machines this value can really be lowered to 200.  250 is adequate, but a little high
// for dual G5s. :)
darin's avatar
darin committed
201
static const int cLayoutScheduleThreshold = 250;
202

adele's avatar
adele committed
203
// Use 1 to represent the document's default form.
darin's avatar
darin committed
204
static HTMLFormElement* const defaultForm = reinterpret_cast<HTMLFormElement*>(1);
adele's avatar
adele committed
205

eseidel's avatar
eseidel committed
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
// DOM Level 2 says (letters added):
//
// a) Name start characters must have one of the categories Ll, Lu, Lo, Lt, Nl.
// b) Name characters other than Name-start characters must have one of the categories Mc, Me, Mn, Lm, or Nd.
// c) Characters in the compatibility area (i.e. with character code greater than #xF900 and less than #xFFFE) are not allowed in XML names.
// d) Characters which have a font or compatibility decomposition (i.e. those with a "compatibility formatting tag" in field 5 of the database -- marked by field 5 beginning with a "<") are not allowed.
// e) The following characters are treated as name-start characters rather than name characters, because the property file classifies them as Alphabetic: [#x02BB-#x02C1], #x0559, #x06E5, #x06E6.
// f) Characters #x20DD-#x20E0 are excluded (in accordance with Unicode, section 5.14).
// g) Character #x00B7 is classified as an extender, because the property list so identifies it.
// h) Character #x0387 is added as a name character, because #x00B7 is its canonical equivalent.
// i) Characters ':' and '_' are allowed as name-start characters.
// j) Characters '-' and '.' are allowed as name characters.
//
// It also contains complete tables. If we decide it's better, we could include those instead of the following code.

static inline bool isValidNameStart(UChar32 c)
{
    // rule (e) above
    if ((c >= 0x02BB && c <= 0x02C1) || c == 0x559 || c == 0x6E5 || c == 0x6E6)
        return true;

    // rule (i) above
    if (c == ':' || c == '_')
        return true;

    // rules (a) and (f) above
darin's avatar
darin committed
232 233
    const uint32_t nameStartMask = Letter_Lowercase | Letter_Uppercase | Letter_Other | Letter_Titlecase | Number_Letter;
    if (!(Unicode::category(c) & nameStartMask))
eseidel's avatar
eseidel committed
234 235 236 237 238 239 240
        return false;

    // rule (c) above
    if (c >= 0xF900 && c < 0xFFFE)
        return false;

    // rule (d) above
darin's avatar
darin committed
241 242
    DecompositionType decompType = decompositionType(c);
    if (decompType == DecompositionFont || decompType == DecompositionCompat)
eseidel's avatar
eseidel committed
243 244 245 246 247 248
        return false;

    return true;
}

static inline bool isValidNamePart(UChar32 c)
darin's avatar
darin committed
249
{
eseidel's avatar
eseidel committed
250 251 252 253 254 255 256 257 258 259 260 261 262
    // rules (a), (e), and (i) above
    if (isValidNameStart(c))
        return true;

    // rules (g) and (h) above
    if (c == 0x00B7 || c == 0x0387)
        return true;

    // rule (j) above
    if (c == '-' || c == '.')
        return true;

    // rules (b) and (f) above
darin's avatar
darin committed
263 264
    const uint32_t otherNamePartMask = Mark_NonSpacing | Mark_Enclosing | Mark_SpacingCombining | Letter_Modifier | Number_DecimalDigit;
    if (!(Unicode::category(c) & otherNamePartMask))
eseidel's avatar
eseidel committed
265 266 267 268
        return false;

    // rule (c) above
    if (c >= 0xF900 && c < 0xFFFE)
darin's avatar
darin committed
269
        return false;
eseidel's avatar
eseidel committed
270 271

    // rule (d) above
darin's avatar
darin committed
272 273
    DecompositionType decompType = decompositionType(c);
    if (decompType == DecompositionFont || decompType == DecompositionCompat)
eseidel's avatar
eseidel committed
274 275
        return false;

darin's avatar
darin committed
276 277 278
    return true;
}

ggaren's avatar
ggaren committed
279
static Widget* widgetForNode(Node* focusedNode)
darin@apple.com's avatar
darin@apple.com committed
280
{
ggaren's avatar
ggaren committed
281 282 283 284 285
    if (!focusedNode)
        return 0;
    RenderObject* renderer = focusedNode->renderer();
    if (!renderer || !renderer->isWidget())
        return 0;
286
    return toRenderWidget(renderer)->widget();
ggaren's avatar
ggaren committed
287 288 289 290
}

static bool acceptsEditingFocus(Node *node)
{
ggaren's avatar
ggaren committed
291 292
    ASSERT(node);
    ASSERT(node->isContentEditable());
ggaren's avatar
ggaren committed
293 294 295 296 297 298 299 300 301

    Node *root = node->rootEditableElement();
    Frame* frame = node->document()->frame();
    if (!frame || !root)
        return false;

    return frame->editor()->shouldBeginEditing(rangeOfContents(root).get());
}

adele@apple.com's avatar
adele@apple.com committed
302 303
static bool disableRangeMutation(Page* page)
{
304
#if PLATFORM(MAC)
adele@apple.com's avatar
adele@apple.com committed
305 306 307
    // Disable Range mutation on document modifications in Tiger and Leopard Mail
    // See <rdar://problem/5865171>
    return page && (page->settings()->needsLeopardMailQuirks() || page->settings()->needsTigerMailQuirks());
308 309 310
#else
    return false;
#endif
adele@apple.com's avatar
adele@apple.com committed
311 312
}

313
static HashSet<Document*>* documentsThatNeedStyleRecalc = 0;
314

weinig@apple.com's avatar
weinig@apple.com committed
315
Document::Document(Frame* frame, bool isXHTML)
darin's avatar
darin committed
316
    : ContainerNode(0)
darin's avatar
darin committed
317
    , m_domtree_version(0)
318
    , m_styleSheets(StyleSheetList::create(this))
319
    , m_styleRecalcTimer(this, &Document::styleRecalcTimerFired)
darin@apple.com's avatar
darin@apple.com committed
320
    , m_frameElementsShouldIgnoreScrolling(false)
darin's avatar
darin committed
321 322
    , m_title("")
    , m_titleSetExplicitly(false)
darin's avatar
darin committed
323
    , m_updateFocusAppearanceTimer(this, &Document::updateFocusAppearanceTimerFired)
mitz@apple.com's avatar
mitz@apple.com committed
324
    , m_executeScriptSoonTimer(this, &Document::executeScriptSoonTimerFired)
ap's avatar
ap committed
325 326
    , m_xmlVersion("1.0")
    , m_xmlStandalone(false)
mjs's avatar
mjs committed
327
#if ENABLE(XBL)
ap's avatar
ap committed
328
    , m_bindingManager(new XBLBindingManager(this))
329
#endif
adele's avatar
adele committed
330 331 332
    , m_savedRenderer(0)
    , m_secureForms(0)
    , m_designMode(inherit)
333
    , m_selfOnlyRefCount(0)
mjs's avatar
mjs committed
334
#if ENABLE(SVG)
darin's avatar
darin committed
335 336
    , m_svgExtensions(0)
#endif
ddkilzer@apple.com's avatar
ddkilzer@apple.com committed
337
#if ENABLE(DASHBOARD_SUPPORT)
rjw's avatar
rjw committed
338
    , m_hasDashboardRegions(false)
rjw's avatar
rjw committed
339
    , m_dashboardRegionsDirty(false)
ddkilzer@apple.com's avatar
ddkilzer@apple.com committed
340
#endif
341 342 343
    , m_accessKeyMapValid(false)
    , m_createRenderers(true)
    , m_inPageCache(false)
beidson's avatar
beidson committed
344
    , m_useSecureKeyboardEntryWhenActive(false)
345
    , m_isXHTML(isXHTML)
weinig@apple.com's avatar
weinig@apple.com committed
346
    , m_numNodeListCaches(0)
mjs@apple.com's avatar
mjs@apple.com committed
347 348 349
#if ENABLE(DATABASE)
    , m_hasOpenDatabases(false)
#endif
ddkilzer@apple.com's avatar
ddkilzer@apple.com committed
350
    , m_usingGeolocation(false)
351 352 353
#if ENABLE(WML)
    , m_containsWMLContent(false)
#endif
kocienda's avatar
kocienda committed
354
{
355
    m_document = this;
356

357 358
    m_pageGroupUserSheetCacheValid = false;

359
    m_printing = false;
adele@apple.com's avatar
adele@apple.com committed
360 361
    
    m_ignoreAutofocus = false;
kocienda's avatar
kocienda committed
362

mjs's avatar
mjs committed
363
    m_frame = frame;
364
    m_renderArena = 0;
365

366
    m_axObjectCache = 0;
367
    
eric@webkit.org's avatar
eric@webkit.org committed
368
    m_docLoader = new DocLoader(this);
kocienda's avatar
kocienda committed
369 370

    visuallyOrdered = false;
371
    m_bParsing = false;
kocienda's avatar
kocienda committed
372
    m_tokenizer = 0;
ap's avatar
ap committed
373
    m_wellFormed = false;
374

375 376
    setParseMode(Strict);

377
    m_textColor = Color::black;
kocienda's avatar
kocienda committed
378
    m_listenerTypes = 0;
379
    m_inDocument = true;
380
    m_inStyleRecalc = false;
381
    m_closeAfterStyleRecalc = false;
hyatt@apple.com's avatar
hyatt@apple.com committed
382

383
    m_usesDescendantRules = false;
384
    m_usesSiblingRules = false;
385
    m_usesFirstLineRules = false;
weinig's avatar
weinig committed
386
    m_usesFirstLetterRules = false;
387
    m_usesBeforeAfterRules = false;
hyatt@apple.com's avatar
hyatt@apple.com committed
388 389
    m_usesRemUnits = false;

thatcher's avatar
thatcher committed
390
    m_gotoAnchorNeededAfterStylesheetsLoad = false;
391 392
 
    m_styleSelector = 0;
ddkilzer's avatar
ddkilzer committed
393
    m_didCalculateStyleSelector = false;
hyatt's avatar
hyatt committed
394
    m_pendingStylesheets = 0;
mjs's avatar
mjs committed
395
    m_ignorePendingStylesheets = false;
antti's avatar
antti committed
396
    m_hasNodesWithPlaceholderStyle = false;
397
    m_pendingSheetLayout = NoLayoutWithPendingSheets;
398 399

    m_cssTarget = 0;
400

401 402 403 404
    resetLinkColor();
    resetVisitedLinkColor();
    resetActiveLinkColor();

405
    m_processingLoadEvent = false;
darin's avatar
darin committed
406
    m_startTime = currentTime();
407
    m_overMinimumLayoutThreshold = false;
kocienda's avatar
kocienda committed
408
    
abarth@webkit.org's avatar
abarth@webkit.org committed
409
    initSecurityContext();
collinj@webkit.org's avatar
 
collinj@webkit.org committed
410
    initDNSPrefetch();
weinig's avatar
weinig committed
411

412 413
    static int docID = 0;
    m_docID = docID++;
414 415 416
#if ENABLE(XHTMLMP)
    m_shouldProcessNoScriptElement = settings() && !settings()->isJavaScriptEnabled();
#endif
kocienda's avatar
kocienda committed
417 418
}

darin's avatar
darin committed
419
void Document::removedLastRef()
mjs's avatar
mjs committed
420
{
darin's avatar
darin committed
421
    ASSERT(!m_deletionHasBegun);
mjs's avatar
mjs committed
422
    if (m_selfOnlyRefCount) {
darin's avatar
darin committed
423
        // If removing a child removes the last self-only ref, we don't
mjs's avatar
mjs committed
424 425
        // want the document to be destructed until after
        // removeAllChildren returns, so we guard ourselves with an
darin's avatar
darin committed
426
        // extra self-only ref.
427
        selfOnlyRef();
mjs's avatar
mjs committed
428

darin's avatar
darin committed
429 430
        // We must make sure not to be retaining any of our children through
        // these extra pointers or we will create a reference cycle.
mjs's avatar
mjs committed
431
        m_docType = 0;
ggaren's avatar
ggaren committed
432
        m_focusedNode = 0;
mjs's avatar
mjs committed
433 434 435
        m_hoverNode = 0;
        m_activeNode = 0;
        m_titleElement = 0;
thatcher's avatar
thatcher committed
436
        m_documentElement = 0;
mjs's avatar
mjs committed
437 438

        removeAllChildren();
mjs's avatar
mjs committed
439

darin's avatar
darin committed
440
        deleteAllValues(m_markers);
mjs's avatar
mjs committed
441
        m_markers.clear();
mjs's avatar
mjs committed
442 443 444

        delete m_tokenizer;
        m_tokenizer = 0;
darin's avatar
darin committed
445

446 447
        m_cssCanvasElements.clear();

darin's avatar
darin committed
448 449 450
#ifndef NDEBUG
        m_inRemovedLastRefFunction = false;
#endif
451 452

        selfOnlyDeref();
harrison's avatar
harrison committed
453 454
    } else {
#ifndef NDEBUG
darin's avatar
darin committed
455
        m_deletionHasBegun = true;
harrison's avatar
harrison committed
456
#endif
mjs's avatar
mjs committed
457
        delete this;
harrison's avatar
harrison committed
458
    }
mjs's avatar
mjs committed
459 460
}

darin's avatar
darin committed
461
Document::~Document()
kocienda's avatar
kocienda committed
462
{
463 464 465
    ASSERT(!renderer());
    ASSERT(!m_inPageCache);
    ASSERT(!m_savedRenderer);
darin@apple.com's avatar
darin@apple.com committed
466
    ASSERT(m_ranges.isEmpty());
467
    ASSERT(!m_styleRecalcTimer.isActive());
468

mitz@apple.com's avatar
mitz@apple.com committed
469 470 471
    for (size_t i = 0; i < m_scriptsToExecuteSoon.size(); ++i)
        m_scriptsToExecuteSoon[i].first->element()->deref(); // Balances ref() in executeScriptSoon().

472
    removeAllEventListeners();
darin's avatar
darin committed
473

474
#if USE(JSC)
darin@apple.com's avatar
darin@apple.com committed
475
    forgetAllDOMNodesForDocument(this);
476
#endif
mjs's avatar
mjs committed
477

darin's avatar
darin committed
478
    delete m_tokenizer;
479
    m_document = 0;
kocienda's avatar
kocienda committed
480 481
    delete m_styleSelector;
    delete m_docLoader;
adele's avatar
adele committed
482
    
darin's avatar
darin committed
483
    if (m_renderArena) {
484 485 486
        delete m_renderArena;
        m_renderArena = 0;
    }
487

mjs's avatar
mjs committed
488
#if ENABLE(XBL)
489 490 491
    delete m_bindingManager;
#endif

darin's avatar
darin committed
492 493
    deleteAllValues(m_markers);

harrison@apple.com's avatar
harrison@apple.com committed
494 495
    clearAXObjectCache();

eseidel's avatar
eseidel committed
496
    m_decoder = 0;
kocienda's avatar
kocienda committed
497
    
andersca's avatar
andersca committed
498 499 500
    unsigned count = sizeof(m_nameCollectionInfo) / sizeof(m_nameCollectionInfo[0]);
    for (unsigned i = 0; i < count; i++)
        deleteAllValues(m_nameCollectionInfo[i]);
501

502
#if ENABLE(DATABASE)
beidson's avatar
beidson committed
503
    if (m_databaseThread) {
beidson@apple.com's avatar
beidson@apple.com committed
504
        ASSERT(m_databaseThread->terminationRequested());
beidson's avatar
beidson committed
505 506
        m_databaseThread = 0;
    }
507
#endif
beidson's avatar
beidson committed
508

509 510
    if (m_styleSheets)
        m_styleSheets->documentDestroyed();
kocienda's avatar
kocienda committed
511 512
}

darin's avatar
darin committed
513
void Document::resetLinkColor()
514
{
515
    m_linkColor = Color(0, 0, 238);
516 517
}

darin's avatar
darin committed
518
void Document::resetVisitedLinkColor()
519
{
520
    m_visitedLinkColor = Color(85, 26, 139);    
521 522
}

darin's avatar
darin committed
523
void Document::resetActiveLinkColor()
524
{
525
    m_activeLinkColor.setNamedColor("red");
526
}
527

darin's avatar
darin committed
528
void Document::setDocType(PassRefPtr<DocumentType> docType)
529
{
530 531 532 533 534
    // This should never be called more than once.
    // Note: This is not a public DOM method and can only be called by the parser.
    ASSERT(!m_docType || !docType);
    if (m_docType && docType)
        return;
535
    m_docType = docType;
536 537 538
    if (m_docType)
        m_docType->setDocument(this);
    determineParseMode();
kocienda's avatar
kocienda committed
539 540
}

darin's avatar
darin committed
541
DOMImplementation* Document::implementation() const
kocienda's avatar
kocienda committed
542
{
weinig@apple.com's avatar
weinig@apple.com committed
543 544
    if (!m_implementation)
        m_implementation = DOMImplementation::create();
darin's avatar
darin committed
545
    return m_implementation.get();
kocienda's avatar
kocienda committed
546 547
}

548
void Document::childrenChanged(bool changedByParser, Node* beforeChange, Node* afterChange, int childCountDelta)
thatcher's avatar
thatcher committed
549
{
550 551 552
    ContainerNode::childrenChanged(changedByParser, beforeChange, afterChange, childCountDelta);
    
    // Invalidate the document element we have cached in case it was replaced.
thatcher's avatar
thatcher committed
553 554 555
    m_documentElement = 0;
}

556
void Document::cacheDocumentElement() const
kocienda's avatar
kocienda committed
557
{
558 559 560 561 562
    ASSERT(!m_documentElement);
    Node* n = firstChild();
    while (n && !n->isElementNode())
        n = n->nextSibling();
    m_documentElement = static_cast<Element*>(n);
kocienda's avatar
kocienda committed
563 564
}

565
PassRefPtr<Element> Document::createElement(const AtomicString& name, ExceptionCode& ec)
kocienda's avatar
kocienda committed
566
{
eric@webkit.org's avatar
eric@webkit.org committed
567 568 569 570 571 572
    if (!isValidName(name)) {
        ec = INVALID_CHARACTER_ERR;
        return 0;
    }

    if (m_isXHTML)
573
        return HTMLElementFactory::createHTMLElement(QualifiedName(nullAtom, name, xhtmlNamespaceURI), this, 0, false);
kmccullo's avatar
kmccullo committed
574

jchaffraix@webkit.org's avatar
jchaffraix@webkit.org committed
575
    return createElement(QualifiedName(nullAtom, name, nullAtom), false);
kocienda's avatar
kocienda committed
576 577
}

darin's avatar
darin committed
578
PassRefPtr<DocumentFragment> Document::createDocumentFragment()
579
{
580
    return DocumentFragment::create(document());
581 582
}

darin@apple.com's avatar
darin@apple.com committed
583
PassRefPtr<Text> Document::createTextNode(const String& data)
584
{
585
    return Text::create(this, data);
586 587
}

darin@apple.com's avatar
darin@apple.com committed
588
PassRefPtr<Comment> Document::createComment(const String& data)
589
{
590
    return Comment::create(this, data);
591 592
}

darin@apple.com's avatar
darin@apple.com committed
593
PassRefPtr<CDATASection> Document::createCDATASection(const String& data, ExceptionCode& ec)
594
{
darin's avatar
darin committed
595
    if (isHTMLDocument()) {
darin's avatar
darin committed
596
        ec = NOT_SUPPORTED_ERR;
darin's avatar
darin committed
597
        return 0;
darin's avatar
darin committed
598
    }
599
    return CDATASection::create(this, data);
600 601
}

darin@apple.com's avatar
darin@apple.com committed
602
PassRefPtr<ProcessingInstruction> Document::createProcessingInstruction(const String& target, const String& data, ExceptionCode& ec)
603
{
darin's avatar
darin committed
604
    if (!isValidName(target)) {
darin's avatar
darin committed
605
        ec = INVALID_CHARACTER_ERR;
606
        return 0;
darin's avatar
darin committed
607 608
    }
    if (isHTMLDocument()) {
darin's avatar
darin committed
609
        ec = NOT_SUPPORTED_ERR;
610
        return 0;
darin's avatar
darin committed
611
    }
612
    return ProcessingInstruction::create(this, target, data);
613 614
}

darin@apple.com's avatar
darin@apple.com committed
615
PassRefPtr<EntityReference> Document::createEntityReference(const String& name, ExceptionCode& ec)
616
{
darin's avatar
darin committed
617
    if (!isValidName(name)) {
darin's avatar
darin committed
618
        ec = INVALID_CHARACTER_ERR;
darin's avatar
darin committed
619
        return 0;
darin's avatar
darin committed
620 621
    }
    if (isHTMLDocument()) {
darin's avatar
darin committed
622
        ec = NOT_SUPPORTED_ERR;
darin's avatar
darin committed
623
        return 0;
darin's avatar
darin committed
624
    }
625
    return EntityReference::create(this, name);
626 627
}

darin@apple.com's avatar
darin@apple.com committed
628
PassRefPtr<EditingText> Document::createEditingTextNode(const String& text)
kocienda's avatar
kocienda committed
629
{
630
    return EditingText::create(this, text);
kocienda's avatar
kocienda committed
631 632
}

darin's avatar
darin committed
633
PassRefPtr<CSSStyleDeclaration> Document::createCSSStyleDeclaration()
kocienda's avatar
kocienda committed
634
{
darin@apple.com's avatar
darin@apple.com committed
635
    return CSSMutableStyleDeclaration::create();
kocienda's avatar
kocienda committed
636 637
}

darin's avatar
darin committed
638
PassRefPtr<Node> Document::importNode(Node* importedNode, bool deep, ExceptionCode& ec)
639
{
darin's avatar
darin committed
640
    ec = 0;
ggaren's avatar
ggaren committed
641
    
oliver's avatar
oliver committed
642
    if (!importedNode
ddkilzer@apple.com's avatar
ddkilzer@apple.com committed
643
#if ENABLE(SVG) && ENABLE(DASHBOARD_SUPPORT)
oliver's avatar
oliver committed
644 645 646
        || (importedNode->isSVGElement() && page() && page()->settings()->usesDashboardBackwardCompatibilityMode())
#endif
        ) {
ggaren's avatar
ggaren committed
647 648 649
        ec = NOT_SUPPORTED_ERR;
        return 0;
    }
darin's avatar
darin committed
650

darin's avatar
darin committed
651
    switch (importedNode->nodeType()) {
darin's avatar
darin committed
652
        case TEXT_NODE:
darin's avatar
darin committed
653
            return createTextNode(importedNode->nodeValue());
darin's avatar
darin committed
654 655 656 657 658 659 660
        case CDATA_SECTION_NODE:
            return createCDATASection(importedNode->nodeValue(), ec);
        case ENTITY_REFERENCE_NODE:
            return createEntityReference(importedNode->nodeName(), ec);
        case PROCESSING_INSTRUCTION_NODE:
            return createProcessingInstruction(importedNode->nodeName(), importedNode->nodeValue(), ec);
        case COMMENT_NODE:
darin's avatar
darin committed
661
            return createComment(importedNode->nodeValue());
darin's avatar
darin committed
662
        case ELEMENT_NODE: {
ap's avatar
ap committed
663
            Element* oldElement = static_cast<Element*>(importedNode);
mjs's avatar
mjs committed
664
            RefPtr<Element> newElement = createElementNS(oldElement->namespaceURI(), oldElement->tagQName().toString(), ec);
darin's avatar
darin committed
665
                        
ap's avatar
ap committed
666
            if (ec)
darin's avatar
darin committed
667
                return 0;
darin's avatar
darin committed
668

669
            NamedNodeMap* attrs = oldElement->attributes(true);
darin's avatar
darin committed
670 671 672
            if (attrs) {
                unsigned length = attrs->length();
                for (unsigned i = 0; i < length; i++) {
darin's avatar
darin committed
673
                    Attribute* attr = attrs->attributeItem(i);
darin's avatar
darin committed
674
                    newElement->setAttribute(attr->name(), attr->value().impl(), ec);
ap's avatar
ap committed
675
                    if (ec)
darin's avatar
darin committed
676 677 678 679
                        return 0;
                }
            }

680 681
            newElement->copyNonAttributeProperties(oldElement);

darin's avatar
darin committed
682
            if (deep) {
darin's avatar
darin committed
683 684
                for (Node* oldChild = oldElement->firstChild(); oldChild; oldChild = oldChild->nextSibling()) {
                    RefPtr<Node> newChild = importNode(oldChild, true, ec);
ap's avatar
ap committed
685
                    if (ec)
darin's avatar
darin committed
686
                        return 0;
darin's avatar
darin committed
687
                    newElement->appendChild(newChild.release(), ec);
ap's avatar
ap committed
688
                    if (ec)
darin's avatar
darin committed
689 690 691 692
                        return 0;
                }
            }

darin's avatar
darin committed
693
            return newElement.release();
darin's avatar
darin committed
694
        }
695 696
        case ATTRIBUTE_NODE:
            return Attr::create(0, this, static_cast<Attr*>(importedNode)->attr()->clone());
ap's avatar
ap committed
697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712
        case DOCUMENT_FRAGMENT_NODE: {
            DocumentFragment* oldFragment = static_cast<DocumentFragment*>(importedNode);
            RefPtr<DocumentFragment> newFragment = createDocumentFragment();
            if (deep) {
                for (Node* oldChild = oldFragment->firstChild(); oldChild; oldChild = oldChild->nextSibling()) {
                    RefPtr<Node> newChild = importNode(oldChild, true, ec);
                    if (ec)
                        return 0;
                    newFragment->appendChild(newChild.release(), ec);
                    if (ec)
                        return 0;
                }
            }
            
            return newFragment.release();
        }
darin's avatar
darin committed
713
        case ENTITY_NODE:
ap's avatar
ap committed
714 715 716
        case NOTATION_NODE:
            // FIXME: It should be possible to import these node types, however in DOM3 the DocumentType is readonly, so there isn't much sense in doing that.
            // Ability to add these imported nodes to a DocumentType will be considered for addition to a future release of the DOM.
darin's avatar
darin committed
717 718
        case DOCUMENT_NODE:
        case DOCUMENT_TYPE_NODE:
719
        case XPATH_NAMESPACE_NODE:
darin's avatar
darin committed
720
            break;
darin's avatar
darin committed
721 722
    }

darin's avatar
darin committed
723
    ec = NOT_SUPPORTED_ERR;
darin's avatar
darin committed
724
    return 0;
725 726
}

727

darin's avatar
darin committed
728
PassRefPtr<Node> Document::adoptNode(PassRefPtr<Node> source, ExceptionCode& ec)
729
{
ggaren's avatar
ggaren committed
730 731
    if (!source) {
        ec = NOT_SUPPORTED_ERR;
732
        return 0;
ggaren's avatar
ggaren committed
733
    }
eric@webkit.org's avatar
eric@webkit.org committed
734 735 736 737 738 739

    if (source->isReadOnlyNode()) {
        ec = NO_MODIFICATION_ALLOWED_ERR;
        return 0;
    }

740
    switch (source->nodeType()) {
darin's avatar
darin committed
741 742 743