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

Changeset 179480 in webkit


Ignore:
Timestamp:
Feb 2, 2015, 11:40:57 AM (12 years ago)
Author:
commit-queue@webkit.org
Message:

Prevent crash when accessing WebAVPlayerController.delegate.
https://bugs.webkit.org/show_bug.cgi?id=140893

Patch by Jeremy Jones <jeremyj@apple.com> on 2015-02-02
Reviewed by Darin Adler.

Source/WebCore:

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.

  • WebCore.exp.in:
  • platform/ios/WebVideoFullscreenInterface.h: add resetMediaState()
  • platform/ios/WebVideoFullscreenInterfaceAVKit.h: ditto.
  • platform/ios/WebVideoFullscreenInterfaceAVKit.mm:

(-[WebAVPlayerController playerViewController:shouldExitFullScreenWithReason:]): Check for null before accessing delegate.
(-[WebAVPlayerController play:]): ditto.
(-[WebAVPlayerController pause:]): ditto.
(-[WebAVPlayerController togglePlayback:]): ditto.
(-[WebAVPlayerController setPlaying:]): ditto.
(-[WebAVPlayerController beginScrubbing:]): ditto.
(-[WebAVPlayerController endScrubbing:]): ditto.
(-[WebAVPlayerController seekToTime:]): ditto.
(-[WebAVPlayerController beginScanningForward:]): ditto.
(-[WebAVPlayerController endScanningForward:]): ditto.
(-[WebAVPlayerController beginScanningBackward:]): ditto.
(-[WebAVPlayerController endScanningBackward:]): ditto.
(-[WebAVPlayerController seekToBeginning:]): ditto.
(-[WebAVPlayerController seekToEnd:]): ditto.
(-[WebAVPlayerController setCurrentAudioMediaSelectionOption:]): ditto.
(-[WebAVPlayerController setCurrentLegibleMediaSelectionOption:]): ditto.
(-[WebAVPlayerController layoutSublayersOfLayer:]): ditto.
(WebVideoFullscreenInterfaceAVKit::WebVideoFullscreenInterfaceAVKit): initialize m_playerController
(WebVideoFullscreenInterfaceAVKit::resetMediaState): Added.
(WebVideoFullscreenInterfaceAVKit::setDuration): remove playerController()
(WebVideoFullscreenInterfaceAVKit::setCurrentTime): ditto.
(WebVideoFullscreenInterfaceAVKit::setRate): ditto.
(WebVideoFullscreenInterfaceAVKit::setVideoDimensions): ditto.
(WebVideoFullscreenInterfaceAVKit::setSeekableRanges): ditto.
(WebVideoFullscreenInterfaceAVKit::setCanPlayFastReverse): ditto.
(WebVideoFullscreenInterfaceAVKit::setAudioMediaSelectionOptions): ditto.
(WebVideoFullscreenInterfaceAVKit::setLegibleMediaSelectionOptions): ditto.
(WebVideoFullscreenInterfaceAVKit::setExternalPlayback): ditto.
(WebVideoFullscreenInterfaceAVKit::setupFullscreenInternal): ditto.
(WebVideoFullscreenInterfaceAVKit::enterFullscreenStandard): ditto.
(WebVideoFullscreenInterfaceAVKit::cleanupFullscreenInternal): consolidated cleanup code from invalidate()
(WebVideoFullscreenInterfaceAVKit::invalidate): consolidate cleanup code.
(WebVideoFullscreenInterfaceAVKit::playerController): Deleted.

  • platform/ios/WebVideoFullscreenModelVideoElement.mm:

(WebVideoFullscreenModelVideoElement::setVideoElement): call resetMediaState()

Source/WebKit2:

Plumb new resetMediaState() through IPC interface WebVideoFullscreenManagerProxy.

  • UIProcess/ios/WebVideoFullscreenManagerProxy.messages.in:
  • UIProcess/ios/WebVideoFullscreenManagerProxy.mm:

(WebKit::WebVideoFullscreenManagerProxy::invalidate): remove redundant set to nullptr.

  • WebProcess/ios/WebVideoFullscreenManager.h:
  • WebProcess/ios/WebVideoFullscreenManager.mm:

(WebKit::WebVideoFullscreenManager::resetMediaState):

