bfd1eac49ebaaf10c1ff0e7eeef762450e3dae9d
[WebKit-https.git] / Source / WebCore / page / MainFrame.cpp
1 /*
2  * Copyright (C) 2013-2015 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "MainFrame.h"
28
29 #include "Element.h"
30 #include "EmptyClients.h"
31 #include "PageConfiguration.h"
32 #include "PageOverlayController.h"
33 #include "ScrollLatchingState.h"
34 #include "Settings.h"
35 #include "WheelEventDeltaTracker.h"
36 #include <wtf/NeverDestroyed.h>
37
38 #if PLATFORM(MAC)
39 #include "ServicesOverlayController.h"
40 #endif
41
42 namespace WebCore {
43
44 inline MainFrame::MainFrame(Page& page, PageConfiguration& configuration)
45     : Frame(page, nullptr, *configuration.loaderClientForMainFrame)
46     , m_selfOnlyRefCount(0)
47 #if PLATFORM(MAC)
48 #if ENABLE(SERVICE_CONTROLS) || ENABLE(TELEPHONE_NUMBER_DETECTION)
49     , m_servicesOverlayController(std::make_unique<ServicesOverlayController>(*this))
50 #endif
51 #endif
52     , m_recentWheelEventDeltaTracker(std::make_unique<WheelEventDeltaTracker>())
53     , m_pageOverlayController(std::make_unique<PageOverlayController>(*this))
54     , m_diagnosticLoggingClient(configuration.diagnosticLoggingClient)
55 {
56 }
57
58 MainFrame::~MainFrame()
59 {
60     if (m_diagnosticLoggingClient)
61         m_diagnosticLoggingClient->mainFrameDestroyed();
62 }
63
64 Ref<MainFrame> MainFrame::create(Page& page, PageConfiguration& configuration)
65 {
66     return adoptRef(*new MainFrame(page, configuration));
67 }
68
69 void MainFrame::selfOnlyRef()
70 {
71     if (m_selfOnlyRefCount++)
72         return;
73
74     ref();
75 }
76
77 void MainFrame::selfOnlyDeref()
78 {
79     ASSERT(m_selfOnlyRefCount);
80     if (--m_selfOnlyRefCount)
81         return;
82
83     if (hasOneRef())
84         dropChildren();
85
86     deref();
87 }
88
89 DiagnosticLoggingClient& MainFrame::diagnosticLoggingClient() const
90 {
91     static NeverDestroyed<EmptyDiagnosticLoggingClient> dummyClient;
92     if (!settings().diagnosticLoggingEnabled() || !m_diagnosticLoggingClient)
93         return dummyClient;
94
95     return *m_diagnosticLoggingClient;
96 }
97
98 void MainFrame::dropChildren()
99 {
100     while (Frame* child = tree().firstChild())
101         tree().removeChild(child);
102 }
103
104 #if PLATFORM(MAC)
105 ScrollLatchingState* MainFrame::latchingState()
106 {
107     if (m_latchingState.isEmpty())
108         return nullptr;
109
110     return &m_latchingState.last();
111 }
112
113 void MainFrame::pushNewLatchingState()
114 {
115     m_latchingState.append(ScrollLatchingState());
116 }
117
118 void MainFrame::resetLatchingState()
119 {
120     m_latchingState.clear();
121 }
122     
123 void MainFrame::popLatchingState()
124 {
125     m_latchingState.removeLast();
126 }
127 #endif
128
129 }