Have window.indexedDB.deleteDatabase return an IDBOpenDBRequest.
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / client / IDBFactoryImpl.cpp
1 /*
2  * Copyright (C) 2015 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "IDBFactoryImpl.h"
28
29 #if ENABLE(INDEXED_DATABASE)
30
31 #include "ExceptionCode.h"
32 #include "IDBDatabaseIdentifier.h"
33 #include "IDBOpenDBRequestImpl.h"
34 #include "Logging.h"
35 #include "Page.h"
36 #include "SchemeRegistry.h"
37 #include "SecurityOrigin.h"
38
39 namespace WebCore {
40 namespace IDBClient {
41
42 static bool shouldThrowSecurityException(ScriptExecutionContext* context)
43 {
44     ASSERT(is<Document>(*context) || context->isWorkerGlobalScope());
45     if (is<Document>(*context)) {
46         Document& document = downcast<Document>(*context);
47         if (!document.frame())
48             return true;
49         if (!document.page())
50             return true;
51         if (document.page()->usesEphemeralSession() && !SchemeRegistry::allowsDatabaseAccessInPrivateBrowsing(document.securityOrigin()->protocol()))
52             return true;
53     }
54
55     if (!context->securityOrigin()->canAccessDatabase(context->topOrigin()))
56         return true;
57
58     return false;
59 }
60
61 Ref<IDBFactory> IDBFactory::create()
62 {
63     return adoptRef(*new IDBFactory);
64 }
65
66 IDBFactory::IDBFactory()
67 {
68
69 }
70
71 PassRefPtr<WebCore::IDBRequest> IDBFactory::getDatabaseNames(ScriptExecutionContext*, ExceptionCode&)
72 {
73     return nullptr;
74 }
75
76 PassRefPtr<WebCore::IDBOpenDBRequest> IDBFactory::open(ScriptExecutionContext*, const String&, ExceptionCode&)
77 {
78     return nullptr;
79 }
80
81 PassRefPtr<WebCore::IDBOpenDBRequest> IDBFactory::open(ScriptExecutionContext*, const String&, unsigned long long, ExceptionCode&)
82 {
83     return nullptr;
84 }
85
86 PassRefPtr<WebCore::IDBOpenDBRequest> IDBFactory::deleteDatabase(ScriptExecutionContext* context, const String& name, ExceptionCode& ec)
87 {
88     LOG(IndexedDB, "IDBFactory::deleteDatabase");
89
90     if (name.isNull()) {
91         ec = TypeError;
92         return nullptr;
93     }
94     
95     if (shouldThrowSecurityException(context)) {
96         ec = SECURITY_ERR;
97         return nullptr;
98     }
99
100     ASSERT(context->securityOrigin());
101     ASSERT(context->topOrigin());
102     IDBDatabaseIdentifier databaseIdentifier(name, *context->securityOrigin(), *context->topOrigin());
103     if (!databaseIdentifier.isValid()) {
104         ec = TypeError;
105         return nullptr;
106     }
107
108     auto request = IDBOpenDBRequest::create(context);
109     return adoptRef(&request.leakRef());
110 }
111
112 short IDBFactory::cmp(ScriptExecutionContext*, const Deprecated::ScriptValue&, const Deprecated::ScriptValue&, ExceptionCode&)
113 {
114     return 0;
115 }
116
117 } // namespace IDBClient
118 } // namespace WebCore
119
120 #endif // ENABLE(INDEXED_DATABASE)