// 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 SHELL_BROWSER_API_ATOM_API_BROWSER_WINDOW_H_ #define SHELL_BROWSER_API_ATOM_API_BROWSER_WINDOW_H_ #include #include #include #include "base/cancelable_callback.h" #include "shell/browser/api/atom_api_top_level_window.h" #include "shell/browser/api/atom_api_web_contents.h" namespace electron { namespace api { class BrowserWindow : public TopLevelWindow, public content::RenderWidgetHost::InputEventObserver, public content::WebContentsObserver, public ExtendedWebContentsObserver { 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); base::WeakPtr GetWeakPtr() { return weak_factory_.GetWeakPtr(); } 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::RenderProcessHost*) override; // ExtendedWebContentsObserver: void OnCloseContents() override; void OnRendererResponsive() override; void OnDraggableRegionsUpdated( const std::vector& regions) override; // NativeWindowObserver: void RequestPreferredWidth(int* width) override; void OnCloseButtonClicked(bool* prevent_default) override; // TopLevelWindow: void OnWindowClosed() override; void OnWindowBlur() override; void OnWindowFocus() override; void OnWindowResize() override; void OnWindowLeaveFullScreen() override; void Focus() override; void Blur() override; void SetBackgroundColor(const std::string& color_name) override; void SetBrowserView(v8::Local value) override; void AddBrowserView(v8::Local value) override; void RemoveBrowserView(v8::Local value) override; void ResetBrowserViews() override; void SetVibrancy(v8::Isolate* isolate, v8::Local value) override; // BrowserWindow APIs. void FocusOnWebView(); void BlurWebView(); bool IsWebViewFocused(); v8::Local GetWebContents(v8::Isolate* isolate); private: #if defined(OS_MACOSX) void OverrideNSWindowContentView(InspectableWebContents* iwc); #endif // Helpers. // Called when the window needs to update its draggable region. void UpdateDraggableRegions( 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(); // Cleanup our WebContents observers. void Cleanup(); // 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_; #if defined(OS_MACOSX) std::vector draggable_regions_; #endif v8::Global web_contents_; base::WeakPtr api_web_contents_; base::WeakPtrFactory weak_factory_; DISALLOW_COPY_AND_ASSIGN(BrowserWindow); }; } // namespace api } // namespace electron #endif // SHELL_BROWSER_API_ATOM_API_BROWSER_WINDOW_H_