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)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CHROME_BROWSER_UI_TAB_CONTENTS_CORE_TAB_HELPER_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CHROME_BROWSER_UI_TAB_CONTENTS_CORE_TAB_HELPER_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
8eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/time/time.h"
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_observer.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/web_contents_user_data.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CoreTabHelperDelegate;
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Per-tab class to handle functionality that is core to the operation of tabs.
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class CoreTabHelper : public content::WebContentsObserver,
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                      public content::WebContentsUserData<CoreTabHelper> {
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~CoreTabHelper();
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Initial title assigned to NavigationEntries from Navigate.
21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  static base::string16 GetDefaultTitle();
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Returns a human-readable description the tab's loading state.
24a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  base::string16 GetStatusText() const;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
267d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Notification that tab closing has started.  This can be called multiple
277d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // times, subsequent calls are ignored.
287d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void OnCloseStarted();
297d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
307d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Notification that tab closing was cancelled. This can happen when a user
317d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // cancels a window close via another tab's beforeunload dialog.
327d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void OnCloseCanceled();
337d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
347d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Set the time during close when unload is started. Normally, this is set
357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // after the beforeunload dialog. However, for a window close, it is set
367d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // after all the beforeunload dialogs have finished.
377d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void OnUnloadStarted();
387d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
397d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // Set the time during close when the tab is no longer visible.
407d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void OnUnloadDetachedStarted();
417d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
42ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  void UpdateContentRestrictions(int content_restrictions);
43ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
447d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  CoreTabHelperDelegate* delegate() const { return delegate_; }
457d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void set_delegate(CoreTabHelperDelegate* d) { delegate_ = d; }
467d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
477d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  void set_new_tab_start_time(const base::TimeTicks& time) {
487d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)    new_tab_start_time_ = time;
497d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  }
507d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
517d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::TimeTicks new_tab_start_time() const { return new_tab_start_time_; }
52ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int content_restrictions() const { return content_restrictions_; }
537d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit CoreTabHelper(content::WebContents* web_contents);
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend class content::WebContentsUserData<CoreTabHelper>;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // content::WebContentsObserver overrides:
59ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  virtual void DidStartLoading(
60ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch      content::RenderViewHost* render_view_host) OVERRIDE;
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void WasShown() OVERRIDE;
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)  virtual void WebContentsDestroyed() OVERRIDE;
637d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void BeforeUnloadFired(const base::TimeTicks& proceed_time) OVERRIDE;
647d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  virtual void BeforeUnloadDialogCancelled() OVERRIDE;
65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  virtual bool OnMessageReceived(
66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      const IPC::Message& message,
67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)      content::RenderFrameHost* render_frame_host) OVERRIDE;
688bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)
698bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)  void OnRequestThumbnailForContextNodeACK(const SkBitmap& bitmap,
708bcbed890bc3ce4d7a057a8f32cab53fa534672eTorne (Richard Coles)                                           const gfx::Size& original_size);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Delegate for notifying our owner about stuff. Not owned by us.
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  CoreTabHelperDelegate* delegate_;
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
757d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The time when we started to create the new tab page.  This time is from
767d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // before we created this WebContents.
777d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::TimeTicks new_tab_start_time_;
787d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
797d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The time that we started to close this WebContents.
807d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::TimeTicks close_start_time_;
817d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
827d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The time when onbeforeunload ended.
837d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::TimeTicks before_unload_end_time_;
847d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
857d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  // The time when the tab was removed from view during close.
867d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)  base::TimeTicks unload_detached_start_time_;
877d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
88ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // Content restrictions, used to disable print/copy etc based on content's
89ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  // (full-page plugins for now only) permissions.
90ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch  int content_restrictions_;
91ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(CoreTabHelper);
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // CHROME_BROWSER_UI_TAB_CONTENTS_CORE_TAB_HELPER_H_
96