OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2013 Google Inc. All rights reserved. | 2 * Copyright (C) 2013 Google Inc. All rights reserved. |
3 * | 3 * |
4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
5 * modification, are permitted provided that the following conditions are | 5 * modification, are permitted provided that the following conditions are |
6 * met: | 6 * met: |
7 * | 7 * |
8 * * Redistributions of source code must retain the above copyright | 8 * * 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 * * Redistributions in binary form must reproduce the above | 10 * * Redistributions in binary form must reproduce the above |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
50 FullscreenController* FullscreenController::create(WebViewImpl* webViewImpl) | 50 FullscreenController* FullscreenController::create(WebViewImpl* webViewImpl) |
51 { | 51 { |
52 return new FullscreenController(webViewImpl); | 52 return new FullscreenController(webViewImpl); |
53 } | 53 } |
54 | 54 |
55 FullscreenController::FullscreenController(WebViewImpl* webViewImpl) | 55 FullscreenController::FullscreenController(WebViewImpl* webViewImpl) |
56 : m_webViewImpl(webViewImpl) | 56 : m_webViewImpl(webViewImpl) |
57 , m_haveEnteredFullscreen(false) | 57 , m_haveEnteredFullscreen(false) |
58 , m_exitFullscreenPageScaleFactor(0) | 58 , m_exitFullscreenPageScaleFactor(0) |
59 , m_needsScrollAndScaleRestore(false) | 59 , m_needsScrollAndScaleRestore(false) |
60 , m_isCancelingFullScreen(false) | 60 , m_isCancelingFullscreen(false) |
61 { | 61 { |
62 } | 62 } |
63 | 63 |
64 void FullscreenController::didEnterFullscreen() | 64 void FullscreenController::didEnterFullscreen() |
65 { | 65 { |
66 if (!m_provisionalFullScreenElement) | 66 if (!m_provisionalFullscreenElement) |
67 return; | 67 return; |
68 | 68 |
69 Element* element = m_provisionalFullScreenElement.release(); | 69 Element* element = m_provisionalFullscreenElement.release(); |
70 Document& document = element->document(); | 70 Document& document = element->document(); |
71 m_fullScreenFrame = document.frame(); | 71 m_fullscreenFrame = document.frame(); |
72 | 72 |
73 if (!m_fullScreenFrame) | 73 if (!m_fullscreenFrame) |
74 return; | 74 return; |
75 | 75 |
76 if (!m_haveEnteredFullscreen) { | 76 if (!m_haveEnteredFullscreen) { |
77 updatePageScaleConstraints(false); | 77 updatePageScaleConstraints(false); |
78 m_webViewImpl->setPageScaleFactor(1.0f); | 78 m_webViewImpl->setPageScaleFactor(1.0f); |
79 if (m_webViewImpl->mainFrame()->isWebLocalFrame()) | 79 if (m_webViewImpl->mainFrame()->isWebLocalFrame()) |
80 m_webViewImpl->mainFrame()->setScrollOffset(WebSize()); | 80 m_webViewImpl->mainFrame()->setScrollOffset(WebSize()); |
81 m_webViewImpl->setVisualViewportOffset(FloatPoint()); | 81 m_webViewImpl->setVisualViewportOffset(FloatPoint()); |
82 m_haveEnteredFullscreen = true; | 82 m_haveEnteredFullscreen = true; |
83 } | 83 } |
84 | 84 |
85 Fullscreen::from(document).didEnterFullscreenForElement(element); | 85 Fullscreen::from(document).didEnterFullscreenForElement(element); |
86 DCHECK_EQ(Fullscreen::currentFullScreenElementFrom(document), element); | 86 DCHECK_EQ(Fullscreen::currentFullScreenElementFrom(document), element); |
87 | 87 |
88 if (isHTMLVideoElement(element)) { | 88 if (isHTMLVideoElement(element)) { |
89 HTMLVideoElement* videoElement = toHTMLVideoElement(element); | 89 HTMLVideoElement* videoElement = toHTMLVideoElement(element); |
90 if (videoElement->usesOverlayFullscreenVideo() && m_webViewImpl->layerTr
eeView()) | 90 if (videoElement->usesOverlayFullscreenVideo() && m_webViewImpl->layerTr
eeView()) |
91 m_webViewImpl->layerTreeView()->setHasTransparentBackground(true); | 91 m_webViewImpl->layerTreeView()->setHasTransparentBackground(true); |
92 } | 92 } |
93 } | 93 } |
94 | 94 |
95 void FullscreenController::didExitFullscreen() | 95 void FullscreenController::didExitFullscreen() |
96 { | 96 { |
97 if (!m_fullScreenFrame) | 97 if (!m_fullscreenFrame) |
98 return; | 98 return; |
99 | 99 |
100 if (m_haveEnteredFullscreen) | 100 if (m_haveEnteredFullscreen) |
101 updatePageScaleConstraints(true); | 101 updatePageScaleConstraints(true); |
102 | 102 |
103 if (Document* document = m_fullScreenFrame->document()) { | 103 if (Document* document = m_fullscreenFrame->document()) { |
104 if (Fullscreen* fullscreen = Fullscreen::fromIfExists(*document)) { | 104 if (Fullscreen* fullscreen = Fullscreen::fromIfExists(*document)) { |
105 Element* element = fullscreen->currentFullScreenElement(); | 105 Element* element = fullscreen->currentFullScreenElement(); |
106 if (element) { | 106 if (element) { |
107 // When the client exits from full screen we have to call fullyE
xitFullscreen to notify | 107 // When the client exits from full screen we have to call fullyE
xitFullscreen to notify |
108 // the document. While doing that, suppress notifications back t
o the client. | 108 // the document. While doing that, suppress notifications back t
o the client. |
109 m_isCancelingFullScreen = true; | 109 m_isCancelingFullscreen = true; |
110 Fullscreen::fullyExitFullscreen(*document); | 110 Fullscreen::fullyExitFullscreen(*document); |
111 m_isCancelingFullScreen = false; | 111 m_isCancelingFullscreen = false; |
112 | 112 |
113 // If the video used overlay fullscreen mode, the background was
made transparent. Restore the transparency. | 113 // If the video used overlay fullscreen mode, the background was
made transparent. Restore the transparency. |
114 if (isHTMLVideoElement(element) && m_webViewImpl->layerTreeView(
)) | 114 if (isHTMLVideoElement(element) && m_webViewImpl->layerTreeView(
)) |
115 m_webViewImpl->layerTreeView()->setHasTransparentBackground(
m_webViewImpl->isTransparent()); | 115 m_webViewImpl->layerTreeView()->setHasTransparentBackground(
m_webViewImpl->isTransparent()); |
116 | 116 |
117 // We need to wait until style and layout are updated in order | 117 // We need to wait until style and layout are updated in order |
118 // to propertly restore scroll offsets since content may not be | 118 // to propertly restore scroll offsets since content may not be |
119 // overflowing in the same way until they do. | 119 // overflowing in the same way until they do. |
120 if (m_haveEnteredFullscreen) | 120 if (m_haveEnteredFullscreen) |
121 m_needsScrollAndScaleRestore = true; | 121 m_needsScrollAndScaleRestore = true; |
122 | 122 |
123 fullscreen->didExitFullscreen(); | 123 fullscreen->didExitFullscreen(); |
124 } | 124 } |
125 } | 125 } |
126 } | 126 } |
127 | 127 |
128 m_haveEnteredFullscreen = false; | 128 m_haveEnteredFullscreen = false; |
129 m_fullScreenFrame.clear(); | 129 m_fullscreenFrame.clear(); |
130 } | 130 } |
131 | 131 |
132 void FullscreenController::enterFullScreenForElement(Element* element) | 132 void FullscreenController::enterFullscreenForElement(Element* element) |
133 { | 133 { |
134 // We are already transitioning to fullscreen for a different element. | 134 // We are already transitioning to fullscreen for a different element. |
135 if (m_provisionalFullScreenElement) { | 135 if (m_provisionalFullscreenElement) { |
136 m_provisionalFullScreenElement = element; | 136 m_provisionalFullscreenElement = element; |
137 return; | 137 return; |
138 } | 138 } |
139 | 139 |
140 // We are already in fullscreen mode. | 140 // We are already in fullscreen mode. |
141 if (m_fullScreenFrame) { | 141 if (m_fullscreenFrame) { |
142 m_provisionalFullScreenElement = element; | 142 m_provisionalFullscreenElement = element; |
143 didEnterFullscreen(); | 143 didEnterFullscreen(); |
144 return; | 144 return; |
145 } | 145 } |
146 | 146 |
147 // We need to store these values here rather than didEnterFullscreen since | 147 // We need to store these values here rather than didEnterFullscreen since |
148 // by the time the latter is called, a Resize has already occured, clamping | 148 // by the time the latter is called, a Resize has already occured, clamping |
149 // the scroll offset. Don't save values if we're still waiting to restore | 149 // the scroll offset. Don't save values if we're still waiting to restore |
150 // a previous set. This can happen if we exit and quickly reenter fullscreen | 150 // a previous set. This can happen if we exit and quickly reenter fullscreen |
151 // without performing a layout. | 151 // without performing a layout. |
152 if (!m_haveEnteredFullscreen && !m_needsScrollAndScaleRestore) { | 152 if (!m_haveEnteredFullscreen && !m_needsScrollAndScaleRestore) { |
153 m_exitFullscreenPageScaleFactor = m_webViewImpl->pageScaleFactor(); | 153 m_exitFullscreenPageScaleFactor = m_webViewImpl->pageScaleFactor(); |
154 m_exitFullscreenScrollOffset = m_webViewImpl->mainFrame()->isWebLocalFra
me() ? m_webViewImpl->mainFrame()->scrollOffset() : WebSize(); | 154 m_exitFullscreenScrollOffset = m_webViewImpl->mainFrame()->isWebLocalFra
me() ? m_webViewImpl->mainFrame()->scrollOffset() : WebSize(); |
155 m_exitFullscreenVisualViewportOffset = m_webViewImpl->visualViewportOffs
et(); | 155 m_exitFullscreenVisualViewportOffset = m_webViewImpl->visualViewportOffs
et(); |
156 } | 156 } |
157 | 157 |
158 // We need to transition to fullscreen mode. | 158 // We need to transition to fullscreen mode. |
159 WebLocalFrameImpl* frame = WebLocalFrameImpl::fromFrame(element->document().
frame()); | 159 WebLocalFrameImpl* frame = WebLocalFrameImpl::fromFrame(element->document().
frame()); |
160 if (frame && frame->client()) { | 160 if (frame && frame->client()) { |
161 if (!Fullscreen::from(element->document()).forCrossProcessDescendant()) | 161 if (!Fullscreen::from(element->document()).forCrossProcessDescendant()) |
162 frame->client()->enterFullscreen(); | 162 frame->client()->enterFullscreen(); |
163 m_provisionalFullScreenElement = element; | 163 m_provisionalFullscreenElement = element; |
164 } | 164 } |
165 } | 165 } |
166 | 166 |
167 void FullscreenController::exitFullScreenForElement(Element* element) | 167 void FullscreenController::exitFullscreenForElement(Element* element) |
168 { | 168 { |
169 DCHECK(element); | 169 DCHECK(element); |
170 | 170 |
171 // The client is exiting full screen, so don't send a notification. | 171 // The client is exiting full screen, so don't send a notification. |
172 if (m_isCancelingFullScreen) | 172 if (m_isCancelingFullscreen) |
173 return; | 173 return; |
174 | 174 |
175 WebLocalFrameImpl* frame = WebLocalFrameImpl::fromFrame(element->document().
frame()); | 175 WebLocalFrameImpl* frame = WebLocalFrameImpl::fromFrame(element->document().
frame()); |
176 if (frame && frame->client()) | 176 if (frame && frame->client()) |
177 frame->client()->exitFullscreen(); | 177 frame->client()->exitFullscreen(); |
178 } | 178 } |
179 | 179 |
180 void FullscreenController::updateSize() | 180 void FullscreenController::updateSize() |
181 { | 181 { |
182 if (!isFullscreen()) | 182 if (!isFullscreen()) |
183 return; | 183 return; |
184 | 184 |
185 updatePageScaleConstraints(false); | 185 updatePageScaleConstraints(false); |
186 | 186 |
187 LayoutFullScreen* layoutObject = Fullscreen::from(*m_fullScreenFrame->docume
nt()).fullScreenLayoutObject(); | 187 LayoutFullScreen* layoutObject = Fullscreen::from(*m_fullscreenFrame->docume
nt()).fullScreenLayoutObject(); |
188 if (layoutObject) | 188 if (layoutObject) |
189 layoutObject->updateStyle(); | 189 layoutObject->updateStyle(); |
190 } | 190 } |
191 | 191 |
192 void FullscreenController::didUpdateLayout() | 192 void FullscreenController::didUpdateLayout() |
193 { | 193 { |
194 if (!m_needsScrollAndScaleRestore) | 194 if (!m_needsScrollAndScaleRestore) |
195 return; | 195 return; |
196 | 196 |
197 // If we re-entered fullscreen before we could restore the scroll and scale | 197 // If we re-entered fullscreen before we could restore the scroll and scale |
(...skipping 25 matching lines...) Expand all Loading... |
223 // Just fire the event again to ensure the final constraints pick up the lat
est contents size. | 223 // Just fire the event again to ensure the final constraints pick up the lat
est contents size. |
224 m_webViewImpl->didChangeContentsSize(); | 224 m_webViewImpl->didChangeContentsSize(); |
225 if (m_webViewImpl->mainFrameImpl() && m_webViewImpl->mainFrameImpl()->frameV
iew()) | 225 if (m_webViewImpl->mainFrameImpl() && m_webViewImpl->mainFrameImpl()->frameV
iew()) |
226 m_webViewImpl->mainFrameImpl()->frameView()->setNeedsLayout(); | 226 m_webViewImpl->mainFrameImpl()->frameView()->setNeedsLayout(); |
227 | 227 |
228 m_webViewImpl->updateMainFrameLayoutSize(); | 228 m_webViewImpl->updateMainFrameLayoutSize(); |
229 } | 229 } |
230 | 230 |
231 DEFINE_TRACE(FullscreenController) | 231 DEFINE_TRACE(FullscreenController) |
232 { | 232 { |
233 visitor->trace(m_provisionalFullScreenElement); | 233 visitor->trace(m_provisionalFullscreenElement); |
234 visitor->trace(m_fullScreenFrame); | 234 visitor->trace(m_fullscreenFrame); |
235 } | 235 } |
236 | 236 |
237 } // namespace blink | 237 } // namespace blink |
OLD | NEW |