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