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