12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_BROWSER_WINDOW_H_ 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_BROWSER_WINDOW_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/callback_forward.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/bookmarks/bookmark_bar.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/fullscreen/fullscreen_exit_bubble_type.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/ui/host_desktop.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/sync/one_click_signin_sync_starter.h" 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/content_settings_types.h" 1590dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)#include "ui/base/base_window.h" 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/window_open_disposition.h" 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/native_widget_types.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserWindowTesting; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DownloadShelf; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class FindBar; 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class GURL; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocationBar; 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Profile; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class StatusBubble; 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class TemplateURL; 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if !defined(OS_MACOSX) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ToolbarView; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace autofill { 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class PasswordGenerator; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class WebContents; 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct NativeWebKeyboardEvent; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PasswordForm; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct SSLStatus; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace extensions { 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Extension; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect; 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Size; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)namespace web_modal { 5290dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class WebContentsModalDialogHost; 5390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)} 5490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//////////////////////////////////////////////////////////////////////////////// 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// BrowserWindow interface 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// An interface implemented by the "view" of the Browser window. 5890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)// This interface includes ui::BaseWindow methods as well as Browser window 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// specific methods. 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// NOTE: All getters may return NULL. 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 6390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)class BrowserWindow : public ui::BaseWindow { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BrowserWindow() {} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ////////////////////////////////////////////////////////////////////////////// 6890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // ui::BaseWindow interface notes: 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Closes the window as soon as possible. If the window is not in a drag 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // session, it will close immediately; otherwise, it will move offscreen (so 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // events are still fired) until the drag ends, then close. This assumes 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that the Browser is not immediately destroyed, but will be eventually 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destroyed by other means (eg, the tab strip going to zero elements). 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Bad things happen if the Browser dtor is called directly as a result of 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // invoking this method. 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // virtual void Close() = 0; 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Browser::OnWindowDidShow should be called after showing the window. 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // virtual void Show() = 0; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ////////////////////////////////////////////////////////////////////////////// 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Browser specific methods: 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns a pointer to the testing interface to the Browser window, or NULL 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if there is none. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual BrowserWindowTesting* GetBrowserWindowTesting() = 0; 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the status bubble associated with the frame 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual StatusBubble* GetStatusBubble() = 0; 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inform the frame that the selected tab favicon or title has changed. Some 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // frames may need to refresh their title bar. 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateTitleBar() = 0; 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoked when the state of the bookmark bar changes. This is only invoked if 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the state changes for the current tab, it is not sent when switching tabs. 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void BookmarkBarStateChanged( 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) BookmarkBar::AnimateChangeType change_type) = 0; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Inform the frame that the dev tools window for the selected tab has 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changed. 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateDevTools() = 0; 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Update any loading animations running in the window. |should_animate| is 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // true if there are tabs loading and the animations should continue, false 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if there are no active loads and the animations should end. 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateLoadingAnimations(bool should_animate) = 0; 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets the starred state for the current tab. 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetStarredState(bool is_starred) = 0; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Called to force the zoom state to for the active tab to be recalculated. 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |can_show_bubble| is true when a user presses the zoom up or down keyboard 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // shortcuts and will be false in other cases (e.g. switching tabs, "clicking" 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // + or - in the wrench menu to change zoom). 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ZoomChangedForActiveTab(bool can_show_bubble) = 0; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Accessors for fullscreen mode state. 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void EnterFullscreen(const GURL& url, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FullscreenExitBubbleType bubble_type) = 0; 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ExitFullscreen() = 0; 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateFullscreenExitBubbleContent( 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) FullscreenExitBubbleType bubble_type) = 0; 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Windows and GTK remove the top controls in fullscreen, but Mac and Ash 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // keep the controls in a slide-down panel. 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool ShouldHideUIForFullscreen() const = 0; 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the fullscreen bubble is visible. 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsFullscreenBubbleVisible() const = 0; 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Sets state for entering or exiting Win8 Metro snap mode. 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetMetroSnapMode(bool enable) = 0; 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns whether the window is currently in Win8 Metro snap mode. 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsInMetroSnapMode() const = 0; 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the location bar. 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual LocationBar* GetLocationBar() const = 0; 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tries to focus the location bar. Clears the window focus (to avoid 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // inconsistent state) if this fails. 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetFocusToLocationBar(bool select_all) = 0; 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Informs the view whether or not a load is in progress for the current tab. 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The view can use this notification to update the reload/stop button. 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdateReloadStopState(bool is_loading, bool force) = 0; 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Updates the toolbar with the state for the specified |contents|. 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void UpdateToolbar(content::WebContents* contents, 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool should_restore_state) = 0; 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Focuses the toolbar (for accessibility). 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void FocusToolbar() = 0; 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Focuses the app menu like it was a menu bar. 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Not used on the Mac, which has a "normal" menu bar. 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void FocusAppMenu() = 0; 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Focuses the bookmarks toolbar (for accessibility). 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void FocusBookmarksToolbar() = 0; 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Focuses an infobar, if shown (for accessibility). 169c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void FocusInfobars() = 0; 170c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Moves keyboard focus to the next pane. 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RotatePaneFocus(bool forwards) = 0; 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns whether the bookmark bar is visible or not. 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsBookmarkBarVisible() const = 0; 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns whether the bookmark bar is animating or not. 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsBookmarkBarAnimating() const = 0; 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns whether the tab strip is editable (for extensions). 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsTabStripEditable() const = 0; 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns whether the tool bar is visible or not. 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsToolbarVisible() const = 0; 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the rect where the resize corner should be drawn by the render 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // widget host view (on top of what the renderer returns). We return an empty 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // rect to identify that there shouldn't be a resize corner (in the cases 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // where we take care of it ourselves at the browser level). 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual gfx::Rect GetRootWindowResizerRect() const = 0; 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Tells the frame not to render as inactive until the next activation change. 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This is required on Windows when dropdown selects are shown to prevent the 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // select from deactivating the browser frame. A stub implementation is 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // provided here since the functionality is Windows-specific. 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DisableInactiveFrame() {} 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows a confirmation dialog box for adding a search engine described by 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |template_url|. Takes ownership of |template_url|. 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ConfirmAddSearchProvider(TemplateURL* template_url, 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile) = 0; 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows or hides the bookmark bar depending on its current visibility. 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ToggleBookmarkBar() = 0; 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows the Update Recommended dialog box. 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowUpdateChromeDialog() = 0; 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows the Bookmark bubble. |url| is the URL being bookmarked, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |already_bookmarked| is true if the url is already bookmarked. 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowBookmarkBubble(const GURL& url, bool already_bookmarked) = 0; 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows the bookmark prompt. 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(yosin): Make ShowBookmarkPrompt pure virtual. 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowBookmarkPrompt() {} 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(ENABLE_ONE_CLICK_SIGNIN) 2182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) enum OneClickSigninBubbleType { 2192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ONE_CLICK_SIGNIN_BUBBLE_TYPE_BUBBLE, 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ONE_CLICK_SIGNIN_BUBBLE_TYPE_MODAL_DIALOG, 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ONE_CLICK_SIGNIN_BUBBLE_TYPE_SAML_MODAL_DIALOG 2222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) }; 2232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Callback type used with the ShowOneClickSigninBubble() method. If the 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // user chooses to accept the sign in, the callback is called to start the 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // sync process. 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typedef base::Callback<void(OneClickSigninSyncStarter::StartSyncMode)> 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StartSyncCallback; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 230c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Shows the one-click sign in bubble. |email| holds the full email address 231c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // of the account that has signed in. 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowOneClickSigninBubble( 2332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OneClickSigninBubbleType type, 234c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const string16& email, 235c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const string16& error_message, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const StartSyncCallback& start_sync_callback) = 0; 237c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) #endif 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Whether or not the shelf view is visible. 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool IsDownloadShelfVisible() const = 0; 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the DownloadShelf. 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual DownloadShelf* GetDownloadShelf() = 0; 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows the confirmation dialog box warning that the browser is closing with 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in-progress downloads. 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // This method should call Browser::InProgressDownloadResponse once the user 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // has confirmed. 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ConfirmBrowserCloseWithPendingDownloads() = 0; 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // ThemeService calls this when a user has changed his or her theme, 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // indicating that it's time to redraw everything. 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UserChangedTheme() = 0; 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Get extra vertical height that the render view should add to its requests 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // to webkit. This can help prevent sending extraneous layout/repaint requests 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // when the delegate is in the process of resizing the tab contents view (e.g. 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // during infobar animations). 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual int GetExtraRenderViewHeight() const = 0; 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notification that |contents| got the focus through user action (click 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // on the page). 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void WebContentsFocused(content::WebContents* contents) = 0; 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows the website settings using the specified information. |url| is the 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // url of the page/frame the info applies to, |ssl| is the SSL information for 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // that page/frame. If |show_history| is true, a section showing how many 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // times that URL has been visited is added to the page info. 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowWebsiteSettings(Profile* profile, 2702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* web_contents, 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const GURL& url, 2727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch const content::SSLStatus& ssl) = 0; 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows the app menu (for accessibility). 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowAppMenu() = 0; 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allows the BrowserWindow object to handle the specified keyboard event 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // before sending it to the renderer. 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns true if the |event| was handled. Otherwise, if the |event| would 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // be handled in HandleKeyboardEvent() method as a normal keyboard shortcut, 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // |*is_keyboard_shortcut| should be set to true. 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool PreHandleKeyboardEvent( 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NativeWebKeyboardEvent& event, 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* is_keyboard_shortcut) = 0; 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Allows the BrowserWindow object to handle the specified keyboard event, 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // if the renderer did not process it. 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleKeyboardEvent( 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NativeWebKeyboardEvent& event) = 0; 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows the create chrome app shortcut dialog box. 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowCreateChromeAppShortcutsDialog(Profile* profile, 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const extensions::Extension* app) = 0; 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clipboard commands applied to the whole browser window. 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Cut() = 0; 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Copy() = 0; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void Paste() = 0; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_MACOSX) 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Opens the tabpose view. 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OpenTabpose() = 0; 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Enters Mac specific fullscreen mode with chrome displayed (e.g. omnibox) 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // on OSX 10.7+, a.k.a. Lion Fullscreen mode. 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Invalid to call on OSX earlier than 10.7. 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Enters either from non fullscreen, or from fullscreen without chrome. 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Exit to normal fullscreen with EnterFullscreen(). 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void EnterFullscreenWithChrome() = 0; 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool IsFullscreenWithChrome() = 0; 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool IsFullscreenWithoutChrome() = 0; 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Return the correct disposition for a popup window based on |bounds|. 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual WindowOpenDisposition GetDispositionForPopupBounds( 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& bounds) = 0; 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct a FindBar implementation for the |browser|. 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual FindBar* CreateFindBar() = 0; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 321c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Return the WebContentsModalDialogHost for use in positioning web contents 322c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // modal dialogs within the browser window. 32390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual web_modal::WebContentsModalDialogHost* 32490dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) GetWebContentsModalDialogHost() = 0; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoked when the preferred size of the contents in current tab has been 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // changed. We might choose to update the window size to accomodate this 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // change. 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Note that this won't be fired if we change tabs. 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void UpdatePreferredSize(content::WebContents* web_contents, 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& pref_size) {} 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoked when the contents auto-resized and the container should match it. 3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ResizeDueToAutoResize(content::WebContents* web_contents, 3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Size& new_size) {} 3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Construct a BrowserWindow implementation for the specified |browser|. 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static BrowserWindow* CreateBrowserWindow(Browser* browser); 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows the avatar bubble inside |web_contents|. The bubble is positioned 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // relative to |rect|. |rect| should be in the |web_contents| coordinate 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // system. 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowAvatarBubble(content::WebContents* web_contents, 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect) = 0; 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Shows the avatar bubble on the window frame off of the avatar button. 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowAvatarBubbleFromAvatarButton() = 0; 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Show bubble for password generation positioned relative to |rect|. The 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // subclasses implementing this interface do not own the |password_generator| 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // object which is passed to generate the password. |form| is the form that 3522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // contains the password field that the bubble will be associated with. 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ShowPasswordGenerationBubble( 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& rect, 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::PasswordForm& form, 3562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) autofill::PasswordGenerator* password_generator) = 0; 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 358bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // Invoked when the amount of vertical overscroll changes. |delta_y| is the 359bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch // amount of overscroll that has occured in the y-direction. 360bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch virtual void OverscrollUpdate(int delta_y) {} 361bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 3625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) friend void chrome::CloseAllBrowsers(); 3645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) friend class BrowserView; 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void DestroyBrowser() = 0; 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) || defined(TOOLKIT_VIEWS) 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BookmarkBarView; 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class LocationBarView; 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class View; 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // defined(OS_WIN) 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// A BrowserWindow utility interface used for accessing elements of the browser 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// UI used only by UI test automation. 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserWindowTesting { 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#if defined(OS_WIN) || defined(TOOLKIT_VIEWS) 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the BookmarkBarView. 3835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual BookmarkBarView* GetBookmarkBarView() const = 0; 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the LocationBarView. 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual LocationBarView* GetLocationBarView() const = 0; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the TabContentsContainer. 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual views::View* GetTabContentsContainerView() const = 0; 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Returns the ToolbarView. 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ToolbarView* GetToolbarView() const = 0; 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~BrowserWindowTesting() {} 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // CHROME_BROWSER_UI_BROWSER_WINDOW_H_ 400