WebSchemeHandler.cpp 4.1 KB

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