summaryrefslogtreecommitdiff
path: root/widget/windows/winrt/MetroApp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'widget/windows/winrt/MetroApp.cpp')
-rw-r--r--widget/windows/winrt/MetroApp.cpp282
1 files changed, 0 insertions, 282 deletions
diff --git a/widget/windows/winrt/MetroApp.cpp b/widget/windows/winrt/MetroApp.cpp
deleted file mode 100644
index 6b445d484..000000000
--- a/widget/windows/winrt/MetroApp.cpp
+++ /dev/null
@@ -1,282 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
-/* This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
-
-#include "MetroApp.h"
-#include "MetroWidget.h"
-#include "mozilla/IOInterposer.h"
-#include "mozilla/widget/AudioSession.h"
-#include "nsIRunnable.h"
-#include "MetroUtils.h"
-#include "MetroAppShell.h"
-#include "nsICommandLineRunner.h"
-#include "FrameworkView.h"
-#include "nsAppDirectoryServiceDefs.h"
-#include "GoannaProfiler.h"
-#include <shellapi.h>
-
-using namespace ABI::Windows::ApplicationModel;
-using namespace ABI::Windows::ApplicationModel::Core;
-using namespace ABI::Windows::UI::Core;
-using namespace ABI::Windows::System;
-using namespace ABI::Windows::Foundation;
-using namespace Microsoft::WRL;
-using namespace Microsoft::WRL::Wrappers;
-using namespace mozilla::widget;
-
-// Metro specific XRE methods we call from here on an
-// appropriate thread.
-extern nsresult XRE_metroStartup(bool runXREMain);
-extern void XRE_metroShutdown();
-
-static const char* gGoannaThreadName = "GoannaMain";
-
-#ifdef PR_LOGGING
-extern PRLogModuleInfo* gWindowsLog;
-#endif
-
-namespace mozilla {
-namespace widget {
-namespace winrt {
-
-ComPtr<FrameworkView> sFrameworkView;
-ComPtr<MetroApp> sMetroApp;
-ComPtr<ICoreApplication> sCoreApp;
-bool MetroApp::sGoannaShuttingDown = false;
-
-////////////////////////////////////////////////////
-// IFrameworkViewSource impl.
-
-// Called after CoreApplication::Run(app)
-HRESULT
-MetroApp::CreateView(ABI::Windows::ApplicationModel::Core::IFrameworkView **aViewProvider)
-{
- // This entry point is called on the metro main thread, but the thread won't
- // be recognized as such until after Run() is called below. XPCOM has not
- // gone through startup at this point.
-
- // Note that we create the view which creates our native window for us. The
- // goanna widget gets created by goanna, and the two get hooked up later in
- // MetroWidget::Create().
-
- LogFunction();
-
- sFrameworkView = Make<FrameworkView>(this);
- sFrameworkView.Get()->AddRef();
- *aViewProvider = sFrameworkView.Get();
- return !sFrameworkView ? E_FAIL : S_OK;
-}
-
-////////////////////////////////////////////////////
-// MetroApp impl.
-
-void
-MetroApp::Run()
-{
- LogThread();
-
- // Name this thread for debugging and register it with the profiler
- // and IOInterposer as the main goanna thread.
- char aLocal;
- PR_SetCurrentThreadName(gGoannaThreadName);
- profiler_register_thread(gGoannaThreadName, &aLocal);
- IOInterposer::RegisterCurrentThread(true);
-
- HRESULT hr;
- hr = sCoreApp->add_Suspending(Callback<__FIEventHandler_1_Windows__CApplicationModel__CSuspendingEventArgs_t>(
- this, &MetroApp::OnSuspending).Get(), &mSuspendEvent);
- AssertHRESULT(hr);
-
- hr = sCoreApp->add_Resuming(Callback<__FIEventHandler_1_IInspectable_t>(
- this, &MetroApp::OnResuming).Get(), &mResumeEvent);
- AssertHRESULT(hr);
-
- WinUtils::Log("Calling XRE_metroStartup.");
- nsresult rv = XRE_metroStartup(true);
- WinUtils::Log("Exiting XRE_metroStartup.");
- if (NS_FAILED(rv)) {
- WinUtils::Log("XPCOM startup initialization failed, bailing. rv=%X", rv);
- CoreExit();
- }
-}
-
-// Free all xpcom related resources before calling the xre shutdown call.
-// Must be called on the metro main thread. Currently called from appshell.
-void
-MetroApp::Shutdown()
-{
- LogThread();
-
- if (sCoreApp) {
- sCoreApp->remove_Suspending(mSuspendEvent);
- sCoreApp->remove_Resuming(mResumeEvent);
- }
-
- if (sFrameworkView) {
- sFrameworkView->Shutdown();
- }
-
- MetroApp::sGoannaShuttingDown = true;
-
- // Shut down xpcom
- XRE_metroShutdown();
-
- // Unhook this thread from the profiler
- profiler_unregister_thread();
-}
-
-// Request a shutdown of the application
-void
-MetroApp::CoreExit()
-{
- LogFunction();
- HRESULT hr;
- ComPtr<ICoreApplicationExit> coreExit;
- HStringReference className(RuntimeClass_Windows_ApplicationModel_Core_CoreApplication);
- hr = GetActivationFactory(className.Get(), coreExit.GetAddressOf());
- NS_ASSERTION(SUCCEEDED(hr), "Activation of ICoreApplicationExit");
- if (SUCCEEDED(hr)) {
- coreExit->Exit();
- }
-}
-
-void
-MetroApp::ActivateBaseView()
-{
- if (sFrameworkView) {
- sFrameworkView->ActivateView();
- }
-}
-
-/*
- * TBD: when we support multiple widgets, we'll need a way to sync up the view
- * created in CreateView with the widget goanna creates. Currently we only have
- * one view (sFrameworkView) and one main widget.
- */
-void
-MetroApp::SetWidget(MetroWidget* aPtr)
-{
- LogThread();
-
- NS_ASSERTION(aPtr, "setting null base widget?");
-
- // Both of these calls AddRef the ptr we pass in
- aPtr->SetView(sFrameworkView.Get());
- sFrameworkView->SetWidget(aPtr);
-}
-
-////////////////////////////////////////////////////
-// MetroApp events
-
-HRESULT
-MetroApp::OnSuspending(IInspectable* aSender, ISuspendingEventArgs* aArgs)
-{
- LogThread();
- PostSuspendResumeProcessNotification(true);
- return S_OK;
-}
-
-HRESULT
-MetroApp::OnResuming(IInspectable* aSender, IInspectable* aArgs)
-{
- LogThread();
- PostSuspendResumeProcessNotification(false);
- return S_OK;
-}
-
-HRESULT
-MetroApp::OnAsyncTileCreated(ABI::Windows::Foundation::IAsyncOperation<bool>* aOperation,
- AsyncStatus aStatus)
-{
- WinUtils::Log("Async operation status: %d", aStatus);
- MetroUtils::FireObserver("metro_on_async_tile_created");
- return S_OK;
-}
-
-// static
-void
-MetroApp::PostSuspendResumeProcessNotification(const bool aIsSuspend)
-{
- static bool isSuspend = false;
- if (isSuspend == aIsSuspend) {
- return;
- }
- isSuspend = aIsSuspend;
- MetroUtils::FireObserver(aIsSuspend ? "suspend_process_notification" :
- "resume_process_notification");
-}
-
-// static
-void
-MetroApp::PostSleepWakeNotification(const bool aIsSleep)
-{
- static bool isSleep = false;
- if (isSleep == aIsSleep) {
- return;
- }
- isSleep = aIsSleep;
- MetroUtils::FireObserver(aIsSleep ? "sleep_notification" :
- "wake_notification");
-}
-
-} } }
-
-
-static bool
-IsBackgroundSessionClosedStartup()
-{
- int argc;
- LPWSTR *argv = CommandLineToArgvW(GetCommandLineW(), &argc);
- bool backgroundSessionClosed = argc > 1 && !wcsicmp(argv[1], L"-BackgroundSessionClosed");
- LocalFree(argv);
- return backgroundSessionClosed;
-}
-
-bool
-XRE_MetroCoreApplicationRun()
-{
- HRESULT hr;
- LogThread();
-
- using namespace mozilla::widget::winrt;
-
- sMetroApp = Make<MetroApp>();
-
- HStringReference className(RuntimeClass_Windows_ApplicationModel_Core_CoreApplication);
- hr = GetActivationFactory(className.Get(), sCoreApp.GetAddressOf());
- if (FAILED(hr)) {
- LogHRESULT(hr);
- return false;
- }
-
- // Perform any cleanup for unclean shutdowns here, such as when the background session
- // is closed via the appbar on the left when outside of Metro. Windows restarts the
- // process solely for cleanup reasons.
- if (IsBackgroundSessionClosedStartup() && SUCCEEDED(XRE_metroStartup(false))) {
-
- // Whether or not to use sessionstore depends on if the bak exists. Since host process
- // shutdown isn't a crash we shouldn't restore sessionstore.
- nsCOMPtr<nsIFile> sessionBAK;
- if (NS_FAILED(NS_GetSpecialDirectory("ProfDS", getter_AddRefs(sessionBAK)))) {
- return false;
- }
-
- sessionBAK->AppendNative(nsDependentCString("sessionstore.bak"));
- bool exists;
- if (NS_SUCCEEDED(sessionBAK->Exists(&exists)) && exists) {
- sessionBAK->Remove(false);
- }
- return false;
- }
-
- hr = sCoreApp->Run(sMetroApp.Get());
-
- WinUtils::Log("Exiting CoreApplication::Run");
-
- sCoreApp = nullptr;
- sMetroApp = nullptr;
-
- return true;
-}
-