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; }
void ArgumentCoder<DatabaseDetails>::encode(ArgumentEncoder& encoder, const DatabaseDetails& details) { encoder << details.name(); encoder << details.displayName(); encoder << details.expectedUsage(); encoder << details.currentUsage(); }
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); }
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; }