OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> | 2 * Copyright (C) 1998, 1999 Torben Weis <weis@kde.org> |
3 * 1999 Lars Knoll <knoll@kde.org> | 3 * 1999 Lars Knoll <knoll@kde.org> |
4 * 1999 Antti Koivisto <koivisto@kde.org> | 4 * 1999 Antti Koivisto <koivisto@kde.org> |
5 * 2000 Simon Hausmann <hausmann@kde.org> | 5 * 2000 Simon Hausmann <hausmann@kde.org> |
6 * 2000 Stefan Schimanski <1Stein@gmx.de> | 6 * 2000 Stefan Schimanski <1Stein@gmx.de> |
7 * 2001 George Staikos <staikos@kde.org> | 7 * 2001 George Staikos <staikos@kde.org> |
8 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. | 8 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All r
ights reserved. |
9 * Copyright (C) 2005 Alexey Proskuryakov <ap@nypop.com> | 9 * Copyright (C) 2005 Alexey Proskuryakov <ap@nypop.com> |
10 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) | 10 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) |
(...skipping 362 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
373 void LocalFrame::detach(FrameDetachType type) | 373 void LocalFrame::detach(FrameDetachType type) |
374 { | 374 { |
375 PluginScriptForbiddenScope forbidPluginDestructorScripting; | 375 PluginScriptForbiddenScope forbidPluginDestructorScripting; |
376 m_loader.stopAllLoaders(); | 376 m_loader.stopAllLoaders(); |
377 // Don't allow any new child frames to load in this frame: attaching a new | 377 // Don't allow any new child frames to load in this frame: attaching a new |
378 // child frame during or after detaching children results in an attached | 378 // child frame during or after detaching children results in an attached |
379 // frame on a detached DOM tree, which is bad. | 379 // frame on a detached DOM tree, which is bad. |
380 SubframeLoadingDisabler disabler(*document()); | 380 SubframeLoadingDisabler disabler(*document()); |
381 m_loader.dispatchUnloadEvent(); | 381 m_loader.dispatchUnloadEvent(); |
382 detachChildren(); | 382 detachChildren(); |
383 m_frameScheduler.reset(); | |
384 | 383 |
385 // All done if detaching the subframes brought about a detach of this frame
also. | 384 // All done if detaching the subframes brought about a detach of this frame
also. |
386 if (!client()) | 385 if (!client()) |
387 return; | 386 return; |
388 | 387 |
389 // stopAllLoaders() needs to be called after detachChildren(), because detac
hChildren() | 388 // stopAllLoaders() needs to be called after detachChildren(), because detac
hChildren() |
390 // will trigger the unload event handlers of any child frames, and those eve
nt | 389 // will trigger the unload event handlers of any child frames, and those eve
nt |
391 // handlers might start a new subresource load in this frame. | 390 // handlers might start a new subresource load in this frame. |
392 m_loader.stopAllLoaders(); | 391 m_loader.stopAllLoaders(); |
393 m_loader.detach(); | 392 m_loader.detach(); |
394 document()->detachLayoutTree(); | 393 document()->detachLayoutTree(); |
395 // This is the earliest that scripting can be disabled: | 394 // This is the earliest that scripting can be disabled: |
396 // - FrameLoader::detach() can fire XHR abort events | 395 // - FrameLoader::detach() can fire XHR abort events |
397 // - Document::detachLayoutTree()'s deferred widget updates can run script. | 396 // - Document::detachLayoutTree()'s deferred widget updates can run script. |
398 ScriptForbiddenScope forbidScript; | 397 ScriptForbiddenScope forbidScript; |
399 m_loader.clear(); | 398 m_loader.clear(); |
400 // Clear FrameScheduler again in case it is recreated in scripting. | |
401 m_frameScheduler.reset(); | |
402 if (!client()) | 399 if (!client()) |
403 return; | 400 return; |
404 | 401 |
405 client()->willBeDetached(); | 402 client()->willBeDetached(); |
406 // Notify ScriptController that the frame is closing, since its cleanup ends
up calling | 403 // Notify ScriptController that the frame is closing, since its cleanup ends
up calling |
407 // back to FrameLoaderClient via WindowProxy. | 404 // back to FrameLoaderClient via WindowProxy. |
408 script().clearForClose(); | 405 script().clearForClose(); |
409 setView(nullptr); | 406 setView(nullptr); |
410 | 407 |
411 m_host->eventHandlerRegistry().didRemoveAllEventHandlers(*localDOMWindow()); | 408 m_host->eventHandlerRegistry().didRemoveAllEventHandlers(*localDOMWindow()); |
412 | 409 |
413 // Signal frame destruction here rather than in the destructor. | 410 // Signal frame destruction here rather than in the destructor. |
414 // Main motivation is to avoid being dependent on its exact timing (Oilpan.) | 411 // Main motivation is to avoid being dependent on its exact timing (Oilpan.) |
415 LocalFrameLifecycleNotifier::notifyContextDestroyed(); | 412 LocalFrameLifecycleNotifier::notifyContextDestroyed(); |
416 | 413 |
417 // TODO: Page should take care of updating focus/scrolling instead of Frame. | 414 // TODO: Page should take care of updating focus/scrolling instead of Frame. |
418 // TODO: It's unclear as to why this is called more than once, but it is, | 415 // TODO: It's unclear as to why this is called more than once, but it is, |
419 // so page() could be null. | 416 // so page() could be null. |
420 if (page() && page()->focusController().focusedFrame() == this) | 417 if (page() && page()->focusController().focusedFrame() == this) |
421 page()->focusController().setFocusedFrame(nullptr); | 418 page()->focusController().setFocusedFrame(nullptr); |
422 | 419 |
423 if (page() && page()->scrollingCoordinator() && m_view) | 420 if (page() && page()->scrollingCoordinator() && m_view) |
424 page()->scrollingCoordinator()->willDestroyScrollableArea(m_view.get()); | 421 page()->scrollingCoordinator()->willDestroyScrollableArea(m_view.get()); |
425 | 422 |
426 InspectorInstrumentation::frameDetachedFromParent(this); | 423 InspectorInstrumentation::frameDetachedFromParent(this); |
427 Frame::detach(type); | 424 Frame::detach(type); |
428 | 425 |
429 m_supplements.clear(); | 426 m_supplements.clear(); |
| 427 m_frameScheduler.reset(); |
430 WeakIdentifierMap<LocalFrame>::notifyObjectDestroyed(this); | 428 WeakIdentifierMap<LocalFrame>::notifyObjectDestroyed(this); |
431 } | 429 } |
432 | 430 |
433 bool LocalFrame::prepareForCommit() | 431 bool LocalFrame::prepareForCommit() |
434 { | 432 { |
435 return loader().prepareForCommit(); | 433 return loader().prepareForCommit(); |
436 } | 434 } |
437 | 435 |
438 SecurityContext* LocalFrame::securityContext() const | 436 SecurityContext* LocalFrame::securityContext() const |
439 { | 437 { |
(...skipping 359 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
799 return layerTree ? layerTree->toPrettyJSONString() : String(); | 797 return layerTree ? layerTree->toPrettyJSONString() : String(); |
800 } | 798 } |
801 | 799 |
802 bool LocalFrame::shouldThrottleRendering() const | 800 bool LocalFrame::shouldThrottleRendering() const |
803 { | 801 { |
804 return view() && view()->shouldThrottleRendering(); | 802 return view() && view()->shouldThrottleRendering(); |
805 } | 803 } |
806 | 804 |
807 inline LocalFrame::LocalFrame(FrameLoaderClient* client, FrameHost* host, FrameO
wner* owner, ServiceRegistry* serviceRegistry) | 805 inline LocalFrame::LocalFrame(FrameLoaderClient* client, FrameHost* host, FrameO
wner* owner, ServiceRegistry* serviceRegistry) |
808 : Frame(client, host, owner) | 806 : Frame(client, host, owner) |
| 807 , m_frameScheduler(page()->chromeClient().createFrameScheduler(client->frame
BlameContext())) |
809 , m_loader(this) | 808 , m_loader(this) |
810 , m_navigationScheduler(NavigationScheduler::create(this)) | 809 , m_navigationScheduler(NavigationScheduler::create(this)) |
811 , m_script(ScriptController::create(this)) | 810 , m_script(ScriptController::create(this)) |
812 , m_editor(Editor::create(*this)) | 811 , m_editor(Editor::create(*this)) |
813 , m_spellChecker(SpellChecker::create(*this)) | 812 , m_spellChecker(SpellChecker::create(*this)) |
814 , m_selection(FrameSelection::create(this)) | 813 , m_selection(FrameSelection::create(this)) |
815 , m_eventHandler(new EventHandler(this)) | 814 , m_eventHandler(new EventHandler(this)) |
816 , m_console(FrameConsole::create(*this)) | 815 , m_console(FrameConsole::create(*this)) |
817 , m_inputMethodController(InputMethodController::create(*this)) | 816 , m_inputMethodController(InputMethodController::create(*this)) |
818 , m_navigationDisableCount(0) | 817 , m_navigationDisableCount(0) |
819 , m_pageZoomFactor(parentPageZoomFactor(this)) | 818 , m_pageZoomFactor(parentPageZoomFactor(this)) |
820 , m_textZoomFactor(parentTextZoomFactor(this)) | 819 , m_textZoomFactor(parentTextZoomFactor(this)) |
821 , m_inViewSourceMode(false) | 820 , m_inViewSourceMode(false) |
822 , m_serviceRegistry(serviceRegistry) | 821 , m_serviceRegistry(serviceRegistry) |
823 { | 822 { |
824 if (isLocalRoot()) | 823 if (isLocalRoot()) |
825 m_instrumentingAgents = new InstrumentingAgents(); | 824 m_instrumentingAgents = new InstrumentingAgents(); |
826 else | 825 else |
827 m_instrumentingAgents = localFrameRoot()->m_instrumentingAgents; | 826 m_instrumentingAgents = localFrameRoot()->m_instrumentingAgents; |
828 } | 827 } |
829 | 828 |
830 WebFrameScheduler* LocalFrame::frameScheduler() | 829 WebFrameScheduler* LocalFrame::frameScheduler() |
831 { | 830 { |
832 if (!m_frameScheduler.get()) | |
833 m_frameScheduler = page()->chromeClient().createFrameScheduler(client()-
>frameBlameContext()); | |
834 | |
835 ASSERT(m_frameScheduler.get()); | |
836 return m_frameScheduler.get(); | 831 return m_frameScheduler.get(); |
837 } | 832 } |
838 | 833 |
839 void LocalFrame::scheduleVisualUpdateUnlessThrottled() | 834 void LocalFrame::scheduleVisualUpdateUnlessThrottled() |
840 { | 835 { |
841 if (shouldThrottleRendering()) | 836 if (shouldThrottleRendering()) |
842 return; | 837 return; |
843 page()->animator().scheduleVisualUpdate(this); | 838 page()->animator().scheduleVisualUpdate(this); |
844 } | 839 } |
845 | 840 |
(...skipping 29 matching lines...) Expand all Loading... |
875 m_frame->client()->frameBlameContext()->Enter(); | 870 m_frame->client()->frameBlameContext()->Enter(); |
876 } | 871 } |
877 | 872 |
878 ScopedFrameBlamer::~ScopedFrameBlamer() | 873 ScopedFrameBlamer::~ScopedFrameBlamer() |
879 { | 874 { |
880 if (m_frame && m_frame->client() && m_frame->client()->frameBlameContext()) | 875 if (m_frame && m_frame->client() && m_frame->client()->frameBlameContext()) |
881 m_frame->client()->frameBlameContext()->Leave(); | 876 m_frame->client()->frameBlameContext()->Leave(); |
882 } | 877 } |
883 | 878 |
884 } // namespace blink | 879 } // namespace blink |
OLD | NEW |