summaryrefslogtreecommitdiffstats
path: root/chrome/test/webdriver/webdriver_error.cc
blob: f1831bda09403e311a028dd0481cdb60944555a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// Copyright (c) 2011 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/test/webdriver/webdriver_error.h"

#include <sstream>

namespace webdriver {

namespace {

// Returns the string equivalent of the given |ErrorCode|.
const char* DefaultMessageForErrorCode(ErrorCode code) {
  switch (code) {
    case kSuccess:
      return "Success";
    case kNoSuchElement:
      return "The element could not be found";
    case kNoSuchFrame:
      return "The frame could not be found";
    case kUnknownCommand:
      return "Unknown command";
    case kStaleElementReference:
      return "Element reference is invalid";
    case kElementNotVisible:
      return "Element is not visible";
    case kInvalidElementState:
      return "Element is in an invalid state";
    case kUnknownError:
      return "Unknown error";
    case kElementNotSelectable:
      return "Element is not selectable";
    case kXPathLookupError:
      return "XPath lookup error";
    case kNoSuchWindow:
      return "The window could not be found";
    case kInvalidCookieDomain:
      return "The cookie domain is invalid";
    case kUnableToSetCookie:
      return "Unable to set cookie";
    default:
      return "<unknown>";
  }
}

}  // namespace

Error::Error(ErrorCode code): code_(code) {
}

Error::Error(ErrorCode code, const std::string& details)
    : code_(code), details_(details) {
}

Error::~Error() {
}

void Error::AddDetails(const std::string& details) {
  if (details_.empty())
    details_ = details;
  else
    details_ = details + ";\n " + details_;
}

std::string Error::GetErrorMessage() const {
  std::string msg;
  if (details_.length())
    msg = details_;
  else
    msg = DefaultMessageForErrorCode(code_);

  // Only include a stacktrace on Linux. Windows and Mac have all symbols
  // stripped in release builds.
#if defined(OS_LINUX)
  size_t count = 0;
  trace_.Addresses(&count);
  if (count > 0) {
    std::ostringstream ostream;
    trace_.OutputToStream(&ostream);
    msg += "\n";
    msg += ostream.str();
  }
#endif
  return msg;
}

ErrorCode Error::code() const {
  return code_;
}

const std::string& Error::details() const {
  return details_;
}

const base::debug::StackTrace& Error::trace() const {
  return trace_;
}

}  // namespace webdriver