From 4475892162b7069ec333f3fc64d086ba3957b752 Mon Sep 17 00:00:00 2001 From: "robertshield@chromium.org" Date: Fri, 7 Sep 2012 18:24:52 +0000 Subject: 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 --- win8/metro_driver/chrome_app_view.h | 177 ++++++++++++++++++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 win8/metro_driver/chrome_app_view.h (limited to 'win8/metro_driver/chrome_app_view.h') 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 +#include +#include +#include + +#include +#include +#include +#include + +#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 { + 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* 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 window_; + mswr::ComPtr 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 input_pane_; + mswr::ComPtr app_view_; + + bool osk_visible_notification_received_; + + // map of notification id to the ToastNotificationHandler instance. + typedef std::map > + 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 { + 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 > 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_ -- cgit v1.1