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