Bug 1189622 part 2 - Allow widget's MakeFullScreen to fail, and call FinishFullscreenChange directly if that happens. r=smaug

--HG--
extra : source : a851e10d72b71dbd7bab21e3e6ef80214f680b9b
This commit is contained in:
Xidorn Quan 2016-01-12 15:18:47 +11:00
Родитель 5e959008be
Коммит 42b9ed4bfc
3 изменённых файлов: 17 добавлений и 10 удалений

Просмотреть файл

@ -5914,8 +5914,12 @@ FullscreenTransitionTask::Run()
mWindow->mFullScreen = mFullscreen;
}
// Toggle the fullscreen state on the widget
mWindow->SetWidgetFullscreen(nsPIDOMWindow::eForFullscreenAPI,
mFullscreen, mWidget, mScreen);
if (!mWindow->SetWidgetFullscreen(nsPIDOMWindow::eForFullscreenAPI,
mFullscreen, mWidget, mScreen)) {
// Fail to setup the widget, call FinishFullscreenChange to
// complete fullscreen change directly.
mWindow->FinishFullscreenChange(mFullscreen);
}
// Set observer for the next content paint.
nsCOMPtr<nsIObserver> observer = new Observer(this);
nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
@ -5994,14 +5998,14 @@ MakeWidgetFullscreen(nsGlobalWindow* aWindow, gfx::VRDeviceProxy* aHMD,
}
nsCOMPtr<nsIScreen> screen = aHMD ? aHMD->GetScreen() : nullptr;
if (!performTransition) {
aWindow->SetWidgetFullscreen(aReason, aFullscreen, widget, screen);
return aWindow->SetWidgetFullscreen(aReason, aFullscreen, widget, screen);
} else {
nsCOMPtr<nsIRunnable> task =
new FullscreenTransitionTask(duration, aWindow, aFullscreen,
widget, screen, transitionData);
task->Run();
return true;
}
return true;
}
nsresult
@ -6105,7 +6109,7 @@ nsGlobalWindow::SetFullscreenInternal(FullscreenReason aReason,
return NS_OK;
}
void
bool
nsGlobalWindow::SetWidgetFullscreen(FullscreenReason aReason, bool aIsFullscreen,
nsIWidget* aWidget, nsIScreen* aScreen)
{
@ -6117,13 +6121,12 @@ nsGlobalWindow::SetWidgetFullscreen(FullscreenReason aReason, bool aIsFullscreen
if (nsCOMPtr<nsIPresShell> presShell = mDocShell->GetPresShell()) {
presShell->SetIsInFullscreenChange(true);
}
if (aReason == nsPIDOMWindow::eForFullscreenMode) {
nsresult rv = aReason == nsPIDOMWindow::eForFullscreenMode ?
// If we enter fullscreen for fullscreen mode, we want
// the native system behavior.
aWidget->MakeFullScreenWithNativeTransition(aIsFullscreen, aScreen);
} else {
aWidget->MakeFullScreenWithNativeTransition(aIsFullscreen, aScreen) :
aWidget->MakeFullScreen(aIsFullscreen, aScreen);
}
return NS_SUCCEEDED(rv);
}
/* virtual */ void

Просмотреть файл

@ -473,7 +473,7 @@ public:
FullscreenReason aReason, bool aIsFullscreen,
mozilla::gfx::VRDeviceProxy *aHMD = nullptr) override final;
virtual void FinishFullscreenChange(bool aIsFullscreen) override final;
void SetWidgetFullscreen(FullscreenReason aReason, bool aIsFullscreen,
bool SetWidgetFullscreen(FullscreenReason aReason, bool aIsFullscreen,
nsIWidget* aWidget, nsIScreen* aScreen);
bool FullScreen() const;

Просмотреть файл

@ -1142,6 +1142,10 @@ class nsIWidget : public nsISupports {
* if possible. (If not, it behaves as if aTargetScreen is null.)
* If !aFullScreen, aTargetScreen is ignored.
* aTargetScreen support is currently only implemented on Windows.
*
* @return NS_OK if the widget is setup properly for fullscreen and
* FullscreenChanged callback has been or will be called. If other
* value is returned, the caller should continue the change itself.
*/
NS_IMETHOD MakeFullScreen(bool aFullScreen, nsIScreen* aTargetScreen = nullptr) = 0;