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

Side by Side Diff: third_party/WebKit/Source/core/dom/Fullscreen.cpp

Issue 2325663002: Make Fullscreen::requestFullscreen and exitFullscreen static (Closed)
Patch Set: Created 4 years, 3 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) 1999 Lars Knoll (knoll@kde.org) 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 3 * (C) 1999 Antti Koivisto (koivisto@kde.org)
4 * (C) 2001 Dirk Mueller (mueller@kde.org) 4 * (C) 2001 Dirk Mueller (mueller@kde.org)
5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org) 5 * (C) 2006 Alexey Proskuryakov (ap@webkit.org)
6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All r ights reserved. 6 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2012 Apple Inc. All r ights reserved.
7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/) 7 * Copyright (C) 2008, 2009 Torch Mobile Inc. All rights reserved. (http://www.t orchmobile.com/)
8 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies) 8 * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
9 * Copyright (C) 2013 Google Inc. All rights reserved. 9 * Copyright (C) 2013 Google Inc. All rights reserved.
10 * 10 *
(...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after
214 214
215 if (m_fullScreenLayoutObject) 215 if (m_fullScreenLayoutObject)
216 m_fullScreenLayoutObject->destroy(); 216 m_fullScreenLayoutObject->destroy();
217 217
218 m_currentFullScreenElement = nullptr; 218 m_currentFullScreenElement = nullptr;
219 m_fullscreenElementStack.clear(); 219 m_fullscreenElementStack.clear();
220 } 220 }
221 221
222 void Fullscreen::requestFullscreen(Element& element, RequestType requestType, bo ol forCrossProcessDescendant) 222 void Fullscreen::requestFullscreen(Element& element, RequestType requestType, bo ol forCrossProcessDescendant)
223 { 223 {
224 Document& doc = element.document();
eae 2016/09/08 19:28:38 s/doc/document/
foolip 2016/09/08 20:00:57 This was actually deliberate to match the comments
225
224 // Use counters only need to be incremented in the process of the actual 226 // Use counters only need to be incremented in the process of the actual
225 // fullscreen element. 227 // fullscreen element.
226 if (!forCrossProcessDescendant) { 228 if (!forCrossProcessDescendant) {
227 if (document()->isSecureContext()) { 229 if (doc.isSecureContext()) {
228 UseCounter::count(document(), UseCounter::FullscreenSecureOrigin); 230 UseCounter::count(doc, UseCounter::FullscreenSecureOrigin);
229 } else { 231 } else {
230 UseCounter::count(document(), UseCounter::FullscreenInsecureOrigin); 232 UseCounter::count(doc, UseCounter::FullscreenInsecureOrigin);
231 HostsUsingFeatures::countAnyWorld(*document(), HostsUsingFeatures::F eature::FullscreenInsecureHost); 233 HostsUsingFeatures::countAnyWorld(doc, HostsUsingFeatures::Feature:: FullscreenInsecureHost);
232 } 234 }
233 } 235 }
234 236
235 // Ignore this request if the document is not in a live frame. 237 // Ignore this request if the document is not in a live frame.
236 if (!document()->isActive()) 238 if (!doc.isActive())
237 return; 239 return;
238 240
239 // If |element| is on top of |doc|'s fullscreen element stack, terminate the se substeps. 241 // If |element| is on top of |doc|'s fullscreen element stack, terminate the se substeps.
240 if (&element == fullscreenElement()) 242 if (&element == fullscreenElementFrom(doc))
241 return; 243 return;
242 244
243 do { 245 do {
244 // 1. If any of the following conditions are true, terminate these steps and queue a task to fire 246 // 1. If any of the following conditions are true, terminate these steps and queue a task to fire
245 // an event named fullscreenerror with its bubbles attribute set to true on the context object's 247 // an event named fullscreenerror with its bubbles attribute set to true on the context object's
246 // node document: 248 // node document:
247 249
248 // The fullscreen element ready check returns false. 250 // The fullscreen element ready check returns false.
249 if (!fullscreenElementReady(element)) 251 if (!fullscreenElementReady(element))
250 break; 252 break;
251 253
252 // Fullscreen is not supported. 254 // Fullscreen is not supported.
253 if (!fullscreenIsSupported(element.document())) 255 if (!fullscreenIsSupported(doc))
254 break; 256 break;
255 257
256 // This algorithm is not allowed to request fullscreen. 258 // This algorithm is not allowed to request fullscreen.
257 // An algorithm is allowed to request fullscreen if one of the following 259 // An algorithm is allowed to request fullscreen if one of the following
258 // is true: 260 // is true:
259 // - the algorithm is triggered by a user activation. 261 // - the algorithm is triggered by a user activation.
260 // - the algorithm is triggered by a user generated orientation change. 262 // - the algorithm is triggered by a user generated orientation change.
261 // 263 //
262 // If |forCrossProcessDescendant| is true, requestFullscreen 264 // If |forCrossProcessDescendant| is true, requestFullscreen
263 // was already called on a descendant element in another process, and 265 // was already called on a descendant element in another process, and
264 // getting here means that it already passed the user gesture check. 266 // getting here means that it already passed the user gesture check.
265 if (!UserGestureIndicator::utilizeUserGesture() && !ScopedOrientationCha ngeIndicator::processingOrientationChange() && !forCrossProcessDescendant) { 267 if (!UserGestureIndicator::utilizeUserGesture() && !ScopedOrientationCha ngeIndicator::processingOrientationChange() && !forCrossProcessDescendant) {
266 String message = ExceptionMessages::failedToExecute("requestFullscre en", 268 String message = ExceptionMessages::failedToExecute("requestFullscre en",
267 "Element", "API can only be initiated by a user gesture."); 269 "Element", "API can only be initiated by a user gesture.");
268 document()->addConsoleMessage( 270 doc.addConsoleMessage(
269 ConsoleMessage::create(JSMessageSource, WarningMessageLevel, mes sage)); 271 ConsoleMessage::create(JSMessageSource, WarningMessageLevel, mes sage));
270 break; 272 break;
271 } 273 }
272 274
273 // 2. Let doc be element's node document. (i.e. "this") 275 // 2. Let doc be element's node document. (i.e. "this")
274 Document* currentDoc = document();
275 276
276 // 3. Let docs be all doc's ancestor browsing context's documents (if an y) and doc. 277 // 3. Let docs be all doc's ancestor browsing context's documents (if an y) and doc.
277 // 278 //
278 // For OOPIF scenarios, |docs| will only contain documents for local 279 // For OOPIF scenarios, |docs| will only contain documents for local
279 // ancestors, and remote ancestors will be processed in their 280 // ancestors, and remote ancestors will be processed in their
280 // respective processes. This preserves the spec's event firing order 281 // respective processes. This preserves the spec's event firing order
281 // for local ancestors, but not for remote ancestors. However, that 282 // for local ancestors, but not for remote ancestors. However, that
282 // difference shouldn't be observable in practice: a fullscreenchange 283 // difference shouldn't be observable in practice: a fullscreenchange
283 // event handler would need to postMessage a frame in another renderer 284 // event handler would need to postMessage a frame in another renderer
284 // process, where the message should be queued up and processed after 285 // process, where the message should be queued up and processed after
285 // the IPC that dispatches fullscreenchange. 286 // the IPC that dispatches fullscreenchange.
286 HeapDeque<Member<Document>> docs; 287 HeapDeque<Member<Document>> docs;
287 288
288 docs.prepend(currentDoc); 289 docs.prepend(&doc);
289 for (Frame* frame = currentDoc->frame()->tree().parent(); frame; frame = frame->tree().parent()) { 290 for (Frame* frame = doc.frame()->tree().parent(); frame; frame = frame-> tree().parent()) {
290 if (frame->isLocalFrame()) 291 if (frame->isLocalFrame())
291 docs.prepend(toLocalFrame(frame)->document()); 292 docs.prepend(toLocalFrame(frame)->document());
292 } 293 }
293 294
294 // 4. For each document in docs, run these substeps: 295 // 4. For each document in docs, run these substeps:
295 HeapDeque<Member<Document>>::iterator current = docs.begin(), following = docs.begin(); 296 HeapDeque<Member<Document>>::iterator current = docs.begin(), following = docs.begin();
296 297
297 do { 298 do {
298 ++following; 299 ++following;
299 300
300 // 1. Let following document be the document after document in docs, or null if there is no 301 // 1. Let following document be the document after document in docs, or null if there is no
301 // such document. 302 // such document.
302 Document* currentDoc = *current; 303 Document* currentDoc = *current;
303 Document* followingDoc = following != docs.end() ? *following : null ptr; 304 Document* followingDoc = following != docs.end() ? *following : null ptr;
304 305
305 // 2. If following document is null, push context object on document 's fullscreen element 306 // 2. If following document is null, push context object on document 's fullscreen element
306 // stack, and queue a task to fire an event named fullscreenchange w ith its bubbles attribute 307 // stack, and queue a task to fire an event named fullscreenchange w ith its bubbles attribute
307 // set to true on the document. 308 // set to true on the document.
308 if (!followingDoc) { 309 if (!followingDoc) {
309 from(*currentDoc).pushFullscreenElementStack(element, requestTyp e); 310 from(*currentDoc).pushFullscreenElementStack(element, requestTyp e);
310 enqueueChangeEvent(*currentDoc, requestType); 311 from(doc).enqueueChangeEvent(*currentDoc, requestType);
311 continue; 312 continue;
312 } 313 }
313 314
314 // 3. Otherwise, if document's fullscreen element stack is either em pty or its top element 315 // 3. Otherwise, if document's fullscreen element stack is either em pty or its top element
315 // is not following document's browsing context container, 316 // is not following document's browsing context container,
316 Element* topElement = fullscreenElementFrom(*currentDoc); 317 Element* topElement = fullscreenElementFrom(*currentDoc);
317 HTMLFrameOwnerElement* followingOwner = findContainerForDescendant(* currentDoc, *followingDoc); 318 HTMLFrameOwnerElement* followingOwner = findContainerForDescendant(* currentDoc, *followingDoc);
318 if (!topElement || topElement != followingOwner) { 319 if (!topElement || topElement != followingOwner) {
319 // ...push following document's browsing context container on do cument's fullscreen element 320 // ...push following document's browsing context container on do cument's fullscreen element
320 // stack, and queue a task to fire an event named fullscreenchan ge with its bubbles attribute 321 // stack, and queue a task to fire an event named fullscreenchan ge with its bubbles attribute
321 // set to true on document. 322 // set to true on document.
322 from(*currentDoc).pushFullscreenElementStack(*followingOwner, re questType); 323 from(*currentDoc).pushFullscreenElementStack(*followingOwner, re questType);
323 enqueueChangeEvent(*currentDoc, requestType); 324 from(doc).enqueueChangeEvent(*currentDoc, requestType);
324 continue; 325 continue;
325 } 326 }
326 327
327 // 4. Otherwise, do nothing for this document. It stays the same. 328 // 4. Otherwise, do nothing for this document. It stays the same.
328 } while (++current != docs.end()); 329 } while (++current != docs.end());
329 330
330 m_forCrossProcessDescendant = forCrossProcessDescendant; 331 from(doc).m_forCrossProcessDescendant = forCrossProcessDescendant;
331 332
332 // 5. Return, and run the remaining steps asynchronously. 333 // 5. Return, and run the remaining steps asynchronously.
333 // 6. Optionally, perform some animation. 334 // 6. Optionally, perform some animation.
334 document()->frameHost()->chromeClient().enterFullscreenForElement(&eleme nt); 335 doc.frameHost()->chromeClient().enterFullscreenForElement(&element);
335 336
336 // 7. Optionally, display a message indicating how the user can exit dis playing the context object fullscreen. 337 // 7. Optionally, display a message indicating how the user can exit dis playing the context object fullscreen.
337 return; 338 return;
338 } while (false); 339 } while (false);
339 340
340 enqueueErrorEvent(element, requestType); 341 from(doc).enqueueErrorEvent(element, requestType);
341 } 342 }
342 343
343 void Fullscreen::fullyExitFullscreen(Document& document) 344 void Fullscreen::fullyExitFullscreen(Document& document)
344 { 345 {
345 // To fully exit fullscreen, run these steps: 346 // To fully exit fullscreen, run these steps:
346 347
347 // 1. Let |doc| be the top-level browsing context's document. 348 // 1. Let |doc| be the top-level browsing context's document.
348 // 349 //
349 // Since the top-level browsing context's document might be unavailable in 350 // Since the top-level browsing context's document might be unavailable in
350 // OOPIF scenarios (i.e., when the top frame is remote), this actually uses 351 // OOPIF scenarios (i.e., when the top frame is remote), this actually uses
351 // the Document of the topmost local ancestor frame. Without OOPIF, this 352 // the Document of the topmost local ancestor frame. Without OOPIF, this
352 // will be the top frame's document. With OOPIF, each renderer process for 353 // will be the top frame's document. With OOPIF, each renderer process for
353 // the current page will separately call fullyExitFullscreen to cover all 354 // the current page will separately call fullyExitFullscreen to cover all
354 // local frames in each process. 355 // local frames in each process.
355 Document& doc = topmostLocalAncestor(document); 356 Document& doc = topmostLocalAncestor(document);
356 357
357 // 2. If |doc|'s fullscreen element stack is empty, terminate these steps. 358 // 2. If |doc|'s fullscreen element stack is empty, terminate these steps.
358 if (!fullscreenElementFrom(doc)) 359 if (!fullscreenElementFrom(doc))
359 return; 360 return;
360 361
361 // 3. Remove elements from |doc|'s fullscreen element stack until only the t op element is left. 362 // 3. Remove elements from |doc|'s fullscreen element stack until only the t op element is left.
362 size_t stackSize = from(doc).m_fullscreenElementStack.size(); 363 size_t stackSize = from(doc).m_fullscreenElementStack.size();
363 from(doc).m_fullscreenElementStack.remove(0, stackSize - 1); 364 from(doc).m_fullscreenElementStack.remove(0, stackSize - 1);
364 DCHECK_EQ(from(doc).m_fullscreenElementStack.size(), 1u); 365 DCHECK_EQ(from(doc).m_fullscreenElementStack.size(), 1u);
365 366
366 // 4. Act as if the exitFullscreen() method was invoked on |doc|. 367 // 4. Act as if the exitFullscreen() method was invoked on |doc|.
367 from(doc).exitFullscreen(); 368 exitFullscreen(doc);
368 } 369 }
369 370
370 void Fullscreen::exitFullscreen() 371 void Fullscreen::exitFullscreen(Document& doc)
371 { 372 {
372 // The exitFullscreen() method must run these steps: 373 // The exitFullscreen() method must run these steps:
373 374
374 // 1. Let doc be the context object. (i.e. "this") 375 // 1. Let doc be the context object. (i.e. "this")
375 Document* currentDoc = document(); 376 if (!doc.isActive())
376 if (!currentDoc->isActive())
377 return; 377 return;
378 378
379 // 2. If doc's fullscreen element stack is empty, terminate these steps. 379 // 2. If doc's fullscreen element stack is empty, terminate these steps.
380 if (m_fullscreenElementStack.isEmpty()) 380 if (!fullscreenElementFrom(doc))
381 return; 381 return;
382 382
383 // 3. Let descendants be all the doc's descendant browsing context's documen ts with a non-empty fullscreen 383 // 3. Let descendants be all the doc's descendant browsing context's documen ts with a non-empty fullscreen
384 // element stack (if any), ordered so that the child of the doc is last and the document furthest 384 // element stack (if any), ordered so that the child of the doc is last and the document furthest
385 // away from the doc is first. 385 // away from the doc is first.
386 HeapDeque<Member<Document>> descendants; 386 HeapDeque<Member<Document>> descendants;
387 for (Frame* descendant = document()->frame() ? document()->frame()->tree().t raverseNext() : 0; descendant; descendant = descendant->tree().traverseNext()) { 387 for (Frame* descendant = doc.frame() ? doc.frame()->tree().traverseNext() : 0; descendant; descendant = descendant->tree().traverseNext()) {
388 if (!descendant->isLocalFrame()) 388 if (!descendant->isLocalFrame())
389 continue; 389 continue;
390 DCHECK(toLocalFrame(descendant)->document()); 390 DCHECK(toLocalFrame(descendant)->document());
391 if (fullscreenElementFrom(*toLocalFrame(descendant)->document())) 391 if (fullscreenElementFrom(*toLocalFrame(descendant)->document()))
392 descendants.prepend(toLocalFrame(descendant)->document()); 392 descendants.prepend(toLocalFrame(descendant)->document());
393 } 393 }
394 394
395 // 4. For each descendant in descendants, empty descendant's fullscreen elem ent stack, and queue a 395 // 4. For each descendant in descendants, empty descendant's fullscreen elem ent stack, and queue a
396 // task to fire an event named fullscreenchange with its bubbles attribute s et to true on descendant. 396 // task to fire an event named fullscreenchange with its bubbles attribute s et to true on descendant.
397 for (auto& descendant : descendants) { 397 for (auto& descendant : descendants) {
398 DCHECK(descendant); 398 DCHECK(descendant);
399 RequestType requestType = from(*descendant).m_fullscreenElementStack.las t().second; 399 RequestType requestType = from(*descendant).m_fullscreenElementStack.las t().second;
400 from(*descendant).clearFullscreenElementStack(); 400 from(*descendant).clearFullscreenElementStack();
401 enqueueChangeEvent(*descendant, requestType); 401 from(doc).enqueueChangeEvent(*descendant, requestType);
402 } 402 }
403 403
404 // 5. While doc is not null, run these substeps: 404 // 5. While doc is not null, run these substeps:
405 Element* newTop = 0; 405 Element* newTop = 0;
406 Document* currentDoc = &doc;
406 while (currentDoc) { 407 while (currentDoc) {
eae 2016/09/08 19:28:38 currentDoc is never changed (other than to null) i
foolip 2016/09/08 20:00:58 currentDoc is never used after the loop, so I'll s
foolip 2016/09/08 22:19:01 Oh wait, currentDoc actually is changed in the loo
407 RequestType requestType = from(*currentDoc).m_fullscreenElementStack.las t().second; 408 RequestType requestType = from(*currentDoc).m_fullscreenElementStack.las t().second;
408 409
409 // 1. Pop the top element of doc's fullscreen element stack. 410 // 1. Pop the top element of doc's fullscreen element stack.
410 from(*currentDoc).popFullscreenElementStack(); 411 from(*currentDoc).popFullscreenElementStack();
411 412
412 // If doc's fullscreen element stack is non-empty and the element now at the top is either 413 // If doc's fullscreen element stack is non-empty and the element now at the top is either
413 // not in a document or its node document is not doc, repeat this sub step. 414 // not in a document or its node document is not doc, repeat this sub step.
414 newTop = fullscreenElementFrom(*currentDoc); 415 newTop = fullscreenElementFrom(*currentDoc);
415 if (newTop && (!newTop->isConnected() || newTop->document() != currentDo c)) 416 if (newTop && (!newTop->isConnected() || newTop->document() != currentDo c))
416 continue; 417 continue;
417 418
418 // 2. Queue a task to fire an event named fullscreenchange with its bubb les attribute set to true 419 // 2. Queue a task to fire an event named fullscreenchange with its bubb les attribute set to true
419 // on doc. 420 // on doc.
420 enqueueChangeEvent(*currentDoc, requestType); 421 from(doc).enqueueChangeEvent(*currentDoc, requestType);
421 422
422 // 3. If doc's fullscreen element stack is empty and doc's browsing cont ext has a browsing context 423 // 3. If doc's fullscreen element stack is empty and doc's browsing cont ext has a browsing context
423 // container, set doc to that browsing context container's node document . 424 // container, set doc to that browsing context container's node document .
424 // 425 //
425 // OOPIF: If browsing context container's document is in another 426 // OOPIF: If browsing context container's document is in another
426 // process, keep moving up the ancestor chain and looking for a 427 // process, keep moving up the ancestor chain and looking for a
427 // browsing context container with a local document. 428 // browsing context container with a local document.
428 // TODO(alexmos): Deal with nested fullscreen cases, see 429 // TODO(alexmos): Deal with nested fullscreen cases, see
429 // https://crbug.com/617369. 430 // https://crbug.com/617369.
430 if (!newTop) { 431 if (!newTop) {
431 Frame* frame = currentDoc->frame()->tree().parent(); 432 Frame* frame = currentDoc->frame()->tree().parent();
432 while (frame && frame->isRemoteFrame()) 433 while (frame && frame->isRemoteFrame())
433 frame = frame->tree().parent(); 434 frame = frame->tree().parent();
434 if (frame) { 435 if (frame) {
435 currentDoc = toLocalFrame(frame)->document(); 436 currentDoc = toLocalFrame(frame)->document();
436 continue; 437 continue;
437 } 438 }
438 } 439 }
439 440
440 // 4. Otherwise, set doc to null. 441 // 4. Otherwise, set doc to null.
441 currentDoc = 0; 442 currentDoc = 0;
442 } 443 }
443 444
444 // 6. Return, and run the remaining steps asynchronously. 445 // 6. Return, and run the remaining steps asynchronously.
445 // 7. Optionally, perform some animation. 446 // 7. Optionally, perform some animation.
446 447
447 FrameHost* host = document()->frameHost(); 448 FrameHost* host = doc.frameHost();
448 449
449 // Speculative fix for engaget.com/videos per crbug.com/336239. 450 // Speculative fix for engaget.com/videos per crbug.com/336239.
450 // FIXME: This check is wrong. We DCHECK(document->isActive()) above 451 // FIXME: This check is wrong. We DCHECK(document->isActive()) above
451 // so this should be redundant and should be removed! 452 // so this should be redundant and should be removed!
452 if (!host) 453 if (!host)
453 return; 454 return;
454 455
455 // Only exit out of full screen window mode if there are no remaining elemen ts in the 456 // Only exit out of full screen window mode if there are no remaining elemen ts in the
456 // full screen stack. 457 // full screen stack.
457 if (!newTop) { 458 if (!newTop) {
458 // FIXME: if the frame exiting fullscreen is not the frame that entered 459 // FIXME: if the frame exiting fullscreen is not the frame that entered
459 // fullscreen (but a parent frame for example), 460 // fullscreen (but a parent frame for example),
460 // m_currentFullScreenElement might be null. We want to pass an element 461 // m_currentFullScreenElement might be null. We want to pass an element
461 // that is part of the document so we will pass the documentElement in 462 // that is part of the document so we will pass the documentElement in
462 // that case. This should be fix by exiting fullscreen for a frame 463 // that case. This should be fix by exiting fullscreen for a frame
463 // instead of an element, see https://crbug.com/441259 464 // instead of an element, see https://crbug.com/441259
465 Element* currentFullScreenElement = currentFullScreenElementFrom(doc);
eae 2016/09/08 19:28:38 const?
foolip 2016/09/08 22:19:01 ChromeClient::exitFullscreenForElement takes a non
464 host->chromeClient().exitFullscreenForElement( 466 host->chromeClient().exitFullscreenForElement(
465 m_currentFullScreenElement ? m_currentFullScreenElement.get() : docu ment()->documentElement()); 467 currentFullScreenElement ? currentFullScreenElement : doc.documentEl ement());
466 return; 468 return;
467 } 469 }
468 470
469 // Otherwise, notify the chrome of the new full screen element. 471 // Otherwise, notify the chrome of the new full screen element.
470 host->chromeClient().enterFullscreenForElement(newTop); 472 host->chromeClient().enterFullscreenForElement(newTop);
471 } 473 }
472 474
473 bool Fullscreen::fullscreenEnabled(Document& document) 475 bool Fullscreen::fullscreenEnabled(Document& document)
474 { 476 {
475 // 4. The fullscreenEnabled attribute must return true if the context object has its 477 // 4. The fullscreenEnabled attribute must return true if the context object has its
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
645 } 647 }
646 648
647 void Fullscreen::elementRemoved(Element& oldNode) 649 void Fullscreen::elementRemoved(Element& oldNode)
648 { 650 {
649 // Whenever the removing steps run with an |oldNode| and |oldNode| is in its node document's 651 // Whenever the removing steps run with an |oldNode| and |oldNode| is in its node document's
650 // fullscreen element stack, run these steps: 652 // fullscreen element stack, run these steps:
651 653
652 // 1. If |oldNode| is at the top of its node document's fullscreen element s tack, act as if the 654 // 1. If |oldNode| is at the top of its node document's fullscreen element s tack, act as if the
653 // exitFullscreen() method was invoked on that document. 655 // exitFullscreen() method was invoked on that document.
654 if (fullscreenElement() == &oldNode) { 656 if (fullscreenElement() == &oldNode) {
655 exitFullscreen(); 657 exitFullscreen(oldNode.document());
656 return; 658 return;
657 } 659 }
658 660
659 // 2. Otherwise, remove |oldNode| from its node document's fullscreen elemen t stack. 661 // 2. Otherwise, remove |oldNode| from its node document's fullscreen elemen t stack.
660 for (size_t i = 0; i < m_fullscreenElementStack.size(); ++i) { 662 for (size_t i = 0; i < m_fullscreenElementStack.size(); ++i) {
661 if (m_fullscreenElementStack[i].first.get() == &oldNode) { 663 if (m_fullscreenElementStack[i].first.get() == &oldNode) {
662 m_fullscreenElementStack.remove(i); 664 m_fullscreenElementStack.remove(i);
663 return; 665 return;
664 } 666 }
665 } 667 }
(...skipping 22 matching lines...) Expand all
688 DEFINE_TRACE(Fullscreen) 690 DEFINE_TRACE(Fullscreen)
689 { 691 {
690 visitor->trace(m_currentFullScreenElement); 692 visitor->trace(m_currentFullScreenElement);
691 visitor->trace(m_fullscreenElementStack); 693 visitor->trace(m_fullscreenElementStack);
692 visitor->trace(m_eventQueue); 694 visitor->trace(m_eventQueue);
693 Supplement<Document>::trace(visitor); 695 Supplement<Document>::trace(visitor);
694 ContextLifecycleObserver::trace(visitor); 696 ContextLifecycleObserver::trace(visitor);
695 } 697 }
696 698
697 } // namespace blink 699 } // namespace blink
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/dom/Fullscreen.h ('k') | third_party/WebKit/Source/core/html/HTMLMediaElement.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698