| 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 149 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 160 Member<LocalDOMWindow> m_window; | 160 Member<LocalDOMWindow> m_window; |
| 161 RefPtr<SecurityOrigin> m_targetOrigin; | 161 RefPtr<SecurityOrigin> m_targetOrigin; |
| 162 std::unique_ptr<SourceLocation> m_location; | 162 std::unique_ptr<SourceLocation> m_location; |
| 163 RefPtr<UserGestureToken> m_userGestureToken; | 163 RefPtr<UserGestureToken> m_userGestureToken; |
| 164 bool m_disposalAllowed; | 164 bool m_disposalAllowed; |
| 165 }; | 165 }; |
| 166 | 166 |
| 167 static void updateSuddenTerminationStatus( | 167 static void updateSuddenTerminationStatus( |
| 168 LocalDOMWindow* domWindow, | 168 LocalDOMWindow* domWindow, |
| 169 bool addedListener, | 169 bool addedListener, |
| 170 FrameLoaderClient::SuddenTerminationDisablerType disablerType) { | 170 LocalFrameClient::SuddenTerminationDisablerType disablerType) { |
| 171 Platform::current()->suddenTerminationChanged(!addedListener); | 171 Platform::current()->suddenTerminationChanged(!addedListener); |
| 172 if (domWindow->frame() && domWindow->frame()->loader().client()) | 172 if (domWindow->frame() && domWindow->frame()->loader().client()) |
| 173 domWindow->frame()->loader().client()->suddenTerminationDisablerChanged( | 173 domWindow->frame()->loader().client()->suddenTerminationDisablerChanged( |
| 174 addedListener, disablerType); | 174 addedListener, disablerType); |
| 175 } | 175 } |
| 176 | 176 |
| 177 using DOMWindowSet = PersistentHeapHashCountedSet<WeakMember<LocalDOMWindow>>; | 177 using DOMWindowSet = PersistentHeapHashCountedSet<WeakMember<LocalDOMWindow>>; |
| 178 | 178 |
| 179 static DOMWindowSet& windowsWithUnloadEventListeners() { | 179 static DOMWindowSet& windowsWithUnloadEventListeners() { |
| 180 DEFINE_STATIC_LOCAL(DOMWindowSet, windowsWithUnloadEventListeners, ()); | 180 DEFINE_STATIC_LOCAL(DOMWindowSet, windowsWithUnloadEventListeners, ()); |
| 181 return windowsWithUnloadEventListeners; | 181 return windowsWithUnloadEventListeners; |
| 182 } | 182 } |
| 183 | 183 |
| 184 static DOMWindowSet& windowsWithBeforeUnloadEventListeners() { | 184 static DOMWindowSet& windowsWithBeforeUnloadEventListeners() { |
| 185 DEFINE_STATIC_LOCAL(DOMWindowSet, windowsWithBeforeUnloadEventListeners, ()); | 185 DEFINE_STATIC_LOCAL(DOMWindowSet, windowsWithBeforeUnloadEventListeners, ()); |
| 186 return windowsWithBeforeUnloadEventListeners; | 186 return windowsWithBeforeUnloadEventListeners; |
| 187 } | 187 } |
| 188 | 188 |
| 189 static void addUnloadEventListener(LocalDOMWindow* domWindow) { | 189 static void addUnloadEventListener(LocalDOMWindow* domWindow) { |
| 190 DOMWindowSet& set = windowsWithUnloadEventListeners(); | 190 DOMWindowSet& set = windowsWithUnloadEventListeners(); |
| 191 if (set.isEmpty()) | 191 if (set.isEmpty()) { |
| 192 updateSuddenTerminationStatus(domWindow, true, | 192 updateSuddenTerminationStatus(domWindow, true, |
| 193 FrameLoaderClient::UnloadHandler); | 193 LocalFrameClient::UnloadHandler); |
| 194 } |
| 194 | 195 |
| 195 set.add(domWindow); | 196 set.add(domWindow); |
| 196 } | 197 } |
| 197 | 198 |
| 198 static void removeUnloadEventListener(LocalDOMWindow* domWindow) { | 199 static void removeUnloadEventListener(LocalDOMWindow* domWindow) { |
| 199 DOMWindowSet& set = windowsWithUnloadEventListeners(); | 200 DOMWindowSet& set = windowsWithUnloadEventListeners(); |
| 200 DOMWindowSet::iterator it = set.find(domWindow); | 201 DOMWindowSet::iterator it = set.find(domWindow); |
| 201 if (it == set.end()) | 202 if (it == set.end()) |
| 202 return; | 203 return; |
| 203 set.remove(it); | 204 set.remove(it); |
| 204 if (set.isEmpty()) | 205 if (set.isEmpty()) { |
| 205 updateSuddenTerminationStatus(domWindow, false, | 206 updateSuddenTerminationStatus(domWindow, false, |
| 206 FrameLoaderClient::UnloadHandler); | 207 LocalFrameClient::UnloadHandler); |
| 208 } |
| 207 } | 209 } |
| 208 | 210 |
| 209 static void removeAllUnloadEventListeners(LocalDOMWindow* domWindow) { | 211 static void removeAllUnloadEventListeners(LocalDOMWindow* domWindow) { |
| 210 DOMWindowSet& set = windowsWithUnloadEventListeners(); | 212 DOMWindowSet& set = windowsWithUnloadEventListeners(); |
| 211 DOMWindowSet::iterator it = set.find(domWindow); | 213 DOMWindowSet::iterator it = set.find(domWindow); |
| 212 if (it == set.end()) | 214 if (it == set.end()) |
| 213 return; | 215 return; |
| 214 set.removeAll(it); | 216 set.removeAll(it); |
| 215 if (set.isEmpty()) | 217 if (set.isEmpty()) { |
| 216 updateSuddenTerminationStatus(domWindow, false, | 218 updateSuddenTerminationStatus(domWindow, false, |
| 217 FrameLoaderClient::UnloadHandler); | 219 LocalFrameClient::UnloadHandler); |
| 220 } |
| 218 } | 221 } |
| 219 | 222 |
| 220 static void addBeforeUnloadEventListener(LocalDOMWindow* domWindow) { | 223 static void addBeforeUnloadEventListener(LocalDOMWindow* domWindow) { |
| 221 DOMWindowSet& set = windowsWithBeforeUnloadEventListeners(); | 224 DOMWindowSet& set = windowsWithBeforeUnloadEventListeners(); |
| 222 if (set.isEmpty()) | 225 if (set.isEmpty()) { |
| 223 updateSuddenTerminationStatus(domWindow, true, | 226 updateSuddenTerminationStatus(domWindow, true, |
| 224 FrameLoaderClient::BeforeUnloadHandler); | 227 LocalFrameClient::BeforeUnloadHandler); |
| 228 } |
| 225 | 229 |
| 226 set.add(domWindow); | 230 set.add(domWindow); |
| 227 } | 231 } |
| 228 | 232 |
| 229 static void removeBeforeUnloadEventListener(LocalDOMWindow* domWindow) { | 233 static void removeBeforeUnloadEventListener(LocalDOMWindow* domWindow) { |
| 230 DOMWindowSet& set = windowsWithBeforeUnloadEventListeners(); | 234 DOMWindowSet& set = windowsWithBeforeUnloadEventListeners(); |
| 231 DOMWindowSet::iterator it = set.find(domWindow); | 235 DOMWindowSet::iterator it = set.find(domWindow); |
| 232 if (it == set.end()) | 236 if (it == set.end()) |
| 233 return; | 237 return; |
| 234 set.remove(it); | 238 set.remove(it); |
| 235 if (set.isEmpty()) | 239 if (set.isEmpty()) { |
| 236 updateSuddenTerminationStatus(domWindow, false, | 240 updateSuddenTerminationStatus(domWindow, false, |
| 237 FrameLoaderClient::BeforeUnloadHandler); | 241 LocalFrameClient::BeforeUnloadHandler); |
| 242 } |
| 238 } | 243 } |
| 239 | 244 |
| 240 static void removeAllBeforeUnloadEventListeners(LocalDOMWindow* domWindow) { | 245 static void removeAllBeforeUnloadEventListeners(LocalDOMWindow* domWindow) { |
| 241 DOMWindowSet& set = windowsWithBeforeUnloadEventListeners(); | 246 DOMWindowSet& set = windowsWithBeforeUnloadEventListeners(); |
| 242 DOMWindowSet::iterator it = set.find(domWindow); | 247 DOMWindowSet::iterator it = set.find(domWindow); |
| 243 if (it == set.end()) | 248 if (it == set.end()) |
| 244 return; | 249 return; |
| 245 set.removeAll(it); | 250 set.removeAll(it); |
| 246 if (set.isEmpty()) | 251 if (set.isEmpty()) { |
| 247 updateSuddenTerminationStatus(domWindow, false, | 252 updateSuddenTerminationStatus(domWindow, false, |
| 248 FrameLoaderClient::BeforeUnloadHandler); | 253 LocalFrameClient::BeforeUnloadHandler); |
| 254 } |
| 249 } | 255 } |
| 250 | 256 |
| 251 static bool allowsBeforeUnloadListeners(LocalDOMWindow* window) { | 257 static bool allowsBeforeUnloadListeners(LocalDOMWindow* window) { |
| 252 DCHECK(window); | 258 DCHECK(window); |
| 253 LocalFrame* frame = window->frame(); | 259 LocalFrame* frame = window->frame(); |
| 254 if (!frame) | 260 if (!frame) |
| 255 return false; | 261 return false; |
| 256 return frame->isMainFrame(); | 262 return frame->isMainFrame(); |
| 257 } | 263 } |
| 258 | 264 |
| (...skipping 1376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1635 DOMWindow::trace(visitor); | 1641 DOMWindow::trace(visitor); |
| 1636 Supplementable<LocalDOMWindow>::trace(visitor); | 1642 Supplementable<LocalDOMWindow>::trace(visitor); |
| 1637 } | 1643 } |
| 1638 | 1644 |
| 1639 DEFINE_TRACE_WRAPPERS(LocalDOMWindow) { | 1645 DEFINE_TRACE_WRAPPERS(LocalDOMWindow) { |
| 1640 visitor->traceWrappers(m_customElements); | 1646 visitor->traceWrappers(m_customElements); |
| 1641 DOMWindow::traceWrappers(visitor); | 1647 DOMWindow::traceWrappers(visitor); |
| 1642 } | 1648 } |
| 1643 | 1649 |
| 1644 } // namespace blink | 1650 } // namespace blink |
| OLD | NEW |