Changeset 189834 in webkit


Ignore:
Timestamp:
Sep 15, 2015 6:03:35 PM (9 years ago)
Author:
commit-queue@webkit.org
Message:

Web Inspector: Paused Debugger prevents page reload
https://bugs.webkit.org/show_bug.cgi?id=148174

Patch by Joseph Pecoraro <Joseph Pecoraro> on 2015-09-15
Reviewed by Brian Burg.

Source/JavaScriptCore:

  • debugger/Debugger.h:

(JSC::Debugger::suppressAllPauses):
(JSC::Debugger::setSuppressAllPauses):

  • debugger/Debugger.cpp:

(JSC::Debugger::Debugger):
(JSC::Debugger::pauseIfNeeded):

  • inspector/agents/InspectorDebuggerAgent.h:
  • inspector/agents/InspectorDebuggerAgent.cpp:

(Inspector::InspectorDebuggerAgent::setSuppressAllPauses):
Provide a way to suppress pauses.

Source/WebCore:

When navigating the page while paused, suppress any pausing until the page
has completed navigation. If not paused and navigating, you can still pause
in pagehide and unload handlers or other late page events.

Could not write a reliable test for this at the moment.
InspectorTest.reloadPage has multiple issues with the output,
so I'll investigate making reload tests more reliable later.

  • inspector/InspectorController.h:
  • inspector/InspectorController.cpp:

(WebCore::InspectorController::resume): Deleted.

  • loader/FrameLoader.cpp:

(WebCore::FrameLoader::continueLoadAfterNavigationPolicy):
We now use existing InspectorInstrumentation functions instead of a method
on InspectorController during load. In dropping the method InspectorController
can drop a member variable no longer used.

  • inspector/InspectorInstrumentation.h:

(WebCore::InspectorInstrumentation::willStartProvisionalLoad):
Add a new instrumentation hook.

  • inspector/InspectorInstrumentation.cpp:

(WebCore::InspectorInstrumentation::willStartProvisionalLoadImpl):
(WebCore::InspectorInstrumentation::didCommitLoadImpl):
When starting or completing main frame navigations, let the PageDebuggerAgent do some work.

  • inspector/PageDebuggerAgent.h:
  • inspector/PageDebuggerAgent.cpp:

(WebCore::PageDebuggerAgent::mainFrameStartedLoading):
(WebCore::PageDebuggerAgent::mainFrameStoppedLoading):
(WebCore::PageDebuggerAgent::mainFrameNavigated):
Suppress pausing if navigating while paused. Otherwise behave as normal.

