1/* 2 * Copyright (C) 2007 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 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 14 * its contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29#import "WebDatabaseTrackerClient.h" 30 31#if ENABLE(DATABASE) 32 33#import "WebDatabaseManagerPrivate.h" 34#import "WebSecurityOriginInternal.h" 35#import <wtf/MainThread.h> 36#import <wtf/RetainPtr.h> 37#import <WebCore/SecurityOrigin.h> 38 39using namespace WebCore; 40 41WebDatabaseTrackerClient* WebDatabaseTrackerClient::sharedWebDatabaseTrackerClient() 42{ 43 static WebDatabaseTrackerClient* sharedClient = new WebDatabaseTrackerClient(); 44 return sharedClient; 45} 46 47WebDatabaseTrackerClient::WebDatabaseTrackerClient() 48{ 49} 50 51WebDatabaseTrackerClient::~WebDatabaseTrackerClient() 52{ 53} 54 55class DidModifyOriginData { 56 WTF_MAKE_NONCOPYABLE(DidModifyOriginData); 57public: 58 static void dispatchToMainThread(WebDatabaseTrackerClient* client, SecurityOrigin* origin) 59 { 60 DidModifyOriginData* context = new DidModifyOriginData(client, origin->threadsafeCopy()); 61 callOnMainThread(&DidModifyOriginData::dispatchDidModifyOriginOnMainThread, context); 62 } 63 64private: 65 DidModifyOriginData(WebDatabaseTrackerClient* client, PassRefPtr<SecurityOrigin> origin) 66 : client(client) 67 , origin(origin) 68 { 69 } 70 71 static void dispatchDidModifyOriginOnMainThread(void* context) 72 { 73 ASSERT(isMainThread()); 74 DidModifyOriginData* info = static_cast<DidModifyOriginData*>(context); 75 info->client->dispatchDidModifyOrigin(info->origin.get()); 76 delete info; 77 } 78 79 WebDatabaseTrackerClient* client; 80 RefPtr<SecurityOrigin> origin; 81}; 82 83void WebDatabaseTrackerClient::dispatchDidModifyOrigin(SecurityOrigin* origin) 84{ 85 if (!isMainThread()) { 86 DidModifyOriginData::dispatchToMainThread(this, origin); 87 return; 88 } 89 90 RetainPtr<WebSecurityOrigin> webSecurityOrigin(AdoptNS, [[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:origin]); 91 92 [[NSNotificationCenter defaultCenter] postNotificationName:WebDatabaseDidModifyOriginNotification 93 object:webSecurityOrigin.get()]; 94} 95 96void WebDatabaseTrackerClient::dispatchDidModifyDatabase(SecurityOrigin* origin, const String& databaseIdentifier) 97{ 98 if (!isMainThread()) { 99 DidModifyOriginData::dispatchToMainThread(this, origin); 100 return; 101 } 102 103 RetainPtr<WebSecurityOrigin> webSecurityOrigin(AdoptNS, [[WebSecurityOrigin alloc] _initWithWebCoreSecurityOrigin:origin]); 104 RetainPtr<NSDictionary> userInfo(AdoptNS, [[NSDictionary alloc] 105 initWithObjectsAndKeys:(NSString *)databaseIdentifier, WebDatabaseIdentifierKey, nil]); 106 107 [[NSNotificationCenter defaultCenter] postNotificationName:WebDatabaseDidModifyDatabaseNotification 108 object:webSecurityOrigin.get() 109 userInfo:userInfo.get()]; 110} 111 112#endif 113