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)#include "chrome/browser/ui/views/hung_renderer_view.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/i18n/rtl.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_vector.h" 9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/favicon/favicon_tab_helper.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/platform_util.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h" 13a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/browser_finder.h" 14a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/chrome_web_modal_dialog_manager_delegate.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tab_contents/core_tab_helper.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/tab_contents/tab_contents_iterator.h" 17a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/ui/views/constrained_window_views.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/chrome_constants.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/logging_chrome.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/generated_resources.h" 21a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "components/web_modal/web_contents_modal_dialog_host.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_process_host.h" 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/render_view_host.h" 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/public/browser/web_contents.h" 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/common/result_codes.h" 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/theme_resources.h" 270529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "ui/aura/window.h" 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h" 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/resource/resource_bundle.h" 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/canvas.h" 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/views/controls/button/label_button.h" 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/image_view.h" 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/controls/label.h" 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/grid_layout.h" 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/layout/layout_constants.h" 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h" 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/window/client_view.h" 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 39a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_WIN) 400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "chrome/browser/hang_monitor/hang_crash_dump_win.h" 41a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/profiles/profile.h" 42a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "chrome/browser/shell_integration.h" 43a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/base/win/shell.h" 44a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include "ui/views/win/hwnd_util.h" 45a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 46a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using content::WebContents; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HungRendererDialogView* HungRendererDialogView::g_instance_ = NULL; 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HungPagesTableModel, public: 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HungPagesTableModel::HungPagesTableModel(Delegate* delegate) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : observer_(NULL), 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_(delegate) { 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HungPagesTableModel::~HungPagesTableModel() { 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)content::RenderProcessHost* HungPagesTableModel::GetRenderProcessHost() { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tab_observers_.empty() ? NULL : 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_observers_[0]->web_contents()->GetRenderProcessHost(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)content::RenderViewHost* HungPagesTableModel::GetRenderViewHost() { 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return tab_observers_.empty() ? NULL : 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_observers_[0]->web_contents()->GetRenderViewHost(); 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HungPagesTableModel::InitForWebContents(WebContents* hung_contents) { 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_observers_.clear(); 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hung_contents) { 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Force hung_contents to be first. 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (hung_contents) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_observers_.push_back(new WebContentsObserverImpl(this, 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hung_contents)); 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) for (TabContentsIterator it; !it.done(); it.Next()) { 812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (*it != hung_contents && 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) it->GetRenderProcessHost() == hung_contents->GetRenderProcessHost()) 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_observers_.push_back(new WebContentsObserverImpl(this, *it)); 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // The world is different. 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (observer_) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer_->OnModelChanged(); 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// HungPagesTableModel, ui::TableModel implementation: 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int HungPagesTableModel::RowCount() { 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return static_cast<int>(tab_observers_.size()); 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 HungPagesTableModel::GetText(int row, int column_id) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(row >= 0 && row < RowCount()); 100a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) base::string16 title = tab_observers_[row]->web_contents()->GetTitle(); 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (title.empty()) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) title = CoreTabHelper::GetDefaultTitle(); 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(xji): Consider adding a special case if the title text is a URL, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // since those should always have LTR directionality. Please refer to 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // http://crbug.com/6726 for more information. 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::i18n::AdjustStringForLocaleDirection(&title); 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return title; 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::ImageSkia HungPagesTableModel::GetIcon(int row) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(row >= 0 && row < RowCount()); 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return FaviconTabHelper::FromWebContents( 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_observers_[row]->web_contents())->GetFavicon().AsImageSkia(); 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HungPagesTableModel::SetObserver(ui::TableModelObserver* observer) { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer_ = observer; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void HungPagesTableModel::GetGroupRange(int model_index, 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) views::GroupRange* range) { 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(range); 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range->start = 0; 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) range->length = RowCount(); 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HungPagesTableModel::TabDestroyed(WebContentsObserverImpl* tab) { 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Clean up tab_observers_ and notify our observer. 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TabObservers::iterator i = std::find( 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_observers_.begin(), tab_observers_.end(), tab); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(i != tab_observers_.end()); 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int index = static_cast<int>(i - tab_observers_.begin()); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tab_observers_.erase(i); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (observer_) 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observer_->OnItemsRemoved(index, 1); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Notify the delegate. 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) delegate_->TabDestroyed(); 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WARNING: we've likely been deleted. 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HungPagesTableModel::WebContentsObserverImpl::WebContentsObserverImpl( 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) HungPagesTableModel* model, WebContents* tab) 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : content::WebContentsObserver(tab), 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) model_(model) { 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid HungPagesTableModel::WebContentsObserverImpl::RenderProcessGone( 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::TerminationStatus status) { 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_->TabDestroyed(this); 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 153010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)void HungPagesTableModel::WebContentsObserverImpl::WebContentsDestroyed() { 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) model_->TabDestroyed(this); 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HungRendererDialogView 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)gfx::ImageSkia* HungRendererDialogView::frozen_icon_ = NULL; 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The dimensions of the hung pages list table view, in pixels. 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kTableViewWidth = 300; 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kTableViewHeight = 100; 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Padding space in pixels between frozen icon to the info label, hung pages 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// list table view and the Kill pages button. 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kCentralColumnPadding = 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::kUnrelatedControlLargeHorizontalSpacing; 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HungRendererDialogView, public: 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 17690dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles)HungRendererDialogView* HungRendererDialogView::Create( 17790dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) gfx::NativeView context) { 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!g_instance_) { 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_instance_ = new HungRendererDialogView; 18090dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) views::DialogDelegate::CreateDialogWidget(g_instance_, context, NULL); 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_instance_; 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HungRendererDialogView* HungRendererDialogView::GetInstance() { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return g_instance_; 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HungRendererDialogView::IsFrameActive(WebContents* contents) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeView frame_view = 193010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) platform_util::GetTopLevel(contents->GetNativeView()); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return platform_util::IsWindowActive(frame_view); 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HungRendererDialogView::KillRendererProcess( 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ProcessHandle process_handle) { 2000529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#if defined(OS_WIN) 2010529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Try to generate a crash report for the hung process. 2020529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch CrashDumpAndTerminateHungChildProcess(process_handle); 2030529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#else 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::KillProcess(process_handle, content::RESULT_CODE_HUNG, false); 2050529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#endif 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HungRendererDialogView::HungRendererDialogView() 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : hung_pages_table_(NULL), 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kill_button_(NULL), 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initialized_(false) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) InitClass(); 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)HungRendererDialogView::~HungRendererDialogView() { 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hung_pages_table_->SetModel(NULL); 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HungRendererDialogView::ShowForWebContents(WebContents* contents) { 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(contents && GetWidget()); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't show the warning unless the foreground window is the frame, or this 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // window (but still invisible). If the user has another window or 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // application selected, activating ourselves is rude. 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!IsFrameActive(contents) && 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) !platform_util::IsWindowActive(GetWidget()->GetNativeWindow())) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!GetWidget()->IsActive()) { 231a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Place the dialog over content's browser window, similar to modal dialogs. 232a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Browser* browser = chrome::FindBrowserWithWebContents(contents); 233a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) if (browser) { 234a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ChromeWebModalDialogManagerDelegate* manager = browser; 235a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) UpdateBrowserModalDialogPosition( 236a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) GetWidget(), manager->GetWebContentsModalDialogHost()); 237a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) } 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) gfx::NativeView frame_view = 240010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) platform_util::GetTopLevel(contents->GetNativeView()); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget* insert_after = 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Widget::GetWidgetForNativeView(frame_view); 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (insert_after) 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWidget()->StackAboveWidget(insert_after); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 246a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#if defined(OS_WIN) 247a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Group the hung renderer dialog with the browsers with the same profile. 248a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Profile* profile = 249a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Profile::FromBrowserContext(contents->GetBrowserContext()); 250a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ui::win::SetAppIdForWindow( 251a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ShellIntegration::GetChromiumModelIdForProfile(profile->GetPath()), 252a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) views::HWNDForWidget(GetWidget())); 253a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#endif 254a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We only do this if the window isn't active (i.e. hasn't been shown yet, 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // or is currently shown but deactivated for another WebContents). This is 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // because this window is a singleton, and it's possible another active 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // renderer may hang while this one is showing, and we don't want to reset 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the list of hung pages for a potentially unrelated renderer while this 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // one is showing. 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hung_pages_table_model_->InitForWebContents(contents); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWidget()->Show(); 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HungRendererDialogView::EndForWebContents(WebContents* contents) { 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(contents); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hung_pages_table_model_->RowCount() == 0 || 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hung_pages_table_model_->GetRenderProcessHost() == 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) contents->GetRenderProcessHost()) { 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWidget()->Close(); 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Close is async, make sure we drop our references to the tab immediately 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // (it may be going away). 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hung_pages_table_model_->InitForWebContents(NULL); 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HungRendererDialogView, views::DialogDelegate implementation: 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 HungRendererDialogView::GetWindowTitle() const { 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16(IDS_BROWSER_HANGMONITOR_RENDERER_TITLE); 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HungRendererDialogView::WindowClosing() { 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We are going to be deleted soon, so make sure our instance is destroyed. 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) g_instance_ = NULL; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)int HungRendererDialogView::GetDialogButtons() const { 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // We specifically don't want a CANCEL button here because that code path is 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // also called when the window is closed by the user clicking the X button in 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the window's titlebar, and also if we call Window::Close. Rather, we want 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the OK button to wait for responsiveness (and close the dialog) and our 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // additional button (which we create) to kill the process (which will result 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // in the dialog being destroyed). 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return ui::DIALOG_BUTTON_OK; 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 HungRendererDialogView::GetDialogButtonLabel( 3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::DialogButton button) const { 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (button == ui::DIALOG_BUTTON_OK) 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return l10n_util::GetStringUTF16(IDS_BROWSER_HANGMONITOR_RENDERER_WAIT); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return views::DialogDelegateView::GetDialogButtonLabel(button); 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)views::View* HungRendererDialogView::CreateExtraView() { 3082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DCHECK(!kill_button_); 3092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) kill_button_ = new views::LabelButton(this, 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) l10n_util::GetStringUTF16(IDS_BROWSER_HANGMONITOR_RENDERER_END)); 3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) kill_button_->SetStyle(views::Button::STYLE_BUTTON); 3122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return kill_button_; 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool HungRendererDialogView::Accept(bool window_closing) { 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Don't do anything if we're being called only because the dialog is being 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // destroyed and we don't supply a Cancel function... 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (window_closing) 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Start waiting again for responsiveness. 3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (hung_pages_table_model_->GetRenderViewHost()) 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hung_pages_table_model_->GetRenderViewHost()->RestartHangMonitorTimeout(); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return true; 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 327f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 328f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)bool HungRendererDialogView::UseNewStyleForThisDialog() const { 329f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#if defined(OS_WIN) 330f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // Use the old dialog style without Aero glass, otherwise the dialog will be 331f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // visually constrained to browser window bounds. See http://crbug.com/323278 332f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return ui::win::IsAeroGlassEnabled(); 33323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#else 334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) return views::DialogDelegateView::UseNewStyleForThisDialog(); 33523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif 336f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)} 337f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HungRendererDialogView, views::ButtonListener implementation: 3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HungRendererDialogView::ButtonPressed( 3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Button* sender, const ui::Event& event) { 3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (sender == kill_button_ && 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hung_pages_table_model_->GetRenderProcessHost()) { 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::ProcessHandle process_handle = 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hung_pages_table_model_->GetRenderProcessHost()->GetHandle(); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) KillRendererProcess(process_handle); 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HungRendererDialogView, HungPagesTableModel::Delegate overrides: 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HungRendererDialogView::TabDestroyed() { 3565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetWidget()->Close(); 3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HungRendererDialogView, views::View overrides: 3615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 362a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles)void HungRendererDialogView::ViewHierarchyChanged( 363a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) const ViewHierarchyChangedDetails& details) { 364a93a17c8d99d686bd4a1511e5504e5e6cc9fcadfTorne (Richard Coles) if (!initialized_ && details.is_add && details.child == this && GetWidget()) 3655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Init(); 3665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/////////////////////////////////////////////////////////////////////////////// 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// HungRendererDialogView, private: 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HungRendererDialogView::Init() { 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::ImageView* frozen_icon_view = new views::ImageView; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frozen_icon_view->SetImage(frozen_icon_); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::Label* info_label = new views::Label( 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) l10n_util::GetStringUTF16(IDS_BROWSER_HANGMONITOR_RENDERER)); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info_label->SetMultiLine(true); 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) hung_pages_table_model_.reset(new HungPagesTableModel(this)); 3815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::vector<ui::TableColumn> columns; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) columns.push_back(ui::TableColumn()); 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hung_pages_table_ = new views::TableView( 384c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) hung_pages_table_model_.get(), columns, views::ICON_AND_TEXT, true); 3852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) hung_pages_table_->SetGrouper(hung_pages_table_model_.get()); 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using views::GridLayout; 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) using views::ColumnSet; 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GridLayout* layout = GridLayout::CreatePanel(this); 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetLayoutManager(layout); 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const int double_column_set_id = 0; 3945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ColumnSet* column_set = layout->AddColumnSet(double_column_set_id); 3955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddColumn(GridLayout::LEADING, GridLayout::LEADING, 0, 3965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GridLayout::FIXED, frozen_icon_->width(), 0); 3975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddPaddingColumn(0, kCentralColumnPadding); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) column_set->AddColumn(GridLayout::FILL, GridLayout::FILL, 1, 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GridLayout::USE_PREF, 0, 0); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(0, double_column_set_id); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(frozen_icon_view, 1, 3); 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add the label with a preferred width of 1, this way it doesn't effect the 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // overall preferred size of the dialog. 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView( 4065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info_label, 1, 1, GridLayout::FILL, GridLayout::LEADING, 1, 0); 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->StartRow(0, double_column_set_id); 4115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->SkipColumns(1); 4125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) layout->AddView(hung_pages_table_->CreateParentIfNecessary(), 1, 1, 4135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::GridLayout::FILL, 4145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) views::GridLayout::FILL, kTableViewWidth, kTableViewHeight); 4155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initialized_ = true; 4175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HungRendererDialogView::InitClass() { 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static bool initialized = false; 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!initialized) { 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance(); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) frozen_icon_ = rb.GetImageSkiaNamed(IDR_FROZEN_TAB_ICON); 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) initialized = true; 4265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace chrome { 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ShowHungRendererDialog(WebContents* contents) { 4320529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (logging::DialogsAreSuppressed()) 4330529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return; 4340529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4350529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch gfx::NativeView toplevel_view = 436010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) platform_util::GetTopLevel(contents->GetNativeView()); 4370529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // Don't show the dialog if there is no root window for the renderer, because 4380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // it's invisible to the user (happens when the renderer is for prerendering 4390529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch // for example). 4400529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!toplevel_view->GetRootWindow()) 4410529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return; 4420529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch HungRendererDialogView* view = HungRendererDialogView::Create(toplevel_view); 4430529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch view->ShowForWebContents(contents); 4445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void HideHungRendererDialog(WebContents* contents) { 4470529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch if (!logging::DialogsAreSuppressed() && HungRendererDialogView::GetInstance()) 4485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) HungRendererDialogView::GetInstance()->EndForWebContents(contents); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace chrome 452