Skip to content

Commit 855d491

Browse files
committed
protocol: api to register schemes that can handle service worker
1 parent 5e9aca4 commit 855d491

File tree

12 files changed

+86
-8
lines changed

12 files changed

+86
-8
lines changed

atom/app/atom_content_client.cc

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
#include "content/public/common/pepper_plugin_info.h"
1818
#include "content/public/common/user_agent.h"
1919
#include "ppapi/shared_impl/ppapi_permissions.h"
20+
#include "url/url_constants.h"
2021

2122
namespace atom {
2223

@@ -62,6 +63,17 @@ content::PepperPluginInfo CreatePepperFlashInfo(const base::FilePath& path,
6263
return plugin;
6364
}
6465

66+
void ConvertStringWithSeparatorToVector(std::vector<std::string>* vec,
67+
const char* separator,
68+
const char* cmd_switch) {
69+
auto command_line = base::CommandLine::ForCurrentProcess();
70+
auto string_with_separator = command_line->GetSwitchValueASCII(cmd_switch);
71+
if (!string_with_separator.empty())
72+
*vec = base::SplitString(string_with_separator, separator,
73+
base::TRIM_WHITESPACE,
74+
base::SPLIT_WANT_NONEMPTY);
75+
}
76+
6577
} // namespace
6678

