Index: chrome/browser/views/about_network_dialog.cc |
=================================================================== |
--- chrome/browser/views/about_network_dialog.cc (revision 51548) |
+++ chrome/browser/views/about_network_dialog.cc (working copy) |
@@ -1,379 +0,0 @@ |
-// Copyright (c) 2010 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. |
- |
-#include "chrome/browser/views/about_network_dialog.h" |
- |
-#include "base/message_loop.h" |
-#include "base/thread.h" |
-#include "base/utf_string_conversions.h" |
-#include "chrome/browser/chrome_thread.h" |
-#include "net/url_request/url_request.h" |
-#include "net/url_request/url_request_job.h" |
-#include "net/url_request/url_request_job_tracker.h" |
-#include "views/grid_layout.h" |
-#include "views/controls/button/text_button.h" |
-#include "views/controls/textfield/textfield.h" |
-#include "views/standard_layout.h" |
-#include "views/window/window.h" |
- |
-namespace { |
- |
-// We don't localize this UI since this is a developer-only feature. |
-const wchar_t kStartTrackingLabel[] = L"Start tracking"; |
-const wchar_t kStopTrackingLabel[] = L"Stop tracking"; |
-const wchar_t kShowCurrentLabel[] = L"Show Current"; |
-const wchar_t kClearLabel[] = L"Clear"; |
- |
-// The singleton dialog box. This is non-NULL when a dialog is active so we |
-// know not to create a new one. |
-AboutNetworkDialog* active_dialog = NULL; |
- |
-// Returns a string representing the URL, handling the case where the spec |
-// is invalid. |
-std::wstring StringForURL(const GURL& url) { |
- if (url.is_valid()) |
- return UTF8ToWide(url.spec()); |
- return UTF8ToWide(url.possibly_invalid_spec()) + L" (invalid)"; |
-} |
- |
-std::wstring URLForJob(URLRequestJob* job) { |
- URLRequest* request = job->request(); |
- if (request) |
- return StringForURL(request->url()); |
- return std::wstring(L"(orphaned)"); |
-} |
- |
-// JobTracker ------------------------------------------------------------------ |
- |
-// 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<JobTracker> { |
- public: |
- explicit JobTracker(AboutNetworkDialog* 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: |
- friend class base::RefCountedThreadSafe<JobTracker>; |
- |
- ~JobTracker(); |
- |
- 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); |
- |
- AboutNetworkDialog* view_; |
- MessageLoop* view_message_loop_; |
-}; |
- |
-// main thread: |
-JobTracker::JobTracker(AboutNetworkDialog* view) |
- : view_(view), |
- view_message_loop_(MessageLoop::current()) { |
-} |
- |
-JobTracker::~JobTracker() { |
-} |
- |
-// main thread: |
-void JobTracker::InvokeOnIOThread(void (JobTracker::*m)()) { |
- ChromeThread::PostTask( |
- ChromeThread::IO, FROM_HERE, NewRunnableMethod(this, m)); |
-} |
- |
-// main thread: |
-void JobTracker::StartTracking() { |
- DCHECK(MessageLoop::current() == view_message_loop_); |
- DCHECK(view_); |
- InvokeOnIOThread(&JobTracker::OnStartTracking); |
-} |
- |
-// main thread: |
-void JobTracker::StopTracking() { |
- DCHECK(MessageLoop::current() == view_message_loop_); |
- // The tracker should not be deleted before it is removed from observer |
- // list. |
- AddRef(); |
- InvokeOnIOThread(&JobTracker::OnStopTracking); |
-} |
- |
-// main thread: |
-void JobTracker::ReportStatus() { |
- DCHECK(MessageLoop::current() == view_message_loop_); |
- InvokeOnIOThread(&JobTracker::OnReportStatus); |
-} |
- |
-// main thread: |
-void JobTracker::OnAppendText(const std::wstring& text) { |
- DCHECK(MessageLoop::current() == view_message_loop_); |
- if (view_ && view_->tracking()) |
- view_->AppendText(text); |
-} |
- |
-// IO thread: |
-void JobTracker::AppendText(const std::wstring& text) { |
- DCHECK(MessageLoop::current() != view_message_loop_); |
- view_message_loop_->PostTask(FROM_HERE, NewRunnableMethod( |
- this, &JobTracker::OnAppendText, text)); |
-} |
- |
-// IO thread: |
-void JobTracker::OnStartTracking() { |
- DCHECK(MessageLoop::current() != view_message_loop_); |
- g_url_request_job_tracker.AddObserver(this); |
-} |
- |
-// IO thread: |
-void JobTracker::OnStopTracking() { |
- DCHECK(MessageLoop::current() != view_message_loop_); |
- g_url_request_job_tracker.RemoveObserver(this); |
- // Balance the AddRef() in StopTracking() called in main thread. |
- Release(); |
-} |
- |
-// IO thread: |
-void JobTracker::OnReportStatus() { |
- DCHECK(MessageLoop::current() != view_message_loop_); |
- |
- std::wstring text(L"\r\n===== Active Job Summary =====\r\n"); |
- |
- URLRequestJobTracker::JobIterator begin_job = |
- g_url_request_job_tracker.begin(); |
- URLRequestJobTracker::JobIterator end_job = g_url_request_job_tracker.end(); |
- int orphaned_count = 0; |
- int regular_count = 0; |
- for (URLRequestJobTracker::JobIterator cur = begin_job; |
- cur != end_job; ++cur) { |
- URLRequestJob* job = (*cur); |
- URLRequest* request = job->request(); |
- if (!request) { |
- orphaned_count++; |
- continue; |
- } |
- |
- regular_count++; |
- |
- // active state |
- if (job->is_done()) |
- text.append(L" Done: "); |
- else |
- text.append(L" Active: "); |
- |
- // URL |
- text.append(StringForURL(request->url())); |
- text.append(L"\r\n"); |
- } |
- |
- if (regular_count == 0) |
- text.append(L" (No active jobs)\r\n"); |
- |
- if (orphaned_count) { |
- wchar_t buf[64]; |
- swprintf(buf, arraysize(buf), L" %d orphaned jobs\r\n", orphaned_count); |
- text.append(buf); |
- } |
- |
- text.append(L"=====\r\n\r\n"); |
- AppendText(text); |
-} |
- |
-// IO thread: |
-void JobTracker::OnJobAdded(URLRequestJob* job) { |
- DCHECK(MessageLoop::current() != view_message_loop_); |
- |
- std::wstring text(L"+ New job : "); |
- text.append(URLForJob(job)); |
- text.append(L"\r\n"); |
- AppendText(text); |
-} |
- |
-// IO thread: |
-void JobTracker::OnJobRemoved(URLRequestJob* job) { |
- DCHECK(MessageLoop::current() != view_message_loop_); |
-} |
- |
-// IO thread: |
-void JobTracker::OnJobDone(URLRequestJob* job, |
- const URLRequestStatus& status) { |
- DCHECK(MessageLoop::current() != view_message_loop_); |
- |
- std::wstring text; |
- if (status.is_success()) { |
- text.assign(L"- Complete: "); |
- } else if (status.status() == URLRequestStatus::CANCELED) { |
- text.assign(L"- Canceled: "); |
- } else if (status.status() == URLRequestStatus::HANDLED_EXTERNALLY) { |
- text.assign(L"- Handled externally: "); |
- } else { |
- wchar_t buf[32]; |
- swprintf(buf, arraysize(buf), L"Failed with %d: ", status.os_error()); |
- text.assign(buf); |
- } |
- |
- text.append(URLForJob(job)); |
- text.append(L"\r\n"); |
- AppendText(text); |
-} |
- |
-// IO thread: |
-void JobTracker::OnJobRedirect(URLRequestJob* job, |
- const GURL& location, |
- int status_code) { |
- DCHECK(MessageLoop::current() != view_message_loop_); |
- |
- std::wstring text(L"- Redirect: "); |
- text.append(URLForJob(job)); |
- text.append(L"\r\n "); |
- |
- wchar_t buf[16]; |
- swprintf(buf, arraysize(buf), L"(%d) to: ", status_code); |
- text.append(buf); |
- |
- text.append(StringForURL(location)); |
- text.append(L"\r\n"); |
- AppendText(text); |
-} |
- |
-void JobTracker::OnBytesRead(URLRequestJob* job, int byte_count) { |
-} |
- |
-// The singleton job tracker associated with the dialog. |
-JobTracker* tracker = NULL; |
- |
-} // namespace |
- |
-// AboutNetworkDialog ---------------------------------------------------------- |
- |
-AboutNetworkDialog::AboutNetworkDialog() : tracking_(false) { |
- SetupControls(); |
- tracker = new JobTracker(this); |
- tracker->AddRef(); |
-} |
- |
-AboutNetworkDialog::~AboutNetworkDialog() { |
- active_dialog = NULL; |
- tracker->StopTracking(); |
- tracker->Release(); |
- tracker = NULL; |
-} |
- |
-// static |
-void AboutNetworkDialog::RunDialog() { |
- if (!active_dialog) { |
- active_dialog = new AboutNetworkDialog; |
- views::Window::CreateChromeWindow(NULL, gfx::Rect(), active_dialog)->Show(); |
- } else { |
- // TOOD(brettw) it would be nice to focus the existing window. |
- } |
-} |
- |
-void AboutNetworkDialog::AppendText(const std::wstring& text) { |
- text_field_->AppendText(text); |
-} |
- |
-void AboutNetworkDialog::SetupControls() { |
- views::GridLayout* layout = CreatePanelGridLayout(this); |
- SetLayoutManager(layout); |
- |
- track_toggle_ = new views::TextButton(this, kStartTrackingLabel); |
- show_button_ = new views::TextButton(this, kShowCurrentLabel); |
- clear_button_ = new views::TextButton(this, kClearLabel); |
- |
- text_field_ = new views::Textfield(static_cast<views::Textfield::StyleFlags>( |
- views::Textfield::STYLE_MULTILINE)); |
- text_field_->SetReadOnly(true); |
- |
- // TODO(brettw): We may want to add this in the future. It can't be called |
- // from here, though, since the hwnd for the field hasn't been created yet. |
- // |
- // This raises the maximum number of chars from 32K to some large maximum, |
- // probably 2GB. 32K is not nearly enough for our use-case. |
- // SendMessageW(text_field_->GetNativeComponent(), EM_SETLIMITTEXT, 0, 0); |
- |
- static const int first_column_set = 1; |
- views::ColumnSet* column_set = layout->AddColumnSet(first_column_set); |
- column_set->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, |
- 33.33f, views::GridLayout::FIXED, 0, 0); |
- column_set->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, |
- 33.33f, views::GridLayout::FIXED, 0, 0); |
- column_set->AddColumn(views::GridLayout::CENTER, views::GridLayout::CENTER, |
- 33.33f, views::GridLayout::FIXED, 0, 0); |
- |
- static const int text_column_set = 2; |
- column_set = layout->AddColumnSet(text_column_set); |
- column_set->AddColumn(views::GridLayout::FILL, views::GridLayout::FILL, |
- 100.0f, |
- views::GridLayout::FIXED, 0, 0); |
- |
- layout->StartRow(0, first_column_set); |
- layout->AddView(track_toggle_); |
- layout->AddView(show_button_); |
- layout->AddView(clear_button_); |
- layout->AddPaddingRow(0, kRelatedControlVerticalSpacing); |
- layout->StartRow(1.0f, text_column_set); |
- layout->AddView(text_field_); |
-} |
- |
-gfx::Size AboutNetworkDialog::GetPreferredSize() { |
- return gfx::Size(800, 400); |
-} |
- |
-views::View* AboutNetworkDialog::GetContentsView() { |
- return this; |
-} |
- |
-int AboutNetworkDialog::GetDialogButtons() const { |
- // Don't want OK or Cancel. |
- return 0; |
-} |
- |
-std::wstring AboutNetworkDialog::GetWindowTitle() const { |
- return L"about:network"; |
-} |
- |
-bool AboutNetworkDialog::CanResize() const { |
- return true; |
-} |
- |
-void AboutNetworkDialog::ButtonPressed( |
- views::Button* button, const views::Event& event) { |
- if (button == track_toggle_) { |
- if (tracking_) { |
- track_toggle_->SetText(kStartTrackingLabel); |
- tracking_ = false; |
- tracker->StopTracking(); |
- } else { |
- track_toggle_->SetText(kStopTrackingLabel); |
- tracking_ = true; |
- tracker->StartTracking(); |
- } |
- track_toggle_->SchedulePaint(); |
- } else if (button == show_button_) { |
- tracker->ReportStatus(); |
- } else if (button == clear_button_) { |
- text_field_->SetText(std::wstring()); |
- } |
-} |