1// Copyright (c) 2013 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef CHROME_TEST_CHROMEDRIVER_CHROME_NAVIGATION_TRACKER_H_
6#define CHROME_TEST_CHROMEDRIVER_CHROME_NAVIGATION_TRACKER_H_
7
8#include <set>
9#include <string>
10
11#include "base/basictypes.h"
12#include "base/compiler_specific.h"
13#include "base/memory/scoped_ptr.h"
14#include "chrome/test/chromedriver/chrome/devtools_event_listener.h"
15#include "chrome/test/chromedriver/chrome/status.h"
16
17namespace base {
18class DictionaryValue;
19}
20
21struct BrowserInfo;
22class DevToolsClient;
23class Status;
24
25// Tracks the navigation state of the page.
26class NavigationTracker : public DevToolsEventListener {
27 public:
28  enum LoadingState {
29    kUnknown,
30    kLoading,
31    kNotLoading,
32  };
33
34  NavigationTracker(DevToolsClient* client, const BrowserInfo* browser_info);
35
36  NavigationTracker(DevToolsClient* client,
37                    LoadingState known_state,
38                    const BrowserInfo* browser_info);
39
40  virtual ~NavigationTracker();
41
42  // Gets whether a navigation is pending for the specified frame. |frame_id|
43  // may be empty to signify the main frame.
44  Status IsPendingNavigation(const std::string& frame_id, bool* is_pending);
45
46  // Overridden from DevToolsEventListener:
47  virtual Status OnConnected(DevToolsClient* client) OVERRIDE;
48  virtual Status OnEvent(DevToolsClient* client,
49                         const std::string& method,
50                         const base::DictionaryValue& params) OVERRIDE;
51  virtual Status OnCommandSuccess(DevToolsClient* client,
52                                  const std::string& method) OVERRIDE;
53
54 private:
55  DevToolsClient* client_;
56  LoadingState loading_state_;
57  const BrowserInfo* browser_info_;
58  std::set<std::string> pending_frame_set_;
59  std::set<std::string> scheduled_frame_set_;
60
61  void ResetLoadingState(LoadingState loading_state);
62
63  DISALLOW_COPY_AND_ASSIGN(NavigationTracker);
64};
65
66#endif  // CHROME_TEST_CHROMEDRIVER_CHROME_NAVIGATION_TRACKER_H_
67