Changeset 180692 in webkit
- Timestamp:
- Feb 26, 2015, 11:56:49 AM (12 years ago)
- Location:
- branches/safari-600.1.4.15-branch/Source
- Files:
-
- 10 edited
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/WebCore.exp.in (modified) (1 diff)
-
WebCore/platform/ios/WebVideoFullscreenInterface.h (modified) (1 diff)
-
WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h (modified) (3 diffs)
-
WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm (modified) (32 diffs)
-
WebCore/platform/ios/WebVideoFullscreenModelMediaElement.mm (modified) (1 diff)
-
WebKit2/ChangeLog (modified) (1 diff)
-
WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.messages.in (modified) (1 diff)
-
WebKit2/WebProcess/ios/WebVideoFullscreenManager.h (modified) (1 diff)
-
WebKit2/WebProcess/ios/WebVideoFullscreenManager.mm (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
branches/safari-600.1.4.15-branch/Source/WebCore/ChangeLog
r180665 r180692 1 2015-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 1 54 2015-02-25 Babak Shafiei <bshafiei@apple.com> 2 55 -
branches/safari-600.1.4.15-branch/Source/WebCore/WebCore.exp.in
r180401 r180692 3447 3447 __ZN7WebCore32WebVideoFullscreenInterfaceAVKit15enterFullscreenEv 3448 3448 __ZN7WebCore32WebVideoFullscreenInterfaceAVKit15setupFullscreenER7CALayerNS_7IntRectEP6UIView 3449 __ZN7WebCore32WebVideoFullscreenInterfaceAVKit15resetMediaStateEv 3449 3450 __ZN7WebCore32WebVideoFullscreenInterfaceAVKit17cleanupFullscreenEv 3450 3451 __ZN7WebCore32WebVideoFullscreenInterfaceAVKit17setSeekableRangesERKNS_10TimeRangesE -
branches/safari-600.1.4.15-branch/Source/WebCore/platform/ios/WebVideoFullscreenInterface.h
r171433 r180692 45 45 46 46 virtual ~WebVideoFullscreenInterface() { }; 47 virtual void resetMediaState() = 0; 47 48 virtual void setDuration(double) = 0; 48 49 virtual void setCurrentTime(double currentTime, double anchorTime) = 0; -
branches/safari-600.1.4.15-branch/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.h
r179067 r180692 64 64 protected: 65 65 void setupFullscreenInternal(PlatformLayer&, IntRect initialRect, UIView *); 66 void beginSession(); 66 67 void enterFullscreenOptimized(); 67 68 void enterFullscreenStandard(); … … 82 83 RetainPtr<UIWindow> m_parentWindow; 83 84 84 WebAVPlayerController *playerController();85 86 85 void doEnterFullscreen(); 87 86 … … 92 91 void setWebVideoFullscreenChangeObserver(WebVideoFullscreenChangeObserver*); 93 92 93 virtual void resetMediaState() override; 94 94 virtual void setDuration(double) override; 95 95 virtual void setCurrentTime(double currentTime, double anchorTime) override; -
branches/safari-600.1.4.15-branch/Source/WebCore/platform/ios/WebVideoFullscreenInterfaceAVKit.mm
r179067 r180692 90 90 } 91 91 92 -(void)resetState; 92 93 @property(retain) AVPlayerController* playerControllerProxy; 93 94 @property(assign) WebVideoFullscreenModel* delegate; … … 157 158 } 158 159 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 159 192 - (id)forwardingTargetForSelector:(SEL)selector 160 193 { … … 167 200 UNUSED_PARAM(playerViewController); 168 201 UNUSED_PARAM(reason); 169 ASSERT(self.delegate); 202 if (!self.delegate) 203 return YES; 204 170 205 if (reason == AVPlayerViewControllerExitFullScreenReasonDoneButtonTapped || reason == AVPlayerViewControllerExitFullScreenReasonRemoteControlStopEventReceived) 171 206 self.delegate->pause(); 207 172 208 self.delegate->requestExitFullscreen(); 173 209 return NO; … … 177 213 { 178 214 UNUSED_PARAM(sender); 179 ASSERT(self.delegate); 215 if (!self.delegate) 216 return; 180 217 self.delegate->play(); 181 218 } … … 184 221 { 185 222 UNUSED_PARAM(sender); 186 ASSERT(self.delegate); 223 if (!self.delegate) 224 return; 187 225 self.delegate->pause(); 188 226 } … … 191 229 { 192 230 UNUSED_PARAM(sender); 193 ASSERT(self.delegate); 231 if (!self.delegate) 232 return; 194 233 self.delegate->togglePlayState(); 195 234 } … … 202 241 - (void)setPlaying:(BOOL)playing 203 242 { 204 ASSERT(self.delegate); 243 if (!self.delegate) 244 return; 205 245 if (playing) 206 246 self.delegate->play(); 207 247 else 208 248 self.delegate->pause(); 209 }249 } 210 250 211 251 + (NSSet *)keyPathsForValuesAffectingPlaying … … 217 257 { 218 258 UNUSED_PARAM(sender); 219 ASSERT(self.delegate); 259 if (!self.delegate) 260 return; 220 261 self.delegate->beginScrubbing(); 221 262 } … … 224 265 { 225 266 UNUSED_PARAM(sender); 226 ASSERT(self.delegate); 267 if (!self.delegate) 268 return; 227 269 self.delegate->endScrubbing(); 228 270 } … … 230 272 - (void)seekToTime:(NSTimeInterval)time 231 273 { 232 ASSERT(self.delegate); 274 if (!self.delegate) 275 return; 233 276 self.delegate->fastSeek(time); 234 277 } … … 293 336 { 294 337 UNUSED_PARAM(sender); 295 ASSERT(self.delegate); 338 if (!self.delegate) 339 return; 296 340 self.delegate->beginScanningForward(); 297 341 } … … 300 344 { 301 345 UNUSED_PARAM(sender); 302 ASSERT(self.delegate); 346 if (!self.delegate) 347 return; 303 348 self.delegate->endScanning(); 304 349 } … … 307 352 { 308 353 UNUSED_PARAM(sender); 309 ASSERT(self.delegate); 354 if (!self.delegate) 355 return; 310 356 self.delegate->beginScanningBackward(); 311 357 } … … 314 360 { 315 361 UNUSED_PARAM(sender); 316 ASSERT(self.delegate); 362 if (!self.delegate) 363 return; 317 364 self.delegate->endScanning(); 318 365 } … … 336 383 { 337 384 UNUSED_PARAM(sender); 338 ASSERT(self.delegate);339 385 if (!self.delegate) 386 return; 340 387 self.delegate->seekToTime(-INFINITY); 341 388 } … … 364 411 { 365 412 UNUSED_PARAM(sender); 366 ASSERT(self.delegate);367 413 if (!self.delegate) 414 return; 368 415 self.delegate->seekToTime(INFINITY); 369 416 } … … 418 465 _currentAudioMediaSelectionOption = [option retain]; 419 466 420 ASSERT(self.delegate); 467 if (!self.delegate) 468 return; 421 469 422 470 NSInteger index = NSNotFound; … … 441 489 _currentLegibleMediaSelectionOption = [option retain]; 442 490 443 ASSERT(self.delegate); 491 if (!self.delegate) 492 return; 444 493 445 494 NSInteger index = NSNotFound; … … 581 630 582 631 WebVideoFullscreenInterfaceAVKit::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 637 void 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 } 598 650 599 651 void WebVideoFullscreenInterfaceAVKit::setWebVideoFullscreenModel(WebVideoFullscreenModel* model) … … 613 665 614 666 dispatch_async(dispatch_get_main_queue(), [strongThis, duration] { 615 WebAVPlayerController* playerController = strongThis-> playerController();667 WebAVPlayerController* playerController = strongThis->m_playerController.get(); 616 668 617 669 // FIXME: https://bugs.webkit.org/show_bug.cgi?id=127017 use correct values instead of duration for all these … … 637 689 638 690 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; 640 692 AVValueTiming *timing = [getAVValueTimingClass() valueTimingWithAnchorValue:currentTime 641 693 anchorTimeStamp:anchorTimeStamp rate:0]; 642 strongThis->playerController().timing = timing;694 [strongThis->m_playerController setTiming:timing]; 643 695 }); 644 696 } … … 649 701 650 702 dispatch_async(dispatch_get_main_queue(), [strongThis, isPlaying, playbackRate] { 651 strongThis->playerController().rate = isPlaying ? playbackRate : 0.;703 [strongThis->m_playerController setRate:isPlaying ? playbackRate : 0.]; 652 704 }); 653 705 } … … 658 710 659 711 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)]; 662 714 }); 663 715 } … … 679 731 680 732 dispatch_async(dispatch_get_main_queue(), [strongThis, seekableRanges] { 681 strongThis->playerController().seekableTimeRanges = seekableRanges.get();733 [strongThis->m_playerController setSeekableTimeRanges:seekableRanges.get()]; 682 734 }); 683 735 } … … 688 740 689 741 dispatch_async(dispatch_get_main_queue(), [strongThis, canPlayFastReverse] { 690 strongThis->playerController().canScanBackward = canPlayFastReverse;742 [strongThis->m_playerController setCanScanBackward:canPlayFastReverse]; 691 743 }); 692 744 } … … 709 761 710 762 dispatch_async(dispatch_get_main_queue(), [webOptions, strongThis, selectedIndex] { 711 strongThis->playerController().audioMediaSelectionOptions = webOptions.get();763 [strongThis->m_playerController setAudioMediaSelectionOptions:webOptions.get()]; 712 764 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)]]; 714 766 }); 715 767 } … … 721 773 722 774 dispatch_async(dispatch_get_main_queue(), [webOptions, strongThis, selectedIndex] { 723 strongThis->playerController().legibleMediaSelectionOptions = webOptions.get();775 [strongThis->m_playerController setLegibleMediaSelectionOptions:webOptions.get()]; 724 776 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)]]; 726 778 }); 727 779 } … … 738 790 739 791 dispatch_async(dispatch_get_main_queue(), [strongThis, enabled, localizedDeviceName, externalPlaybackType] { 740 WebAVPlayerController* playerController = strongThis-> playerController();792 WebAVPlayerController* playerController = strongThis->m_playerController.get(); 741 793 playerController.externalPlaybackAirPlayDeviceLocalizedName = localizedDeviceName; 742 794 playerController.externalPlaybackType = externalPlaybackType; … … 778 830 779 831 m_videoLayerContainer = [WebAVVideoLayer videoLayer]; 780 [m_videoLayerContainer setHidden: playerController().externalPlaybackActive];832 [m_videoLayerContainer setHidden:[m_playerController isExternalPlaybackActive]]; 781 833 [m_videoLayerContainer setVideoSublayer:m_videoLayer.get()]; 782 834 783 CGSize videoSize = playerController().contentDimensions;835 CGSize videoSize = [m_playerController contentDimensions]; 784 836 CGRect videoRect = CGRectMake(0, 0, videoSize.width, videoSize.height); 785 837 [m_videoLayerContainer setVideoRect:videoRect]; … … 787 839 m_playerViewController = adoptNS([[getAVPlayerViewControllerClass() alloc] initWithVideoLayer:m_videoLayerContainer.get()]); 788 840 [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()]; 791 843 [m_videoLayerContainer setPlayerViewController:m_playerViewController.get()]; 792 844 … … 894 946 [[getUIApplicationClass() sharedApplication] _setStatusBarOrientation:[m_parentWindow interfaceOrientation]]; 895 947 } 948 949 [m_playerController setDelegate:nil]; 950 896 951 [m_playerViewController setDelegate:nil]; 952 [m_playerViewController setPlayerController:nil]; 953 954 [m_playerViewController exitFullScreenAnimated:NO completionHandler:nil]; 955 897 956 [[m_playerViewController view] removeFromSuperview]; 898 957 if (m_viewController) 899 958 [m_playerViewController removeFromParentViewController]; 900 [m_playerViewController setPlayerController:nil]; 901 m_playerViewController = nil; 959 902 960 [m_videoLayer removeFromSuperlayer]; 903 m_videoLayer = nil;904 961 [m_videoLayerContainer removeFromSuperlayer]; 905 962 [m_videoLayerContainer setPlayerViewController:nil]; 963 [[m_viewController view] removeFromSuperview]; 964 965 m_videoLayer = nil; 906 966 m_videoLayerContainer = nil; 907 [[m_viewController view] removeFromSuperview]; 967 m_playerViewController = nil; 968 m_playerController = nil; 908 969 m_viewController = nil; 909 970 m_window = nil; … … 920 981 void WebVideoFullscreenInterfaceAVKit::invalidate() 921 982 { 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(); 942 987 } 943 988 -
branches/safari-600.1.4.15-branch/Source/WebCore/platform/ios/WebVideoFullscreenModelMediaElement.mm
r180099 r180692 69 69 return; 70 70 71 if (m_videoFullscreenInterface) 72 m_videoFullscreenInterface->resetMediaState(); 73 71 74 if (m_mediaElement && m_isListening) { 72 75 for (auto eventName : observedEventNames()) -
branches/safari-600.1.4.15-branch/Source/WebKit2/ChangeLog
r180663 r180692 1 2015-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 1 21 2015-02-25 Babak Shafiei <bshafiei@apple.com> 2 22 -
branches/safari-600.1.4.15-branch/Source/WebKit2/UIProcess/ios/WebVideoFullscreenManagerProxy.messages.in
r173718 r180692 23 23 #if PLATFORM(IOS) 24 24 messages -> WebVideoFullscreenManagerProxy { 25 ResetMediaState() 25 26 SetCurrentTime(double currentTime, double hostTime) 26 27 SetVideoDimensions(bool hasVideo, unsigned width, unsigned height) -
branches/safari-600.1.4.15-branch/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.h
r178994 r180692 68 68 69 69 // FullscreenInterface 70 virtual void resetMediaState() override; 70 71 virtual void setDuration(double) override; 71 72 virtual void setCurrentTime(double currentTime, double anchorTime) override; -
branches/safari-600.1.4.15-branch/Source/WebKit2/WebProcess/ios/WebVideoFullscreenManager.mm
r180186 r180692 115 115 } 116 116 117 void WebVideoFullscreenManager::resetMediaState() 118 { 119 m_page->send(Messages::WebVideoFullscreenManagerProxy::ResetMediaState(), m_page->pageID()); 120 } 121 117 122 void WebVideoFullscreenManager::setDuration(double duration) 118 123 {
Note:
See TracChangeset
for help on using the changeset viewer.