summaryrefslogtreecommitdiffstats
path: root/win8/metro_driver/chrome_app_view.h
diff options
context:
space:
mode:
authorrobertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-07 18:24:52 +0000
committerrobertshield@chromium.org <robertshield@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2012-09-07 18:24:52 +0000
commit4475892162b7069ec333f3fc64d086ba3957b752 (patch)
tree5f85c72235b6425bc20fbf48da693003cf295d7d /win8/metro_driver/chrome_app_view.h
parente6f1a6fbcc8869e27697b2bb548aa61e58f969a5 (diff)
downloadchromium_src-4475892162b7069ec333f3fc64d086ba3957b752.zip
chromium_src-4475892162b7069ec333f3fc64d086ba3957b752.tar.gz
chromium_src-4475892162b7069ec333f3fc64d086ba3957b752.tar.bz2
Integrate the Windows 8 code into the Chromium tree.
BUG=127799 TEST=A Chromium build can run as the immersive browser on Windows 8. Review URL: https://chromiumcodereview.appspot.com/10875008 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@155429 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'win8/metro_driver/chrome_app_view.h')
-rw-r--r--win8/metro_driver/chrome_app_view.h177
1 files changed, 177 insertions, 0 deletions
diff --git a/win8/metro_driver/chrome_app_view.h b/win8/metro_driver/chrome_app_view.h
new file mode 100644
index 0000000..80f309d
--- /dev/null
+++ b/win8/metro_driver/chrome_app_view.h
@@ -0,0 +1,177 @@
+// Copyright (c) 2012 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef CHROME_BROWSER_UI_METRO_DRIVER_CHROME_APP_VIEW_H_
+#define CHROME_BROWSER_UI_METRO_DRIVER_CHROME_APP_VIEW_H_
+
+#include <windows.applicationmodel.core.h>
+#include <windows.ui.core.h>
+#include <windows.ui.input.h>
+#include <windows.ui.viewmanagement.h>
+
+#include <list>
+#include <map>
+#include <string>
+#include <utility>
+
+#include "base/memory/scoped_ptr.h"
+#include "base/message_loop.h"
+#include "base/synchronization/lock.h"
+#include "win8/metro_driver/chrome_url_launch_handler.h"
+#include "win8/metro_driver/devices_handler.h"
+#include "win8/metro_driver/metro_dialog_box.h"
+#include "win8/metro_driver/settings_handler.h"
+#include "win8/metro_driver/toast_notification_handler.h"
+
+class ChromeAppView
+ : public mswr::RuntimeClass<winapp::Core::IFrameworkView> {
+ public:
+ ChromeAppView();
+ ~ChromeAppView();
+
+ // IViewProvider overrides.
+ IFACEMETHOD(Initialize)(winapp::Core::ICoreApplicationView* view);
+ IFACEMETHOD(SetWindow)(winui::Core::ICoreWindow* window);
+ IFACEMETHOD(Load)(HSTRING entryPoint);
+ IFACEMETHOD(Run)();
+ IFACEMETHOD(Uninitialize)();
+
+ static LRESULT CALLBACK CoreWindowProc(HWND window, UINT message, WPARAM wp,
+ LPARAM lp);
+
+ HRESULT TileRequestCreateDone(winfoundtn::IAsyncOperation<bool>* async,
+ AsyncStatus status);
+
+ bool osk_visible_notification_received() const {
+ return osk_visible_notification_received_;
+ }
+
+ // Displays the notification.
+ void DisplayNotification(
+ const ToastNotificationHandler::DesktopNotification& notification);
+
+ // Cancels the notification.
+ void CancelNotification(const std::string& notification);
+
+ // Returns true if the notification passed in is valid.
+ bool IsValidNotification(const std::string& notification);
+
+ // Displays a dialog box.
+ void ShowDialogBox(const MetroDialogBox::DialogBoxInfo& dialog_box_info);
+ // Dismisses the dialog box.
+ void DismissDialogBox();
+
+ // Helper function to unsnap the chrome metro app if it is snapped.
+ // Returns S_OK on success.
+ static HRESULT Unsnap();
+
+ // Notification from chrome that a full screen operation is being performed.
+ void SetFullscreen(bool fullscreen);
+
+ private:
+ HRESULT OnActivate(winapp::Core::ICoreApplicationView* view,
+ winapp::Activation::IActivatedEventArgs* args);
+
+ HRESULT OnSizeChanged(winui::Core::ICoreWindow* sender,
+ winui::Core::IWindowSizeChangedEventArgs* args);
+
+ HRESULT OnEdgeGestureCompleted(winui::Input::IEdgeGesture* gesture,
+ winui::Input::IEdgeGestureEventArgs* args);
+
+ HRESULT OnShareDataRequested(
+ winapp::DataTransfer::IDataTransferManager* data_transfer_mgr,
+ winapp::DataTransfer::IDataRequestedEventArgs* event_args);
+
+ HRESULT OnInputPaneVisible(
+ winui::ViewManagement::IInputPane* input_pane,
+ winui::ViewManagement::IInputPaneVisibilityEventArgs* event_args);
+
+ HRESULT OnInputPaneHiding(
+ winui::ViewManagement::IInputPane* input_pane,
+ winui::ViewManagement::IInputPaneVisibilityEventArgs* event_args);
+
+ HRESULT OnPositionChanged(int x, int y);
+
+ void CheckForOSKActivation();
+
+ HRESULT RegisterInputPaneNotifications();
+
+ void HandleInputPaneVisible(const RECT& osk_rect);
+ void HandleInputPaneHidden(const RECT& osk_rect);
+
+ mswr::ComPtr<winui::Core::ICoreWindow> window_;
+ mswr::ComPtr<winapp::Core::ICoreApplicationView> view_;
+ EventRegistrationToken activated_token_;
+ EventRegistrationToken edgeevent_token_;
+ EventRegistrationToken sizechange_token_;
+ EventRegistrationToken share_data_requested_token_;
+ EventRegistrationToken input_pane_visible_token_;
+ EventRegistrationToken input_pane_hiding_token_;
+ EventRegistrationToken app_exit_token_;
+
+ ChromeUrlLaunchHandler url_launch_handler_;
+ metro_driver::DevicesHandler devices_handler_;
+ SettingsHandler settings_handler_;
+ mswr::ComPtr<winui::ViewManagement::IInputPane> input_pane_;
+ mswr::ComPtr<winui::ViewManagement::IApplicationViewStatics> app_view_;
+
+ bool osk_visible_notification_received_;
+
+ // map of notification id to the ToastNotificationHandler instance.
+ typedef std::map<std::string, scoped_ptr<ToastNotificationHandler> >
+ NotificationMap;
+ NotificationMap notification_map_;
+
+ // Synchronizes access to the notification_map_ member.
+ base::Lock notification_lock_;
+
+ // If the OSK covers the input area we scroll the window by the height of the
+ // OSK + an additional offset. This member holds this offset. Set to 0 if the
+ // window was not scrolled.
+ int osk_offset_adjustment_;
+
+ MetroDialogBox dialog_box_;
+};
+
+class ChromeAppViewFactory
+ : public mswr::RuntimeClass<winapp::Core::IFrameworkViewSource> {
+ public:
+ ChromeAppViewFactory(winapp::Core::ICoreApplication* icore_app,
+ LPTHREAD_START_ROUTINE host_main,
+ void* host_context);
+ IFACEMETHOD(CreateView)(winapp::Core::IFrameworkView** view);
+};
+
+// This function is exported by chrome.exe.
+typedef int (__cdecl *BreakpadExceptionHandler)(EXCEPTION_POINTERS* info);
+
+// Global information used across the metro driver.
+struct Globals {
+ LPTHREAD_START_ROUTINE host_main;
+ void* host_context;
+ HWND core_window;
+ // The pair below contains the HWND and a bool which indicates whether the
+ // window was displaced to ensure that the focused region is visible when
+ // the OSK is displayed.
+ std::list<std::pair<HWND, bool> > host_windows;
+ HANDLE host_thread;
+ DWORD main_thread_id;
+ ChromeAppView* view;
+ WNDPROC g_core_proc;
+ string16 navigation_url;
+ string16 search_string;
+ winapp::Activation::ApplicationExecutionState previous_state;
+ winapp::Activation::ActivationKind initial_activation_kind;
+ bool is_initial_activation;
+ // This message loop lives in the app view's thread. Some operations have
+ // to be initiated from that thread, notably spawning file pickers.
+ base::MessageLoopProxy* appview_msg_loop;
+ winapp::Core::ICoreApplicationExit* app_exit;
+ BreakpadExceptionHandler breakpad_exception_handler;
+ string16 metro_command_line_switches;
+};
+
+extern Globals globals;
+
+#endif // CHROME_BROWSER_UI_METRO_DRIVER_CHROME_APP_VIEW_H_