Location:
trunk/Source
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r189822 r189834  
     12015-09-15  Joseph Pecoraro  <pecoraro@apple.com>
     2
     3        Web Inspector: Paused Debugger prevents page reload
     4        https://bugs.webkit.org/show_bug.cgi?id=148174
     5
     6        Reviewed by Brian Burg.
     7
     8        * debugger/Debugger.h:
     9        (JSC::Debugger::suppressAllPauses):
     10        (JSC::Debugger::setSuppressAllPauses):
     11        * debugger/Debugger.cpp:
     12        (JSC::Debugger::Debugger):
     13        (JSC::Debugger::pauseIfNeeded):
     14        * inspector/agents/InspectorDebuggerAgent.h:
     15        * inspector/agents/InspectorDebuggerAgent.cpp:
     16        (Inspector::InspectorDebuggerAgent::setSuppressAllPauses):
     17        Provide a way to suppress pauses.
     18
    1192015-09-15  Sukolsak Sakshuwong  <sukolsak@gmail.com>
    220
  • trunk/Source/JavaScriptCore/debugger/Debugger.cpp

    r189123 r189834  
    119119    , m_hasHandlerForExceptionCallback(false)
    120120    , m_isInWorkerThread(isInWorkerThread)
     121    , m_suppressAllPauses(false)
    121122    , m_steppingMode(SteppingModeDisabled)
    122123    , m_reasonForPause(NotPaused)
     
    586587        return;
    587588
     589    if (m_suppressAllPauses)
     590        return;
     591
    588592    JSGlobalObject* vmEntryGlobalObject = callFrame->vmEntryGlobalObject();
    589593    if (!needPauseHandling(vmEntryGlobalObject))
  • trunk/Source/JavaScriptCore/debugger/Debugger.h

    r188841 r189834  
    111111    bool isStepping() const { return m_steppingMode == SteppingModeEnabled; }
    112112
     113    bool suppressAllPauses() const { return m_suppressAllPauses; }
     114    void setSuppressAllPauses(bool suppress) { m_suppressAllPauses = suppress; }
     115
    113116    virtual void sourceParsed(ExecState*, SourceProvider*, int errorLineNumber, const WTF::String& errorMessage) = 0;
    114117
     
    197200    bool m_hasHandlerForExceptionCallback : 1;
    198201    bool m_isInWorkerThread : 1;
     202    bool m_suppressAllPauses : 1;
    199203    unsigned m_steppingMode : 1; // SteppingMode
    200204
  • trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.cpp

    r189438 r189834  
    133133{
    134134    return scriptDebugServer().isPaused();
     135}
     136
     137void InspectorDebuggerAgent::setSuppressAllPauses(bool suppress)
     138{
     139    scriptDebugServer().setSuppressAllPauses(suppress);
    135140}
    136141
  • trunk/Source/JavaScriptCore/inspector/agents/InspectorDebuggerAgent.h

    r189438 r189834  
    8989
    9090    bool isPaused();
    91    
     91
     92    void setSuppressAllPauses(bool);
     93
    9294    void handleConsoleAssert(const String& message);
    9395
  • trunk/Source/WebCore/ChangeLog

    r189833 r189834  
     12015-09-15  Joseph Pecoraro  <pecoraro@apple.com>
     2
     3        Web Inspector: Paused Debugger prevents page reload
     4        https://bugs.webkit.org/show_bug.cgi?id=148174
     5
     6        Reviewed by Brian Burg.
     7
     8        When navigating the page while paused, suppress any pausing until the page
     9        has completed navigation. If not paused and navigating, you can still pause
     10        in pagehide and unload handlers or other late page events.
     11
     12        Could not write a reliable test for this at the moment.
     13        InspectorTest.reloadPage has multiple issues with the output,
     14        so I'll investigate making reload tests more reliable later.
     15
     16        * inspector/InspectorController.h:
     17        * inspector/InspectorController.cpp:
     18        (WebCore::InspectorController::resume): Deleted.
     19        * loader/FrameLoader.cpp:
     20        (WebCore::FrameLoader::continueLoadAfterNavigationPolicy):
     21        We now use existing InspectorInstrumentation functions instead of a method
     22        on InspectorController during load. In dropping the method InspectorController
     23        can drop a member variable no longer used.
     24
     25        * inspector/InspectorInstrumentation.h:
     26        (WebCore::InspectorInstrumentation::willStartProvisionalLoad):
     27        Add a new instrumentation hook.
     28
     29        * inspector/InspectorInstrumentation.cpp:
     30        (WebCore::InspectorInstrumentation::willStartProvisionalLoadImpl):
     31        (WebCore::InspectorInstrumentation::didCommitLoadImpl):
     32        When starting or completing main frame navigations, let the PageDebuggerAgent do some work.
     33
     34        * inspector/PageDebuggerAgent.h:
     35        * inspector/PageDebuggerAgent.cpp:
     36        (WebCore::PageDebuggerAgent::mainFrameStartedLoading):
     37        (WebCore::PageDebuggerAgent::mainFrameStoppedLoading):
     38        (WebCore::PageDebuggerAgent::mainFrameNavigated):
     39        Suppress pausing if navigating while paused. Otherwise behave as normal.
     40
    1412015-09-15  Brent Fulgham  <bfulgham@apple.com>
    242
  • trunk/Source/WebCore/inspector/InspectorController.cpp

    r189654 r189834  
    164164
    165165    auto debuggerAgentPtr = std::make_unique<PageDebuggerAgent>(pageContext, pageAgent, m_overlay.get());
    166     m_debuggerAgent = debuggerAgentPtr.get();
     166    PageDebuggerAgent* debuggerAgent = debuggerAgentPtr.get();
    167167    m_agents.append(WTF::move(debuggerAgentPtr));
    168168
    169     auto domDebuggerAgentPtr = std::make_unique<InspectorDOMDebuggerAgent>(pageContext, m_domAgent, m_debuggerAgent);
     169    auto domDebuggerAgentPtr = std::make_unique<InspectorDOMDebuggerAgent>(pageContext, m_domAgent, debuggerAgent);
    170170    m_domDebuggerAgent = domDebuggerAgentPtr.get();
    171171    m_agents.append(WTF::move(domDebuggerAgentPtr));
     
    185185    }
    186186
    187     runtimeAgent->setScriptDebugServer(&m_debuggerAgent->scriptDebugServer());
    188     m_timelineAgent->setPageScriptDebugServer(&m_debuggerAgent->scriptDebugServer());
     187    runtimeAgent->setScriptDebugServer(&debuggerAgent->scriptDebugServer());
     188    m_timelineAgent->setPageScriptDebugServer(&debuggerAgent->scriptDebugServer());
    189189}
    190190
     
    424424}
    425425
    426 void InspectorController::resume()
    427 {
    428     if (m_debuggerAgent) {
    429         ErrorString unused;
    430         m_debuggerAgent->resume(unused);
    431     }
    432 }
    433 
    434426bool InspectorController::developerExtrasEnabled() const
    435427{
  • trunk/Source/WebCore/inspector/InspectorController.h

    r189375 r189834  
    122122    WEBCORE_EXPORT void setProfilerEnabled(bool);
    123123
    124     void resume();
    125 
    126124    InspectorClient* inspectorClient() const { return m_inspectorClient; }
    127125    InspectorPageAgent* pageAgent() const { return m_pageAgent; }
     
    157155    InspectorResourceAgent* m_resourceAgent { nullptr };
    158156    InspectorPageAgent* m_pageAgent { nullptr };
    159     PageDebuggerAgent* m_debuggerAgent { nullptr };
    160157    InspectorDOMDebuggerAgent* m_domDebuggerAgent { nullptr };
    161158    InspectorTimelineAgent* m_timelineAgent { nullptr };
  • trunk/Source/WebCore/inspector/InspectorInstrumentation.cpp

    r189438 r189834  
    799799        if (InspectorLayerTreeAgent* layerTreeAgent = instrumentingAgents.inspectorLayerTreeAgent())
    800800            layerTreeAgent->reset();
     801
     802        if (PageDebuggerAgent* pageDebuggerAgent = instrumentingAgents.pageDebuggerAgent())
     803            pageDebuggerAgent->mainFrameNavigated();
    801804    }
    802805
     
    829832void InspectorInstrumentation::frameStartedLoadingImpl(InstrumentingAgents& instrumentingAgents, Frame& frame)
    830833{
     834    if (frame.isMainFrame()) {
     835        if (PageDebuggerAgent* pageDebuggerAgent = instrumentingAgents.pageDebuggerAgent())
     836            pageDebuggerAgent->mainFrameStartedLoading();
     837    }
     838
    831839    if (InspectorPageAgent* inspectorPageAgent = instrumentingAgents.inspectorPageAgent())
    832840        inspectorPageAgent->frameStartedLoading(frame);
     
    835843void InspectorInstrumentation::frameStoppedLoadingImpl(InstrumentingAgents& instrumentingAgents, Frame& frame)
    836844{
     845    if (frame.isMainFrame()) {
     846        if (PageDebuggerAgent* pageDebuggerAgent = instrumentingAgents.pageDebuggerAgent())
     847            pageDebuggerAgent->mainFrameStoppedLoading();
     848    }
     849
    837850    if (InspectorPageAgent* inspectorPageAgent = instrumentingAgents.inspectorPageAgent())
    838851        inspectorPageAgent->frameStoppedLoading(frame);
  • trunk/Source/WebCore/inspector/PageDebuggerAgent.cpp

    r189438 r189834  
    148148}
    149149
     150void PageDebuggerAgent::mainFrameStartedLoading()
     151{
     152    if (isPaused()) {
     153        setSuppressAllPauses(true);
     154        ErrorString unused;
     155        resume(unused);
     156    }
     157}
     158
     159void PageDebuggerAgent::mainFrameStoppedLoading()
     160{
     161    setSuppressAllPauses(false);
     162}
     163
     164void PageDebuggerAgent::mainFrameNavigated()
     165{
     166    setSuppressAllPauses(false);
     167}
     168
    150169} // namespace WebCore
  • trunk/Source/WebCore/inspector/PageDebuggerAgent.h

    r189438 r189834  
    5252    void didClearMainFrameWindowObject();
    5353
     54    void mainFrameStartedLoading();
     55    void mainFrameStoppedLoading();
     56    void mainFrameNavigated();
     57
    5458    virtual PageScriptDebugServer& scriptDebugServer() override;
    5559
  • trunk/Source/WebCore/loader/FrameLoader.cpp

    r189252 r189834  
    29842984        return;
    29852985
    2986     if (Page* page = m_frame.page()) {
    2987         if (m_frame.isMainFrame())
    2988             page->inspectorController().resume();
    2989     }
    2990 
    29912986    setProvisionalDocumentLoader(m_policyDocumentLoader.get());
    29922987    m_loadType = type;
Note: See TracChangeset for help on using the changeset viewer.