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 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 DEFINE_STATIC_LOCAL(DOMWindowSet, windowsWithBeforeUnloadEventListeners, ())
; | 224 DEFINE_STATIC_LOCAL(DOMWindowSet, windowsWithBeforeUnloadEventListeners, ())
; |
225 return windowsWithBeforeUnloadEventListeners; | 225 return windowsWithBeforeUnloadEventListeners; |
226 } | 226 } |
227 | 227 |
228 static void addUnloadEventListener(LocalDOMWindow* domWindow) | 228 static void addUnloadEventListener(LocalDOMWindow* domWindow) |
229 { | 229 { |
230 DOMWindowSet& set = windowsWithUnloadEventListeners(); | 230 DOMWindowSet& set = windowsWithUnloadEventListeners(); |
231 if (set.isEmpty()) | 231 if (set.isEmpty()) |
232 disableSuddenTermination(); | 232 disableSuddenTermination(); |
233 set.add(domWindow); | 233 set.add(domWindow); |
| 234 if (domWindow->frame()) { |
| 235 domWindow->frame()->loader().client()->suddenTerminationDisablerChanged( |
| 236 1, FrameLoaderClient::UnloadHandler); |
| 237 } |
234 } | 238 } |
235 | 239 |
236 static void removeUnloadEventListener(LocalDOMWindow* domWindow) | 240 static void removeUnloadEventListener(LocalDOMWindow* domWindow) |
237 { | 241 { |
238 DOMWindowSet& set = windowsWithUnloadEventListeners(); | 242 DOMWindowSet& set = windowsWithUnloadEventListeners(); |
239 DOMWindowSet::iterator it = set.find(domWindow); | 243 DOMWindowSet::iterator it = set.find(domWindow); |
240 if (it == set.end()) | 244 if (it == set.end()) |
241 return; | 245 return; |
242 set.remove(it); | 246 set.remove(it); |
243 if (set.isEmpty()) | 247 if (set.isEmpty()) |
244 enableSuddenTermination(); | 248 enableSuddenTermination(); |
| 249 if (domWindow->frame()) { |
| 250 domWindow->frame()->loader().client()->suddenTerminationDisablerChanged( |
| 251 -1, FrameLoaderClient::UnloadHandler); |
| 252 } |
245 } | 253 } |
246 | 254 |
247 static void removeAllUnloadEventListeners(LocalDOMWindow* domWindow) | 255 static void removeAllUnloadEventListeners(LocalDOMWindow* domWindow) |
248 { | 256 { |
249 DOMWindowSet& set = windowsWithUnloadEventListeners(); | 257 DOMWindowSet& set = windowsWithUnloadEventListeners(); |
250 DOMWindowSet::iterator it = set.find(domWindow); | 258 DOMWindowSet::iterator it = set.find(domWindow); |
251 if (it == set.end()) | 259 if (it == set.end()) |
252 return; | 260 return; |
| 261 int numHandlers = set.count(domWindow); |
253 set.removeAll(it); | 262 set.removeAll(it); |
254 if (set.isEmpty()) | 263 if (set.isEmpty()) |
255 enableSuddenTermination(); | 264 enableSuddenTermination(); |
| 265 if (domWindow->frame()) { |
| 266 domWindow->frame()->loader().client()->suddenTerminationDisablerChanged( |
| 267 -numHandlers, FrameLoaderClient::UnloadHandler); |
| 268 } |
256 } | 269 } |
257 | 270 |
258 static void addBeforeUnloadEventListener(LocalDOMWindow* domWindow) | 271 static void addBeforeUnloadEventListener(LocalDOMWindow* domWindow) |
259 { | 272 { |
260 DOMWindowSet& set = windowsWithBeforeUnloadEventListeners(); | 273 DOMWindowSet& set = windowsWithBeforeUnloadEventListeners(); |
261 if (set.isEmpty()) | 274 if (set.isEmpty()) |
262 disableSuddenTermination(); | 275 disableSuddenTermination(); |
263 set.add(domWindow); | 276 set.add(domWindow); |
| 277 if (domWindow->frame()) { |
| 278 domWindow->frame()->loader().client()->suddenTerminationDisablerChanged( |
| 279 1, FrameLoaderClient::BeforeUnloadHandler); |
| 280 } |
264 } | 281 } |
265 | 282 |
266 static void removeBeforeUnloadEventListener(LocalDOMWindow* domWindow) | 283 static void removeBeforeUnloadEventListener(LocalDOMWindow* domWindow) |
267 { | 284 { |
268 DOMWindowSet& set = windowsWithBeforeUnloadEventListeners(); | 285 DOMWindowSet& set = windowsWithBeforeUnloadEventListeners(); |
269 DOMWindowSet::iterator it = set.find(domWindow); | 286 DOMWindowSet::iterator it = set.find(domWindow); |
270 if (it == set.end()) | 287 if (it == set.end()) |
271 return; | 288 return; |
272 set.remove(it); | 289 set.remove(it); |
273 if (set.isEmpty()) | 290 if (set.isEmpty()) |
274 enableSuddenTermination(); | 291 enableSuddenTermination(); |
| 292 if (domWindow->frame()) { |
| 293 domWindow->frame()->loader().client()->suddenTerminationDisablerChanged( |
| 294 -1, FrameLoaderClient::BeforeUnloadHandler); |
| 295 } |
275 } | 296 } |
276 | 297 |
277 static void removeAllBeforeUnloadEventListeners(LocalDOMWindow* domWindow) | 298 static void removeAllBeforeUnloadEventListeners(LocalDOMWindow* domWindow) |
278 { | 299 { |
279 DOMWindowSet& set = windowsWithBeforeUnloadEventListeners(); | 300 DOMWindowSet& set = windowsWithBeforeUnloadEventListeners(); |
280 DOMWindowSet::iterator it = set.find(domWindow); | 301 DOMWindowSet::iterator it = set.find(domWindow); |
281 if (it == set.end()) | 302 if (it == set.end()) |
282 return; | 303 return; |
| 304 int numHandlers = set.count(domWindow); |
283 set.removeAll(it); | 305 set.removeAll(it); |
284 if (set.isEmpty()) | 306 if (set.isEmpty()) |
285 enableSuddenTermination(); | 307 enableSuddenTermination(); |
| 308 if (domWindow->frame()) { |
| 309 domWindow->frame()->loader().client()->suddenTerminationDisablerChanged( |
| 310 -numHandlers, FrameLoaderClient::BeforeUnloadHandler); |
| 311 } |
286 } | 312 } |
287 | 313 |
288 static bool allowsBeforeUnloadListeners(LocalDOMWindow* window) | 314 static bool allowsBeforeUnloadListeners(LocalDOMWindow* window) |
289 { | 315 { |
290 ASSERT_ARG(window, window); | 316 ASSERT_ARG(window, window); |
291 LocalFrame* frame = window->frame(); | 317 LocalFrame* frame = window->frame(); |
292 if (!frame) | 318 if (!frame) |
293 return false; | 319 return false; |
294 return frame->isMainFrame(); | 320 return frame->isMainFrame(); |
295 } | 321 } |
(...skipping 1530 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1826 return m_frameObserver->frame(); | 1852 return m_frameObserver->frame(); |
1827 } | 1853 } |
1828 | 1854 |
1829 v8::Handle<v8::Object> LocalDOMWindow::wrap(v8::Handle<v8::Object> creationConte
xt, v8::Isolate* isolate) | 1855 v8::Handle<v8::Object> LocalDOMWindow::wrap(v8::Handle<v8::Object> creationConte
xt, v8::Isolate* isolate) |
1830 { | 1856 { |
1831 ASSERT_NOT_REACHED(); // LocalDOMWindow has [Custom=ToV8]. | 1857 ASSERT_NOT_REACHED(); // LocalDOMWindow has [Custom=ToV8]. |
1832 return v8::Handle<v8::Object>(); | 1858 return v8::Handle<v8::Object>(); |
1833 } | 1859 } |
1834 | 1860 |
1835 } // namespace blink | 1861 } // namespace blink |
OLD | NEW |