⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 180692 in webkit


Ignore:
Timestamp:
Feb 26, 2015, 11:56:49 AM (12 years ago)
Author:
Lucas Forschler
Message:

Merged r179480. rdar://problem/19709193

Location:
branches/safari-600.1.4.15-branch/Source
Files:
10 edited

Legend:

Unmodified
Added
Removed
  • branches/safari-600.1.4.15-branch/Source/WebCore/ChangeLog

    r180665 r180692  
     12015-02-26  Lucas Forschler  <lforschler@apple.com>
     2
     3        Merge r179480
     4
     5    2015-02-02  Jeremy Jones  <jeremyj@apple.com>
     6
     7            Prevent crash when accessing WebAVPlayerController.delegate.
     8            https://bugs.webkit.org/show_bug.cgi?id=140893
     9
     10            Reviewed by Darin Adler.
     11
     12            This patch aims to prevent a null delegate access during invalidation by adding null checks before accessing the delegate, by making explicit the recreation of m_playerController, and by consolidating and correcting the teardown sequence.
     13
     14            * WebCore.exp.in:
     15            * platform/ios/WebVideoFullscreenInterface.h: add resetMediaState()
     16            * platform/ios/WebVideoFullscreenInterfaceAVKit.h: ditto.
     17            * platform/ios/WebVideoFullscreenInterfaceAVKit.mm:
     18            (-[WebAVPlayerController playerViewController:shouldExitFullScreenWithReason:]): Check for null before accessing delegate.
     19            (-[WebAVPlayerController play:]): ditto.
     20            (-[WebAVPlayerController pause:]): ditto.
     21            (-[WebAVPlayerController togglePlayback:]): ditto.
     22            (-[WebAVPlayerController setPlaying:]): ditto.
     23            (-[WebAVPlayerController beginScrubbing:]): ditto.
     24            (-[WebAVPlayerController endScrubbing:]): ditto.
     25            (-[WebAVPlayerController seekToTime:]): ditto.
     26            (-[WebAVPlayerController beginScanningForward:]): ditto.
     27            (-[WebAVPlayerController endScanningForward:]): ditto.
     28            (-[WebAVPlayerController beginScanningBackward:]): ditto.
     29            (-[WebAVPlayerController endScanningBackward:]): ditto.
     30            (-[WebAVPlayerController seekToBeginning:]): ditto.
     31            (-[WebAVPlayerController seekToEnd:]): ditto.
     32            (-[WebAVPlayerController setCurrentAudioMediaSelectionOption:]): ditto.
     33            (-[WebAVPlayerController setCurrentLegibleMediaSelectionOption:]): ditto.
     34            (-[WebAVPlayerController layoutSublayersOfLayer:]): ditto.
     35            (WebVideoFullscreenInterfaceAVKit::WebVideoFullscreenInterfaceAVKit): initialize m_playerController
     36            (WebVideoFullscreenInterfaceAVKit::resetMediaState): Added.
     37            (WebVideoFullscreenInterfaceAVKit::setDuration): remove playerController()
     38            (WebVideoFullscreenInterfaceAVKit::setCurrentTime): ditto.
     39            (WebVideoFullscreenInterfaceAVKit::setRate): ditto.
     40            (WebVideoFullscreenInterfaceAVKit::setVideoDimensions): ditto.
     41            (WebVideoFullscreenInterfaceAVKit::setSeekableRanges): ditto.
     42            (WebVideoFullscreenInterfaceAVKit::setCanPlayFastReverse): ditto.
     43            (WebVideoFullscreenInterfaceAVKit::setAudioMediaSelectionOptions): ditto.
     44            (WebVideoFullscreenInterfaceAVKit::setLegibleMediaSelectionOptions): ditto.
     45            (WebVideoFullscreenInterfaceAVKit::setExternalPlayback): ditto.
     46            (WebVideoFullscreenInterfaceAVKit::setupFullscreenInternal): ditto.
     47            (WebVideoFullscreenInterfaceAVKit::enterFullscreenStandard): ditto.
     48            (WebVideoFullscreenInterfaceAVKit::cleanupFullscreenInternal): consolidated cleanup code from invalidate()
     49            (WebVideoFullscreenInterfaceAVKit::invalidate): consolidate cleanup code.
     50            (WebVideoFullscreenInterfaceAVKit::playerController): Deleted.
     51            * platform/ios/WebVideoFullscreenModelVideoElement.mm:
     52            (WebVideoFullscreenModelVideoElement::setVideoElement): call resetMediaState()
     53
    1542015-02-25  Babak Shafiei  <bshafiei@apple.com>
    255
  • branches/safari-600.1.4.15-branch/Source/WebCore/WebCore.exp.in

    r180401 r180692  
    34473447__ZN7WebCore32WebVideoFullscreenInterfaceAVKit15enterFullscreenEv
    34483448__ZN7WebCore32WebVideoFullscreenInterfaceAVKit15setupFullscreenER7CALayerNS_7IntRectEP6UIView
     3449__ZN7WebCore32WebVideoFullscreenInterfaceAVKit15resetMediaStateEv
    34493450__ZN7WebCore32WebVideoFullscreenInterfaceAVKit17cleanupFullscreenEv
    34503451__ZN7WebCore32WebVideoFullscreenInterfaceAVKit17setSeekableRangesERKNS_10TimeRangesE
  • branches/safari-600.1.4.15-branch/Source/WebCore/platform/ios/WebVideoFullscreenInterface.h

    r171433 r180692  
    4545   
    4646    virtual ~WebVideoFullscreenInterface() { };
     47    virtual void resetMediaState() = 0;
    4748    virtual void setDuration(double) = 0;
    4849    virtual void setCurrentTime(double currentTime, double anchorTime) = 0;
  • branches/safari-600.1.4.15-branch/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h

    r179067 r180692  
    6464protected:
    6565    void setupFullscreenInternal(PlatformLayer&, IntRect initialRect, UIView *);
     66    void beginSession();
    6667    void enterFullscreenOptimized();
    6768    void enterFullscreenStandard();
     
    8283    RetainPtr<UIWindow> m_parentWindow;
    8384
    84     WebAVPlayerController *playerController();
    85    
    8685    void doEnterFullscreen();
    8786       
     
    9291    void setWebVideoFullscreenChangeObserver(WebVideoFullscreenChangeObserver*);
    9392   
     93    virtual void resetMediaState() override;
    9494    virtual void setDuration(double) override;
    9595    virtual void setCurrentTime(double currentTime, double anchorTime) override;
  • branches/safari-600.1.4.15-branch/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm

    r179067 r180692  
    9090}
    9191
     92-(void)resetState;
    9293@property(retain) AVPlayerController* playerControllerProxy;
    9394@property(assign) WebVideoFullscreenModel* delegate;
     
    157158}
    158159
     160
     161-(void)resetState {
     162    self.contentDuration = 0;
     163    self.maxTime = 0;
     164    self.contentDurationWithinEndTimes = 0;
     165    self.loadedTimeRanges = @[];
     166   
     167    self.canPlay = NO;
     168    self.canPause = NO;
     169    self.canTogglePlayback = NO;
     170    self.hasEnabledAudio = NO;
     171    self.canSeek = NO;
     172    self.minTime = 0;
     173    self.status = AVPlayerControllerStatusUnknown;
     174   
     175    self.timing = nil;
     176    self.rate = 0;
     177   
     178    self.hasEnabledVideo = NO;
     179    self.contentDimensions = CGSizeMake(0, 0);
     180   
     181    self.seekableTimeRanges = [NSMutableArray array];
     182   
     183    self.canScanBackward = NO;
     184   
     185    self.audioMediaSelectionOptions = nil;
     186    self.currentAudioMediaSelectionOption = nil;
     187   
     188    self.legibleMediaSelectionOptions = nil;
     189    self.currentLegibleMediaSelectionOption = nil;
     190}
     191
    159192- (id)forwardingTargetForSelector:(SEL)selector
    160193{
     
    167200    UNUSED_PARAM(playerViewController);
    168201    UNUSED_PARAM(reason);
    169     ASSERT(self.delegate);
     202    if (!self.delegate)
     203        return YES;
     204   
    170205    if (reason == AVPlayerViewControllerExitFullScreenReasonDoneButtonTapped || reason == AVPlayerViewControllerExitFullScreenReasonRemoteControlStopEventReceived)
    171206        self.delegate->pause();
     207   
    172208    self.delegate->requestExitFullscreen();
    173209    return NO;
     
    177213{
    178214    UNUSED_PARAM(sender);
    179     ASSERT(self.delegate);
     215    if (!self.delegate)
     216        return;
    180217    self.delegate->play();
    181218}
     
    184221{
    185222    UNUSED_PARAM(sender);
    186     ASSERT(self.delegate);
     223    if (!self.delegate)
     224        return;
    187225    self.delegate->pause();
    188226}
     
    191229{
    192230    UNUSED_PARAM(sender);
    193     ASSERT(self.delegate);
     231    if (!self.delegate)
     232        return;
    194233    self.delegate->togglePlayState();
    195234}
     
    202241- (void)setPlaying:(BOOL)playing
    203242{
    204     ASSERT(self.delegate);
     243    if (!self.delegate)
     244        return;
    205245    if (playing)
    206246        self.delegate->play();
    207247    else
    208248        self.delegate->pause();
    209     }
     249}
    210250
    211251+ (NSSet *)keyPathsForValuesAffectingPlaying
     
    217257{
    218258    UNUSED_PARAM(sender);
    219     ASSERT(self.delegate);
     259    if (!self.delegate)
     260        return;
    220261    self.delegate->beginScrubbing();
    221262}
     
    224265{
    225266    UNUSED_PARAM(sender);
    226     ASSERT(self.delegate);
     267    if (!self.delegate)
     268        return;
    227269    self.delegate->endScrubbing();
    228270}
     
    230272- (void)seekToTime:(NSTimeInterval)time
    231273{
    232     ASSERT(self.delegate);
     274    if (!self.delegate)
     275        return;
    233276    self.delegate->fastSeek(time);
    234277}
     
    293336{
    294337    UNUSED_PARAM(sender);
    295     ASSERT(self.delegate);
     338    if (!self.delegate)
     339        return;
    296340    self.delegate->beginScanningForward();
    297341}
     
    300344{
    301345    UNUSED_PARAM(sender);
    302     ASSERT(self.delegate);
     346    if (!self.delegate)
     347        return;
    303348    self.delegate->endScanning();
    304349}
     
    307352{
    308353    UNUSED_PARAM(sender);
    309     ASSERT(self.delegate);
     354    if (!self.delegate)
     355        return;
    310356    self.delegate->beginScanningBackward();
    311357}
     
    314360{
    315361    UNUSED_PARAM(sender);
    316     ASSERT(self.delegate);
     362    if (!self.delegate)
     363        return;
    317364    self.delegate->endScanning();
    318365}
     
    336383{
    337384    UNUSED_PARAM(sender);
    338     ASSERT(self.delegate);
    339 
     385    if (!self.delegate)
     386        return;
    340387    self.delegate->seekToTime(-INFINITY);
    341388}
     
    364411{
    365412    UNUSED_PARAM(sender);
    366     ASSERT(self.delegate);
    367 
     413    if (!self.delegate)
     414        return;
    368415    self.delegate->seekToTime(INFINITY);
    369416}
     
    418465    _currentAudioMediaSelectionOption = [option retain];
    419466   
    420     ASSERT(self.delegate);
     467    if (!self.delegate)
     468        return;
    421469   
    422470    NSInteger index = NSNotFound;
     
    441489    _currentLegibleMediaSelectionOption = [option retain];
    442490   
    443     ASSERT(self.delegate);
     491    if (!self.delegate)
     492        return;
    444493   
    445494    NSInteger index = NSNotFound;
     
    581630
    582631WebVideoFullscreenInterfaceAVKit::WebVideoFullscreenInterfaceAVKit()
    583     : m_videoFullscreenModel(nullptr)
    584 {
    585 }
    586 
    587 WebAVPlayerController *WebVideoFullscreenInterfaceAVKit::playerController()
    588 {
    589     if (!m_playerController)
    590     {
    591         m_playerController = adoptNS([[WebAVPlayerController alloc] init]);
    592         if (m_videoFullscreenModel)
    593             [m_playerController setDelegate:m_videoFullscreenModel];
    594     }
    595     return m_playerController.get();
    596 }
    597 
     632    : m_playerController(adoptNS([[WebAVPlayerController alloc] init]))
     633    , m_videoFullscreenModel(nullptr)
     634{
     635}
     636
     637void WebVideoFullscreenInterfaceAVKit::resetMediaState()
     638{
     639    RefPtr<WebVideoFullscreenInterfaceAVKit> strongThis(this);
     640   
     641    dispatch_async(dispatch_get_main_queue(), [strongThis] {
     642        if (!strongThis->m_playerController) {
     643            strongThis->m_playerController = adoptNS([[WebAVPlayerController alloc] init]);
     644            [strongThis->m_playerController setDelegate:strongThis->m_videoFullscreenModel];
     645           
     646        } else
     647            [strongThis->m_playerController resetState];
     648    });
     649}
    598650
    599651void WebVideoFullscreenInterfaceAVKit::setWebVideoFullscreenModel(WebVideoFullscreenModel* model)
     
    613665   
    614666    dispatch_async(dispatch_get_main_queue(), [strongThis, duration] {
    615         WebAVPlayerController* playerController = strongThis->playerController();
     667        WebAVPlayerController* playerController = strongThis->m_playerController.get();
    616668
    617669        // FIXME: https://bugs.webkit.org/show_bug.cgi?id=127017 use correct values instead of duration for all these
     
    637689   
    638690    dispatch_async(dispatch_get_main_queue(), [strongThis, currentTime, anchorTime] {
    639         NSTimeInterval anchorTimeStamp = ![strongThis->playerController() rate] ? NAN : anchorTime;
     691        NSTimeInterval anchorTimeStamp = ![strongThis->m_playerController rate] ? NAN : anchorTime;
    640692        AVValueTiming *timing = [getAVValueTimingClass() valueTimingWithAnchorValue:currentTime
    641693            anchorTimeStamp:anchorTimeStamp rate:0];
    642         strongThis->playerController().timing = timing;
     694        [strongThis->m_playerController setTiming:timing];
    643695    });
    644696}
     
    649701   
    650702    dispatch_async(dispatch_get_main_queue(), [strongThis, isPlaying, playbackRate] {
    651         strongThis->playerController().rate = isPlaying ? playbackRate : 0.;
     703        [strongThis->m_playerController setRate:isPlaying ? playbackRate : 0.];
    652704    });
    653705}
     
    658710   
    659711    dispatch_async(dispatch_get_main_queue(), [strongThis, hasVideo, width, height] {
    660         strongThis->playerController().hasEnabledVideo = hasVideo;
    661         strongThis->playerController().contentDimensions = CGSizeMake(width, height);
     712        [strongThis->m_playerController setHasEnabledVideo:hasVideo];
     713        [strongThis->m_playerController setContentDimensions:CGSizeMake(width, height)];
    662714    });
    663715}
     
    679731   
    680732    dispatch_async(dispatch_get_main_queue(), [strongThis, seekableRanges] {
    681         strongThis->playerController().seekableTimeRanges = seekableRanges.get();
     733        [strongThis->m_playerController setSeekableTimeRanges:seekableRanges.get()];
    682734    });
    683735}
     
    688740   
    689741    dispatch_async(dispatch_get_main_queue(), [strongThis, canPlayFastReverse] {
    690         strongThis->playerController().canScanBackward = canPlayFastReverse;
     742        [strongThis->m_playerController setCanScanBackward:canPlayFastReverse];
    691743    });
    692744}
     
    709761   
    710762    dispatch_async(dispatch_get_main_queue(), [webOptions, strongThis, selectedIndex] {
    711         strongThis->playerController().audioMediaSelectionOptions = webOptions.get();
     763        [strongThis->m_playerController setAudioMediaSelectionOptions:webOptions.get()];
    712764        if (selectedIndex < [webOptions count])
    713             strongThis->playerController().currentAudioMediaSelectionOption = [webOptions objectAtIndex:static_cast<NSUInteger>(selectedIndex)];
     765            [strongThis->m_playerController setCurrentAudioMediaSelectionOption:[webOptions objectAtIndex:static_cast<NSUInteger>(selectedIndex)]];
    714766    });
    715767}
     
    721773
    722774    dispatch_async(dispatch_get_main_queue(), [webOptions, strongThis, selectedIndex] {
    723         strongThis->playerController().legibleMediaSelectionOptions = webOptions.get();
     775        [strongThis->m_playerController setLegibleMediaSelectionOptions:webOptions.get()];
    724776        if (selectedIndex < [webOptions count])
    725             strongThis->playerController().currentLegibleMediaSelectionOption = [webOptions objectAtIndex:static_cast<NSUInteger>(selectedIndex)];
     777            [strongThis->m_playerController setCurrentLegibleMediaSelectionOption:[webOptions objectAtIndex:static_cast<NSUInteger>(selectedIndex)]];
    726778    });
    727779}
     
    738790
    739791    dispatch_async(dispatch_get_main_queue(), [strongThis, enabled, localizedDeviceName, externalPlaybackType] {
    740         WebAVPlayerController* playerController = strongThis->playerController();
     792        WebAVPlayerController* playerController = strongThis->m_playerController.get();
    741793        playerController.externalPlaybackAirPlayDeviceLocalizedName = localizedDeviceName;
    742794        playerController.externalPlaybackType = externalPlaybackType;
     
    778830
    779831    m_videoLayerContainer = [WebAVVideoLayer videoLayer];
    780     [m_videoLayerContainer setHidden:playerController().externalPlaybackActive];
     832    [m_videoLayerContainer setHidden:[m_playerController isExternalPlaybackActive]];
    781833    [m_videoLayerContainer setVideoSublayer:m_videoLayer.get()];
    782834
    783     CGSize videoSize = playerController().contentDimensions;
     835    CGSize videoSize = [m_playerController contentDimensions];
    784836    CGRect videoRect = CGRectMake(0, 0, videoSize.width, videoSize.height);
    785837    [m_videoLayerContainer setVideoRect:videoRect];
     
    787839    m_playerViewController = adoptNS([[getAVPlayerViewControllerClass() alloc] initWithVideoLayer:m_videoLayerContainer.get()]);
    788840    [m_playerViewController setShowsPlaybackControls:NO];
    789     [m_playerViewController setPlayerController:(AVPlayerController *)playerController()];
    790     [m_playerViewController setDelegate:playerController()];
     841    [m_playerViewController setPlayerController:(AVPlayerController *)m_playerController.get()];
     842    [m_playerViewController setDelegate:m_playerController.get()];
    791843    [m_videoLayerContainer setPlayerViewController:m_playerViewController.get()];
    792844
     
    894946            [[getUIApplicationClass() sharedApplication] _setStatusBarOrientation:[m_parentWindow interfaceOrientation]];
    895947    }
     948   
     949    [m_playerController setDelegate:nil];
     950   
    896951    [m_playerViewController setDelegate:nil];
     952    [m_playerViewController setPlayerController:nil];
     953   
     954    [m_playerViewController exitFullScreenAnimated:NO completionHandler:nil];
     955   
    897956    [[m_playerViewController view] removeFromSuperview];
    898957    if (m_viewController)
    899958        [m_playerViewController removeFromParentViewController];
    900     [m_playerViewController setPlayerController:nil];
    901     m_playerViewController = nil;
     959   
    902960    [m_videoLayer removeFromSuperlayer];
    903     m_videoLayer = nil;
    904961    [m_videoLayerContainer removeFromSuperlayer];
    905962    [m_videoLayerContainer setPlayerViewController:nil];
     963    [[m_viewController view] removeFromSuperview];
     964   
     965    m_videoLayer = nil;
    906966    m_videoLayerContainer = nil;
    907     [[m_viewController view] removeFromSuperview];
     967    m_playerViewController = nil;
     968    m_playerController = nil;
    908969    m_viewController = nil;
    909970    m_window = nil;
     
    920981void WebVideoFullscreenInterfaceAVKit::invalidate()
    921982{
    922     [m_window setHidden:YES];
    923     [m_window setRootViewController:nil];
    924     [m_playerViewController exitFullScreenAnimated:NO completionHandler:nil];
    925     m_playerController = nil;
    926     [m_playerViewController setDelegate:nil];
    927     [[m_playerViewController view] removeFromSuperview];
    928     if (m_viewController)
    929         [m_playerViewController removeFromParentViewController];
    930     [m_playerViewController setPlayerController:nil];
    931     m_playerViewController = nil;
    932     [m_videoLayer removeFromSuperlayer];
    933     m_videoLayer = nil;
    934     [m_videoLayerContainer removeFromSuperlayer];
    935     [m_videoLayerContainer setPlayerViewController:nil];
    936     m_videoLayerContainer = nil;
    937     [[m_viewController view] removeFromSuperview];
    938     m_viewController = nil;
    939     m_window = nil;
    940     m_parentView = nil;
    941     m_parentWindow = nil;
     983    m_videoFullscreenModel = nil;
     984    m_fullscreenChangeObserver = nil;
     985   
     986    cleanupFullscreenInternal();
    942987}
    943988
  • branches/safari-600.1.4.15-branch/Source/WebCore/platform/ios/WebVideoFullscreenModelMediaElement.mm

    r180099 r180692  
    6969        return;
    7070
     71    if (m_videoFullscreenInterface)
     72        m_videoFullscreenInterface->resetMediaState();
     73
    7174    if (m_mediaElement && m_isListening) {
    7275        for (auto eventName : observedEventNames())
  • branches/safari-600.1.4.15-branch/Source/WebKit2/ChangeLog

    r180663 r180692  
     12015-02-26  Lucas Forschler  <lforschler@apple.com>
     2
     3        Merge r179480
     4
     5    2015-02-02  Jeremy Jones  <jeremyj@apple.com>
     6
     7            Prevent crash when accessing WebAVPlayerController.delegate.
     8            https://bugs.webkit.org/show_bug.cgi?id=140893
     9
     10            Reviewed by Darin Adler.
     11
     12            Plumb new resetMediaState() through IPC interface WebVideoFullscreenManagerProxy.
     13
     14            * UIProcess/ios/WebVideoFullscreenManagerProxy.messages.in:
     15            * UIProcess/ios/WebVideoFullscreenManagerProxy.mm:
     16            (WebKit::WebVideoFullscreenManagerProxy::invalidate): remove redundant set to nullptr.
     17            * WebProcess/ios/WebVideoFullscreenManager.h:
     18            * WebProcess/ios/WebVideoFullscreenManager.mm:
     19            (WebKit::WebVideoFullscreenManager::resetMediaState):
     20
    1212015-02-25  Babak Shafiei  <bshafiei@apple.com>
    222
  • branches/safari-600.1.4.15-branch/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.messages.in

    r173718 r180692  
    2323#if PLATFORM(IOS)
    2424messages -> WebVideoFullscreenManagerProxy {
     25    ResetMediaState()
    2526    SetCurrentTime(double currentTime, double hostTime)
    2627    SetVideoDimensions(bool hasVideo, unsigned width, unsigned height)
  • branches/safari-600.1.4.15-branch/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.h

    r178994 r180692  
    6868   
    6969    // FullscreenInterface
     70    virtual void resetMediaState() override;
    7071    virtual void setDuration(double) override;
    7172    virtual void setCurrentTime(double currentTime, double anchorTime) override;
  • branches/safari-600.1.4.15-branch/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.mm

    r180186 r180692  
    115115}
    116116
     117void WebVideoFullscreenManager::resetMediaState()
     118{
     119    m_page->send(Messages::WebVideoFullscreenManagerProxy::ResetMediaState(), m_page->pageID());
     120}
     121   
    117122void WebVideoFullscreenManager::setDuration(double duration)
    118123{
Note: See TracChangeset for help on using the changeset viewer.