Improve use of NeverDestroyed
[WebKit-https.git] / Source / WebCore / page / MainFrame.cpp
1 /*
2  * Copyright (C) 2013-2016 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 "PageConfiguration.h"
31 #include "PageOverlayController.h"
32 #include "PaymentCoordinator.h"
33 #include "PerformanceLogging.h"
34 #include "ScrollLatchingState.h"
35 #include "WheelEventDeltaFilter.h"
36
37 #if PLATFORM(MAC)
38 #include "ServicesOverlayController.h"
39 #endif
40
41 namespace WebCore {
42
43 inline MainFrame::MainFrame(Page& page, PageConfiguration& configuration)
44     : Frame(page, nullptr, *configuration.loaderClientForMainFrame)
45     , m_selfOnlyRefCount(0)
46 #if PLATFORM(MAC) && (ENABLE(SERVICE_CONTROLS) || ENABLE(TELEPHONE_NUMBER_DETECTION))
47     , m_servicesOverlayController(std::make_unique<ServicesOverlayController>(*this))
48 #endif
49     , m_recentWheelEventDeltaFilter(WheelEventDeltaFilter::create())
50     , m_pageOverlayController(std::make_unique<PageOverlayController>(*this))
51 #if ENABLE(APPLE_PAY)
52     , m_paymentCoordinator(std::make_unique<PaymentCoordinator>(*configuration.paymentCoordinatorClient))
53 #endif
54     , m_performanceLogging(std::make_unique<PerformanceLogging>(*this))
55 {
56 }
57
58 MainFrame::~MainFrame()
59 {
60     m_recentWheelEventDeltaFilter = nullptr;
61
62     setMainFrameWasDestroyed();
63 }
64
65 Ref<MainFrame> MainFrame::create(Page& page, PageConfiguration& configuration)
66 {
67     return adoptRef(*new MainFrame(page, configuration));
68 }
69
70 void MainFrame::selfOnlyRef()
71 {
72     if (m_selfOnlyRefCount++)
73         return;
74
75     ref();
76 }
77
78 void MainFrame::selfOnlyDeref()
79 {
80     ASSERT(m_selfOnlyRefCount);
81     if (--m_selfOnlyRefCount)
82         return;
83
84     if (hasOneRef())
85         dropChildren();
86
87     deref();
88 }
89
90 void MainFrame::dropChildren()
91 {
92     while (Frame* child = tree().firstChild())
93         tree().removeChild(*child);
94 }
95
96 void MainFrame::didCompleteLoad()
97 {
98     performanceLogging().didReachPointOfInterest(PerformanceLogging::MainFrameLoadCompleted);
99 }
100
101 #if PLATFORM(MAC)
102 ScrollLatchingState* MainFrame::latchingState()
103 {
104     if (m_latchingState.isEmpty())
105         return nullptr;
106
107     return &m_latchingState.last();
108 }
109
110 void MainFrame::pushNewLatchingState()
111 {
112     m_latchingState.append(ScrollLatchingState());
113 }
114
115 void MainFrame::resetLatchingState()
116 {
117     m_latchingState.clear();
118 }
119     
120 void MainFrame::popLatchingState()
121 {
122     m_latchingState.removeLast();
123 }
124
125 void MainFrame::removeLatchingStateForTarget(Element& targetNode)
126 {
127     if (m_latchingState.isEmpty())
128         return;
129
130     m_latchingState.removeAllMatching([&targetNode] (ScrollLatchingState& state) {
131         auto* wheelElement = state.wheelEventElement();
132         if (!wheelElement)
133             return false;
134
135         return targetNode.isEqualNode(wheelElement);
136     });
137 }
138 #endif
139
140 }