WebSchemeHandler.cpp 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #include "include/cef_browser.h"
  2. #include "include/cef_callback.h"
  3. #include "include/cef_frame.h"
  4. #include "include/cef_resource_handler.h"
  5. #include "include/cef_response.h"
  6. #include "include/cef_request.h"
  7. #include "include/cef_scheme.h"
  8. #include "include/wrapper/cef_helpers.h"
  9. #include <Atomic/Resource/ResourceCache.h>
  10. #include <Atomic/IO/FileSystem.h>
  11. #include "WebString.h"
  12. #include "WebBrowserHost.h"
  13. #include "WebSchemeHandler.h"
  14. namespace Atomic
  15. {
  16. static WeakPtr<WebBrowserHost> webBrowserHost_;
  17. // Implementation of the schema handler for atomic://resources/ requests.
  18. class ResourceSchemeHandler : public CefResourceHandler
  19. {
  20. public:
  21. ResourceSchemeHandler() : fileLength_(0), offset_(0)
  22. {
  23. }
  24. virtual bool ProcessRequest(CefRefPtr<CefRequest> request,
  25. CefRefPtr<CefCallback> callback) OVERRIDE
  26. {
  27. CEF_REQUIRE_IO_THREAD();
  28. if (webBrowserHost_.Null())
  29. return false;
  30. ConvertCEFString(request->GetURL(), url_);
  31. // shave off atomic://resources/
  32. url_ = url_.SubstringUTF8(19);
  33. if (IsAbsolutePath(url_))
  34. {
  35. file_ = new File(webBrowserHost_->GetContext(), url_, FILE_READ);
  36. }
  37. else
  38. {
  39. ResourceCache* cache = webBrowserHost_->GetSubsystem<ResourceCache>();
  40. file_ = cache->GetFile(url_, false);
  41. }
  42. if (!file_->IsOpen())
  43. return false;
  44. fileLength_ = file_->GetSize();
  45. // Indicate the headers are available.
  46. callback->Continue();
  47. return true;
  48. }
  49. virtual void GetResponseHeaders(CefRefPtr<CefResponse> response,
  50. int64& response_length,
  51. CefString& redirectUrl) OVERRIDE
  52. {
  53. CEF_REQUIRE_IO_THREAD();
  54. String pathName, fileName, ext;
  55. SplitPath(url_, pathName, fileName, ext);
  56. if (ext == ".js")
  57. response->SetMimeType("text/javascript");
  58. else if (ext == ".ts")
  59. response->SetMimeType("text/typescript");
  60. response->SetStatus(200);
  61. // Set the resulting response length
  62. response_length = fileLength_;
  63. }
  64. virtual void Cancel() OVERRIDE
  65. {
  66. CEF_REQUIRE_IO_THREAD();
  67. }
  68. virtual bool ReadResponse(void* data_out,
  69. int bytes_to_read,
  70. int& bytes_read,
  71. CefRefPtr<CefCallback> callback) OVERRIDE
  72. {
  73. bool has_data = false;
  74. bytes_read = 0;
  75. if (offset_ < fileLength_)
  76. {
  77. // Copy the next block of data into the buffer.
  78. int transfer_size = std::min(bytes_to_read, static_cast<int>(fileLength_ - offset_));
  79. file_->Read(data_out, transfer_size);
  80. offset_ += transfer_size;
  81. bytes_read = transfer_size;
  82. has_data = true;
  83. if (offset_ >= fileLength_)
  84. file_->Close();
  85. }
  86. return has_data;
  87. }
  88. private:
  89. SharedPtr<File> file_;
  90. unsigned fileLength_;
  91. String url_;
  92. unsigned offset_;
  93. IMPLEMENT_REFCOUNTING(ResourceSchemeHandler);
  94. };
  95. // Implementation of the factory for for creating schema handlers.
  96. class ResourceSchemeHandlerFactory : public CefSchemeHandlerFactory
  97. {
  98. public:
  99. // Return a new scheme handler instance to handle the request.
  100. virtual CefRefPtr<CefResourceHandler> Create(CefRefPtr<CefBrowser> browser,
  101. CefRefPtr<CefFrame> frame,
  102. const CefString& scheme_name,
  103. CefRefPtr<CefRequest> request) OVERRIDE
  104. {
  105. CEF_REQUIRE_IO_THREAD();
  106. return new ResourceSchemeHandler();
  107. }
  108. IMPLEMENT_REFCOUNTING(ResourceSchemeHandlerFactory);
  109. };
  110. void RegisterWebSchemeHandlers(WebBrowserHost* host)
  111. {
  112. webBrowserHost_ = host;
  113. CefRegisterSchemeHandlerFactory("atomic", "resources",
  114. new ResourceSchemeHandlerFactory());
  115. }
  116. }