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