// Copyright (c) 2013 GitHub, Inc. // Use of this source code is governed by the MIT license that can be // found in the LICENSE file. #ifndef ATOM_BROWSER_API_ATOM_API_BROWSER_WINDOW_H_ #define ATOM_BROWSER_API_ATOM_API_BROWSER_WINDOW_H_ #include #include #include #include #include "atom/browser/api/atom_api_web_contents.h" #include "atom/browser/native_window.h" #include "atom/browser/native_window_observer.h" #include "atom/common/api/atom_api_native_image.h" #include "atom/common/key_weak_map.h" #include "base/cancelable_callback.h" #include "base/memory/weak_ptr.h" #include "content/public/browser/render_widget_host.h" #include "native_mate/persistent_dictionary.h" class GURL; namespace gfx { class Rect; } namespace mate { class Arguments; class Dictionary; } namespace atom { class NativeWindow; namespace api { class BrowserWindow : public mate::TrackableObject, public content::RenderWidgetHost::InputEventObserver, public content::WebContentsObserver, public ExtendedWebContentsObserver, public NativeWindowObserver { public: static mate::WrappableBase* New(mate::Arguments* args); static void BuildPrototype(v8::Isolate* isolate, v8::Local prototype); // Returns the BrowserWindow object from |native_window|. static v8::Local From(v8::Isolate* isolate, NativeWindow* native_window); NativeWindow* window() const { return window_.get(); } int32_t ID() const; protected: BrowserWindow(v8::Isolate* isolate, v8::Local wrapper, const mate::Dictionary& options); ~BrowserWindow() override; // content::RenderWidgetHost::InputEventObserver: void OnInputEvent(const blink::WebInputEvent& event) override; // content::WebContentsObserver: void RenderViewHostChanged(content::RenderViewHost* old_host, content::RenderViewHost* new_host) override; void RenderViewCreated(content::RenderViewHost* render_view_host) override; void DidFirstVisuallyNonEmptyPaint() override; void BeforeUnloadDialogCancelled() override; void OnRendererUnresponsive(content::RenderWidgetHost*) override; bool OnMessageReceived(const IPC::Message& message, content::RenderFrameHost* rfh) override; // ExtendedWebContentsObserver: void OnCloseContents() override; void OnRendererResponsive() override; // NativeWindowObserver: void WillCloseWindow(bool* prevent_default) override; void RequestPreferredWidth(int* width) override; void OnCloseButtonClicked(bool* prevent_default) override; void OnWindowClosed() override; void OnWindowEndSession() override; void OnWindowBlur() override; void OnWindowFocus() override; void OnWindowShow() override; void OnWindowHide() override; void OnWindowMaximize() override; void OnWindowUnmaximize() override; void OnWindowMinimize() override; void OnWindowRestore() override; void OnWindowResize() override; void OnWindowMove() override; void OnWindowMoved() override; void OnWindowScrollTouchBegin() override; void OnWindowScrollTouchEnd() override; void OnWindowSwipe(const std::string& direction) override; void OnWindowSheetBegin() override; void OnWindowSheetEnd() override; void OnWindowEnterFullScreen() override; void OnWindowLeaveFullScreen() override; void OnWindowEnterHtmlFullScreen() override; void OnWindowLeaveHtmlFullScreen() override; void OnExecuteWindowsCommand(const std::string& command_name) override; void OnTouchBarItemResult(const std::string& item_id, const base::DictionaryValue& details) override; void OnNewWindowForTab() override; #if defined(OS_WIN) void OnWindowMessage(UINT message, WPARAM w_param, LPARAM l_param) override; #endif base::WeakPtr GetWeakPtr() { return weak_factory_.GetWeakPtr(); } private: void Init(v8::Isolate* isolate, v8::Local wrapper, const mate::Dictionary& options, mate::Handle web_contents); // APIs for NativeWindow. void Close(); void Focus(); void Blur(); bool IsFocused(); void Show(); void ShowInactive(); void Hide(); bool IsVisible(); bool IsEnabled(); void SetEnabled(bool enable); void Maximize(); void Unmaximize(); bool IsMaximized(); void Minimize(); void Restore(); bool IsMinimized(); void SetFullScreen(bool fullscreen); bool IsFullscreen(); void SetBounds(const gfx::Rect& bounds, mate::Arguments* args); gfx::Rect GetBounds(); void SetSize(int width, int height, mate::Arguments* args); std::vector GetSize(); void SetContentSize(int width, int height, mate::Arguments* args); std::vector GetContentSize(); void SetContentBounds(const gfx::Rect& bounds, mate::Arguments* args); gfx::Rect GetContentBounds(); void SetMinimumSize(int width, int height); std::vector GetMinimumSize(); void SetMaximumSize(int width, int height); std::vector GetMaximumSize(); void SetSheetOffset(double offsetY, mate::Arguments* args); void SetResizable(bool resizable); bool IsResizable(); void SetMovable(bool movable); bool IsMovable(); void SetMinimizable(bool minimizable); bool IsMinimizable(); void SetMaximizable(bool maximizable); bool IsMaximizable(); void SetFullScreenable(bool fullscreenable); bool IsFullScreenable(); void SetClosable(bool closable); bool IsClosable(); void SetAlwaysOnTop(bool top, mate::Arguments* args); bool IsAlwaysOnTop(); void Center(); void SetPosition(int x, int y, mate::Arguments* args); std::vector GetPosition(); void SetTitle(const std::string& title); std::string GetTitle(); void FlashFrame(bool flash); void SetSkipTaskbar(bool skip); void SetSimpleFullScreen(bool simple_fullscreen); bool IsSimpleFullScreen(); void SetKiosk(bool kiosk); bool IsKiosk(); void SetBackgroundColor(const std::string& color_name); void SetHasShadow(bool has_shadow); bool HasShadow(); void SetOpacity(const double opacity); double GetOpacity(); void FocusOnWebView(); void BlurWebView(); bool IsWebViewFocused(); void SetRepresentedFilename(const std::string& filename); std::string GetRepresentedFilename(); void SetDocumentEdited(bool edited); bool IsDocumentEdited(); void SetIgnoreMouseEvents(bool ignore, mate::Arguments* args); void SetContentProtection(bool enable); void SetFocusable(bool focusable); void SetProgressBar(double progress, mate::Arguments* args); void SetOverlayIcon(const gfx::Image& overlay, const std::string& description); bool SetThumbarButtons(mate::Arguments* args); void SetMenu(v8::Isolate* isolate, v8::Local menu); void SetAutoHideMenuBar(bool auto_hide); bool IsMenuBarAutoHide(); void SetMenuBarVisibility(bool visible); bool IsMenuBarVisible(); void SetAspectRatio(double aspect_ratio, mate::Arguments* args); void PreviewFile(const std::string& path, mate::Arguments* args); void CloseFilePreview(); void SetParentWindow(v8::Local value, mate::Arguments* args); v8::Local GetParentWindow() const; std::vector> GetChildWindows() const; v8::Local GetBrowserView() const; void SetBrowserView(v8::Local value); void ResetBrowserView(); bool IsModal() const; v8::Local GetNativeWindowHandle(); #if defined(OS_WIN) typedef base::Callback, v8::Local)> MessageCallback; bool HookWindowMessage(UINT message, const MessageCallback& callback); bool IsWindowMessageHooked(UINT message); void UnhookWindowMessage(UINT message); void UnhookAllWindowMessages(); bool SetThumbnailClip(const gfx::Rect& region); bool SetThumbnailToolTip(const std::string& tooltip); void SetAppDetails(const mate::Dictionary& options); #endif #if defined(TOOLKIT_VIEWS) void SetIcon(mate::Handle icon); #endif void SetVisibleOnAllWorkspaces(bool visible); bool IsVisibleOnAllWorkspaces(); void SetAutoHideCursor(bool auto_hide); void SelectPreviousTab(); void SelectNextTab(); void MergeAllWindows(); void MoveTabToNewWindow(); void ToggleTabBar(); void AddTabbedWindow(NativeWindow* window, mate::Arguments* args); void SetVibrancy(mate::Arguments* args); void SetTouchBar(const std::vector& items); void RefreshTouchBarItem(const std::string& item_id); void SetEscapeTouchBarItem(const mate::PersistentDictionary& item); v8::Local WebContents(v8::Isolate* isolate); // Remove this window from parent window's |child_windows_|. void RemoveFromParentChildWindows(); // Called when the window needs to update its draggable region. void UpdateDraggableRegions( content::RenderFrameHost* rfh, const std::vector& regions); // Convert draggable regions in raw format to SkRegion format. std::unique_ptr DraggableRegionsToSkRegion( const std::vector& regions); // Schedule a notification unresponsive event. void ScheduleUnresponsiveEvent(int ms); // Dispatch unresponsive event to observers. void NotifyWindowUnresponsive(); #if defined(OS_WIN) typedef std::map MessageCallbackMap; MessageCallbackMap messages_callback_map_; #endif #if defined(OS_MACOSX) std::vector draggable_regions_; #endif // Closure that would be called when window is unresponsive when closing, // it should be cancelled when we can prove that the window is responsive. base::CancelableClosure window_unresponsive_closure_; v8::Global browser_view_; v8::Global web_contents_; v8::Global menu_; v8::Global parent_window_; KeyWeakMap child_windows_; api::WebContents* api_web_contents_; std::unique_ptr window_; base::WeakPtrFactory weak_factory_; DISALLOW_COPY_AND_ASSIGN(BrowserWindow); }; } // namespace api } // namespace atom namespace mate { template<> struct Converter { static bool FromV8(v8::Isolate* isolate, v8::Local val, atom::NativeWindow** out) { // null would be tranfered to NULL. if (val->IsNull()) { *out = NULL; return true; } atom::api::BrowserWindow* window; if (!Converter::FromV8(isolate, val, &window)) return false; *out = window->window(); return true; } }; } // namespace mate #endif // ATOM_BROWSER_API_ATOM_API_BROWSER_WINDOW_H_