OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved. | 2 * Copyright (C) 2006, 2007, 2008, 2010 Apple Inc. All rights reserved. |
3 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) | 3 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
492 } | 492 } |
493 | 493 |
494 MediaQueryList* LocalDOMWindow::matchMedia(const String& media) | 494 MediaQueryList* LocalDOMWindow::matchMedia(const String& media) |
495 { | 495 { |
496 return document() ? document()->mediaQueryMatcher().matchMedia(media) : null
ptr; | 496 return document() ? document()->mediaQueryMatcher().matchMedia(media) : null
ptr; |
497 } | 497 } |
498 | 498 |
499 void LocalDOMWindow::willDetachFrameHost() | 499 void LocalDOMWindow::willDetachFrameHost() |
500 { | 500 { |
501 frame()->host()->eventHandlerRegistry().didRemoveAllEventHandlers(*this); | 501 frame()->host()->eventHandlerRegistry().didRemoveAllEventHandlers(*this); |
502 LocalDOMWindow::notifyContextDestroyed(); | |
503 } | 502 } |
504 | 503 |
505 void LocalDOMWindow::frameDestroyed() | 504 void LocalDOMWindow::frameDestroyed() |
506 { | 505 { |
507 willDestroyDocumentInFrame(); | 506 willDestroyDocumentInFrame(); |
508 resetLocation(); | 507 resetLocation(); |
509 m_properties.clear(); | 508 m_properties.clear(); |
510 removeAllEventListeners(); | 509 removeAllEventListeners(); |
511 } | 510 } |
512 | 511 |
(...skipping 12 matching lines...) Expand all Loading... |
525 void LocalDOMWindow::registerProperty(DOMWindowProperty* property) | 524 void LocalDOMWindow::registerProperty(DOMWindowProperty* property) |
526 { | 525 { |
527 m_properties.add(property); | 526 m_properties.add(property); |
528 } | 527 } |
529 | 528 |
530 void LocalDOMWindow::unregisterProperty(DOMWindowProperty* property) | 529 void LocalDOMWindow::unregisterProperty(DOMWindowProperty* property) |
531 { | 530 { |
532 m_properties.remove(property); | 531 m_properties.remove(property); |
533 } | 532 } |
534 | 533 |
| 534 void LocalDOMWindow::registerEventListenerObserver(EventListenerObserver* eventL
istenerObserver) |
| 535 { |
| 536 m_eventListenerObservers.add(eventListenerObserver); |
| 537 } |
| 538 |
535 void LocalDOMWindow::reset() | 539 void LocalDOMWindow::reset() |
536 { | 540 { |
537 m_frameObserver->contextDestroyed(); | 541 m_frameObserver->contextDestroyed(); |
538 | 542 |
539 m_screen = nullptr; | 543 m_screen = nullptr; |
540 m_history = nullptr; | 544 m_history = nullptr; |
541 m_locationbar = nullptr; | 545 m_locationbar = nullptr; |
542 m_menubar = nullptr; | 546 m_menubar = nullptr; |
543 m_personalbar = nullptr; | 547 m_personalbar = nullptr; |
544 m_scrollbars = nullptr; | 548 m_scrollbars = nullptr; |
545 m_statusbar = nullptr; | 549 m_statusbar = nullptr; |
546 m_toolbar = nullptr; | 550 m_toolbar = nullptr; |
547 m_navigator = nullptr; | 551 m_navigator = nullptr; |
548 m_media = nullptr; | 552 m_media = nullptr; |
549 m_customElements = nullptr; | 553 m_customElements = nullptr; |
550 m_applicationCache = nullptr; | 554 m_applicationCache = nullptr; |
551 | |
552 LocalDOMWindow::notifyContextDestroyed(); | |
553 } | 555 } |
554 | 556 |
555 void LocalDOMWindow::sendOrientationChangeEvent() | 557 void LocalDOMWindow::sendOrientationChangeEvent() |
556 { | 558 { |
557 ASSERT(RuntimeEnabledFeatures::orientationEventEnabled()); | 559 ASSERT(RuntimeEnabledFeatures::orientationEventEnabled()); |
558 ASSERT(frame()->isMainFrame()); | 560 ASSERT(frame()->isMainFrame()); |
559 | 561 |
560 // Before dispatching the event, build a list of all frames in the page | 562 // Before dispatching the event, build a list of all frames in the page |
561 // to send the event to, to mitigate side effects from event handlers | 563 // to send the event to, to mitigate side effects from event handlers |
562 // potentially interfering with others. | 564 // potentially interfering with others. |
(...skipping 797 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1360 | 1362 |
1361 void LocalDOMWindow::addedEventListener(const AtomicString& eventType, Registere
dEventListener& registeredListener) | 1363 void LocalDOMWindow::addedEventListener(const AtomicString& eventType, Registere
dEventListener& registeredListener) |
1362 { | 1364 { |
1363 DOMWindow::addedEventListener(eventType, registeredListener); | 1365 DOMWindow::addedEventListener(eventType, registeredListener); |
1364 if (frame() && frame()->host()) | 1366 if (frame() && frame()->host()) |
1365 frame()->host()->eventHandlerRegistry().didAddEventHandler(*this, eventT
ype, registeredListener.options()); | 1367 frame()->host()->eventHandlerRegistry().didAddEventHandler(*this, eventT
ype, registeredListener.options()); |
1366 | 1368 |
1367 if (Document* document = this->document()) | 1369 if (Document* document = this->document()) |
1368 document->addListenerTypeIfNeeded(eventType); | 1370 document->addListenerTypeIfNeeded(eventType); |
1369 | 1371 |
1370 notifyAddEventListener(this, eventType); | 1372 for (auto& it : m_eventListenerObservers) { |
| 1373 it->didAddEventListener(this, eventType); |
| 1374 } |
1371 | 1375 |
1372 if (eventType == EventTypeNames::unload) { | 1376 if (eventType == EventTypeNames::unload) { |
1373 UseCounter::count(document(), UseCounter::DocumentUnloadRegistered); | 1377 UseCounter::count(document(), UseCounter::DocumentUnloadRegistered); |
1374 addUnloadEventListener(this); | 1378 addUnloadEventListener(this); |
1375 } else if (eventType == EventTypeNames::beforeunload) { | 1379 } else if (eventType == EventTypeNames::beforeunload) { |
1376 UseCounter::count(document(), UseCounter::DocumentBeforeUnloadRegistered
); | 1380 UseCounter::count(document(), UseCounter::DocumentBeforeUnloadRegistered
); |
1377 if (allowsBeforeUnloadListeners(this)) { | 1381 if (allowsBeforeUnloadListeners(this)) { |
1378 // This is confusingly named. It doesn't actually add the listener.
It just increments a count | 1382 // This is confusingly named. It doesn't actually add the listener.
It just increments a count |
1379 // so that we know we have listeners registered for the purposes of
determining if we can | 1383 // so that we know we have listeners registered for the purposes of
determining if we can |
1380 // fast terminate the renderer process. | 1384 // fast terminate the renderer process. |
1381 addBeforeUnloadEventListener(this); | 1385 addBeforeUnloadEventListener(this); |
1382 } else { | 1386 } else { |
1383 // Subframes return false from allowsBeforeUnloadListeners. | 1387 // Subframes return false from allowsBeforeUnloadListeners. |
1384 UseCounter::count(document(), UseCounter::SubFrameBeforeUnloadRegist
ered); | 1388 UseCounter::count(document(), UseCounter::SubFrameBeforeUnloadRegist
ered); |
1385 } | 1389 } |
1386 } | 1390 } |
1387 } | 1391 } |
1388 | 1392 |
1389 void LocalDOMWindow::removedEventListener(const AtomicString& eventType, const R
egisteredEventListener& registeredListener) | 1393 void LocalDOMWindow::removedEventListener(const AtomicString& eventType, const R
egisteredEventListener& registeredListener) |
1390 { | 1394 { |
1391 DOMWindow::removedEventListener(eventType, registeredListener); | 1395 DOMWindow::removedEventListener(eventType, registeredListener); |
1392 if (frame() && frame()->host()) | 1396 if (frame() && frame()->host()) |
1393 frame()->host()->eventHandlerRegistry().didRemoveEventHandler(*this, eve
ntType, registeredListener.options()); | 1397 frame()->host()->eventHandlerRegistry().didRemoveEventHandler(*this, eve
ntType, registeredListener.options()); |
1394 | 1398 |
1395 notifyRemoveEventListener(this, eventType); | 1399 for (auto& it : m_eventListenerObservers) { |
| 1400 it->didRemoveEventListener(this, eventType); |
| 1401 } |
1396 | 1402 |
1397 if (eventType == EventTypeNames::unload) { | 1403 if (eventType == EventTypeNames::unload) { |
1398 removeUnloadEventListener(this); | 1404 removeUnloadEventListener(this); |
1399 } else if (eventType == EventTypeNames::beforeunload && allowsBeforeUnloadLi
steners(this)) { | 1405 } else if (eventType == EventTypeNames::beforeunload && allowsBeforeUnloadLi
steners(this)) { |
1400 removeBeforeUnloadEventListener(this); | 1406 removeBeforeUnloadEventListener(this); |
1401 } | 1407 } |
1402 } | 1408 } |
1403 | 1409 |
1404 void LocalDOMWindow::dispatchLoadEvent() | 1410 void LocalDOMWindow::dispatchLoadEvent() |
1405 { | 1411 { |
(...skipping 29 matching lines...) Expand all Loading... |
1435 event->setEventPhase(Event::AT_TARGET); | 1441 event->setEventPhase(Event::AT_TARGET); |
1436 | 1442 |
1437 TRACE_EVENT1("devtools.timeline", "EventDispatch", "data", InspectorEventDis
patchEvent::data(*event)); | 1443 TRACE_EVENT1("devtools.timeline", "EventDispatch", "data", InspectorEventDis
patchEvent::data(*event)); |
1438 return fireEventListeners(event); | 1444 return fireEventListeners(event); |
1439 } | 1445 } |
1440 | 1446 |
1441 void LocalDOMWindow::removeAllEventListeners() | 1447 void LocalDOMWindow::removeAllEventListeners() |
1442 { | 1448 { |
1443 EventTarget::removeAllEventListeners(); | 1449 EventTarget::removeAllEventListeners(); |
1444 | 1450 |
1445 notifyRemoveAllEventListeners(this); | 1451 for (auto& it : m_eventListenerObservers) { |
| 1452 it->didRemoveAllEventListeners(this); |
| 1453 } |
| 1454 |
1446 if (frame() && frame()->host()) | 1455 if (frame() && frame()->host()) |
1447 frame()->host()->eventHandlerRegistry().didRemoveAllEventHandlers(*this)
; | 1456 frame()->host()->eventHandlerRegistry().didRemoveAllEventHandlers(*this)
; |
1448 | 1457 |
1449 removeAllUnloadEventListeners(this); | 1458 removeAllUnloadEventListeners(this); |
1450 removeAllBeforeUnloadEventListeners(this); | 1459 removeAllBeforeUnloadEventListeners(this); |
1451 } | 1460 } |
1452 | 1461 |
1453 void LocalDOMWindow::finishedLoading() | 1462 void LocalDOMWindow::finishedLoading() |
1454 { | 1463 { |
1455 if (m_shouldPrintWhenFinishedLoading) { | 1464 if (m_shouldPrintWhenFinishedLoading) { |
(...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1540 visitor->trace(m_scrollbars); | 1549 visitor->trace(m_scrollbars); |
1541 visitor->trace(m_statusbar); | 1550 visitor->trace(m_statusbar); |
1542 visitor->trace(m_toolbar); | 1551 visitor->trace(m_toolbar); |
1543 visitor->trace(m_navigator); | 1552 visitor->trace(m_navigator); |
1544 visitor->trace(m_media); | 1553 visitor->trace(m_media); |
1545 visitor->trace(m_customElements); | 1554 visitor->trace(m_customElements); |
1546 visitor->trace(m_applicationCache); | 1555 visitor->trace(m_applicationCache); |
1547 visitor->trace(m_eventQueue); | 1556 visitor->trace(m_eventQueue); |
1548 visitor->trace(m_postMessageTimers); | 1557 visitor->trace(m_postMessageTimers); |
1549 visitor->trace(m_visualViewport); | 1558 visitor->trace(m_visualViewport); |
| 1559 visitor->trace(m_eventListenerObservers); |
1550 DOMWindow::trace(visitor); | 1560 DOMWindow::trace(visitor); |
1551 Supplementable<LocalDOMWindow>::trace(visitor); | 1561 Supplementable<LocalDOMWindow>::trace(visitor); |
1552 DOMWindowLifecycleNotifier::trace(visitor); | |
1553 } | 1562 } |
1554 | 1563 |
1555 LocalFrame* LocalDOMWindow::frame() const | 1564 LocalFrame* LocalDOMWindow::frame() const |
1556 { | 1565 { |
1557 // If the LocalDOMWindow still has a frame reference, that frame must point | 1566 // If the LocalDOMWindow still has a frame reference, that frame must point |
1558 // back to this LocalDOMWindow: otherwise, it's easy to get into a situation | 1567 // back to this LocalDOMWindow: otherwise, it's easy to get into a situation |
1559 // where script execution leaks between different LocalDOMWindows. | 1568 // where script execution leaks between different LocalDOMWindows. |
1560 if (m_frameObserver->frame()) | 1569 if (m_frameObserver->frame()) |
1561 ASSERT_WITH_SECURITY_IMPLICATION(m_frameObserver->frame()->domWindow() =
= this); | 1570 ASSERT_WITH_SECURITY_IMPLICATION(m_frameObserver->frame()->domWindow() =
= this); |
1562 return m_frameObserver->frame(); | 1571 return m_frameObserver->frame(); |
1563 } | 1572 } |
1564 | 1573 |
1565 } // namespace blink | 1574 } // namespace blink |
OLD | NEW |