Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(447)

Side by Side Diff: third_party/WebKit/Source/web/FullscreenController.cpp

Issue 2848513002: Introduce the abstract class WebViewBase, to decouple WebViewImpl. (Closed)
Patch Set: Fix typo. Created 3 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 14 matching lines...) Expand all
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 #include "web/FullscreenController.h" 31 #include "web/FullscreenController.h"
32 32
33 #include "core/dom/Document.h" 33 #include "core/dom/Document.h"
34 #include "core/dom/Fullscreen.h" 34 #include "core/dom/Fullscreen.h"
35 #include "core/exported/WebViewBase.h"
35 #include "core/frame/FrameView.h" 36 #include "core/frame/FrameView.h"
36 #include "core/frame/LocalFrame.h" 37 #include "core/frame/LocalFrame.h"
37 #include "core/frame/PageScaleConstraintsSet.h" 38 #include "core/frame/PageScaleConstraintsSet.h"
38 #include "core/html/HTMLVideoElement.h" 39 #include "core/html/HTMLVideoElement.h"
39 #include "core/layout/LayoutFullScreen.h" 40 #include "core/layout/LayoutFullScreen.h"
41 #include "core/page/Page.h"
40 #include "public/platform/WebLayerTreeView.h" 42 #include "public/platform/WebLayerTreeView.h"
41 #include "public/web/WebFrameClient.h" 43 #include "public/web/WebFrameClient.h"
42 #include "web/WebLocalFrameImpl.h" 44 #include "web/WebLocalFrameImpl.h"
43 #include "web/WebViewImpl.h"
44 45
45 namespace blink { 46 namespace blink {
46 47
47 namespace { 48 namespace {
48 49
49 WebFrameClient& GetWebFrameClient(LocalFrame& frame) { 50 WebFrameClient& GetWebFrameClient(LocalFrame& frame) {
50 WebLocalFrameImpl* web_frame = WebLocalFrameImpl::FromFrame(frame); 51 WebLocalFrameImpl* web_frame = WebLocalFrameImpl::FromFrame(frame);
51 DCHECK(web_frame); 52 DCHECK(web_frame);
52 DCHECK(web_frame->Client()); 53 DCHECK(web_frame->Client());
53 return *web_frame->Client(); 54 return *web_frame->Client();
54 } 55 }
55 56
56 } // anonymous namespace 57 } // anonymous namespace
57 58
58 std::unique_ptr<FullscreenController> FullscreenController::Create( 59 std::unique_ptr<FullscreenController> FullscreenController::Create(
59 WebViewImpl* web_view_impl) { 60 WebViewBase* web_view_base) {
60 return WTF::WrapUnique(new FullscreenController(web_view_impl)); 61 return WTF::WrapUnique(new FullscreenController(web_view_base));
61 } 62 }
62 63
63 FullscreenController::FullscreenController(WebViewImpl* web_view_impl) 64 FullscreenController::FullscreenController(WebViewBase* web_view_base)
64 : web_view_impl_(web_view_impl) {} 65 : web_view_base_(web_view_base) {}
65 66
66 void FullscreenController::DidEnterFullscreen() { 67 void FullscreenController::DidEnterFullscreen() {
67 // |Browser::EnterFullscreenModeForTab()| can enter fullscreen without going 68 // |Browser::EnterFullscreenModeForTab()| can enter fullscreen without going
68 // through |Fullscreen::requestFullscreen()|, in which case there will be no 69 // through |Fullscreen::requestFullscreen()|, in which case there will be no
69 // fullscreen element. Do nothing. 70 // fullscreen element. Do nothing.
70 if (state_ != State::kEnteringFullscreen) 71 if (state_ != State::kEnteringFullscreen)
71 return; 72 return;
72 73
73 UpdatePageScaleConstraints(false); 74 UpdatePageScaleConstraints(false);
74 web_view_impl_->SetPageScaleFactor(1.0f); 75 web_view_base_->SetPageScaleFactor(1.0f);
75 if (web_view_impl_->MainFrame()->IsWebLocalFrame()) 76 if (web_view_base_->MainFrame()->IsWebLocalFrame())
76 web_view_impl_->MainFrame()->SetScrollOffset(WebSize()); 77 web_view_base_->MainFrame()->SetScrollOffset(WebSize());
77 web_view_impl_->SetVisualViewportOffset(FloatPoint()); 78 web_view_base_->SetVisualViewportOffset(FloatPoint());
78 79
79 state_ = State::kFullscreen; 80 state_ = State::kFullscreen;
80 81
81 // Notify all local frames that we have entered fullscreen. 82 // Notify all local frames that we have entered fullscreen.
82 for (Frame* frame = web_view_impl_->GetPage()->MainFrame(); frame; 83 for (Frame* frame = web_view_base_->GetPage()->MainFrame(); frame;
83 frame = frame->Tree().TraverseNext()) { 84 frame = frame->Tree().TraverseNext()) {
84 if (!frame->IsLocalFrame()) 85 if (!frame->IsLocalFrame())
85 continue; 86 continue;
86 if (Document* document = ToLocalFrame(frame)->GetDocument()) { 87 if (Document* document = ToLocalFrame(frame)->GetDocument()) {
87 if (Fullscreen* fullscreen = Fullscreen::FromIfExists(*document)) 88 if (Fullscreen* fullscreen = Fullscreen::FromIfExists(*document))
88 fullscreen->DidEnterFullscreen(); 89 fullscreen->DidEnterFullscreen();
89 } 90 }
90 } 91 }
91 } 92 }
92 93
(...skipping 13 matching lines...) Expand all
106 // TODO(foolip): Remove this when state changes and events are synchronized 107 // TODO(foolip): Remove this when state changes and events are synchronized
107 // with animation frames. https://crbug.com/402376 108 // with animation frames. https://crbug.com/402376
108 state_ = State::kExitingFullscreen; 109 state_ = State::kExitingFullscreen;
109 110
110 // Notify all local frames that we have exited fullscreen. 111 // Notify all local frames that we have exited fullscreen.
111 // TODO(foolip): This should only need to notify the topmost local roots. That 112 // TODO(foolip): This should only need to notify the topmost local roots. That
112 // doesn't currently work because |Fullscreen::m_currentFullScreenElement| 113 // doesn't currently work because |Fullscreen::m_currentFullScreenElement|
113 // isn't set for the topmost document when an iframe goes fullscreen, but can 114 // isn't set for the topmost document when an iframe goes fullscreen, but can
114 // be done once |m_currentFullScreenElement| is gone and all state is in the 115 // be done once |m_currentFullScreenElement| is gone and all state is in the
115 // fullscreen element stack. https://crbug.com/402421 116 // fullscreen element stack. https://crbug.com/402421
116 for (Frame* frame = web_view_impl_->GetPage()->MainFrame(); frame; 117 for (Frame* frame = web_view_base_->GetPage()->MainFrame(); frame;
117 frame = frame->Tree().TraverseNext()) { 118 frame = frame->Tree().TraverseNext()) {
118 if (!frame->IsLocalFrame()) 119 if (!frame->IsLocalFrame())
119 continue; 120 continue;
120 if (Document* document = ToLocalFrame(frame)->GetDocument()) { 121 if (Document* document = ToLocalFrame(frame)->GetDocument()) {
121 if (Fullscreen* fullscreen = Fullscreen::FromIfExists(*document)) 122 if (Fullscreen* fullscreen = Fullscreen::FromIfExists(*document))
122 fullscreen->DidExitFullscreen(); 123 fullscreen->DidExitFullscreen();
123 } 124 }
124 } 125 }
125 126
126 // We need to wait until style and layout are updated in order to properly 127 // We need to wait until style and layout are updated in order to properly
(...skipping 13 matching lines...) Expand all
140 state_ = old_state; 141 state_ = old_state;
141 return; 142 return;
142 } 143 }
143 144
144 // We need to store these values here rather than in |didEnterFullscreen()| 145 // We need to store these values here rather than in |didEnterFullscreen()|
145 // since by the time the latter is called, a Resize has already occured, 146 // since by the time the latter is called, a Resize has already occured,
146 // clamping the scroll offset. Don't save values if we're still waiting to 147 // clamping the scroll offset. Don't save values if we're still waiting to
147 // restore a previous set. This can happen if we exit and quickly reenter 148 // restore a previous set. This can happen if we exit and quickly reenter
148 // fullscreen without performing a layout. 149 // fullscreen without performing a layout.
149 if (state_ == State::kInitial) { 150 if (state_ == State::kInitial) {
150 initial_page_scale_factor_ = web_view_impl_->PageScaleFactor(); 151 initial_page_scale_factor_ = web_view_base_->PageScaleFactor();
151 initial_scroll_offset_ = 152 initial_scroll_offset_ =
152 web_view_impl_->MainFrame()->IsWebLocalFrame() 153 web_view_base_->MainFrame()->IsWebLocalFrame()
153 ? web_view_impl_->MainFrame()->GetScrollOffset() 154 ? web_view_base_->MainFrame()->GetScrollOffset()
154 : WebSize(); 155 : WebSize();
155 initial_visual_viewport_offset_ = web_view_impl_->VisualViewportOffset(); 156 initial_visual_viewport_offset_ = web_view_base_->VisualViewportOffset();
156 initial_background_color_override_enabled_ = 157 initial_background_color_override_enabled_ =
157 web_view_impl_->BackgroundColorOverrideEnabled(); 158 web_view_base_->BackgroundColorOverrideEnabled();
158 initial_background_color_override_ = 159 initial_background_color_override_ =
159 web_view_impl_->BackgroundColorOverride(); 160 web_view_base_->BackgroundColorOverride();
160 } 161 }
161 162
162 // If already entering fullscreen, just wait. 163 // If already entering fullscreen, just wait.
163 if (state_ == State::kEnteringFullscreen) 164 if (state_ == State::kEnteringFullscreen)
164 return; 165 return;
165 166
166 DCHECK(state_ == State::kInitial || 167 DCHECK(state_ == State::kInitial ||
167 state_ == State::kNeedsScrollAndScaleRestore); 168 state_ == State::kNeedsScrollAndScaleRestore);
168 GetWebFrameClient(frame).EnterFullscreen(); 169 GetWebFrameClient(frame).EnterFullscreen();
169 170
(...skipping 24 matching lines...) Expand all
194 if (to_element) { 195 if (to_element) {
195 DCHECK(Fullscreen::IsCurrentFullScreenElement(*to_element)); 196 DCHECK(Fullscreen::IsCurrentFullScreenElement(*to_element));
196 197
197 if (isHTMLVideoElement(*to_element)) { 198 if (isHTMLVideoElement(*to_element)) {
198 HTMLVideoElement& video_element = toHTMLVideoElement(*to_element); 199 HTMLVideoElement& video_element = toHTMLVideoElement(*to_element);
199 video_element.DidEnterFullscreen(); 200 video_element.DidEnterFullscreen();
200 201
201 // If the video uses overlay fullscreen mode, make the background 202 // If the video uses overlay fullscreen mode, make the background
202 // transparent. 203 // transparent.
203 if (video_element.UsesOverlayFullscreenVideo()) 204 if (video_element.UsesOverlayFullscreenVideo())
204 web_view_impl_->SetBackgroundColorOverride(Color::kTransparent); 205 web_view_base_->SetBackgroundColorOverride(Color::kTransparent);
205 } 206 }
206 } 207 }
207 208
208 if (from_element) { 209 if (from_element) {
209 DCHECK(!Fullscreen::IsCurrentFullScreenElement(*from_element)); 210 DCHECK(!Fullscreen::IsCurrentFullScreenElement(*from_element));
210 211
211 if (isHTMLVideoElement(*from_element)) { 212 if (isHTMLVideoElement(*from_element)) {
212 HTMLVideoElement& video_element = toHTMLVideoElement(*from_element); 213 HTMLVideoElement& video_element = toHTMLVideoElement(*from_element);
213 video_element.DidExitFullscreen(); 214 video_element.DidExitFullscreen();
214 } 215 }
215 } 216 }
216 } 217 }
217 218
218 void FullscreenController::RestoreBackgroundColorOverride() { 219 void FullscreenController::RestoreBackgroundColorOverride() {
219 if (web_view_impl_->BackgroundColorOverrideEnabled() != 220 if (web_view_base_->BackgroundColorOverrideEnabled() !=
220 initial_background_color_override_enabled_ || 221 initial_background_color_override_enabled_ ||
221 web_view_impl_->BackgroundColorOverride() != 222 web_view_base_->BackgroundColorOverride() !=
222 initial_background_color_override_) { 223 initial_background_color_override_) {
223 if (initial_background_color_override_enabled_) { 224 if (initial_background_color_override_enabled_) {
224 web_view_impl_->SetBackgroundColorOverride( 225 web_view_base_->SetBackgroundColorOverride(
225 initial_background_color_override_); 226 initial_background_color_override_);
226 } else { 227 } else {
227 web_view_impl_->ClearBackgroundColorOverride(); 228 web_view_base_->ClearBackgroundColorOverride();
228 } 229 }
229 } 230 }
230 } 231 }
231 232
232 void FullscreenController::UpdateSize() { 233 void FullscreenController::UpdateSize() {
233 DCHECK(web_view_impl_->GetPage()); 234 DCHECK(web_view_base_->GetPage());
234 235
235 if (state_ != State::kFullscreen && state_ != State::kExitingFullscreen) 236 if (state_ != State::kFullscreen && state_ != State::kExitingFullscreen)
236 return; 237 return;
237 238
238 UpdatePageScaleConstraints(false); 239 UpdatePageScaleConstraints(false);
239 240
240 // Traverse all local frames and notify the LayoutFullScreen object, if any. 241 // Traverse all local frames and notify the LayoutFullScreen object, if any.
241 for (Frame* frame = web_view_impl_->GetPage()->MainFrame(); frame; 242 for (Frame* frame = web_view_base_->GetPage()->MainFrame(); frame;
242 frame = frame->Tree().TraverseNext()) { 243 frame = frame->Tree().TraverseNext()) {
243 if (!frame->IsLocalFrame()) 244 if (!frame->IsLocalFrame())
244 continue; 245 continue;
245 if (Document* document = ToLocalFrame(frame)->GetDocument()) { 246 if (Document* document = ToLocalFrame(frame)->GetDocument()) {
246 if (Fullscreen* fullscreen = Fullscreen::FromIfExists(*document)) { 247 if (Fullscreen* fullscreen = Fullscreen::FromIfExists(*document)) {
247 if (LayoutFullScreen* layout_object = 248 if (LayoutFullScreen* layout_object =
248 fullscreen->FullScreenLayoutObject()) 249 fullscreen->FullScreenLayoutObject())
249 layout_object->UpdateStyle(); 250 layout_object->UpdateStyle();
250 } 251 }
251 } 252 }
252 } 253 }
253 } 254 }
254 255
255 void FullscreenController::DidUpdateLayout() { 256 void FullscreenController::DidUpdateLayout() {
256 if (state_ != State::kNeedsScrollAndScaleRestore) 257 if (state_ != State::kNeedsScrollAndScaleRestore)
257 return; 258 return;
258 259
259 web_view_impl_->SetPageScaleFactor(initial_page_scale_factor_); 260 web_view_base_->SetPageScaleFactor(initial_page_scale_factor_);
260 if (web_view_impl_->MainFrame()->IsWebLocalFrame()) 261 if (web_view_base_->MainFrame()->IsWebLocalFrame())
261 web_view_impl_->MainFrame()->SetScrollOffset( 262 web_view_base_->MainFrame()->SetScrollOffset(
262 WebSize(initial_scroll_offset_)); 263 WebSize(initial_scroll_offset_));
263 web_view_impl_->SetVisualViewportOffset(initial_visual_viewport_offset_); 264 web_view_base_->SetVisualViewportOffset(initial_visual_viewport_offset_);
264 // Background color override was already restored when 265 // Background color override was already restored when
265 // fullscreenElementChanged([..], nullptr) was called while exiting. 266 // fullscreenElementChanged([..], nullptr) was called while exiting.
266 267
267 state_ = State::kInitial; 268 state_ = State::kInitial;
268 } 269 }
269 270
270 void FullscreenController::UpdatePageScaleConstraints(bool remove_constraints) { 271 void FullscreenController::UpdatePageScaleConstraints(bool remove_constraints) {
271 PageScaleConstraints fullscreen_constraints; 272 PageScaleConstraints fullscreen_constraints;
272 if (!remove_constraints) { 273 if (!remove_constraints) {
273 fullscreen_constraints = PageScaleConstraints(1.0, 1.0, 1.0); 274 fullscreen_constraints = PageScaleConstraints(1.0, 1.0, 1.0);
274 fullscreen_constraints.layout_size = FloatSize(web_view_impl_->Size()); 275 fullscreen_constraints.layout_size = FloatSize(web_view_base_->Size());
275 } 276 }
276 web_view_impl_->GetPageScaleConstraintsSet().SetFullscreenConstraints( 277 web_view_base_->GetPageScaleConstraintsSet().SetFullscreenConstraints(
277 fullscreen_constraints); 278 fullscreen_constraints);
278 web_view_impl_->GetPageScaleConstraintsSet().ComputeFinalConstraints(); 279 web_view_base_->GetPageScaleConstraintsSet().ComputeFinalConstraints();
279 280
280 // Although we called |computedFinalConstraints()| above, the "final" 281 // Although we called |computedFinalConstraints()| above, the "final"
281 // constraints are not actually final. They are still subject to scale factor 282 // constraints are not actually final. They are still subject to scale factor
282 // clamping by contents size. Normally they should be dirtied due to contents 283 // clamping by contents size. Normally they should be dirtied due to contents
283 // size mutation after layout, however the contents size is not guaranteed to 284 // size mutation after layout, however the contents size is not guaranteed to
284 // mutate, and the scale factor may remain unclamped. Just fire the event 285 // mutate, and the scale factor may remain unclamped. Just fire the event
285 // again to ensure the final constraints pick up the latest contents size. 286 // again to ensure the final constraints pick up the latest contents size.
286 web_view_impl_->DidChangeContentsSize(); 287 web_view_base_->DidChangeContentsSize();
287 if (web_view_impl_->MainFrameImpl() && 288 if (web_view_base_->MainFrameImpl() &&
288 web_view_impl_->MainFrameImpl()->GetFrameView()) 289 web_view_base_->MainFrameImpl()->GetFrameView())
289 web_view_impl_->MainFrameImpl()->GetFrameView()->SetNeedsLayout(); 290 web_view_base_->MainFrameImpl()->GetFrameView()->SetNeedsLayout();
290 291
291 web_view_impl_->UpdateMainFrameLayoutSize(); 292 web_view_base_->UpdateMainFrameLayoutSize();
292 } 293 }
293 294
294 } // namespace blink 295 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/web/FullscreenController.h ('k') | third_party/WebKit/Source/web/InspectorEmulationAgent.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698