1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /* This Source Code Form is subject to the terms of the Mozilla Public
3  * License, v. 2.0. If a copy of the MPL was not distributed with this
4  * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 
6 #ifndef nsResProtocolHandler_h___
7 #define nsResProtocolHandler_h___
8 
9 #include "SubstitutingProtocolHandler.h"
10 
11 #include "nsIResProtocolHandler.h"
12 #include "nsInterfaceHashtable.h"
13 #include "nsWeakReference.h"
14 #include "nsStandardURL.h"
15 
16 class nsISubstitutionObserver;
17 
18 struct SubstitutionMapping;
19 class nsResProtocolHandler final : public nsIResProtocolHandler,
20                                    public mozilla::SubstitutingProtocolHandler,
21                                    public nsSupportsWeakReference {
22  public:
23   NS_DECL_ISUPPORTS_INHERITED
24   NS_DECL_NSIRESPROTOCOLHANDLER
25 
NS_FORWARD_NSIPROTOCOLHANDLER(mozilla::SubstitutingProtocolHandler::)26   NS_FORWARD_NSIPROTOCOLHANDLER(mozilla::SubstitutingProtocolHandler::)
27 
28   nsResProtocolHandler()
29       : SubstitutingProtocolHandler(
30             "resource", URI_STD | URI_IS_UI_RESOURCE | URI_IS_LOCAL_RESOURCE,
31             /* aEnforceFileOrJar = */ false) {}
32 
33   MOZ_MUST_USE nsresult Init();
34 
35   NS_IMETHOD SetSubstitution(const nsACString& aRoot,
36                              nsIURI* aBaseURI) override;
37   NS_IMETHOD SetSubstitutionWithFlags(const nsACString& aRoot, nsIURI* aBaseURI,
38                                       uint32_t aFlags) override;
39 
GetSubstitution(const nsACString & aRoot,nsIURI ** aResult)40   NS_IMETHOD GetSubstitution(const nsACString& aRoot,
41                              nsIURI** aResult) override {
42     return mozilla::SubstitutingProtocolHandler::GetSubstitution(aRoot,
43                                                                  aResult);
44   }
45 
HasSubstitution(const nsACString & aRoot,bool * aResult)46   NS_IMETHOD HasSubstitution(const nsACString& aRoot, bool* aResult) override {
47     return mozilla::SubstitutingProtocolHandler::HasSubstitution(aRoot,
48                                                                  aResult);
49   }
50 
ResolveURI(nsIURI * aResURI,nsACString & aResult)51   NS_IMETHOD ResolveURI(nsIURI* aResURI, nsACString& aResult) override {
52     return mozilla::SubstitutingProtocolHandler::ResolveURI(aResURI, aResult);
53   }
54 
AddObserver(nsISubstitutionObserver * aObserver)55   NS_IMETHOD AddObserver(nsISubstitutionObserver* aObserver) override {
56     return mozilla::SubstitutingProtocolHandler::AddObserver(aObserver);
57   }
58 
RemoveObserver(nsISubstitutionObserver * aObserver)59   NS_IMETHOD RemoveObserver(nsISubstitutionObserver* aObserver) override {
60     return mozilla::SubstitutingProtocolHandler::RemoveObserver(aObserver);
61   }
62 
63  protected:
64   MOZ_MUST_USE nsresult GetSubstitutionInternal(const nsACString& aRoot,
65                                                 nsIURI** aResult,
66                                                 uint32_t* aFlags) override;
~nsResProtocolHandler()67   virtual ~nsResProtocolHandler() {}
68 
69   MOZ_MUST_USE bool ResolveSpecialCases(const nsACString& aHost,
70                                         const nsACString& aPath,
71                                         const nsACString& aPathname,
72                                         nsACString& aResult) override;
73 
74  private:
75   nsCString mAppURI;
76   nsCString mGREURI;
77 };
78 
79 #endif /* nsResProtocolHandler_h___ */
80