Sat, 03 Jan 2015 20:18:00 +0100
Conditionally enable double key logic according to:
private browsing mode or privacy.thirdparty.isolate preference and
implement in GetCookieStringCommon and FindCookie where it counts...
With some reservations of how to convince FindCookie users to test
condition and pass a nullptr when disabling double key logic.
1 /* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
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/. */
6 #include <iostream.h>
7 #include "plstr.h"
8 #include "prlink.h"
9 #include "nsIComponentRegistrar.h"
10 #include "nsIComponentManager.h"
11 #include "nsIServiceManager.h"
12 #include "nsIFile.h"
13 #include "nsCOMPtr.h"
14 #include "nsString.h"
16 static bool gUnreg = false;
18 void print_err(nsresult err)
19 {
20 switch (err) {
21 case NS_ERROR_FACTORY_NOT_LOADED:
22 cerr << "Factory not loaded";
23 break;
24 case NS_NOINTERFACE:
25 cerr << "No Interface";
26 break;
27 case NS_ERROR_NULL_POINTER:
28 cerr << "Null pointer";
29 break;
30 case NS_ERROR_OUT_OF_MEMORY:
31 cerr << "Out of memory";
32 break;
33 default:
34 cerr << hex << err << dec;
35 }
36 }
38 nsresult Register(nsIComponentRegistrar* registrar, const char *path)
39 {
40 nsCOMPtr<nsIFile> file;
41 nsresult rv =
42 NS_NewLocalFile(
43 NS_ConvertUTF8toUTF16(path),
44 true,
45 getter_AddRefs(file));
46 if (NS_FAILED(rv)) return rv;
47 rv = registrar->AutoRegister(file);
48 return rv;
49 }
51 nsresult Unregister(const char *path)
52 {
53 /* NEEDS IMPLEMENTATION */
54 #if 0
55 nsresult res = nsComponentManager::AutoUnregisterComponent(path);
56 return res;
57 #else
58 return NS_ERROR_FAILURE;
59 #endif
60 }
62 int ProcessArgs(nsIComponentRegistrar* registrar, int argc, char *argv[])
63 {
64 int i = 1;
65 nsresult res;
67 while (i < argc) {
68 if (argv[i][0] == '-') {
69 int j;
70 for (j = 1; argv[i][j] != '\0'; j++) {
71 switch (argv[i][j]) {
72 case 'u':
73 gUnreg = true;
74 break;
75 default:
76 cerr << "Unknown option '" << argv[i][j] << "'\n";
77 }
78 }
79 i++;
80 } else {
81 if (gUnreg) {
82 res = Unregister(argv[i]);
83 if (NS_SUCCEEDED(res)) {
84 cout << "Successfully unregistered: " << argv[i] << "\n";
85 } else {
86 cerr << "Unregister failed (";
87 print_err(res);
88 cerr << "): " << argv[i] << "\n";
89 }
90 } else {
91 res = Register(registrar, argv[i]);
92 if (NS_SUCCEEDED(res)) {
93 cout << "Successfully registered: " << argv[i] << "\n";
94 } else {
95 cerr << "Register failed (";
96 print_err(res);
97 cerr << "): " << argv[i] << "\n";
98 }
99 }
100 i++;
101 }
102 }
103 return 0;
104 }
106 int main(int argc, char *argv[])
107 {
108 int ret = 0;
109 nsresult rv;
110 {
111 nsCOMPtr<nsIServiceManager> servMan;
112 rv = NS_InitXPCOM2(getter_AddRefs(servMan), nullptr, nullptr);
113 if (NS_FAILED(rv)) return -1;
114 nsCOMPtr<nsIComponentRegistrar> registrar = do_QueryInterface(servMan);
115 NS_ASSERTION(registrar, "Null nsIComponentRegistrar");
117 /* With no arguments, RegFactory will autoregister */
118 if (argc <= 1)
119 {
120 rv = registrar->AutoRegister(nullptr);
121 ret = (NS_FAILED(rv)) ? -1 : 0;
122 }
123 else
124 ret = ProcessArgs(registrar, argc, argv);
125 } // this scopes the nsCOMPtrs
126 // no nsCOMPtrs are allowed to be alive when you call NS_ShutdownXPCOM
127 rv = NS_ShutdownXPCOM(nullptr);
128 NS_ASSERTION(NS_SUCCEEDED(rv), "NS_ShutdownXPCOM failed");
129 return ret;
130 }