void ChromeClientBlackBerry::exceededDatabaseQuota(Frame* frame, const String& name, DatabaseDetails details) { #if ENABLE(SQL_DATABASE) Document* document = frame->document(); if (!document) return; SecurityOrigin* origin = document->securityOrigin(); #if !defined(PUBLIC_BUILD) || !PUBLIC_BUILD if (m_webPagePrivate->m_dumpRenderTree) { m_webPagePrivate->m_dumpRenderTree->exceededDatabaseQuota(origin, name); return; } #endif DatabaseManager& manager = DatabaseManager::manager(); unsigned long long originUsage = manager.usageForOrigin(origin); unsigned long long currentQuota = manager.quotaForOrigin(origin); unsigned long long estimatedSize = details.expectedUsage(); const String& nameStr = details.displayName(); String originStr = origin->toString(); unsigned long long quota = m_webPagePrivate->m_client->databaseQuota(originStr, nameStr, originUsage, currentQuota, estimatedSize); manager.setQuota(origin, quota); #endif }
void ChromeClientBlackBerry::exceededDatabaseQuota(Frame* frame, const String& name) { #if ENABLE(SQL_DATABASE) Document* document = frame->document(); if (!document) return; SecurityOrigin* origin = document->securityOrigin(); #if ENABLE_DRT if (m_webPagePrivate->m_dumpRenderTree) { m_webPagePrivate->m_dumpRenderTree->exceededDatabaseQuota(origin, name); return; } #endif DatabaseTracker& tracker = DatabaseTracker::tracker(); unsigned long long totalUsage = tracker.totalDatabaseUsage(); unsigned long long originUsage = tracker.usageForOrigin(origin); DatabaseDetails details = tracker.detailsForNameAndOrigin(name, origin); unsigned long long estimatedSize = details.expectedUsage(); const String& nameStr = details.displayName(); String originStr = origin->databaseIdentifier(); unsigned long long quota = m_webPagePrivate->m_client->databaseQuota(originStr.characters(), originStr.length(), nameStr.characters(), nameStr.length(), totalUsage, originUsage, estimatedSize); tracker.setQuota(origin, quota); #endif }
void ArgumentCoder<DatabaseDetails>::encode(ArgumentEncoder& encoder, const DatabaseDetails& details) { encoder << details.name(); encoder << details.displayName(); encoder << details.expectedUsage(); encoder << details.currentUsage(); }
HRESULT STDMETHODCALLTYPE WebDatabaseManager::detailsForDatabase( /* [in] */ BSTR databaseName, /* [in] */ IWebSecurityOrigin* origin, /* [retval][out] */ IPropertyBag** result) { if (!origin || !result) return E_POINTER; *result = 0; if (this != s_sharedWebDatabaseManager) return E_FAIL; COMPtr<WebSecurityOrigin> webSecurityOrigin(Query, origin); if (!webSecurityOrigin) return E_FAIL; DatabaseDetails details = DatabaseManager::manager().detailsForNameAndOrigin(String(databaseName, SysStringLen(databaseName)), webSecurityOrigin->securityOrigin()); if (details.name().isNull()) return E_INVALIDARG; *result = DatabaseDetailsPropertyBag::createInstance(details); return S_OK; }
/*! Returns the current size of the database in bytes. */ qint64 QWebDatabase::size() const { #if ENABLE(DATABASE) DatabaseDetails details = DatabaseTracker::tracker().detailsForNameAndOrigin(d->name, d->origin.get()); return details.currentUsage(); #else return 0; #endif }
/*! Returns the name of the database as seen by the user. */ QString QWebDatabase::displayName() const { #if ENABLE(DATABASE) DatabaseDetails details = DatabaseTracker::tracker().detailsForNameAndOrigin(d->name, d->origin.get()); return details.displayName(); #else return QString(); #endif }
void ChromeClientEfl::exceededDatabaseQuota(Frame* frame, const String& databaseName, DatabaseDetails details) { uint64_t quota; SecurityOrigin* origin = frame->document()->securityOrigin(); quota = ewk_view_exceeded_database_quota(m_view, kit(frame), databaseName.utf8().data(), details.currentUsage(), details.expectedUsage()); /* if client did not set quota, and database is being created now, the * default quota is applied */ if (!quota && !DatabaseManager::manager().hasEntryForOrigin(origin)) quota = ewk_settings_web_database_default_quota_get(); DatabaseManager::manager().setQuota(origin, quota); }
void WebDatabaseManager::getDatabasesByOrigin(uint64_t callbackID) const { ChildProcess::LocalTerminationDisabler terminationDisabler(*m_process); // FIXME: This could be made more efficient by adding a function to DatabaseManager // to get both the origins and the Vector of DatabaseDetails for each origin in one // shot. That would avoid taking the numerous locks this requires. Vector<RefPtr<SecurityOrigin> > origins; DatabaseManager::manager().origins(origins); Vector<OriginAndDatabases> originAndDatabasesVector; originAndDatabasesVector.reserveInitialCapacity(origins.size()); for (size_t i = 0; i < origins.size(); ++i) { OriginAndDatabases originAndDatabases; Vector<String> nameVector; if (!DatabaseManager::manager().databaseNamesForOrigin(origins[i].get(), nameVector)) continue; Vector<DatabaseDetails> detailsVector; detailsVector.reserveInitialCapacity(nameVector.size()); for (size_t j = 0; j < nameVector.size(); j++) { DatabaseDetails details = DatabaseManager::manager().detailsForNameAndOrigin(nameVector[j], origins[i].get()); if (details.name().isNull()) continue; detailsVector.append(details); } if (detailsVector.isEmpty()) continue; originAndDatabases.originIdentifier = origins[i]->databaseIdentifier(); originAndDatabases.originQuota = DatabaseManager::manager().quotaForOrigin(origins[i].get()); originAndDatabases.originUsage = DatabaseManager::manager().usageForOrigin(origins[i].get()); originAndDatabases.databases.swap(detailsVector); originAndDatabasesVector.append(originAndDatabases); } m_process->send(Messages::WebDatabaseManagerProxy::DidGetDatabasesByOrigin(originAndDatabasesVector, callbackID), 0); }
// IPropertyBag -------------------------------------------------------------------- HRESULT STDMETHODCALLTYPE DatabaseDetailsPropertyBag::Read(LPCOLESTR pszPropName, VARIANT* pVar, IErrorLog*) { if (!pszPropName || !pVar) return E_POINTER; VariantInit(pVar); if (isEqual(pszPropName, WebDatabaseDisplayNameKey)) { COMVariantSetter<String>::setVariant(pVar, m_details.displayName()); return S_OK; } else if (isEqual(pszPropName, WebDatabaseExpectedSizeKey)) { COMVariantSetter<unsigned long long>::setVariant(pVar, m_details.expectedUsage()); return S_OK; } else if (isEqual(pszPropName, WebDatabaseUsageKey)) { COMVariantSetter<unsigned long long>::setVariant(pVar, m_details.currentUsage()); return S_OK; } return E_INVALIDARG; }
void WebChromeClient::exceededDatabaseQuota(Frame* frame, const String& databaseName) { WebFrame* webFrame = static_cast<WebFrameLoaderClient*>(frame->loader()->client())->webFrame(); SecurityOrigin* origin = frame->document()->securityOrigin(); DatabaseDetails details = DatabaseTracker::tracker().detailsForNameAndOrigin(databaseName, origin); uint64_t currentQuota = DatabaseTracker::tracker().quotaForOrigin(origin); uint64_t newQuota = 0; WebProcess::shared().connection()->sendSync( Messages::WebPageProxy::ExceededDatabaseQuota(webFrame->frameID(), origin->databaseIdentifier(), databaseName, details.displayName(), currentQuota, details.currentUsage(), details.expectedUsage()), Messages::WebPageProxy::ExceededDatabaseQuota::Reply(newQuota), m_page->pageID()); DatabaseTracker::tracker().setQuota(origin, newQuota); }
HRESULT WebDatabaseManager::detailsForDatabase(_In_ BSTR databaseName, _In_opt_ IWebSecurityOrigin* origin, _COM_Outptr_opt_ IPropertyBag** result) { if (!result) return E_POINTER; *result = nullptr; if (!origin) return E_POINTER; if (this != s_sharedWebDatabaseManager) return E_FAIL; COMPtr<WebSecurityOrigin> webSecurityOrigin(Query, origin); if (!webSecurityOrigin) return E_FAIL; DatabaseDetails details = DatabaseManager::singleton().detailsForNameAndOrigin(String(databaseName, SysStringLen(databaseName)), webSecurityOrigin->securityOrigin()); if (details.name().isNull()) return E_INVALIDARG; *result = DatabaseDetailsPropertyBag::createInstance(details); return S_OK; }
void WebChromeClient::exceededDatabaseQuota(Frame* frame, const String& databaseName, DatabaseDetails details) { WebFrame* webFrame = WebFrame::fromCoreFrame(*frame); ASSERT(webFrame); SecurityOrigin* origin = frame->document()->securityOrigin(); DatabaseManager& dbManager = DatabaseManager::singleton(); uint64_t currentQuota = dbManager.quotaForOrigin(origin); uint64_t currentOriginUsage = dbManager.usageForOrigin(origin); uint64_t newQuota = 0; RefPtr<API::SecurityOrigin> securityOrigin = API::SecurityOrigin::create(WebCore::SecurityOrigin::createFromDatabaseIdentifier(origin->databaseIdentifier())); newQuota = m_page->injectedBundleUIClient().didExceedDatabaseQuota(m_page, securityOrigin.get(), databaseName, details.displayName(), currentQuota, currentOriginUsage, details.currentUsage(), details.expectedUsage()); if (!newQuota) { WebProcess::singleton().parentProcessConnection()->sendSync( Messages::WebPageProxy::ExceededDatabaseQuota(webFrame->frameID(), origin->databaseIdentifier(), databaseName, details.displayName(), currentQuota, currentOriginUsage, details.currentUsage(), details.expectedUsage()), Messages::WebPageProxy::ExceededDatabaseQuota::Reply(newQuota), m_page->pageID(), std::chrono::milliseconds::max(), IPC::SendSyncOption::InformPlatformProcessWillSuspend); } dbManager.setQuota(origin, newQuota); }
void WebChromeClient::exceededDatabaseQuota(Frame* frame, const String& databaseName, DatabaseDetails details) { WebFrameLoaderClient* webFrameLoaderClient = toWebFrameLoaderClient(frame->loader()->client()); WebFrame* webFrame = webFrameLoaderClient ? webFrameLoaderClient->webFrame() : 0; ASSERT(webFrame); SecurityOrigin* origin = frame->document()->securityOrigin(); DatabaseManager& dbManager = DatabaseManager::manager(); uint64_t currentQuota = dbManager.quotaForOrigin(origin); uint64_t currentOriginUsage = dbManager.usageForOrigin(origin); uint64_t newQuota = 0; RefPtr<WebSecurityOrigin> webSecurityOrigin = WebSecurityOrigin::createFromDatabaseIdentifier(origin->databaseIdentifier()); newQuota = m_page->injectedBundleUIClient().didExceedDatabaseQuota(m_page, webSecurityOrigin.get(), databaseName, details.displayName(), currentQuota, currentOriginUsage, details.currentUsage(), details.expectedUsage()); if (!newQuota) { WebProcess::shared().connection()->sendSync( Messages::WebPageProxy::ExceededDatabaseQuota(webFrame->frameID(), origin->databaseIdentifier(), databaseName, details.displayName(), currentQuota, currentOriginUsage, details.currentUsage(), details.expectedUsage()), Messages::WebPageProxy::ExceededDatabaseQuota::Reply(newQuota), m_page->pageID()); } dbManager.setQuota(origin, newQuota); }
void WebChromeClient::exceededDatabaseQuota(Frame* frame, const String& databaseName, DatabaseDetails details) { WebFrame* webFrame = WebFrame::fromCoreFrame(*frame); ASSERT(webFrame); SecurityOrigin* origin = frame->document()->securityOrigin(); DatabaseManager& dbManager = DatabaseManager::manager(); uint64_t currentQuota = dbManager.quotaForOrigin(origin); uint64_t currentOriginUsage = dbManager.usageForOrigin(origin); uint64_t newQuota = 0; RefPtr<WebSecurityOrigin> webSecurityOrigin = WebSecurityOrigin::createFromDatabaseIdentifier(origin->databaseIdentifier()); newQuota = m_page->injectedBundleUIClient().didExceedDatabaseQuota(m_page, webSecurityOrigin.get(), databaseName, details.displayName(), currentQuota, currentOriginUsage, details.currentUsage(), details.expectedUsage()); if (!newQuota) { unsigned syncSendFlags = IPC::InformPlatformProcessWillSuspend; if (WebPage::synchronousMessagesShouldSpinRunLoop()) syncSendFlags |= IPC::SpinRunLoopWhileWaitingForReply; WebProcess::shared().parentProcessConnection()->sendSync( Messages::WebPageProxy::ExceededDatabaseQuota(webFrame->frameID(), origin->databaseIdentifier(), databaseName, details.displayName(), currentQuota, currentOriginUsage, details.currentUsage(), details.expectedUsage()), Messages::WebPageProxy::ExceededDatabaseQuota::Reply(newQuota), m_page->pageID(), std::chrono::milliseconds::max(), syncSendFlags); } dbManager.setQuota(origin, newQuota); }
/*! Returns the current size of the database in bytes. */ qint64 QWebDatabase::size() const { DatabaseDetails details = DatabaseTracker::tracker().detailsForNameAndOrigin(d->name, d->origin.get()); return details.currentUsage(); }
/*! Returns the name of the database as seen by the user. */ QString QWebDatabase::displayName() const { DatabaseDetails details = DatabaseTracker::tracker().detailsForNameAndOrigin(d->name, d->origin.get()); return details.displayName(); }