// Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef CHROME_BROWSER_NETWORK_STATUS_VIEW_H__ #define CHROME_BROWSER_NETWORK_STATUS_VIEW_H__ #include "base/basictypes.h" #include "base/ref_counted.h" #include "base/scoped_ptr.h" #include "chrome/common/render_messages.h" #include "chrome/browser/status_view.h" #include "net/url_request/url_request_job_tracker.h" class MessageLoop; class RenderProcessHost; class NavigationPerformanceViewer; class PageLoadView; namespace ChromeViews { class HWNDViewContainer; } class NetworkStatusView : public StatusView { public: // button types enum { IDC_CONFIG_TRACKING_BUTTON = 101, IDC_CURRENT_STATUS_BUTTON, IDC_CONFIG_PROFILING_BUTTON, IDC_SHOW_PERFORMANCE_BUTTON, IDC_CLEAR, IDC_PAGE_LISTBOX, }; NetworkStatusView(); virtual ~NetworkStatusView(); // TabContents overrides virtual const std::wstring GetDefaultTitle(); // StatusView implementation virtual void OnCreate(const CRect& rect); virtual void OnSize(const CRect& rect); BEGIN_MSG_MAP(NetworkStatusView) COMMAND_HANDLER_EX(IDC_CONFIG_TRACKING_BUTTON, BN_CLICKED, OnConfigTrackingClicked) COMMAND_HANDLER_EX(IDC_CURRENT_STATUS_BUTTON, BN_CLICKED, OnCurrentStatusClicked) COMMAND_HANDLER_EX(IDC_CLEAR, BN_CLICKED, OnClearClicked) COMMAND_HANDLER_EX(IDC_CONFIG_PROFILING_BUTTON, BN_CLICKED, OnConfigProfilingClicked) COMMAND_HANDLER_EX(IDC_SHOW_PERFORMANCE_BUTTON, BN_CLICKED, OnShowPerformanceClicked) COMMAND_HANDLER_EX(IDC_PAGE_LISTBOX, LBN_DBLCLK, OnPageDoubleClicked) CHAIN_MSG_MAP(StatusView); END_MSG_MAP() bool is_tracking() const { return is_tracking_; } private: // Event handlers void OnConfigTrackingClicked(UINT code, int button_id, HWND hwnd); void OnCurrentStatusClicked(UINT code, int button_id, HWND hwnd); void OnClearClicked(UINT code, int button_id, HWND hwnd); void OnConfigProfilingClicked(UINT code, int button_id, HWND hwnd); void OnShowPerformanceClicked(UINT code, int button_id, HWND hwnd); void OnPageDoubleClicked(UINT code, int listbox_id, HWND hwnd); void AppendText(const std::wstring& text); // Hide/Show tracking output window void HideTrackingResults(); void ShowTrackingResults(); // Clear tracking output void ClearTrackingResults(); // Hide/Show profiling output windows void HideProfilingResults(); void ShowProfilingResults(); // Clear profiling output void ClearProfilingResults(); // Show detailed profiling results for the page with given index. void ReportPagePerformance(int page_index); // A JobTracker is allocated to monitor network jobs running on the IO // thread. This allows the NetworkStatusView to remain single-threaded. class JobTracker : public URLRequestJobTracker::JobObserver, public base::RefCountedThreadSafe { public: JobTracker(NetworkStatusView* view); // Called by the NetworkStatusView on the main application thread. void StartTracking(); void StopTracking(); void ReportStatus(); // URLRequestJobTracker::JobObserver methods (called on the IO thread): virtual void OnJobAdded(URLRequestJob* job); virtual void OnJobRemoved(URLRequestJob* job); virtual void OnJobDone(URLRequestJob* job, const URLRequestStatus& status); virtual void OnJobRedirect(URLRequestJob* job, const GURL& location, int status_code); virtual void OnBytesRead(URLRequestJob* job, int byte_count); // The JobTracker may be deleted after NetworkStatusView is deleted. void DetachView() { view_ = NULL; } private: void InvokeOnIOThread(void (JobTracker::*method)()); // Called on the IO thread void OnStartTracking(); void OnStopTracking(); void OnReportStatus(); void AppendText(const std::wstring& text); // Called on the main thread void OnAppendText(const std::wstring& text); NetworkStatusView* view_; MessageLoop* view_message_loop_; }; friend class JobTracker; scoped_refptr tracker_; bool is_tracking_; // Textual output of network tracking CEdit text_area_; HFONT monospaced_font_; // For performance profiling bool is_profiling_; int profiling_session_id_; scoped_ptr performance_viewer_; // Output of performance profiling // List of pages being profiled CListBox page_list_; // Textual report of selected page loading performance CEdit page_text_; // Graphical report of selected page loading performance PageLoadView* page_load_view_; // We don't use a scoped_ptr here since the page_view_container_ deletes // itself when it is destroyed automatically by its parent window. ChromeViews::HWNDViewContainer* page_view_container_; // Current page being selected int current_page_index_; DISALLOW_EVIL_CONSTRUCTORS(NetworkStatusView); }; #endif // #ifndef CHROME_BROWSER_NETWORK_STATUS_VIEW_H__