Changeset 87692 in webkit
- Timestamp:
- May 30, 2011 10:09:48 AM (13 years ago)
- Location:
- trunk/Source/WebCore
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r87691 r87692 1 2011-05-30 Jer Noble <jer.noble@apple.com> 2 3 Reviewed by Darin Adler and Simon Fraser. 4 5 REGRESSION (r87622): Scrubbing a Vimeo movie when in fullscreen stops playback; no way to make it start again 6 https://bugs.webkit.org/show_bug.cgi?id=61717 7 rdar://problem/9522272 8 9 May be some good way to test this later. No immediate idea about the best way. 10 11 When a media element is taken into full-screen mode, stop events from propagating 12 outside the media element's shadow DOM, EventDispatcher::determineDispatchBehavior() 13 has been changed to take a shadow root node. In our full screen media element check, 14 we check to see if the passed shadow root is the shadow root of the full screen media 15 element, and if so, specify events should StayInsideShadowDOM. The end result is that 16 inside EventDispatcher::ensureEventAncestors, an ancestor chain is built up all the 17 way from the SliderThumb to the video element's shadow root, but no further. 18 19 * dom/EventDispatcher.cpp: 20 (WebCore::EventDispatcher::determineDispatchBehavior): Restrict events to the 21 shadow DOM when showing a full screen video. 22 23 * html/HTMLMediaElement.cpp: 24 (WebCore::HTMLMediaElement::HTMLMediaElement): Removed code to manage full screen controls. 25 The events telling us about activity in the shadow DOM no longer bubble out so we need to 26 handle this inside the shadow DOM on the root element. 27 (WebCore::HTMLMediaElement::play): Ditto. 28 (WebCore::HTMLMediaElement::playbackProgressTimerFired): Ditto. 29 (WebCore::HTMLMediaElement::defaultEventHandler): Ditto. 30 (WebCore::HTMLMediaElement::enterFullscreen): Ditto. 31 (WebCore::HTMLMediaElement::exitFullscreen): Ditto. 32 * html/HTMLMediaElement.h: Added isPlaying function, removed things moved to the root element. 33 34 * html/shadow/MediaControlElements.cpp: 35 (WebCore::MediaControlVolumeSliderContainerElement::defaultEventHandler): Rolled out 36 changes that tried to make special rules for events using preDispatchEventHandler and such. 37 This rolls out both r87622 and r87655. 38 (WebCore::MediaControlMuteButtonElement::defaultEventHandler): Ditto. 39 (WebCore::MediaControlPanelMuteButtonElement::defaultEventHandler): Ditto. 40 (WebCore::MediaControlPlayButtonElement::defaultEventHandler): Ditto. 41 (WebCore::MediaControlSeekButtonElement::defaultEventHandler): Ditto. 42 (WebCore::MediaControlRewindButtonElement::defaultEventHandler): Ditto. 43 (WebCore::MediaControlReturnToRealtimeButtonElement::defaultEventHandler): Ditto. 44 (WebCore::MediaControlToggleClosedCaptionsButtonElement::defaultEventHandler): Ditto. 45 (WebCore::MediaControlTimelineElement::defaultEventHandler): Ditto. 46 (WebCore::MediaControlVolumeSliderElement::defaultEventHandler): Ditto. 47 (WebCore::MediaControlFullscreenButtonElement::defaultEventHandler): Ditto. 48 (WebCore::MediaControlFullscreenVolumeMinButtonElement::defaultEventHandler): Ditto. 49 (WebCore::MediaControlFullscreenVolumeMaxButtonElement::defaultEventHandler): Ditto. 50 * html/shadow/MediaControlElements.h: Ditto. 51 52 * html/shadow/MediaControlRootElement.cpp: 53 (WebCore::MediaControlRootElement::MediaControlRootElement): Initialize new data members. 54 (WebCore::MediaControlRootElement::playbackStarted): Start the timer so we will consider 55 hiding the controls later. 56 (WebCore::MediaControlRootElement::playbackProgressed): Hide the controls if the mouse 57 is no longer over the controls. 58 (WebCore::MediaControlRootElement::playbackStopped): Stop the timer since we only hide 59 automatically if we're playing. 60 (WebCore::MediaControlRootElement::enteredFullscreen): Start the timer. 61 (WebCore::MediaControlRootElement::exitedFullscreen): Stop the timer since we only care 62 if we are full screen. 63 (WebCore::MediaControlRootElement::containsRelatedTarget): Added. Helper for next function. 64 (WebCore::MediaControlRootElement::defaultEventHandler): Do the hide/show and timer functions 65 as the mouse is moved in and out. 66 (WebCore::MediaControlRootElement::startHideFullscreenControlsTimer): Start the timer if 67 needed. 68 (WebCore::MediaControlRootElement::hideFullscreenControlsTimerFired): Hide if the conditions 69 are met. 70 (WebCore::MediaControlRootElement::stopHideFullscreenControlsTimer): Stop the timer. 71 72 * html/shadow/MediaControlRootElement.h: Added new functions and data members. 73 74 1 75 2011-05-30 Gavin Peters <gavinp@chromium.org> 2 76 -
trunk/Source/WebCore/dom/EventDispatcher.cpp
r85742 r87692 3 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) 4 4 * (C) 2001 Dirk Mueller (mueller@kde.org) 5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.5 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 6 6 * Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies) 7 7 * Copyright (C) 2009 Torch Mobile Inc. All rights reserved. (http://www.torchmobile.com/) … … 27 27 #include "EventDispatcher.h" 28 28 29 #include "Element.h"30 #include "Event.h"31 29 #include "EventContext.h" 32 #include "EventTarget.h"33 30 #include "FrameView.h" 31 #include "HTMLMediaElement.h" 34 32 #include "InspectorInstrumentation.h" 35 33 #include "MouseEvent.h" 36 #include "Node.h"37 34 #include "ScopedEventQueue.h" 35 #include "WindowEventContext.h" 36 #include <wtf/RefPtr.h> 38 37 39 38 #if ENABLE(SVG) … … 42 41 #include "SVGUseElement.h" 43 42 #endif 44 45 #include "UIEvent.h"46 #include "UIEventWithKeyState.h"47 #include "WindowEventContext.h"48 49 #include <wtf/RefPtr.h>50 43 51 44 namespace WebCore { … … 236 229 void EventDispatcher::ensureEventAncestors(Event* event) 237 230 { 238 EventDispatchBehavior behavior = determineDispatchBehavior(event);239 240 231 if (!m_node->inDocument()) 241 232 return; … … 252 243 bool isSVGShadowRoot = ancestor->isSVGShadowRoot(); 253 244 if (isSVGShadowRoot || ancestor->isShadowRoot()) { 254 if ( behavior== StayInsideShadowDOM)245 if (determineDispatchBehavior(event, ancestor) == StayInsideShadowDOM) 255 246 return; 256 247 #if ENABLE(SVG) … … 376 367 } 377 368 378 EventDispatchBehavior EventDispatcher::determineDispatchBehavior(Event* event) 379 { 369 EventDispatchBehavior EventDispatcher::determineDispatchBehavior(Event* event, Node* shadowRoot) 370 { 371 #if ENABLE(FULLSCREEN_API) 372 // Video-only full screen is a mode where we use the shadow DOM as an implementation 373 // detail that should not be detectable by the web content. 374 if (Element* element = m_node->document()->webkitCurrentFullScreenElement()) { 375 // FIXME: We assume that if the full screen element is a media element that it's 376 // the video-only full screen. Both here and elsewhere. But that is probably wrong. 377 if (element->isMediaElement() && shadowRoot && shadowRoot->shadowHost() == element) 378 return StayInsideShadowDOM; 379 } 380 #endif 381 380 382 // Per XBL 2.0 spec, mutation events should never cross shadow DOM boundary: 381 383 // http://dev.w3.org/2006/xbl2/#event-flow-and-targeting-across-shadow-s -
trunk/Source/WebCore/dom/EventDispatcher.h
r83386 r87692 62 62 63 63 PassRefPtr<EventTarget> adjustToShadowBoundaries(PassRefPtr<Node> relatedTarget, const Vector<Node*> relatedTargetAncestors); 64 EventDispatchBehavior determineDispatchBehavior(Event* );64 EventDispatchBehavior determineDispatchBehavior(Event*, Node* shadowRoot); 65 65 void ensureEventAncestors(Event*); 66 66 const EventContext* topEventContext(); -
trunk/Source/WebCore/html/HTMLMediaElement.cpp
r87661 r87692 124 124 , m_progressEventTimer(this, &HTMLMediaElement::progressEventTimerFired) 125 125 , m_playbackProgressTimer(this, &HTMLMediaElement::playbackProgressTimerFired) 126 , m_hideFullscreenControlsTimer(this, &HTMLMediaElement::hideFullscreenControlsTimerFired)127 126 , m_playedTimeRanges() 128 127 , m_playbackRate(1.0f) … … 166 165 , m_isFullscreen(false) 167 166 , m_closedCaptionsVisible(false) 168 , m_mouseOver(false)169 167 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) 170 168 , m_needWidgetUpdate(false) … … 1427 1425 } 1428 1426 1429 if (isFullscreen())1430 startHideFullscreenControlsTimer();1431 1432 1427 playInternal(); 1433 1428 } … … 1634 1629 1635 1630 scheduleTimeupdateEvent(true); 1636 if (hasMediaControls()) { 1637 if (!m_mouseOver && controls() && hasVideo()) 1638 mediaControls()->makeTransparent(); 1631 if (hasMediaControls()) 1639 1632 mediaControls()->playbackProgressed(); 1640 }1641 1633 // FIXME: deal with cue ranges here 1642 }1643 1644 void HTMLMediaElement::startHideFullscreenControlsTimer()1645 {1646 if (!isFullscreen())1647 return;1648 1649 m_hideFullscreenControlsTimer.startOneShot(timeWithoutMouseMovementBeforeHidingControls);1650 }1651 1652 void HTMLMediaElement::hideFullscreenControlsTimerFired(Timer<HTMLMediaElement>*)1653 {1654 if (!m_playing)1655 return;1656 1657 if (!isFullscreen())1658 return;1659 1660 if (!controls() || !hasMediaControls())1661 return;1662 1663 if (!mediaControls()->shouldHideControls())1664 return;1665 1666 mediaControls()->makeTransparent();1667 }1668 1669 void HTMLMediaElement::stopHideFullscreenControlsTimer()1670 {1671 m_hideFullscreenControlsTimer.stop();1672 1634 } 1673 1635 … … 2410 2372 widget->handleEvent(event); 2411 2373 #else 2412 if (event->isMouseEvent()) {2413 MouseEvent* mouseEvent = static_cast<MouseEvent*>(event);2414 if (mouseEvent->relatedTarget() != this) {2415 if (event->type() == eventNames().mouseoverEvent) {2416 m_mouseOver = true;2417 if (hasMediaControls() && controls() && !canPlay()) {2418 mediaControls()->makeOpaque();2419 if (mediaControls()->shouldHideControls())2420 startHideFullscreenControlsTimer();2421 }2422 } else if (event->type() == eventNames().mouseoutEvent) {2423 m_mouseOver = false;2424 stopHideFullscreenControlsTimer();2425 } else if (event->type() == eventNames().mousemoveEvent) {2426 if (isFullscreen() && hasMediaControls() && controls()) {2427 // When we get a mouse move in fullscreen mode, show the media controls, and start a timer2428 // that will hide the media controls after a 3 seconds without a mouse move.2429 mediaControls()->makeOpaque();2430 if (mediaControls()->shouldHideControls())2431 startHideFullscreenControlsTimer();2432 }2433 }2434 2435 }2436 }2437 2438 2374 HTMLElement::defaultEventHandler(event); 2439 2375 #endif … … 2569 2505 { 2570 2506 LOG(Media, "HTMLMediaElement::enterFullscreen"); 2571 2572 startHideFullscreenControlsTimer(); 2573 2507 2574 2508 #if ENABLE(FULLSCREEN_API) 2575 2509 if (document() && document()->settings() && document()->settings()->fullScreenEnabled()) { … … 2591 2525 { 2592 2526 LOG(Media, "HTMLMediaElement::exitFullscreen"); 2593 2594 stopHideFullscreenControlsTimer(); 2595 2527 2596 2528 #if ENABLE(FULLSCREEN_API) 2597 2529 if (document() && document()->settings() && document()->settings()->fullScreenEnabled()) { -
trunk/Source/WebCore/html/HTMLMediaElement.h
r87661 r87692 1 1 /* 2 * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.2 * Copyright (C) 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 148 148 void endScrubbing(); 149 149 150 void stopHideFullscreenControlsTimer();151 152 150 bool canPlay() const; 153 151 … … 203 201 static void clearMediaCache(); 204 202 static void clearMediaCacheForSite(const String&); 203 204 bool isPlaying() const { return m_playing; } 205 205 206 206 protected: … … 273 273 void progressEventTimerFired(Timer<HTMLMediaElement>*); 274 274 void playbackProgressTimerFired(Timer<HTMLMediaElement>*); 275 void hideFullscreenControlsTimerFired(Timer<HTMLMediaElement>*);276 275 void startPlaybackProgressTimer(); 277 276 void startProgressEventTimer(); 278 void startHideFullscreenControlsTimer();279 277 void stopPeriodicTimers(); 280 278 … … 346 344 Timer<HTMLMediaElement> m_progressEventTimer; 347 345 Timer<HTMLMediaElement> m_playbackProgressTimer; 348 Timer<HTMLMediaElement> m_hideFullscreenControlsTimer;349 346 Vector<RefPtr<Event> > m_pendingEvents; 350 347 RefPtr<TimeRanges> m_playedTimeRanges; … … 422 419 bool m_isFullscreen : 1; 423 420 bool m_closedCaptionsVisible : 1; 424 bool m_mouseOver : 1;425 421 426 422 #if ENABLE(PLUGIN_PROXY_FOR_VIDEO) -
trunk/Source/WebCore/html/shadow/MediaControlElements.cpp
r87657 r87692 1 1 /* 2 * Copyright (C) 2008, 2009, 2010 Apple Inc. All rights reserved.2 * Copyright (C) 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 76 76 } 77 77 78 void* MediaControlElement::preDispatchEventHandler(Event* event)79 {80 if (event->type() == eventNames().clickEvent) {81 event->preventDefault();82 event->stopPropagation();83 }84 return 0;85 }86 87 78 static const String& displayString() 88 79 { … … 201 192 } 202 193 203 void * MediaControlVolumeSliderContainerElement::preDispatchEventHandler(Event* event)194 void MediaControlVolumeSliderContainerElement::defaultEventHandler(Event* event) 204 195 { 205 196 if (!event->isMouseEvent() || event->type() != eventNames().mouseoutEvent) 206 return 0;197 return; 207 198 208 199 // Poor man's mouseleave event detection. 209 200 MouseEvent* mouseEvent = static_cast<MouseEvent*>(event); 210 201 if (!mouseEvent->relatedTarget() || !mouseEvent->relatedTarget()->toNode()) 211 return 0;202 return; 212 203 213 204 if (this->containsIncludingShadowDOM(mouseEvent->relatedTarget()->toNode())) 214 return 0;205 return; 215 206 216 207 hide(); 217 return 0;218 208 } 219 209 … … 331 321 } 332 322 333 void * MediaControlMuteButtonElement::preDispatchEventHandler(Event* event)323 void MediaControlMuteButtonElement::defaultEventHandler(Event* event) 334 324 { 335 325 if (event->type() == eventNames().clickEvent) { 336 326 mediaElement()->setMuted(!mediaElement()->muted()); 337 event->preventDefault(); 338 event->stopPropagation(); 339 } 340 341 return 0; 327 event->setDefaultHandled(); 328 } 329 330 HTMLInputElement::defaultEventHandler(event); 342 331 } 343 332 … … 369 358 } 370 359 371 void * MediaControlPanelMuteButtonElement::preDispatchEventHandler(Event* event)360 void MediaControlPanelMuteButtonElement::defaultEventHandler(Event* event) 372 361 { 373 362 if (event->type() == eventNames().mouseoverEvent) 374 363 m_controls->showVolumeSlider(); 375 364 376 return 0;365 MediaControlMuteButtonElement::defaultEventHandler(event); 377 366 } 378 367 … … 417 406 } 418 407 419 void * MediaControlPlayButtonElement::preDispatchEventHandler(Event* event)408 void MediaControlPlayButtonElement::defaultEventHandler(Event* event) 420 409 { 421 410 if (event->type() == eventNames().clickEvent) { 422 411 mediaElement()->togglePlayState(); 423 412 updateDisplayType(); 424 event->preventDefault(); 425 event->stopPropagation(); 426 } 427 return 0; 413 event->setDefaultHandled(); 414 } 415 HTMLInputElement::defaultEventHandler(event); 428 416 } 429 417 … … 449 437 } 450 438 451 void * MediaControlSeekButtonElement::preDispatchEventHandler(Event* event)439 void MediaControlSeekButtonElement::defaultEventHandler(Event* event) 452 440 { 453 441 if (event->type() == eventNames().mousedownEvent) { … … 458 446 mediaElement()->pause(event->fromUserGesture()); 459 447 m_seekTimer.startRepeating(cSeekRepeatDelay); 460 event->preventDefault(); 461 event->stopPropagation(); 448 event->setDefaultHandled(); 462 449 } else if (event->type() == eventNames().mouseupEvent) { 463 450 if (m_capturing) … … 474 461 m_seekTimer.stop(); 475 462 m_seeking = false; 476 event->preventDefault(); 477 event->stopPropagation(); 463 event->setDefaultHandled(); 478 464 } 479 465 } 480 return 0;466 HTMLInputElement::defaultEventHandler(event); 481 467 } 482 468 … … 552 538 } 553 539 554 void * MediaControlRewindButtonElement::preDispatchEventHandler(Event* event)540 void MediaControlRewindButtonElement::defaultEventHandler(Event* event) 555 541 { 556 542 if (event->type() == eventNames().clickEvent) { 557 543 mediaElement()->rewind(30); 558 event->preventDefault(); 559 event->stopPropagation(); 544 event->setDefaultHandled(); 560 545 } 561 return 0;546 HTMLInputElement::defaultEventHandler(event); 562 547 } 563 548 … … 583 568 } 584 569 585 void * MediaControlReturnToRealtimeButtonElement::preDispatchEventHandler(Event* event)570 void MediaControlReturnToRealtimeButtonElement::defaultEventHandler(Event* event) 586 571 { 587 572 if (event->type() == eventNames().clickEvent) { 588 573 mediaElement()->returnToRealtime(); 589 event->preventDefault(); 590 event->stopPropagation(); 591 } 592 return 0; 574 event->setDefaultHandled(); 575 } 576 HTMLInputElement::defaultEventHandler(event); 593 577 } 594 578 … … 614 598 } 615 599 616 void * MediaControlToggleClosedCaptionsButtonElement::preDispatchEventHandler(Event* event)600 void MediaControlToggleClosedCaptionsButtonElement::defaultEventHandler(Event* event) 617 601 { 618 602 if (event->type() == eventNames().clickEvent) { … … 620 604 setChecked(mediaElement()->closedCaptionsVisible()); 621 605 updateDisplayType(); 622 event->preventDefault(); 623 event->stopPropagation(); 624 } 625 626 return 0; 606 event->setDefaultHandled(); 607 } 608 609 HTMLInputElement::defaultEventHandler(event); 627 610 } 628 611 … … 656 639 } 657 640 658 void * MediaControlTimelineElement::preDispatchEventHandler(Event* event)641 void MediaControlTimelineElement::defaultEventHandler(Event* event) 659 642 { 660 643 // Left button is 0. Rejects mouse events not from left button. 661 644 if (event->isMouseEvent() && static_cast<MouseEvent*>(event)->button()) 662 return 0;645 return; 663 646 664 647 if (!attached()) 665 return 0;648 return; 666 649 667 650 if (event->type() == eventNames().mousedownEvent) 668 651 mediaElement()->beginScrubbing(); 669 652 653 if (event->type() == eventNames().mouseupEvent) 654 mediaElement()->endScrubbing(); 655 670 656 MediaControlInputElement::defaultEventHandler(event); 671 657 672 658 if (event->type() == eventNames().mouseoverEvent || event->type() == eventNames().mouseoutEvent || event->type() == eventNames().mousemoveEvent) 673 return 0;659 return; 674 660 675 661 float time = narrowPrecisionToFloat(value().toDouble()); … … 683 669 if (slider && slider->inDragMode()) 684 670 m_controls->updateTimeDisplay(); 685 686 if (event->type() == eventNames().mouseupEvent)687 mediaElement()->endScrubbing();688 return 0;689 671 } 690 672 … … 723 705 } 724 706 725 void * MediaControlVolumeSliderElement::preDispatchEventHandler(Event* event)707 void MediaControlVolumeSliderElement::defaultEventHandler(Event* event) 726 708 { 727 709 // Left button is 0. Rejects mouse events not from left button. 728 710 if (event->isMouseEvent() && static_cast<MouseEvent*>(event)->button()) 729 return 0;711 return; 730 712 731 713 if (!attached()) 732 return 0;714 return; 733 715 734 716 MediaControlInputElement::defaultEventHandler(event); 735 717 736 718 if (event->type() == eventNames().mouseoverEvent || event->type() == eventNames().mouseoutEvent || event->type() == eventNames().mousemoveEvent) 737 return 0;719 return; 738 720 739 721 float volume = narrowPrecisionToFloat(value().toDouble()); … … 743 725 ASSERT(!ec); 744 726 } 745 return 0;746 727 } 747 728 … … 799 780 } 800 781 801 void * MediaControlFullscreenButtonElement::preDispatchEventHandler(Event* event)782 void MediaControlFullscreenButtonElement::defaultEventHandler(Event* event) 802 783 { 803 784 if (event->type() == eventNames().clickEvent) { … … 816 797 #endif 817 798 mediaElement()->enterFullscreen(); 818 event->preventDefault(); 819 event->stopPropagation(); 820 } 821 return 0; 799 event->setDefaultHandled(); 800 } 801 HTMLInputElement::defaultEventHandler(event); 822 802 } 823 803 … … 842 822 } 843 823 844 void * MediaControlFullscreenVolumeMinButtonElement::preDispatchEventHandler(Event* event)824 void MediaControlFullscreenVolumeMinButtonElement::defaultEventHandler(Event* event) 845 825 { 846 826 if (event->type() == eventNames().clickEvent) { 847 827 ExceptionCode code = 0; 848 828 mediaElement()->setVolume(0, code); 849 event->preventDefault(); 850 event->stopPropagation(); 851 } 852 return 0; 829 event->setDefaultHandled(); 830 } 831 HTMLInputElement::defaultEventHandler(event); 853 832 } 854 833 … … 873 852 } 874 853 875 void * MediaControlFullscreenVolumeMaxButtonElement::preDispatchEventHandler(Event* event)854 void MediaControlFullscreenVolumeMaxButtonElement::defaultEventHandler(Event* event) 876 855 { 877 856 if (event->type() == eventNames().clickEvent) { 878 857 ExceptionCode code = 0; 879 858 mediaElement()->setVolume(1, code); 880 event->preventDefault(); 881 event->stopPropagation(); 882 } 883 return 0; 859 event->setDefaultHandled(); 860 } 861 HTMLInputElement::defaultEventHandler(event); 884 862 } 885 863 -
trunk/Source/WebCore/html/shadow/MediaControlElements.h
r87622 r87692 1 1 /* 2 * Copyright (C) 2008, 2009, 2010 Apple Inc. All rights reserved.2 * Copyright (C) 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 88 88 89 89 private: 90 virtual void *preDispatchEventHandler(Event*);91 90 virtual bool isMediaControlElement() const { return true; } 92 91 … … 128 127 MediaControlVolumeSliderContainerElement(HTMLMediaElement*); 129 128 virtual RenderObject* createRenderer(RenderArena*, RenderStyle*); 130 virtual void *preDispatchEventHandler(Event*);129 virtual void defaultEventHandler(Event*); 131 130 virtual MediaControlElementType displayType() const; 132 131 virtual const AtomicString& shadowPseudoId() const; … … 184 183 protected: 185 184 MediaControlMuteButtonElement(HTMLMediaElement*, MediaControlElementType); 186 virtual void *preDispatchEventHandler(Event*);185 virtual void defaultEventHandler(Event*); 187 186 188 187 … … 200 199 MediaControlPanelMuteButtonElement(HTMLMediaElement*, MediaControls*); 201 200 202 virtual void *preDispatchEventHandler(Event*);201 virtual void defaultEventHandler(Event*); 203 202 virtual const AtomicString& shadowPseudoId() const; 204 203 … … 225 224 static PassRefPtr<MediaControlPlayButtonElement> create(HTMLMediaElement*); 226 225 227 virtual void *preDispatchEventHandler(Event*);226 virtual void defaultEventHandler(Event*); 228 227 virtual void updateDisplayType(); 229 228 … … 238 237 class MediaControlSeekButtonElement : public MediaControlInputElement { 239 238 public: 240 virtual void *preDispatchEventHandler(Event*);239 virtual void defaultEventHandler(Event*); 241 240 242 241 protected: … … 286 285 static PassRefPtr<MediaControlRewindButtonElement> create(HTMLMediaElement*); 287 286 288 virtual void *preDispatchEventHandler(Event*);287 virtual void defaultEventHandler(Event*); 289 288 290 289 private: … … 300 299 static PassRefPtr<MediaControlReturnToRealtimeButtonElement> create(HTMLMediaElement*); 301 300 302 virtual void *preDispatchEventHandler(Event*);301 virtual void defaultEventHandler(Event*); 303 302 304 303 private: … … 314 313 static PassRefPtr<MediaControlToggleClosedCaptionsButtonElement> create(HTMLMediaElement*); 315 314 316 virtual void *preDispatchEventHandler(Event*);315 virtual void defaultEventHandler(Event*); 317 316 virtual void updateDisplayType(); 318 317 … … 329 328 static PassRefPtr<MediaControlTimelineElement> create(HTMLMediaElement*, MediaControls*); 330 329 331 virtual void *preDispatchEventHandler(Event*);330 virtual void defaultEventHandler(Event*); 332 331 void setPosition(float); 333 332 void setDuration(float); … … 347 346 static PassRefPtr<MediaControlVolumeSliderElement> create(HTMLMediaElement*); 348 347 349 virtual void *preDispatchEventHandler(Event*);348 virtual void defaultEventHandler(Event*); 350 349 void setVolume(float); 351 350 … … 363 362 static PassRefPtr<MediaControlFullscreenButtonElement> create(HTMLMediaElement*, MediaControls*); 364 363 365 virtual void *preDispatchEventHandler(Event*);364 virtual void defaultEventHandler(Event*); 366 365 367 366 private: … … 391 390 static PassRefPtr<MediaControlFullscreenVolumeMinButtonElement> create(HTMLMediaElement*); 392 391 393 virtual void *preDispatchEventHandler(Event*);392 virtual void defaultEventHandler(Event*); 394 393 395 394 private: … … 405 404 static PassRefPtr<MediaControlFullscreenVolumeMaxButtonElement> create(HTMLMediaElement*); 406 405 407 virtual void *preDispatchEventHandler(Event*);406 virtual void defaultEventHandler(Event*); 408 407 409 408 private: -
trunk/Source/WebCore/html/shadow/MediaControlRootElement.cpp
r87661 r87692 1 1 /* 2 * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.2 * Copyright (C) 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 3 3 * Copyright (C) 2011 Google Inc. All rights reserved. 4 4 * … … 31 31 32 32 #include "MediaControlElements.h" 33 #include "MouseEvent.h" 33 34 #include "Page.h" 34 35 #include "RenderTheme.h" … … 37 38 38 39 namespace WebCore { 40 41 static const double timeWithoutMouseMovementBeforeHidingControls = 3; 39 42 40 43 MediaControlRootElement::MediaControlRootElement(HTMLMediaElement* mediaElement) … … 62 65 , m_panel(0) 63 66 , m_opaque(true) 67 , m_isMouseOverControls(false) 68 , m_hideFullscreenControlsTimer(this, &MediaControlRootElement::hideFullscreenControlsTimerFired) 64 69 { 65 70 } … … 337 342 m_timeline->setPosition(m_mediaElement->currentTime()); 338 343 updateTimeDisplay(); 344 345 if (m_mediaElement->isFullscreen()) 346 startHideFullscreenControlsTimer(); 339 347 } 340 348 … … 343 351 m_timeline->setPosition(m_mediaElement->currentTime()); 344 352 updateTimeDisplay(); 353 354 if (!m_isMouseOverControls && m_mediaElement->hasVideo()) 355 makeTransparent(); 345 356 } 346 357 … … 352 363 makeOpaque(); 353 364 354 m_mediaElement->stopHideFullscreenControlsTimer();365 stopHideFullscreenControlsTimer(); 355 366 } 356 367 … … 438 449 m_returnToRealTimeButton->hide(); 439 450 } 451 452 startHideFullscreenControlsTimer(); 440 453 } 441 454 … … 449 462 m_seekForwardButton->show(); 450 463 m_returnToRealTimeButton->show(); 464 465 stopHideFullscreenControlsTimer(); 451 466 } 452 467 … … 465 480 } 466 481 482 bool MediaControlRootElement::containsRelatedTarget(Event* event) 483 { 484 if (!event->isMouseEvent()) 485 return false; 486 EventTarget* relatedTarget = static_cast<MouseEvent*>(event)->relatedTarget(); 487 if (!relatedTarget) 488 return false; 489 return contains(relatedTarget->toNode()); 490 } 491 492 void MediaControlRootElement::defaultEventHandler(Event* event) 493 { 494 MediaControls::defaultEventHandler(event); 495 496 if (event->type() == eventNames().mouseoverEvent) { 497 if (!containsRelatedTarget(event)) { 498 m_isMouseOverControls = true; 499 if (!m_mediaElement->canPlay()) { 500 makeOpaque(); 501 if (shouldHideControls()) 502 startHideFullscreenControlsTimer(); 503 } 504 } 505 } else if (event->type() == eventNames().mouseoutEvent) { 506 if (!containsRelatedTarget(event)) { 507 m_isMouseOverControls = false; 508 stopHideFullscreenControlsTimer(); 509 } 510 } else if (event->type() == eventNames().mousemoveEvent) { 511 if (m_mediaElement->isFullscreen()) { 512 // When we get a mouse move in fullscreen mode, show the media controls, and start a timer 513 // that will hide the media controls after a 3 seconds without a mouse move. 514 makeOpaque(); 515 if (shouldHideControls()) 516 startHideFullscreenControlsTimer(); 517 } 518 } 519 } 520 521 void MediaControlRootElement::startHideFullscreenControlsTimer() 522 { 523 if (!m_mediaElement->isFullscreen()) 524 return; 525 526 m_hideFullscreenControlsTimer.startOneShot(timeWithoutMouseMovementBeforeHidingControls); 527 } 528 529 void MediaControlRootElement::hideFullscreenControlsTimerFired(Timer<MediaControlRootElement>*) 530 { 531 if (!m_mediaElement->isPlaying()) 532 return; 533 534 if (!m_mediaElement->isFullscreen()) 535 return; 536 537 if (!shouldHideControls()) 538 return; 539 540 makeTransparent(); 541 } 542 543 void MediaControlRootElement::stopHideFullscreenControlsTimer() 544 { 545 m_hideFullscreenControlsTimer.stop(); 546 } 547 467 548 const AtomicString& MediaControlRootElement::shadowPseudoId() const 468 549 { -
trunk/Source/WebCore/html/shadow/MediaControlRootElement.h
r87661 r87692 1 1 /* 2 * Copyright (C) 2007, 2008, 2009, 2010 Apple Inc. All rights reserved.2 * Copyright (C) 2007, 2008, 2009, 2010, 2011 Apple Inc. All rights reserved. 3 3 * Copyright (C) 2011 Google Inc. All rights reserved. 4 4 * … … 98 98 99 99 virtual bool shouldHideControls(); 100 100 101 private: 101 102 MediaControlRootElement(HTMLMediaElement*); 102 103 104 virtual void defaultEventHandler(Event*); 105 void hideFullscreenControlsTimerFired(Timer<MediaControlRootElement>*); 106 void startHideFullscreenControlsTimer(); 107 void stopHideFullscreenControlsTimer(); 108 103 109 virtual const AtomicString& shadowPseudoId() const; 110 111 bool containsRelatedTarget(Event*); 104 112 105 113 HTMLMediaElement* m_mediaElement; … … 125 133 MediaControlFullscreenVolumeMaxButtonElement* m_fullScreenMaxVolumeButton; 126 134 MediaControlPanelElement* m_panel; 127 128 135 bool m_opaque; 136 bool m_isMouseOverControls; 137 Timer<MediaControlRootElement> m_hideFullscreenControlsTimer; 129 138 }; 130 139
Note: See TracChangeset
for help on using the changeset viewer.