1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "third_party/blink/renderer/modules/cache_storage/cache_storage_error.h"
6
7 #include "third_party/blink/public/mojom/cache_storage/cache_storage.mojom-blink.h"
8 #include "third_party/blink/renderer/bindings/core/v8/script_promise_resolver.h"
9 #include "third_party/blink/renderer/core/dom/dom_exception.h"
10 #include "third_party/blink/renderer/modules/cache_storage/cache.h"
11 #include "third_party/blink/renderer/platform/bindings/v8_throw_exception.h"
12 #include "third_party/blink/renderer/platform/heap/heap.h"
13
14 namespace blink {
15
16 namespace {
17
GetDefaultMessage(mojom::CacheStorageError web_error)18 String GetDefaultMessage(mojom::CacheStorageError web_error) {
19 switch (web_error) {
20 case mojom::CacheStorageError::kSuccess:
21 // This function should only be called with an error.
22 break;
23 case mojom::CacheStorageError::kErrorExists:
24 return "Entry already exists.";
25 case mojom::CacheStorageError::kErrorStorage:
26 return "Unexpected internal error.";
27 case mojom::CacheStorageError::kErrorNotFound:
28 return "Entry was not found.";
29 case mojom::CacheStorageError::kErrorQuotaExceeded:
30 return "Quota exceeded.";
31 case mojom::CacheStorageError::kErrorCacheNameNotFound:
32 return "Cache was not found.";
33 case mojom::CacheStorageError::kErrorQueryTooLarge:
34 return "Operation too large.";
35 case mojom::CacheStorageError::kErrorNotImplemented:
36 return "Method is not implemented.";
37 case mojom::CacheStorageError::kErrorDuplicateOperation:
38 return "Duplicate operation.";
39 case mojom::CacheStorageError::kErrorCrossOriginResourcePolicy:
40 return "Failed Cross-Origin-Resource-Policy check.";
41 }
42 NOTREACHED();
43 return String();
44 }
45
46 } // namespace
47
RejectCacheStorageWithError(ScriptPromiseResolver * resolver,mojom::blink::CacheStorageError web_error,const String & message)48 void RejectCacheStorageWithError(ScriptPromiseResolver* resolver,
49 mojom::blink::CacheStorageError web_error,
50 const String& message) {
51 String final_message =
52
53 !message.IsEmpty() ? message : GetDefaultMessage(web_error);
54 switch (web_error) {
55 case mojom::CacheStorageError::kSuccess:
56 // This function should only be called with an error.
57 NOTREACHED();
58 return;
59 case mojom::CacheStorageError::kErrorExists:
60 resolver->Reject(MakeGarbageCollected<DOMException>(
61 DOMExceptionCode::kInvalidAccessError, final_message));
62 return;
63 case mojom::CacheStorageError::kErrorStorage:
64 resolver->Reject(MakeGarbageCollected<DOMException>(
65 DOMExceptionCode::kUnknownError, final_message));
66 return;
67 case mojom::CacheStorageError::kErrorNotFound:
68 resolver->Reject(MakeGarbageCollected<DOMException>(
69 DOMExceptionCode::kNotFoundError, final_message));
70 return;
71 case mojom::CacheStorageError::kErrorQuotaExceeded:
72 resolver->Reject(MakeGarbageCollected<DOMException>(
73 DOMExceptionCode::kQuotaExceededError, final_message));
74 return;
75 case mojom::CacheStorageError::kErrorCacheNameNotFound:
76 resolver->Reject(MakeGarbageCollected<DOMException>(
77 DOMExceptionCode::kNotFoundError, final_message));
78 return;
79 case mojom::CacheStorageError::kErrorQueryTooLarge:
80 resolver->Reject(MakeGarbageCollected<DOMException>(
81 DOMExceptionCode::kAbortError, final_message));
82 return;
83 case mojom::CacheStorageError::kErrorNotImplemented:
84 resolver->Reject(MakeGarbageCollected<DOMException>(
85 DOMExceptionCode::kNotSupportedError, final_message));
86 return;
87 case mojom::CacheStorageError::kErrorDuplicateOperation:
88 resolver->Reject(MakeGarbageCollected<DOMException>(
89 DOMExceptionCode::kInvalidStateError, final_message));
90 return;
91 case mojom::CacheStorageError::kErrorCrossOriginResourcePolicy:
92 ScriptState::Scope scope(resolver->GetScriptState());
93 resolver->Reject(V8ThrowException::CreateTypeError(
94 resolver->GetScriptState()->GetIsolate(), message));
95 return;
96 }
97 }
98
99 } // namespace blink
100