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 "ui/views/debug_utils.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include <ostream> 82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/view.h" 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace views { 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintViewHierarchyImp(const View* view, 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int indent, 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::wostringstream* out) { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ind = indent; 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (ind-- > 0) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << L' '; 215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *out << base::UTF8ToWide(view->GetClassName()); 222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << L' '; 232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << view->id(); 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << L' '; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << view->x() << L"," << view->y() << L","; 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << view->bounds().right() << L"," << view->bounds().bottom(); 272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << L' '; 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << view; 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << L'\n'; 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) for (int i = 0, count = view->child_count(); i < count; ++i) 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrintViewHierarchyImp(view->child_at(i), indent + 2, out); 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void PrintFocusHierarchyImp(const View* view, 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int indent, 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::wostringstream* out) { 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) int ind = indent; 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) while (ind-- > 0) 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << L' '; 415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) *out << base::UTF8ToWide(view->GetClassName()); 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << L' '; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << view->id(); 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << L' '; 45b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles) *out << view->GetClassName(); 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << L' '; 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << view; 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) *out << L'\n'; 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (view->child_count() > 0) 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrintFocusHierarchyImp(view->child_at(0), indent + 2, out); 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const View* next_focusable = view->GetNextFocusableView(); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (next_focusable) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrintFocusHierarchyImp(next_focusable, indent, out); 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintViewHierarchy(const View* view) { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::wostringstream out; 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out << L"View hierarchy:\n"; 622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrintViewHierarchyImp(view, 0, &out); 632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Error so users in the field can generate and upload logs. 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << out.str(); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void PrintFocusHierarchy(const View* view) { 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::wostringstream out; 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) out << L"Focus hierarchy:\n"; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PrintFocusHierarchyImp(view, 0, &out); 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Error so users in the field can generate and upload logs. 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) LOG(ERROR) << out.str(); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace views 76