15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 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) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#ifndef CHROME_BROWSER_DEVTOOLS_DEVTOOLS_WINDOW_H_ 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#define CHROME_BROWSER_DEVTOOLS_DEVTOOLS_WINDOW_H_ 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/devtools/devtools_contents_resizing_strategy.h" 92a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/devtools/devtools_toggle_action.h" 105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "chrome/browser/devtools/devtools_ui_bindings.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_delegate.h" 12116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "content/public/browser/web_contents_observer.h" 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Browser; 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class BrowserWindow; 16116680a4aac90f2aa7413d9095a592090648e557Ben Murdochclass DevToolsWindowTesting; 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass DevToolsEventForwarder; 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class DevToolsAgentHost; 21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochstruct NativeWebKeyboardEvent; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RenderViewHost; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace user_prefs { 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class PrefRegistrySyncable; 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass DevToolsWindow : public DevToolsUIBindings::Delegate, 305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu public content::WebContentsDelegate { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 32116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch class ObserverWithAccessor : public content::WebContentsObserver { 33116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 34116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch explicit ObserverWithAccessor(content::WebContents* web_contents); 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch virtual ~ObserverWithAccessor(); 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 37116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch private: 38116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch DISALLOW_COPY_AND_ASSIGN(ObserverWithAccessor); 39116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch }; 40116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static const char kDevToolsApp[]; 42a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 43a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual ~DevToolsWindow(); 44a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Return the DevToolsWindow for the given WebContents if one exists, 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // otherwise NULL. 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch static DevToolsWindow* GetInstanceForInspectedWebContents( 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch content::WebContents* inspected_web_contents); 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // Return the docked DevTools WebContents for the given inspected WebContents 53cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // if one exists and should be shown in browser window, otherwise NULL. 54cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // This method will return only fully initialized window ready to be 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // presented in UI. 56cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) // If |out_strategy| is not NULL, it will contain resizing strategy. 575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // For immediately-ready-to-use but maybe not yet fully initialized DevTools 585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // use |GetInstanceForInspectedRenderViewHost| instead. 59cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) static content::WebContents* GetInTabWebContents( 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::WebContents* inspected_tab, 61cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) DevToolsContentsResizingStrategy* out_strategy); 625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static bool IsDevToolsWindow(content::WebContents* web_contents); 645d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open or reveal DevTools window, and perform the specified action. 665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static DevToolsWindow* OpenDevToolsWindow( 676e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) content::WebContents* inspected_web_contents, 685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const DevToolsToggleAction& action); 695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Open or reveal DevTools window, with no special action. 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static DevToolsWindow* OpenDevToolsWindow( 726e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) content::WebContents* inspected_web_contents); 735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Perform specified action for current WebContents inside a |browser|. 755d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // This may close currently open DevTools window. 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static DevToolsWindow* ToggleDevToolsWindow( 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser, 780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) const DevToolsToggleAction& action); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // External frontend is always undocked. 815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static void OpenExternalFrontend( 825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Profile* profile, 835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const std::string& frontend_uri, 841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const scoped_refptr<content::DevToolsAgentHost>& agent_host, 851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci bool isWorker); 865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Worker frontend is always undocked. 885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static DevToolsWindow* OpenDevToolsWindowForWorker( 895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) Profile* profile, 901320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci const scoped_refptr<content::DevToolsAgentHost>& worker_agent); 910f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles) 926e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) static void InspectElement(content::WebContents* inspected_web_contents, 936e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int x, 946e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) int y); 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Sets closure to be called after load is done. If already loaded, calls 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // closure immediately. 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void SetLoadCompletedCallback(const base::Closure& closure); 99c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 100c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // Forwards an unhandled keyboard event to the DevTools frontend. 101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch bool ForwardKeyboardEvent(const content::NativeWebKeyboardEvent& event); 102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 103f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // BeforeUnload interception //////////////////////////////////////////////// 104f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 105f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // In order to preserve any edits the user may have made in devtools, the 106f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // beforeunload event of the inspected page is hooked - devtools gets the 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // first shot at handling beforeunload and presents a dialog to the user. If 108f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // the user accepts the dialog then the script is given a chance to handle 109f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // it. This way 2 dialogs may be displayed: one from the devtools asking the 110f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // user to confirm that they're ok with their devtools edits going away and 111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // another from the webpage as the result of its beforeunload handler. 112f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The following set of methods handle beforeunload event flow through 113f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // devtools window. When the |contents| with devtools opened on them are 114f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // getting closed, the following sequence of calls takes place: 115f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 1. |DevToolsWindow::InterceptPageBeforeUnload| is called and indicates 116f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // whether devtools intercept the beforeunload event. 117f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If InterceptPageBeforeUnload() returns true then the following steps 118f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // will take place; otherwise only step 4 will be reached and none of the 119f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // corresponding functions in steps 2 & 3 will get called. 120f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 2. |DevToolsWindow::InterceptPageBeforeUnload| fires beforeunload event 121f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // for devtools frontend, which will asynchronously call 122f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |WebContentsDelegate::BeforeUnloadFired| method. 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // In case of docked devtools window, devtools are set as a delegate for 124f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // its frontend, so method |DevToolsWindow::BeforeUnloadFired| will be 125f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // called directly. 126f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // If devtools window is undocked it's not set as the delegate so the call 127f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // to BeforeUnloadFired is proxied through HandleBeforeUnload() rather 128f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // than getting called directly. 129f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 3a. If |DevToolsWindow::BeforeUnloadFired| is called with |proceed|=false 130f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // it calls throught to the content's BeforeUnloadFired(), which from the 131f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // WebContents perspective looks the same as the |content|'s own 132f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // beforeunload dialog having had it's 'stay on this page' button clicked. 133f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 3b. If |proceed| = true, then it fires beforeunload event on |contents| 134f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // and everything proceeds as it normally would without the Devtools 135f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // interception. 136f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // 4. If the user cancels the dialog put up by either the WebContents or 137f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // devtools frontend, then |contents|'s |BeforeUnloadFired| callback is 138f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // called with the proceed argument set to false, this causes 139f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |DevToolsWindow::OnPageCloseCancelled| to be called. 140f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Devtools window in undocked state is not set as a delegate of 142f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // its frontend. Instead, an instance of browser is set as the delegate, and 143f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // thus beforeunload event callback from devtools frontend is not delivered 144f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // to the instance of devtools window, which is solely responsible for 145f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // managing custom beforeunload event flow. 146f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // This is a helper method to route callback from 147f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // |Browser::BeforeUnloadFired| back to |DevToolsWindow::BeforeUnloadFired|. 148f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // * |proceed| - true if the user clicked 'ok' in the beforeunload dialog, 149f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // false otherwise. 150f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // * |proceed_to_fire_unload| - output parameter, whether we should continue 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // to fire the unload event or stop things here. 152f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns true if devtools window is in a state of intercepting beforeunload 153f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // event and if it will manage unload process on its own. 154f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static bool HandleBeforeUnload(content::WebContents* contents, 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool proceed, 156f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool* proceed_to_fire_unload); 157f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 158f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns true if this contents beforeunload event was intercepted by 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // devtools and false otherwise. If the event was intercepted, caller should 160f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // not fire beforeunlaod event on |contents| itself as devtools window will 161f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // take care of it, otherwise caller should continue handling the event as 162f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // usual. 163f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static bool InterceptPageBeforeUnload(content::WebContents* contents); 164f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 165f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns true if devtools browser has already fired its beforeunload event 166f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // as a result of beforeunload event interception. 167f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static bool HasFiredBeforeUnloadEventForDevToolsBrowser(Browser* browser); 168f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 169f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Returns true if devtools window would like to hook beforeunload event 170f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // of this |contents|. 171f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static bool NeedsToInterceptBeforeUnload(content::WebContents* contents); 172f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 173f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Notify devtools window that closing of |contents| was cancelled 174f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // by user. 175f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) static void OnPageCloseCanceled(content::WebContents* contents); 176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch friend class DevToolsWindowTesting; 1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // DevTools lifecycle typically follows this way: 1815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // - Toggle/Open: client call; 1825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // - Create; 1835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // - ScheduleShow: setup window to be functional, but not yet show; 1845d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // - DocumentOnLoadCompletedInMainFrame: frontend loaded; 1855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // - SetIsDocked: frontend decided on docking state; 1865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // - OnLoadCompleted: ready to present frontend; 1875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // - Show: actually placing frontend WebContents to a Browser or docked place; 188116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // - DoAction: perform action passed in Toggle/Open; 189116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // - ...; 190116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // - CloseWindow: initiates before unload handling; 191116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // - CloseContents: destroys frontend; 192116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // - DevToolsWindow is dead once it's main_web_contents dies. 193116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch enum LifeStage { 1945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kNotLoaded, 1955d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kOnLoadFired, // Implies SetIsDocked was not yet called. 1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kIsDockedSet, // Implies DocumentOnLoadCompleted was not yet called. 197116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kLoadCompleted, 198116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kClosing 1995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) }; 200a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) DevToolsWindow(Profile* profile, 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const GURL& frontend_url, 2036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) content::WebContents* inspected_web_contents, 2045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool can_dock); 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 206a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static DevToolsWindow* Create(Profile* profile, 207a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const GURL& frontend_url, 2086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) content::WebContents* inspected_web_contents, 209424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool shared_worker_frontend, 210a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool external_frontend, 211116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool can_dock, 212116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& settings); 213a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static GURL GetDevToolsURL(Profile* profile, 214a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) const GURL& base_url, 215424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles) bool shared_worker_frontend, 216a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) bool external_frontend, 217116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch bool can_dock, 218116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& settings); 219a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) static DevToolsWindow* FindDevToolsWindow(content::DevToolsAgentHost*); 220116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch static DevToolsWindow* AsDevToolsWindow(content::WebContents*); 2215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static DevToolsWindow* CreateDevToolsWindowForWorker(Profile* profile); 2225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) static DevToolsWindow* ToggleDevToolsWindow( 2236e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) content::WebContents* web_contents, 2245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool force_open, 225116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const DevToolsToggleAction& action, 226116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& settings); 227116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 2282385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch // content::WebContentsDelegate: 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual content::WebContents* OpenURLFromTab( 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* source, 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::OpenURLParams& params) OVERRIDE; 2325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void ActivateContents(content::WebContents* contents) OVERRIDE; 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void AddNewContents(content::WebContents* source, 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* new_contents, 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WindowOpenDisposition disposition, 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const gfx::Rect& initial_pos, 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool user_gesture, 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* was_blocked) OVERRIDE; 239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void WebContentsCreated(content::WebContents* source_contents, 240cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) int opener_render_frame_id, 241cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const base::string16& frame_name, 242cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) const GURL& target_url, 243cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::WebContents* new_contents) OVERRIDE; 244a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) virtual void CloseContents(content::WebContents* source) OVERRIDE; 2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void ContentsZoomChange(bool zoom_in) OVERRIDE; 2464e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) virtual void BeforeUnloadFired(content::WebContents* tab, 2474e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool proceed, 2484e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) bool* proceed_to_fire_unload) OVERRIDE; 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool PreHandleKeyboardEvent( 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* source, 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NativeWebKeyboardEvent& event, 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool* is_keyboard_shortcut) OVERRIDE; 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void HandleKeyboardEvent( 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* source, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::NativeWebKeyboardEvent& event) OVERRIDE; 2562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual content::JavaScriptDialogManager* 2572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetJavaScriptDialogManager() OVERRIDE; 25890dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) virtual content::ColorChooser* OpenColorChooser( 25990dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) content::WebContents* web_contents, 260a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SkColor color, 261a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) const std::vector<content::ColorSuggestion>& suggestions) OVERRIDE; 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void RunFileChooser( 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) content::WebContents* web_contents, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const content::FileChooserParams& params) OVERRIDE; 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void WebContentsFocused(content::WebContents* contents) OVERRIDE; 2665d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual bool PreHandleGestureEvent( 2675d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) content::WebContents* source, 2685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) const blink::WebGestureEvent& event) OVERRIDE; 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu // content::DevToolsUIBindings::Delegate overrides 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void ActivateWindow() OVERRIDE; 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void CloseWindow() OVERRIDE; 273cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void SetInspectedPageBounds(const gfx::Rect& rect) OVERRIDE; 2745d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void InspectElementCompleted() OVERRIDE; 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void MoveWindow(int x, int y) OVERRIDE; 2765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) virtual void SetIsDocked(bool is_docked) OVERRIDE; 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void OpenInNewTab(const std::string& url) OVERRIDE; 278c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void SetWhitelistedShortcuts(const std::string& message) OVERRIDE; 2795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void InspectedContentsClosing() OVERRIDE; 2805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu virtual void OnLoadCompleted() OVERRIDE; 281010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual InfoBarService* GetInfoBarService() OVERRIDE; 282010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) virtual void RenderProcessGone() OVERRIDE; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 284a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) void CreateDevToolsBrowser(); 285a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles) BrowserWindow* GetInspectedBrowserWindow(); 2865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void ScheduleShow(const DevToolsToggleAction& action); 2875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void Show(const DevToolsToggleAction& action); 2885d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void DoAction(const DevToolsToggleAction& action); 2895d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) void LoadCompleted(); 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void UpdateBrowserToolbar(); 291cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) void UpdateBrowserWindow(); 2922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) content::WebContents* GetInspectedWebContents(); 2932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 294116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch scoped_ptr<ObserverWithAccessor> inspected_contents_observer_; 2952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Profile* profile_; 297cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::WebContents* main_web_contents_; 298cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) content::WebContents* toolbox_web_contents_; 2995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu DevToolsUIBindings* bindings_; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Browser* browser_; 3015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) bool is_docked_; 3020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch const bool can_dock_; 303116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch LifeStage life_stage_; 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DevToolsToggleAction action_on_load_; 3055d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) DevToolsContentsResizingStrategy contents_resizing_strategy_; 306f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // True if we're in the process of handling a beforeunload event originating 307f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // from the inspected webcontents, see InterceptPageBeforeUnload for details. 308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) bool intercepted_page_beforeunload_; 3095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::Closure load_completed_callback_; 310116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Closure close_callback_; 3112385ea399aae016c0806a4f9ef3c9cfe3d2a39dfBen Murdoch 3125d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::TimeTicks inspect_element_start_time_; 313c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_ptr<DevToolsEventForwarder> event_forwarder_; 314c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 315c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch friend class DevToolsEventForwarder; 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISALLOW_COPY_AND_ASSIGN(DevToolsWindow); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#endif // CHROME_BROWSER_DEVTOOLS_DEVTOOLS_WINDOW_H_ 320