OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2001 Dirk Mueller (mueller@kde.org) | 4 * (C) 2001 Dirk Mueller (mueller@kde.org) |
5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) | 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) |
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. | 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009 Apple Inc. All rights reserv
ed. |
7 * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) | 7 * Copyright (C) 2008 Torch Mobile Inc. All rights reserved. (http://www.torchmo
bile.com/) |
8 * Copyright (C) 2008 David Levin (levin@chromium.org) | 8 * Copyright (C) 2008 David Levin (levin@chromium.org) |
9 * | 9 * |
10 * This library is free software; you can redistribute it and/or | 10 * This library is free software; you can redistribute it and/or |
(...skipping 1251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1262 if (renderer() && ch != NoChange) | 1262 if (renderer() && ch != NoChange) |
1263 renderer()->setStyle(documentStyle.release()); | 1263 renderer()->setStyle(documentStyle.release()); |
1264 if (change != Force) | 1264 if (change != Force) |
1265 change = ch; | 1265 change = ch; |
1266 } | 1266 } |
1267 | 1267 |
1268 for (Node* n = firstChild(); n; n = n->nextSibling()) | 1268 for (Node* n = firstChild(); n; n = n->nextSibling()) |
1269 if (change >= Inherit || n->hasChangedChild() || n->changed()) | 1269 if (change >= Inherit || n->hasChangedChild() || n->changed()) |
1270 n->recalcStyle(change); | 1270 n->recalcStyle(change); |
1271 | 1271 |
1272 if (view()) { | 1272 if (changed() && view()) |
1273 if (changed()) | 1273 view()->layout(); |
1274 view()->layout(); | |
1275 #if USE(ACCELERATED_COMPOSITING) | |
1276 else { | |
1277 // If we didn't update compositing layers because of layout(), we ne
ed to do so here. | |
1278 view()->updateCompositingLayers(); | |
1279 } | |
1280 #endif | |
1281 } | |
1282 | 1274 |
1283 bail_out: | 1275 bail_out: |
1284 setChanged(NoStyleChange); | 1276 setChanged(NoStyleChange); |
1285 setHasChangedChild(false); | 1277 setHasChangedChild(false); |
1286 setDocumentChanged(false); | 1278 setDocumentChanged(false); |
1287 | 1279 |
1288 resumePostAttachCallbacks(); | 1280 resumePostAttachCallbacks(); |
1289 m_inStyleRecalc = false; | 1281 m_inStyleRecalc = false; |
1290 | 1282 |
1291 // If we wanted to call implicitClose() during recalcStyle, do so now that w
e're finished. | 1283 // If we wanted to call implicitClose() during recalcStyle, do so now that w
e're finished. |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1323 doc->m_docChanged = false; | 1315 doc->m_docChanged = false; |
1324 doc->updateRendering(); | 1316 doc->updateRendering(); |
1325 } | 1317 } |
1326 } | 1318 } |
1327 | 1319 |
1328 void Document::updateLayout() | 1320 void Document::updateLayout() |
1329 { | 1321 { |
1330 if (Element* oe = ownerElement()) | 1322 if (Element* oe = ownerElement()) |
1331 oe->document()->updateLayout(); | 1323 oe->document()->updateLayout(); |
1332 | 1324 |
| 1325 // FIXME: Dave Hyatt's pretty sure we can remove this because layout calls r
ecalcStyle as needed. |
1333 updateRendering(); | 1326 updateRendering(); |
1334 | 1327 |
1335 // Only do a layout if changes have occurred that make it necessary. | 1328 // Only do a layout if changes have occurred that make it necessary. |
1336 FrameView* v = view(); | 1329 FrameView* v = view(); |
1337 if (v && renderer() && (v->layoutPending() || renderer()->needsLayout())) | 1330 if (v && renderer() && (v->layoutPending() || renderer()->needsLayout())) |
1338 v->layout(); | 1331 v->layout(); |
1339 } | 1332 } |
1340 | 1333 |
1341 // FIXME: This is a bad idea and needs to be removed eventually. | 1334 // FIXME: This is a bad idea and needs to be removed eventually. |
1342 // Other browsers load stylesheets before they continue parsing the web page. | 1335 // Other browsers load stylesheets before they continue parsing the web page. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1375 { | 1368 { |
1376 ASSERT(!attached()); | 1369 ASSERT(!attached()); |
1377 ASSERT(!m_inPageCache); | 1370 ASSERT(!m_inPageCache); |
1378 ASSERT(!m_axObjectCache); | 1371 ASSERT(!m_axObjectCache); |
1379 | 1372 |
1380 if (!m_renderArena) | 1373 if (!m_renderArena) |
1381 m_renderArena = new RenderArena(); | 1374 m_renderArena = new RenderArena(); |
1382 | 1375 |
1383 // Create the rendering tree | 1376 // Create the rendering tree |
1384 setRenderer(new (m_renderArena) RenderView(this, view())); | 1377 setRenderer(new (m_renderArena) RenderView(this, view())); |
1385 #if USE(ACCELERATED_COMPOSITING) | |
1386 renderView()->didMoveOnscreen(); | |
1387 #endif | |
1388 | 1378 |
1389 if (!m_styleSelector) { | 1379 if (!m_styleSelector) { |
1390 bool matchAuthorAndUserStyles = true; | 1380 bool matchAuthorAndUserStyles = true; |
1391 if (Settings* docSettings = settings()) | 1381 if (Settings* docSettings = settings()) |
1392 matchAuthorAndUserStyles = docSettings->authorAndUserStylesEnabled()
; | 1382 matchAuthorAndUserStyles = docSettings->authorAndUserStylesEnabled()
; |
1393 m_styleSelector = new CSSStyleSelector(this, userStyleSheet(), m_styleSh
eets.get(), m_mappedElementSheet.get(), !inCompatMode(), matchAuthorAndUserStyle
s); | 1383 m_styleSelector = new CSSStyleSelector(this, userStyleSheet(), m_styleSh
eets.get(), m_mappedElementSheet.get(), !inCompatMode(), matchAuthorAndUserStyle
s); |
1394 } | 1384 } |
1395 | 1385 |
1396 recalcStyle(Force); | 1386 recalcStyle(Force); |
1397 | 1387 |
1398 RenderObject* render = renderer(); | 1388 RenderObject* render = renderer(); |
1399 setRenderer(0); | 1389 setRenderer(0); |
1400 | 1390 |
1401 ContainerNode::attach(); | 1391 ContainerNode::attach(); |
1402 | 1392 |
1403 setRenderer(render); | 1393 setRenderer(render); |
1404 } | 1394 } |
1405 | 1395 |
1406 void Document::detach() | 1396 void Document::detach() |
1407 { | 1397 { |
1408 ASSERT(attached()); | 1398 ASSERT(attached()); |
1409 ASSERT(!m_inPageCache); | 1399 ASSERT(!m_inPageCache); |
1410 | 1400 |
1411 clearAXObjectCache(); | 1401 clearAXObjectCache(); |
1412 stopActiveDOMObjects(); | 1402 stopActiveDOMObjects(); |
1413 | 1403 |
1414 RenderObject* render = renderer(); | 1404 RenderObject* render = renderer(); |
1415 | 1405 |
1416 #if USE(ACCELERATED_COMPOSITING) | |
1417 if (render) | |
1418 renderView()->willMoveOffscreen(); | |
1419 #endif | |
1420 | |
1421 // indicate destruction mode, i.e. attached() but renderer == 0 | 1406 // indicate destruction mode, i.e. attached() but renderer == 0 |
1422 setRenderer(0); | 1407 setRenderer(0); |
1423 | 1408 |
1424 // Empty out these lists as a performance optimization, since detaching | 1409 // Empty out these lists as a performance optimization, since detaching |
1425 // all the individual render objects will cause all the RenderImage | 1410 // all the individual render objects will cause all the RenderImage |
1426 // objects to remove themselves from the lists. | 1411 // objects to remove themselves from the lists. |
1427 m_imageLoadEventDispatchSoonList.clear(); | 1412 m_imageLoadEventDispatchSoonList.clear(); |
1428 m_imageLoadEventDispatchingList.clear(); | 1413 m_imageLoadEventDispatchingList.clear(); |
1429 | 1414 |
1430 m_hoverNode = 0; | 1415 m_hoverNode = 0; |
(...skipping 22 matching lines...) Expand all Loading... |
1453 m_frame = 0; | 1438 m_frame = 0; |
1454 } | 1439 } |
1455 | 1440 |
1456 void Document::removeAllEventListenersFromAllNodes() | 1441 void Document::removeAllEventListenersFromAllNodes() |
1457 { | 1442 { |
1458 size_t size = m_windowEventListeners.size(); | 1443 size_t size = m_windowEventListeners.size(); |
1459 for (size_t i = 0; i < size; ++i) | 1444 for (size_t i = 0; i < size; ++i) |
1460 m_windowEventListeners[i]->setRemoved(true); | 1445 m_windowEventListeners[i]->setRemoved(true); |
1461 m_windowEventListeners.clear(); | 1446 m_windowEventListeners.clear(); |
1462 removeAllDisconnectedNodeEventListeners(); | 1447 removeAllDisconnectedNodeEventListeners(); |
1463 for (Node* node = this; node; node = node->traverseNextNode()) | 1448 removeAllEventListeners(); |
1464 node->removeAllEventListeners(); | 1449 Element* documentElement = this->documentElement(); |
| 1450 for (Node* node = documentElement; node; node = node->traverseNextNode(docum
entElement)) |
| 1451 toEventTargetNode(node)->removeAllEventListeners(); |
1465 } | 1452 } |
1466 | 1453 |
1467 void Document::registerDisconnectedNodeWithEventListeners(Node* node) | 1454 void Document::registerDisconnectedNodeWithEventListeners(Node* node) |
1468 { | 1455 { |
1469 m_disconnectedNodesWithEventListeners.add(node); | 1456 m_disconnectedNodesWithEventListeners.add(node); |
1470 } | 1457 } |
1471 | 1458 |
1472 void Document::unregisterDisconnectedNodeWithEventListeners(Node* node) | 1459 void Document::unregisterDisconnectedNodeWithEventListeners(Node* node) |
1473 { | 1460 { |
1474 m_disconnectedNodesWithEventListeners.remove(node); | 1461 m_disconnectedNodesWithEventListeners.remove(node); |
1475 } | 1462 } |
1476 | 1463 |
1477 void Document::removeAllDisconnectedNodeEventListeners() | 1464 void Document::removeAllDisconnectedNodeEventListeners() |
1478 { | 1465 { |
1479 HashSet<Node*>::iterator end = m_disconnectedNodesWithEventListeners.end(); | 1466 HashSet<Node*>::iterator end = m_disconnectedNodesWithEventListeners.end(); |
1480 for (HashSet<Node*>::iterator i = m_disconnectedNodesWithEventListeners.begi
n(); i != end; ++i) | 1467 for (HashSet<Node*>::iterator i = m_disconnectedNodesWithEventListeners.begi
n(); i != end; ++i) |
1481 (*i)->removeAllEventListeners(); | 1468 EventTargetNodeCast(*i)->removeAllEventListeners(); |
1482 m_disconnectedNodesWithEventListeners.clear(); | 1469 m_disconnectedNodesWithEventListeners.clear(); |
1483 } | 1470 } |
1484 | 1471 |
1485 RenderView* Document::renderView() const | 1472 RenderView* Document::renderView() const |
1486 { | 1473 { |
1487 return toRenderView(renderer()); | 1474 return toRenderView(renderer()); |
1488 } | 1475 } |
1489 | 1476 |
1490 void Document::clearAXObjectCache() | 1477 void Document::clearAXObjectCache() |
1491 { | 1478 { |
(...skipping 1094 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2586 // Remove focus from the existing focus node (if any) | 2573 // Remove focus from the existing focus node (if any) |
2587 if (oldFocusedNode && !oldFocusedNode->m_inDetach) { | 2574 if (oldFocusedNode && !oldFocusedNode->m_inDetach) { |
2588 if (oldFocusedNode->active()) | 2575 if (oldFocusedNode->active()) |
2589 oldFocusedNode->setActive(false); | 2576 oldFocusedNode->setActive(false); |
2590 | 2577 |
2591 oldFocusedNode->setFocus(false); | 2578 oldFocusedNode->setFocus(false); |
2592 | 2579 |
2593 // Dispatch a change event for text fields or textareas that have been e
dited | 2580 // Dispatch a change event for text fields or textareas that have been e
dited |
2594 RenderObject* r = static_cast<RenderObject*>(oldFocusedNode.get()->rende
rer()); | 2581 RenderObject* r = static_cast<RenderObject*>(oldFocusedNode.get()->rende
rer()); |
2595 if (r && (r->isTextArea() || r->isTextField()) && r->isEdited()) { | 2582 if (r && (r->isTextArea() || r->isTextField()) && r->isEdited()) { |
2596 oldFocusedNode->dispatchEventForType(eventNames().changeEvent, true,
false); | 2583 EventTargetNodeCast(oldFocusedNode.get())->dispatchEventForType(even
tNames().changeEvent, true, false); |
2597 if ((r = static_cast<RenderObject*>(oldFocusedNode.get()->renderer()
))) | 2584 if ((r = static_cast<RenderObject*>(oldFocusedNode.get()->renderer()
))) |
2598 r->setEdited(false); | 2585 r->setEdited(false); |
2599 } | 2586 } |
2600 | 2587 |
2601 // Dispatch the blur event and let the node do any other blur related ac
tivities (important for text fields) | 2588 // Dispatch the blur event and let the node do any other blur related ac
tivities (important for text fields) |
2602 oldFocusedNode->dispatchBlurEvent(); | 2589 EventTargetNodeCast(oldFocusedNode.get())->dispatchBlurEvent(); |
2603 | 2590 |
2604 if (m_focusedNode) { | 2591 if (m_focusedNode) { |
2605 // handler shifted focus | 2592 // handler shifted focus |
2606 focusChangeBlocked = true; | 2593 focusChangeBlocked = true; |
2607 newFocusedNode = 0; | 2594 newFocusedNode = 0; |
2608 } | 2595 } |
2609 oldFocusedNode->dispatchUIEvent(eventNames().DOMFocusOutEvent); | 2596 EventTargetNodeCast(oldFocusedNode.get())->dispatchUIEvent(eventNames().
DOMFocusOutEvent); |
2610 if (m_focusedNode) { | 2597 if (m_focusedNode) { |
2611 // handler shifted focus | 2598 // handler shifted focus |
2612 focusChangeBlocked = true; | 2599 focusChangeBlocked = true; |
2613 newFocusedNode = 0; | 2600 newFocusedNode = 0; |
2614 } | 2601 } |
2615 if ((oldFocusedNode.get() == this) && oldFocusedNode->hasOneRef()) | 2602 if ((oldFocusedNode.get() == this) && oldFocusedNode->hasOneRef()) |
2616 return true; | 2603 return true; |
2617 | 2604 |
2618 if (oldFocusedNode.get() == oldFocusedNode->rootEditableElement()) | 2605 if (oldFocusedNode.get() == oldFocusedNode->rootEditableElement()) |
2619 frame()->editor()->didEndEditing(); | 2606 frame()->editor()->didEndEditing(); |
2620 } | 2607 } |
2621 | 2608 |
2622 if (newFocusedNode) { | 2609 if (newFocusedNode) { |
2623 if (newFocusedNode == newFocusedNode->rootEditableElement() && !acceptsE
ditingFocus(newFocusedNode.get())) { | 2610 if (newFocusedNode == newFocusedNode->rootEditableElement() && !acceptsE
ditingFocus(newFocusedNode.get())) { |
2624 // delegate blocks focus change | 2611 // delegate blocks focus change |
2625 focusChangeBlocked = true; | 2612 focusChangeBlocked = true; |
2626 goto SetFocusedNodeDone; | 2613 goto SetFocusedNodeDone; |
2627 } | 2614 } |
2628 // Set focus on the new node | 2615 // Set focus on the new node |
2629 m_focusedNode = newFocusedNode.get(); | 2616 m_focusedNode = newFocusedNode.get(); |
2630 | 2617 |
2631 // Dispatch the focus event and let the node do any other focus related
activities (important for text fields) | 2618 // Dispatch the focus event and let the node do any other focus related
activities (important for text fields) |
2632 m_focusedNode->dispatchFocusEvent(); | 2619 EventTargetNodeCast(m_focusedNode.get())->dispatchFocusEvent(); |
2633 | 2620 |
2634 if (m_focusedNode != newFocusedNode) { | 2621 if (m_focusedNode != newFocusedNode) { |
2635 // handler shifted focus | 2622 // handler shifted focus |
2636 focusChangeBlocked = true; | 2623 focusChangeBlocked = true; |
2637 goto SetFocusedNodeDone; | 2624 goto SetFocusedNodeDone; |
2638 } | 2625 } |
2639 m_focusedNode->dispatchUIEvent(eventNames().DOMFocusInEvent); | 2626 EventTargetNodeCast(m_focusedNode.get())->dispatchUIEvent(eventNames().D
OMFocusInEvent); |
2640 if (m_focusedNode != newFocusedNode) { | 2627 if (m_focusedNode != newFocusedNode) { |
2641 // handler shifted focus | 2628 // handler shifted focus |
2642 focusChangeBlocked = true; | 2629 focusChangeBlocked = true; |
2643 goto SetFocusedNodeDone; | 2630 goto SetFocusedNodeDone; |
2644 } | 2631 } |
2645 m_focusedNode->setFocus(); | 2632 m_focusedNode->setFocus(); |
2646 | 2633 |
2647 if (m_focusedNode.get() == m_focusedNode->rootEditableElement()) | 2634 if (m_focusedNode.get() == m_focusedNode->rootEditableElement()) |
2648 frame()->editor()->didBeginEditing(); | 2635 frame()->editor()->didBeginEditing(); |
2649 | 2636 |
(...skipping 651 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3301 } else { | 3288 } else { |
3302 ASSERT(renderer() == 0 || renderer() == m_savedRenderer); | 3289 ASSERT(renderer() == 0 || renderer() == m_savedRenderer); |
3303 ASSERT(m_renderArena); | 3290 ASSERT(m_renderArena); |
3304 setRenderer(m_savedRenderer); | 3291 setRenderer(m_savedRenderer); |
3305 m_savedRenderer = 0; | 3292 m_savedRenderer = 0; |
3306 } | 3293 } |
3307 } | 3294 } |
3308 | 3295 |
3309 void Document::documentWillBecomeInactive() | 3296 void Document::documentWillBecomeInactive() |
3310 { | 3297 { |
3311 #if USE(ACCELERATED_COMPOSITING) | |
3312 if (renderer()) | |
3313 renderView()->willMoveOffscreen(); | |
3314 #endif | |
3315 | |
3316 HashSet<Element*>::iterator end = m_documentActivationCallbackElements.end()
; | 3298 HashSet<Element*>::iterator end = m_documentActivationCallbackElements.end()
; |
3317 for (HashSet<Element*>::iterator i = m_documentActivationCallbackElements.be
gin(); i != end; ++i) | 3299 for (HashSet<Element*>::iterator i = m_documentActivationCallbackElements.be
gin(); i != end; ++i) |
3318 (*i)->documentWillBecomeInactive(); | 3300 (*i)->documentWillBecomeInactive(); |
3319 } | 3301 } |
3320 | 3302 |
3321 void Document::documentDidBecomeActive() | 3303 void Document::documentDidBecomeActive() |
3322 { | 3304 { |
3323 HashSet<Element*>::iterator end = m_documentActivationCallbackElements.end()
; | 3305 HashSet<Element*>::iterator end = m_documentActivationCallbackElements.end()
; |
3324 for (HashSet<Element*>::iterator i = m_documentActivationCallbackElements.be
gin(); i != end; ++i) | 3306 for (HashSet<Element*>::iterator i = m_documentActivationCallbackElements.be
gin(); i != end; ++i) |
3325 (*i)->documentDidBecomeActive(); | 3307 (*i)->documentDidBecomeActive(); |
3326 | |
3327 #if USE(ACCELERATED_COMPOSITING) | |
3328 if (renderer()) | |
3329 renderView()->didMoveOnscreen(); | |
3330 #endif | |
3331 } | 3308 } |
3332 | 3309 |
3333 void Document::registerForDocumentActivationCallbacks(Element* e) | 3310 void Document::registerForDocumentActivationCallbacks(Element* e) |
3334 { | 3311 { |
3335 m_documentActivationCallbackElements.add(e); | 3312 m_documentActivationCallbackElements.add(e); |
3336 } | 3313 } |
3337 | 3314 |
3338 void Document::unregisterForDocumentActivationCallbacks(Element* e) | 3315 void Document::unregisterForDocumentActivationCallbacks(Element* e) |
3339 { | 3316 { |
3340 m_documentActivationCallbackElements.remove(e); | 3317 m_documentActivationCallbackElements.remove(e); |
(...skipping 1187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4528 } | 4505 } |
4529 } | 4506 } |
4530 } | 4507 } |
4531 return 0; | 4508 return 0; |
4532 } | 4509 } |
4533 | 4510 |
4534 } // namespace WebCore | 4511 } // namespace WebCore |
4535 | 4512 |
4536 | 4513 |
4537 | 4514 |
OLD | NEW |