summaryrefslogtreecommitdiffstats
path: root/docshell/base/IHistory.h
blob: 594ebdb3bb22eaf71e357f12f9d56df74a820a1d (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
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
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */

#ifndef mozilla_IHistory_h_
#define mozilla_IHistory_h_

#include "nsISupports.h"
#include "nsURIHashKey.h"
#include "nsTHashSet.h"
#include "nsTObserverArray.h"

class nsIURI;
class nsIWidget;

namespace mozilla {

namespace dom {
class ContentParent;
class Document;
class Link;
}  // namespace dom

// 0057c9d3-b98e-4933-bdc5-0275d06705e1
#define IHISTORY_IID                                 \
  {                                                  \
    0x0057c9d3, 0xb98e, 0x4933, {                    \
      0xbd, 0xc5, 0x02, 0x75, 0xd0, 0x67, 0x05, 0xe1 \
    }                                                \
  }

class IHistory : public nsISupports {
 public:
  NS_DECLARE_STATIC_IID_ACCESSOR(IHISTORY_IID)

  using ContentParentSet = nsTHashSet<RefPtr<dom::ContentParent>>;

  /**
   * Registers the Link for notifications about the visited-ness of aURI.
   * Consumers should assume that the URI is unvisited after calling this, and
   * they will be notified if that state (unvisited) changes by having
   * VisitedQueryFinished called on themselves. Note that it may call
   * synchronously if the answer is already known.
   *
   * @note VisitedQueryFinished must not call RegisterVisitedCallback or
   *       UnregisterVisitedCallback.
   *
   * @pre aURI must not be null.
   * @pre aLink may be null only in the parent (chrome) process.
   *
   * @param aURI
   *        The URI to check.
   * @param aLink
   *        The link to update whenever the history status changes.  The
   *        implementation will only hold onto a raw pointer, so if this
   *        object should be destroyed, be sure to call
   *        UnregisterVistedCallback first.
   */
  virtual void RegisterVisitedCallback(nsIURI* aURI, dom::Link* aLink) = 0;

  /**
   * Schedules a single visited query from a given child process.
   *
   * @param aURI the URI to query.
   * @param ContentParent the process interested in knowing about the visited
   *                      state of this URI.
   */
  virtual void ScheduleVisitedQuery(nsIURI* aURI, dom::ContentParent*) = 0;

  /**
   * Unregisters a previously registered Link object.  This must be called
   * before destroying the registered object, and asserts when misused.
   *
   * @pre aURI must not be null.
   * @pre aLink must not be null.
   *
   * @param aURI
   *        The URI that aLink was registered for.
   * @param aLink
   *        The link object to unregister for aURI.
   */
  virtual void UnregisterVisitedCallback(nsIURI* aURI, dom::Link* aLink) = 0;

  enum class VisitedStatus : uint8_t {
    Unknown,
    Visited,
    Unvisited,
  };

  /**
   * Notifies about the visited status of a given URI. The visited status cannot
   * be unknown, otherwise there's no point in notifying of anything.
   *
   * @param ContentParentSet a set of content processes that are interested on
   *                         this change. If null, it is broadcasted to all
   *                         child processes.
   */
  virtual void NotifyVisited(nsIURI*, VisitedStatus,
                             const ContentParentSet* = nullptr) = 0;

  enum VisitFlags {
    /**
     * Indicates whether the URI was loaded in a top-level window.
     */
    TOP_LEVEL = 1 << 0,
    /**
     * Indicates whether the URI is the target of a permanent redirect.
     */
    REDIRECT_PERMANENT = 1 << 1,
    /**
     * Indicates whether the URI is the target of a temporary redirect.
     */
    REDIRECT_TEMPORARY = 1 << 2,
    /**
     * Indicates the URI will redirect  (Response code 3xx).
     */
    REDIRECT_SOURCE = 1 << 3,
    /**
     * Indicates the URI caused an error that is unlikely fixable by a
     * retry, like a not found or unfetchable page.
     */
    UNRECOVERABLE_ERROR = 1 << 4,
    /**
     * If REDIRECT_SOURCE is set, this indicates that the redirect is permanent.
     * Note this differs from REDIRECT_PERMANENT because that one refers to how
     * we reached the URI, while this is used when the URI itself redirects.
     */
    REDIRECT_SOURCE_PERMANENT = 1 << 5
  };

  /**
   * Adds a history visit for the URI.
   *
   * @pre aURI must not be null.
   *
   * @param aWidget
   *        The widget for the DocShell.
   * @param aURI
   *        The URI of the page being visited.
   * @param aLastVisitedURI
   *        The URI of the last visit in the chain.
   * @param aFlags
   *        The VisitFlags describing this visit.
   * @param aBrowserId
   *        The id of browser used for this visit.
   */
  NS_IMETHOD VisitURI(nsIWidget* aWidget, nsIURI* aURI, nsIURI* aLastVisitedURI,
                      uint32_t aFlags, uint64_t aBrowserId) = 0;

  /**
   * Set the title of the URI.
   *
   * @pre aURI must not be null.
   *
   * @param aURI
   *        The URI to set the title for.
   * @param aTitle
   *        The title string.
   */
  NS_IMETHOD SetURITitle(nsIURI* aURI, const nsAString& aTitle) = 0;
};

NS_DEFINE_STATIC_IID_ACCESSOR(IHistory, IHISTORY_IID)

}  // namespace mozilla

#endif  // mozilla_IHistory_h_