File: frame_navigation_state.h

package info (click to toggle)
chromium-browser 41.0.2272.118-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie-kfreebsd
  • size: 2,189,132 kB
  • sloc: cpp: 9,691,462; ansic: 3,341,451; python: 712,689; asm: 518,779; xml: 208,926; java: 169,820; sh: 119,353; perl: 68,907; makefile: 28,311; yacc: 13,305; objc: 11,385; tcl: 3,186; cs: 2,225; sql: 2,217; lex: 2,215; lisp: 1,349; pascal: 1,256; awk: 407; ruby: 155; sed: 53; php: 14; exp: 11
file content (140 lines) | stat: -rw-r--r-- 5,356 bytes parent folder | download
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
// Copyright (c) 2012 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.

#ifndef CHROME_BROWSER_EXTENSIONS_API_WEB_NAVIGATION_FRAME_NAVIGATION_STATE_H_
#define CHROME_BROWSER_EXTENSIONS_API_WEB_NAVIGATION_FRAME_NAVIGATION_STATE_H_

#include <map>
#include <set>

#include "base/compiler_specific.h"
#include "url/gurl.h"

namespace content {
class RenderFrameHost;
class RenderViewHost;
}

namespace extensions {

// Tracks the navigation state of all frame hosts in a given tab currently known
// to the webNavigation API. It is mainly used to track in which frames an error
// occurred so no further events for this frame are being sent.
class FrameNavigationState {
 public:
  typedef std::set<content::RenderFrameHost*>::const_iterator const_iterator;

  FrameNavigationState();
  ~FrameNavigationState();

  // Use these to iterate over all frame hosts known by this object.
  const_iterator begin() const { return frame_hosts_.begin(); }
  const_iterator end() const { return frame_hosts_.end(); }

  // True if navigation events for the given frame can be sent.
  bool CanSendEvents(content::RenderFrameHost* frame_host) const;

  // TODO(dcheng): This should be static.
  // True if in general webNavigation events may be sent for the given URL.
  bool IsValidUrl(const GURL& url) const;

  // Starts to track a |frame_host| showing the URL |url|.
  void TrackFrame(content::RenderFrameHost* frame_host,
                  const GURL& url,
                  bool is_error_page,
                  bool is_iframe_srcdoc);

  // Marks |frame_host| as detached and stops tracking it.
  void FrameDetached(content::RenderFrameHost* frame_host);

  // Stops tracking all frame hosts but |frame_host_to_skip| in
  // |render_view_host|.
  void StopTrackingFramesInRVH(content::RenderViewHost* render_view_host,
                               content::RenderFrameHost* frame_host_to_skip);

  // Update the URL associated with |frame_host|.
  void UpdateFrame(content::RenderFrameHost* frame_host, const GURL& url);

  // Returns true if |frame_host| is a known frame host.
  bool IsValidFrame(content::RenderFrameHost* frame_host) const;

  // Returns the URL corresponding to a tracked |frame_host|.
  // TODO(dcheng): Why is this needed? Can't this information be extracted from
  // RenderFrameHost?
  GURL GetUrl(content::RenderFrameHost* frame_host) const;

  // Returns a pointer to the last comitted main frame host.
  content::RenderFrameHost* GetLastCommittedMainFrameHost() const;

  // Marks |frame_host| as in an error state, i.e. the onErrorOccurred event was
  // fired for it, and no further events should be sent for it.
  void SetErrorOccurredInFrame(content::RenderFrameHost* frame_host);

  // True if |frame_host| is marked as being in an error state.
  bool GetErrorOccurredInFrame(content::RenderFrameHost* frame_host) const;

  // Marks |frame_host| as having finished its last navigation, i.e. the
  // onCompleted event was fired for this frame.
  void SetNavigationCompleted(content::RenderFrameHost* frame_host);

  // True if |frame_host| is currently not navigating.
  bool GetNavigationCompleted(content::RenderFrameHost* frame_host) const;

  // Marks |frame_host| as having finished parsing.
  void SetParsingFinished(content::RenderFrameHost* frame_host);

  // True if |frame_host| has finished parsing.
  bool GetParsingFinished(content::RenderFrameHost* frame_host) const;

  // Marks |frame_host| as having committed its navigation, i.e. the onCommitted
  // event was fired for this frame.
  void SetNavigationCommitted(content::RenderFrameHost* frame_host);

  // True if |frame_host| has committed its navigation.
  bool GetNavigationCommitted(content::RenderFrameHost* frame_host) const;

  // Marks |frame_host| as redirected by the server.
  void SetIsServerRedirected(content::RenderFrameHost* frame_host);

  // True if |frame_host| was redirected by the server.
  bool GetIsServerRedirected(content::RenderFrameHost* frame_host) const;

#ifdef UNIT_TEST
  static void set_allow_extension_scheme(bool allow_extension_scheme) {
    allow_extension_scheme_ = allow_extension_scheme;
  }
#endif

 private:
  struct FrameState {
    FrameState();

    bool error_occurred;  // True if an error has occurred in this frame.
    bool is_iframe_srcdoc;  // True if the frame is displaying its srcdoc.
    bool is_navigating;  // True if there is a navigation going on.
    bool is_committed;  // True if the navigation is already committed.
    bool is_server_redirected;  // True if a server redirect happened.
    bool is_parsing;  // True if the frame is still parsing.
    GURL url;  // URL of this frame.
  };
  typedef std::map<content::RenderFrameHost*, FrameState> FrameHostToStateMap;

  // Tracks the state of known frame hosts.
  FrameHostToStateMap frame_host_state_map_;

  // Set of all known frame hosts.
  std::set<content::RenderFrameHost*> frame_hosts_;

  // The last comitted main frame.
  content::RenderFrameHost* main_frame_host_;

  // If true, also allow events from chrome-extension:// URLs.
  static bool allow_extension_scheme_;

  DISALLOW_COPY_AND_ASSIGN(FrameNavigationState);
};

}  // namespace extensions

#endif  // CHROME_BROWSER_EXTENSIONS_API_WEB_NAVIGATION_FRAME_NAVIGATION_STATE_H_