Location:
trunk/Source
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r179476 r179480  
     12015-02-02  Jeremy Jones  <jeremyj@apple.com>
     2
     3        Prevent crash when accessing WebAVPlayerController.delegate.
     4        https://bugs.webkit.org/show_bug.cgi?id=140893
     5
     6        Reviewed by Darin Adler.
     7
     8        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.
     9
     10        * WebCore.exp.in:
     11        * platform/ios/WebVideoFullscreenInterface.h: add resetMediaState()
     12        * platform/ios/WebVideoFullscreenInterfaceAVKit.h: ditto.
     13        * platform/ios/WebVideoFullscreenInterfaceAVKit.mm:
     14        (-[WebAVPlayerController playerViewController:shouldExitFullScreenWithReason:]): Check for null before accessing delegate.
     15        (-[WebAVPlayerController play:]): ditto.
     16        (-[WebAVPlayerController pause:]): ditto.
     17        (-[WebAVPlayerController togglePlayback:]): ditto.
     18        (-[WebAVPlayerController setPlaying:]): ditto.
     19        (-[WebAVPlayerController beginScrubbing:]): ditto.
     20        (-[WebAVPlayerController endScrubbing:]): ditto.
     21        (-[WebAVPlayerController seekToTime:]): ditto.
     22        (-[WebAVPlayerController beginScanningForward:]): ditto.
     23        (-[WebAVPlayerController endScanningForward:]): ditto.
     24        (-[WebAVPlayerController beginScanningBackward:]): ditto.
     25        (-[WebAVPlayerController endScanningBackward:]): ditto.
     26        (-[WebAVPlayerController seekToBeginning:]): ditto.
     27        (-[WebAVPlayerController seekToEnd:]): ditto.
     28        (-[WebAVPlayerController setCurrentAudioMediaSelectionOption:]): ditto.
     29        (-[WebAVPlayerController setCurrentLegibleMediaSelectionOption:]): ditto.
     30        (-[WebAVPlayerController layoutSublayersOfLayer:]): ditto.
     31        (WebVideoFullscreenInterfaceAVKit::WebVideoFullscreenInterfaceAVKit): initialize m_playerController
     32        (WebVideoFullscreenInterfaceAVKit::resetMediaState): Added.
     33        (WebVideoFullscreenInterfaceAVKit::setDuration): remove playerController()
     34        (WebVideoFullscreenInterfaceAVKit::setCurrentTime): ditto.
     35        (WebVideoFullscreenInterfaceAVKit::setRate): ditto.
     36        (WebVideoFullscreenInterfaceAVKit::setVideoDimensions): ditto.
     37        (WebVideoFullscreenInterfaceAVKit::setSeekableRanges): ditto.
     38        (WebVideoFullscreenInterfaceAVKit::setCanPlayFastReverse): ditto.
     39        (WebVideoFullscreenInterfaceAVKit::setAudioMediaSelectionOptions): ditto.
     40        (WebVideoFullscreenInterfaceAVKit::setLegibleMediaSelectionOptions): ditto.
     41        (WebVideoFullscreenInterfaceAVKit::setExternalPlayback): ditto.
     42        (WebVideoFullscreenInterfaceAVKit::setupFullscreenInternal): ditto.
     43        (WebVideoFullscreenInterfaceAVKit::enterFullscreenStandard): ditto.
     44        (WebVideoFullscreenInterfaceAVKit::cleanupFullscreenInternal): consolidated cleanup code from invalidate()
     45        (WebVideoFullscreenInterfaceAVKit::invalidate): consolidate cleanup code.
     46        (WebVideoFullscreenInterfaceAVKit::playerController): Deleted.
     47        * platform/ios/WebVideoFullscreenModelVideoElement.mm:
     48        (WebVideoFullscreenModelVideoElement::setVideoElement): call resetMediaState()
     49
    1502015-02-02  Darin Adler  <darin@apple.com>
    251
  • trunk/Source/WebCore/WebCore.exp.in

    r179472 r179480  
    34843484__ZN7WebCore32WebVideoFullscreenInterfaceAVKit14setCurrentTimeEdd
    34853485__ZN7WebCore32WebVideoFullscreenInterfaceAVKit15enterFullscreenEv
     3486__ZN7WebCore32WebVideoFullscreenInterfaceAVKit15resetMediaStateEv
    34863487__ZN7WebCore32WebVideoFullscreenInterfaceAVKit15setupFullscreenER7CALayerNS_7IntRectEP6UIViewjb
    34873488__ZN7WebCore32WebVideoFullscreenInterfaceAVKit17cleanupFullscreenEv
  • trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterface.h

    r173230 r179480  
    4545   
    4646    virtual ~WebVideoFullscreenInterface() { };
     47    virtual void resetMediaState() = 0;
    4748    virtual void setDuration(double) = 0;
    4849    virtual void setCurrentTime(double currentTime, double anchorTime) = 0;
  • trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h

    r177375 r179480  
    7474    WEBCORE_EXPORT void setWebVideoFullscreenChangeObserver(WebVideoFullscreenChangeObserver*);
    7575   
     76    WEBCORE_EXPORT virtual void resetMediaState() override;
    7677    WEBCORE_EXPORT virtual void setDuration(double) override;
    7778    WEBCORE_EXPORT virtual void setCurrentTime(double currentTime, double anchorTime) override;
     
    9697
    9798protected:
     99    void beginSession();
    98100    void setupFullscreenInternal(PlatformLayer&, IntRect initialRect, UIView *, HTMLMediaElement::VideoFullscreenMode, bool allowOptimizedFullscreen);
    99101    void enterFullscreenOptimized();
     
    119121    bool m_enterRequested;
    120122
    121     WebAVPlayerController *playerController();
    122    
    123123    void doEnterFullscreen();
    124124};
  • trunk/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm

    r179279 r179480  
    8787}
    8888
     89-(void)resetState;
     90
    8991@property (retain) AVPlayerController* playerControllerProxy;
    9092@property (assign) WebVideoFullscreenModel* delegate;
     
    155157}
    156158
     159-(void)resetState {
     160    self.contentDuration = 0;
     161    self.maxTime = 0;
     162    self.contentDurationWithinEndTimes = 0;
     163    self.loadedTimeRanges = @[];
     164   
     165    self.canPlay = NO;
     166    self.canPause = NO;
     167    self.canTogglePlayback = NO;
     168    self.hasEnabledAudio = NO;
     169    self.canSeek = NO;
     170    self.minTime = 0;
     171    self.status = AVPlayerControllerStatusUnknown;
     172   
     173    self.timing = nil;
     174    self.rate = 0;
     175   
     176    self.hasEnabledVideo = NO;
     177    self.contentDimensions = CGSizeMake(0, 0);
     178   
     179    self.seekableTimeRanges = [NSMutableArray array];
     180   
     181    self.canScanBackward = NO;
     182   
     183    self.audioMediaSelectionOptions = nil;
     184    self.currentAudioMediaSelectionOption = nil;
     185   
     186    self.legibleMediaSelectionOptions = nil;
     187    self.currentLegibleMediaSelectionOption = nil;
     188}
     189
    157190- (AVPlayer*) player {
    158191    return nil;
     
    169202    UNUSED_PARAM(playerViewController);
    170203    UNUSED_PARAM(reason);
    171     ASSERT(self.delegate);
     204    if (!self.delegate)
     205        return YES;
     206   
    172207    if (reason == AVPlayerViewControllerExitFullScreenReasonDoneButtonTapped || reason == AVPlayerViewControllerExitFullScreenReasonRemoteControlStopEventReceived)
    173208        self.delegate->pause();
     209   
    174210    self.delegate->requestExitFullscreen();
    175211    return NO;
     
    179215{
    180216    UNUSED_PARAM(sender);
    181     ASSERT(self.delegate);
     217    if (!self.delegate)
     218        return;
    182219    self.delegate->play();
    183220}
     
    186223{
    187224    UNUSED_PARAM(sender);
    188     ASSERT(self.delegate);
     225    if (!self.delegate)
     226        return;
    189227    self.delegate->pause();
    190228}
     
    193231{
    194232    UNUSED_PARAM(sender);
    195     ASSERT(self.delegate);
     233    if (!self.delegate)
     234        return;
    196235    self.delegate->togglePlayState();
    197236}
     
    204243- (void)setPlaying:(BOOL)playing
    205244{
    206     ASSERT(self.delegate);
     245    if (!self.delegate)
     246        return;
    207247    if (playing)
    208248        self.delegate->play();
    209249    else
    210250        self.delegate->pause();
    211     }
     251}
    212252
    213253+ (NSSet *)keyPathsForValuesAffectingPlaying
     
    219259{
    220260    UNUSED_PARAM(sender);
    221     ASSERT(self.delegate);
     261    if (!self.delegate)
     262        return;
    222263    self.delegate->beginScrubbing();
    223264}
     
    226267{
    227268    UNUSED_PARAM(sender);
    228     ASSERT(self.delegate);
     269    if (!self.delegate)
     270        return;
    229271    self.delegate->endScrubbing();
    230272}
     
    232274- (void)seekToTime:(NSTimeInterval)time
    233275{
    234     ASSERT(self.delegate);
     276    if (!self.delegate)
     277        return;
    235278    self.delegate->fastSeek(time);
    236279}
     
    295338{
    296339    UNUSED_PARAM(sender);
    297     ASSERT(self.delegate);
     340    if (!self.delegate)
     341        return;
    298342    self.delegate->beginScanningForward();
    299343}
     
    302346{
    303347    UNUSED_PARAM(sender);
    304     ASSERT(self.delegate);
     348    if (!self.delegate)
     349        return;
    305350    self.delegate->endScanning();
    306351}
     
    309354{
    310355    UNUSED_PARAM(sender);
    311     ASSERT(self.delegate);
     356    if (!self.delegate)
     357        return;
    312358    self.delegate->beginScanningBackward();
    313359}
     
    316362{
    317363    UNUSED_PARAM(sender);
    318     ASSERT(self.delegate);
     364    if (!self.delegate)
     365        return;
    319366    self.delegate->endScanning();
    320367}
     
    338385{
    339386    UNUSED_PARAM(sender);
    340     ASSERT(self.delegate);
    341 
     387    if (!self.delegate)
     388        return;
    342389    self.delegate->seekToTime(-INFINITY);
    343390}
     
    366413{
    367414    UNUSED_PARAM(sender);
    368     ASSERT(self.delegate);
    369 
     415    if (!self.delegate)
     416        return;
    370417    self.delegate->seekToTime(INFINITY);
    371418}
     
    420467    _currentAudioMediaSelectionOption = [option retain];
    421468   
    422     ASSERT(self.delegate);
     469    if (!self.delegate)
     470        return;
    423471   
    424472    NSInteger index = NSNotFound;
     
    443491    _currentLegibleMediaSelectionOption = [option retain];
    444492   
    445     ASSERT(self.delegate);
     493    if (!self.delegate)
     494        return;
    446495   
    447496    NSInteger index = NSNotFound;
     
    466515{
    467516    CGRect layerBounds = [layer bounds];
    468     self.delegate->setVideoLayerFrame(CGRectMake(0, 0, CGRectGetWidth(layerBounds), CGRectGetHeight(layerBounds)));
     517    if (self.delegate)
     518        self.delegate->setVideoLayerFrame(CGRectMake(0, 0, CGRectGetWidth(layerBounds), CGRectGetHeight(layerBounds)));
    469519   
    470520    [CATransaction begin];
     
    615665
    616666WebVideoFullscreenInterfaceAVKit::WebVideoFullscreenInterfaceAVKit()
    617     : m_videoFullscreenModel(nullptr)
     667    : m_playerController(adoptNS([[WebAVPlayerController alloc] init]))
     668    , m_videoFullscreenModel(nullptr)
    618669    , m_fullscreenChangeObserver(nullptr)
    619670    , m_mode(HTMLMediaElement::VideoFullscreenModeNone)
     
    622673    , m_enterRequested(false)
    623674{
    624 }
    625 
    626 WebAVPlayerController *WebVideoFullscreenInterfaceAVKit::playerController()
    627 {
    628     if (!m_playerController)
    629     {
    630         m_playerController = adoptNS([[WebAVPlayerController alloc] init]);
    631         if (m_videoFullscreenModel)
    632             [m_playerController setDelegate:m_videoFullscreenModel];
    633         [m_playerController setFullscreenInterface:this];
    634     }
    635     return m_playerController.get();
    636 }
    637 
     675    [m_playerController setFullscreenInterface:this];
     676}
     677
     678void WebVideoFullscreenInterfaceAVKit::resetMediaState()
     679{
     680    RefPtr<WebVideoFullscreenInterfaceAVKit> strongThis(this);
     681   
     682    dispatch_async(dispatch_get_main_queue(), [strongThis] {
     683        if (!strongThis->m_playerController) {
     684            strongThis->m_playerController = adoptNS([[WebAVPlayerController alloc] init]);
     685            [strongThis->m_playerController setDelegate:strongThis->m_videoFullscreenModel];
     686            [strongThis->m_playerController setFullscreenInterface:strongThis.get()];
     687           
     688        } else
     689            [strongThis->m_playerController resetState];
     690    });
     691}
    638692
    639693void WebVideoFullscreenInterfaceAVKit::setWebVideoFullscreenModel(WebVideoFullscreenModel* model)
     
    653707   
    654708    dispatch_async(dispatch_get_main_queue(), [strongThis, duration] {
    655         WebAVPlayerController* playerController = strongThis->playerController();
     709        WebAVPlayerController* playerController = strongThis->m_playerController.get();
    656710
    657711        // FIXME: https://bugs.webkit.org/show_bug.cgi?id=127017 use correct values instead of duration for all these
     
    677731   
    678732    dispatch_async(dispatch_get_main_queue(), [strongThis, currentTime, anchorTime] {
    679         NSTimeInterval anchorTimeStamp = ![strongThis->playerController() rate] ? NAN : anchorTime;
     733        NSTimeInterval anchorTimeStamp = ![strongThis->m_playerController rate] ? NAN : anchorTime;
    680734        AVValueTiming *timing = [getAVValueTimingClass() valueTimingWithAnchorValue:currentTime
    681735            anchorTimeStamp:anchorTimeStamp rate:0];
    682         strongThis->playerController().timing = timing;
     736        [strongThis->m_playerController setTiming:timing];
    683737    });
    684738}
     
    689743   
    690744    dispatch_async(dispatch_get_main_queue(), [strongThis, isPlaying, playbackRate] {
    691         strongThis->playerController().rate = isPlaying ? playbackRate : 0.;
     745        [strongThis->m_playerController setRate:isPlaying ? playbackRate : 0.];
    692746    });
    693747}
     
    698752   
    699753    dispatch_async(dispatch_get_main_queue(), [strongThis, hasVideo, width, height] {
    700         strongThis->playerController().hasEnabledVideo = hasVideo;
    701         strongThis->playerController().contentDimensions = CGSizeMake(width, height);
     754        [strongThis->m_playerController setHasEnabledVideo:hasVideo];
     755        [strongThis->m_playerController setContentDimensions:CGSizeMake(width, height)];
    702756    });
    703757}
     
    719773   
    720774    dispatch_async(dispatch_get_main_queue(), [strongThis, seekableRanges] {
    721         strongThis->playerController().seekableTimeRanges = seekableRanges.get();
     775        [strongThis->m_playerController setSeekableTimeRanges:seekableRanges.get()];
    722776    });
    723777}
     
    728782   
    729783    dispatch_async(dispatch_get_main_queue(), [strongThis, canPlayFastReverse] {
    730         strongThis->playerController().canScanBackward = canPlayFastReverse;
     784        [strongThis->m_playerController setCanScanBackward:canPlayFastReverse];
    731785    });
    732786}
     
    749803   
    750804    dispatch_async(dispatch_get_main_queue(), [webOptions, strongThis, selectedIndex] {
    751         strongThis->playerController().audioMediaSelectionOptions = webOptions.get();
     805        [strongThis->m_playerController setAudioMediaSelectionOptions:webOptions.get()];
    752806        if (selectedIndex < [webOptions count])
    753             strongThis->playerController().currentAudioMediaSelectionOption = [webOptions objectAtIndex:static_cast<NSUInteger>(selectedIndex)];
     807            [strongThis->m_playerController setCurrentAudioMediaSelectionOption:[webOptions objectAtIndex:static_cast<NSUInteger>(selectedIndex)]];
    754808    });
    755809}
     
    761815
    762816    dispatch_async(dispatch_get_main_queue(), [webOptions, strongThis, selectedIndex] {
    763         strongThis->playerController().legibleMediaSelectionOptions = webOptions.get();
     817        [strongThis->m_playerController setLegibleMediaSelectionOptions:webOptions.get()];
    764818        if (selectedIndex < [webOptions count])
    765             strongThis->playerController().currentLegibleMediaSelectionOption = [webOptions objectAtIndex:static_cast<NSUInteger>(selectedIndex)];
     819            [strongThis->m_playerController setCurrentLegibleMediaSelectionOption:[webOptions objectAtIndex:static_cast<NSUInteger>(selectedIndex)]];
    766820    });
    767821}
     
    778832
    779833    dispatch_async(dispatch_get_main_queue(), [strongThis, enabled, localizedDeviceName, externalPlaybackType] {
    780         WebAVPlayerController* playerController = strongThis->playerController();
     834        WebAVPlayerController* playerController = strongThis->m_playerController.get();
    781835        playerController.externalPlaybackAirPlayDeviceLocalizedName = localizedDeviceName;
    782836        playerController.externalPlaybackType = externalPlaybackType;
     
    822876
    823877    m_videoLayerContainer = [WebAVVideoLayer videoLayer];
    824     [m_videoLayerContainer setHidden:playerController().externalPlaybackActive];
     878    [m_videoLayerContainer setHidden:[m_playerController isExternalPlaybackActive]];
    825879    [m_videoLayerContainer setVideoSublayer:m_videoLayer.get()];
    826880
    827     CGSize videoSize = playerController().contentDimensions;
     881    CGSize videoSize = [m_playerController contentDimensions];
    828882    CGRect videoRect = CGRectMake(0, 0, videoSize.width, videoSize.height);
    829883    [m_videoLayerContainer setVideoRect:videoRect];
     
    831885    m_playerViewController = adoptNS([allocAVPlayerViewControllerInstance() initWithVideoLayer:m_videoLayerContainer.get()]);
    832886    [m_playerViewController setShowsPlaybackControls:NO];
    833     [m_playerViewController setPlayerController:(AVPlayerController *)playerController()];
    834     [m_playerViewController setDelegate:playerController()];
     887    [m_playerViewController setPlayerController:(AVPlayerController *)m_playerController.get()];
     888    [m_playerViewController setDelegate:m_playerController.get()];
    835889    [m_playerViewController setAllowsOptimizedFullscreen:allowOptimizedFullscreen];
    836890
     
    10161070            [[getUIApplicationClass() sharedApplication] _setStatusBarOrientation:[m_parentWindow interfaceOrientation]];
    10171071    }
     1072   
     1073    [m_playerController setDelegate:nil];
     1074    [m_playerController setFullscreenInterface:nil];
     1075   
    10181076    [m_playerViewController setDelegate:nil];
     1077    [m_playerViewController setPlayerController:nil];
     1078   
     1079    if (m_mode & HTMLMediaElement::VideoFullscreenModeOptimized)
     1080        [m_playerViewController cancelOptimizedFullscreen];
     1081    if (m_mode & HTMLMediaElement::VideoFullscreenModeStandard)
     1082        [m_playerViewController exitFullScreenAnimated:NO completionHandler:nil];
     1083   
    10191084    [[m_playerViewController view] removeFromSuperview];
    10201085    if (m_viewController)
    10211086        [m_playerViewController removeFromParentViewController];
    1022     [m_playerViewController setPlayerController:nil];
    1023     m_playerViewController = nil;
     1087   
    10241088    [m_videoLayer removeFromSuperlayer];
    1025     m_videoLayer = nil;
    10261089    [m_videoLayerContainer removeFromSuperlayer];
    10271090    [m_videoLayerContainer setPlayerViewController:nil];
     1091    [[m_viewController view] removeFromSuperview];
     1092   
     1093    m_videoLayer = nil;
    10281094    m_videoLayerContainer = nil;
    1029     [[m_viewController view] removeFromSuperview];
     1095    m_playerViewController = nil;
     1096    m_playerController = nil;
    10301097    m_viewController = nil;
    10311098    m_window = nil;
     
    10431110void WebVideoFullscreenInterfaceAVKit::invalidate()
    10441111{
    1045     [m_window setHidden:YES];
    1046     [m_window setRootViewController:nil];
    1047     m_window = nil;
    10481112    m_videoFullscreenModel = nil;
    1049     if (m_mode & HTMLMediaElement::VideoFullscreenModeOptimized)
    1050         [m_playerViewController cancelOptimizedFullscreen];
    1051     if (m_mode & HTMLMediaElement::VideoFullscreenModeStandard)
    1052         [m_playerViewController exitFullScreenAnimated:NO completionHandler:nil];
    1053     m_playerController = nil;
    1054     [m_playerViewController setDelegate:nil];
    1055     [[m_playerViewController view] removeFromSuperview];
    1056     if (m_viewController)
    1057         [m_playerViewController removeFromParentViewController];
    1058     [m_playerViewController setPlayerController:nil];
    1059     m_playerViewController = nil;
    1060     [m_videoLayer removeFromSuperlayer];
    1061     m_videoLayer = nil;
    1062     [m_videoLayerContainer removeFromSuperlayer];
    1063     [m_videoLayerContainer setPlayerViewController:nil];
    1064     m_videoLayerContainer = nil;
    1065     [[m_viewController view] removeFromSuperview];
    1066     [m_playerController setFullscreenInterface:nil];
    1067     m_viewController = nil;
    1068     m_parentView = nil;
    1069     m_parentWindow = nil;
     1113    m_fullscreenChangeObserver = nil;
     1114   
     1115    cleanupFullscreenInternal();
    10701116}
    10711117
  • trunk/Source/WebCore/platform/ios/WebVideoFullscreenModelVideoElement.mm

    r177012 r179480  
    6868        return;
    6969
     70    if (m_videoFullscreenInterface)
     71        m_videoFullscreenInterface->resetMediaState();
     72   
    7073    if (m_videoElement && m_isListening) {
    7174        for (auto eventName : observedEventNames())
  • trunk/Source/WebKit2/ChangeLog

    r179472 r179480  
     12015-02-02  Jeremy Jones  <jeremyj@apple.com>
     2
     3        Prevent crash when accessing WebAVPlayerController.delegate.
     4        https://bugs.webkit.org/show_bug.cgi?id=140893
     5
     6        Reviewed by Darin Adler.
     7
     8        Plumb new resetMediaState() through IPC interface WebVideoFullscreenManagerProxy.
     9
     10        * UIProcess/ios/WebVideoFullscreenManagerProxy.messages.in:
     11        * UIProcess/ios/WebVideoFullscreenManagerProxy.mm:
     12        (WebKit::WebVideoFullscreenManagerProxy::invalidate): remove redundant set to nullptr.
     13        * WebProcess/ios/WebVideoFullscreenManager.h:
     14        * WebProcess/ios/WebVideoFullscreenManager.mm:
     15        (WebKit::WebVideoFullscreenManager::resetMediaState):
     16
    1172015-02-01  Chris Dumez  <cdumez@apple.com>
    218
  • trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.messages.in

    r177012 r179480  
    2323#if PLATFORM(IOS)
    2424messages -> WebVideoFullscreenManagerProxy {
     25    ResetMediaState()
    2526    SetCurrentTime(double currentTime, double hostTime)
    2627    SetVideoDimensions(bool hasVideo, unsigned width, unsigned height)
  • trunk/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.mm

    r178080 r179480  
    6969    WebVideoFullscreenInterfaceAVKit::invalidate();
    7070
    71     setWebVideoFullscreenModel(nullptr);
    72     setWebVideoFullscreenChangeObserver(nullptr);
    73 
    7471    m_page->process().removeMessageReceiver(Messages::WebVideoFullscreenManagerProxy::messageReceiverName(), m_page->pageID());
    7572    m_page = nullptr;
  • trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.h

    r177917 r179480  
    6969   
    7070    // FullscreenInterface
     71    virtual void resetMediaState() override;
    7172    virtual void setDuration(double) override;
    7273    virtual void setCurrentTime(double currentTime, double anchorTime) override;
  • trunk/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.mm

    r179409 r179480  
    120120}
    121121
     122void WebVideoFullscreenManager::resetMediaState()
     123{
     124    m_page->send(Messages::WebVideoFullscreenManagerProxy::ResetMediaState(), m_page->pageID());
     125}
     126   
    122127void WebVideoFullscreenManager::setDuration(double duration)
    123128{
Note: See TracChangeset for help on using the changeset viewer.