6779
AtomContentClient::AtomContentClient() {
@@ -83,12 +95,10 @@ std::string AtomContentClient::GetUserAgent() const {
8395
void AtomContentClient::AddAdditionalSchemes(
8496
std::vector<url::SchemeWithType>* standard_schemes,
8597
std::vector<std::string>* savable_schemes) {
86-
auto command_line = base::CommandLine::ForCurrentProcess();
87-
auto custom_schemes = command_line->GetSwitchValueASCII(
88-
switches::kRegisterStandardSchemes);
89-
if (!custom_schemes.empty()) {
90-
std::vector<std::string> schemes = base::SplitString(
91-
custom_schemes, ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_NONEMPTY);
98+
std::vector<std::string> schemes;
99+
ConvertStringWithSeparatorToVector(&schemes, ",",
100+
switches::kRegisterStandardSchemes);
101+
if (!schemes.empty()) {
92102
for (const std::string& scheme : schemes)
93103
standard_schemes->push_back({scheme.c_str(), url::SCHEME_WITHOUT_PORT});
94104
}
@@ -110,4 +120,16 @@ void AtomContentClient::AddPepperPlugins(
110120
CreatePepperFlashInfo(flash_path, flash_version));
111121
}
112122

123+
void AtomContentClient::AddServiceWorkerSchemes(
124+
std::set<std::string>* service_worker_schemes) {
125+
std::vector<std::string> schemes;
126+
ConvertStringWithSeparatorToVector(&schemes, ",",
127+
switches::kRegisterServiceWorkerSchemes);
128+
if (!schemes.empty()) {
129+
for (const std::string& scheme : schemes)
130+
service_worker_schemes->insert(scheme);
131+
}
132+
service_worker_schemes->insert(url::kFileScheme);
133+
}
134+
113135
} // namespace atom

atom/app/atom_content_client.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
#ifndef ATOM_APP_ATOM_CONTENT_CLIENT_H_
66
#define ATOM_APP_ATOM_CONTENT_CLIENT_H_
77

8+
#include <set>
89
#include <string>
910
#include <vector>
1011

@@ -26,6 +27,8 @@ class AtomContentClient : public brightray::ContentClient {
2627
std::vector<std::string>* savable_schemes) override;
2728
void AddPepperPlugins(
2829
std::vector<content::PepperPluginInfo>* plugins) override;
30+
void AddServiceWorkerSchemes(
31+
std::set<std::string>* service_worker_schemes) override;
2932

3033
private:
3134
DISALLOW_COPY_AND_ASSIGN(AtomContentClient);

atom/browser/api/atom_api_protocol.cc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ mate::ObjectTemplateBuilder Protocol::GetObjectTemplateBuilder(
3232
v8::Isolate* isolate) {
3333
return mate::ObjectTemplateBuilder(isolate)
3434
.SetMethod("registerStandardSchemes", &Protocol::RegisterStandardSchemes)
35+
.SetMethod("registerServiceWorkerSchemes",
36+
&Protocol::RegisterServiceWorkerSchemes)
3537
.SetMethod("registerStringProtocol",
3638
&Protocol::RegisterProtocol<URLRequestStringJob>)
3739
.SetMethod("registerBufferProtocol",
@@ -58,6 +60,11 @@ void Protocol::RegisterStandardSchemes(
5860
atom::AtomBrowserClient::SetCustomSchemes(schemes);
5961
}
6062

63+
void Protocol::RegisterServiceWorkerSchemes(
64+
const std::vector<std::string>& schemes) {
65+
atom::AtomBrowserClient::SetCustomServiceWorkerSchemes(schemes);
66+
}
67+
6168
void Protocol::UnregisterProtocol(
6269
const std::string& scheme, mate::Arguments* args) {
6370
CompletionCallback callback;

atom/browser/api/atom_api_protocol.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,9 @@ class Protocol : public mate::Wrappable {
9292
// Register schemes to standard scheme list.
9393
void RegisterStandardSchemes(const std::vector<std::string>& schemes);
9494

95+
// Register schemes that can handle service worker.
96+
void RegisterServiceWorkerSchemes(const std::vector<std::string>& schemes);
97+
9598
// Register the protocol with certain request job.
9699
template<typename RequestJob>
97100
void RegisterProtocol(const std::string& scheme,

atom/browser/atom_browser_client.cc

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ bool g_suppress_renderer_process_restart = false;
5454

5555
// Custom schemes to be registered to standard.
5656
std::string g_custom_schemes = "";
57+
// Custom schemes to be registered to handle service worker.
58+
std::string g_custom_service_worker_schemes = "";
5759

5860
scoped_refptr<net::X509Certificate> ImportCertFromFile(
5961
const base::FilePath& path) {
@@ -87,6 +89,11 @@ void AtomBrowserClient::SetCustomSchemes(
8789
g_custom_schemes = base::JoinString(schemes, ",");
8890
}
8991

92+
void AtomBrowserClient::SetCustomServiceWorkerSchemes(
93+
const std::vector<std::string>& schemes) {
94+
g_custom_service_worker_schemes = base::JoinString(schemes, ",");
95+
}
96+
9097
AtomBrowserClient::AtomBrowserClient() : delegate_(nullptr) {
9198
}
9299

@@ -172,6 +179,11 @@ void AtomBrowserClient::AppendExtraCommandLineSwitches(
172179
command_line->AppendSwitchASCII(switches::kRegisterStandardSchemes,
173180
g_custom_schemes);
174181

182+
// The registered service worker schemes.
183+
if (!g_custom_service_worker_schemes.empty())
184+
command_line->AppendSwitchASCII(switches::kRegisterServiceWorkerSchemes,
185+
g_custom_service_worker_schemes);
186+
175187
#if defined(OS_WIN)
176188
// Append --app-user-model-id.
177189
PWSTR current_app_id;

atom/browser/atom_browser_client.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@ class AtomBrowserClient : public brightray::BrowserClient,
3838
static void SuppressRendererProcessRestartForOnce();
3939
// Custom schemes to be registered to standard.
4040
static void SetCustomSchemes(const std::vector<std::string>& schemes);
41+
// Custom schemes to be registered to handle service worker.
42+
static void SetCustomServiceWorkerSchemes(
43+
const std::vector<std::string>& schemes);
4144

4245
protected:
4346
// content::ContentBrowserClient:

atom/browser/net/asar/url_request_asar_job.cc

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,14 @@
77
#include <string>
88
#include <vector>
99

10+
#include "atom/common/asar/archive.h"
11+
#include "atom/common/asar/asar_util.h"
12+
#include "atom/common/atom_constants.h"
1013
#include "base/bind.h"
1114
#include "base/files/file_util.h"
1215
#include "base/strings/string_util.h"
1316
#include "base/synchronization/lock.h"
1417
#include "base/task_runner.h"
15-
#include "atom/common/asar/archive.h"
16-
#include "atom/common/asar/asar_util.h"
1718
#include "net/base/file_stream.h"
1819
#include "net/base/filename_util.h"
1920
#include "net/base/io_buffer.h"
@@ -227,6 +228,19 @@ void URLRequestAsarJob::SetExtraRequestHeaders(
227228
}
228229
}
229230

231+
int URLRequestAsarJob::GetResponseCode() const {
232+
// Request Job gets created only if path exists.
233+
return 200;
234+
}
235+
236+
void URLRequestAsarJob::GetResponseInfo(net::HttpResponseInfo* info) {
237+
std::string status("HTTP/1.1 200 OK");
238+
net::HttpResponseHeaders* headers = new net::HttpResponseHeaders(status);
239+
240+
headers->AddHeader(atom::kCORSHeader);
241+
info->headers = headers;
242+
}
243+
230244
void URLRequestAsarJob::FetchMetaInfo(const base::FilePath& file_path,
231245
FileMetaInfo* meta_info) {
232246
base::File::Info file_info;

atom/browser/net/asar/url_request_asar_job.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ class URLRequestAsarJob : public net::URLRequestJob {
6161
net::Filter* SetupFilter() const override;
6262
bool GetMimeType(std::string* mime_type) const override;
6363
void SetExtraRequestHeaders(const net::HttpRequestHeaders& headers) override;
64+
int GetResponseCode() const override;
65+
void GetResponseInfo(net::HttpResponseInfo* info) override;
6466

6567
private:
6668
// Meta information about the file. It's used as a member in the

atom/common/options_switches.cc

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ const char kDisableHttpCache[] = "disable-http-cache";
119119
// Register schemes to standard.
120120
const char kRegisterStandardSchemes[] = "register-standard-schemes";
121121

122+
// Register schemes to handle service worker.
123+
const char kRegisterServiceWorkerSchemes[] = "register-service-worker-schemes";
124+
122125
// The minimum SSL/TLS version ("tls1", "tls1.1", or "tls1.2") that
123126
// TLS fallback will accept.
124127
const char kSSLVersionFallbackMin[] = "ssl-version-fallback-min";

atom/common/options_switches.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ extern const char kPpapiFlashVersion[];
6666
extern const char kClientCertificate[];
6767
extern const char kDisableHttpCache[];
6868
extern const char kRegisterStandardSchemes[];
69+
extern const char kRegisterServiceWorkerSchemes[];
6970
extern const char kSSLVersionFallbackMin[];
7071
extern const char kCipherSuiteBlacklist[];
7172
extern const char kAppUserModelId[];

0 commit comments

Comments
 (0)