1 /* 2 * Copyright (C) 2009 Martin Robinson 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Library General Public 6 * License as published by the Free Software Foundation; either 7 * version 2 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Library General Public License for more details. 13 * 14 * You should have received a copy of the GNU Library General Public License 15 * along with this library; see the file COPYING.LIB. If not, write to 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 17 * Boston, MA 02110-1301, USA. 18 */ 19 20 #include "config.h" 21 #include "webkitwebdatabase.h" 22 23 #include "webkitprivate.h" 24 25 #include "CString.h" 26 #include "DatabaseDetails.h" 27 #include "DatabaseTracker.h" 28 29 #include <glib/gi18n-lib.h> 30 31 /** 32 * SECTION:webkitwebdatabase 33 * @short_description: A WebKit web application database 34 * 35 * #WebKitWebDatabase is a representation of a Web Database database. The 36 * proposed Web Database standard introduces support for SQL databases that web 37 * sites can create and access on a local computer through JavaScript. 38 * 39 * To get access to all databases defined by a security origin, use 40 * #webkit_security_origin_get_databases. Each database has a canonical 41 * name, as well as a user-friendly display name. 42 * 43 * WebKit uses SQLite to create and access the local SQL databases. The location 44 * of a #WebKitWebDatabase can be accessed wth #webkit_web_database_get_filename. 45 * You can configure the location of all databases with 46 * #webkit_set_database_directory_path. 47 * 48 * For each database the web site can define an estimated size which can be 49 * accessed with #webkit_web_database_get_expected_size. The current size of the 50 * database in bytes is returned by #webkit_web_database_get_size. 51 * 52 * For more information refer to the Web Database specification proposal at 53 * http://dev.w3.org/html5/webdatabase 54 */ 55 56 using namespace WebKit; 57 58 enum { 59 PROP_0, 60 61 PROP_SECURITY_ORIGIN, 62 PROP_NAME, 63 PROP_DISPLAY_NAME, 64 PROP_EXPECTED_SIZE, 65 PROP_SIZE, 66 PROP_PATH 67 }; 68 69 G_DEFINE_TYPE(WebKitWebDatabase, webkit_web_database, G_TYPE_OBJECT) 70 71 struct _WebKitWebDatabasePrivate { 72 WebKitSecurityOrigin* origin; 73 gchar* name; 74 gchar* displayName; 75 gchar* filename; 76 }; 77 78 static gchar* webkit_database_directory_path = NULL; 79 static guint64 webkit_default_database_quota = 5 * 1024 * 1024; 80 81 #define WEBKIT_WEB_DATABASE_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE((obj), WEBKIT_TYPE_WEB_DATABASE, WebKitWebDatabasePrivate)) 82 83 static void webkit_web_database_set_security_origin(WebKitWebDatabase* webDatabase, WebKitSecurityOrigin* security_origin); 84 85 static void webkit_web_database_set_name(WebKitWebDatabase* webDatabase, const gchar* name); 86 87 static void webkit_web_database_finalize(GObject* object) 88 { 89 WebKitWebDatabase* webDatabase = WEBKIT_WEB_DATABASE(object); 90 WebKitWebDatabasePrivate* priv = webDatabase->priv; 91 92 g_free(priv->name); 93 g_free(priv->displayName); 94 g_free(priv->filename); 95 96 G_OBJECT_CLASS(webkit_web_database_parent_class)->finalize(object); 97 } 98 99 static void webkit_web_database_dispose(GObject* object) 100 { 101 WebKitWebDatabase* webDatabase = WEBKIT_WEB_DATABASE(object); 102 WebKitWebDatabasePrivate* priv = webDatabase->priv; 103 104 if (priv->origin) { 105 g_object_unref(priv->origin); 106 priv->origin = NULL; 107 } 108 109 G_OBJECT_CLASS(webkit_web_database_parent_class)->dispose(object); 110 } 111 112 static void webkit_web_database_set_property(GObject* object, guint propId, const GValue* value, GParamSpec* pspec) 113 { 114 WebKitWebDatabase* webDatabase = WEBKIT_WEB_DATABASE(object); 115 116 switch (propId) { 117 case PROP_SECURITY_ORIGIN: 118 webkit_web_database_set_security_origin(webDatabase, WEBKIT_SECURITY_ORIGIN(g_value_get_object(value))); 119 break; 120 case PROP_NAME: 121 webkit_web_database_set_name(webDatabase, g_value_get_string(value)); 122 break; 123 default: 124 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, pspec); 125 break; 126 } 127 } 128 129 static void webkit_web_database_get_property(GObject* object, guint propId, GValue* value, GParamSpec* pspec) 130 { 131 WebKitWebDatabase* webDatabase = WEBKIT_WEB_DATABASE(object); 132 WebKitWebDatabasePrivate* priv = webDatabase->priv; 133 134 switch (propId) { 135 case PROP_SECURITY_ORIGIN: 136 g_value_set_object(value, priv->origin); 137 break; 138 case PROP_NAME: 139 g_value_set_string(value, webkit_web_database_get_name(webDatabase)); 140 break; 141 case PROP_DISPLAY_NAME: 142 g_value_set_string(value, webkit_web_database_get_display_name(webDatabase)); 143 break; 144 case PROP_EXPECTED_SIZE: 145 g_value_set_uint64(value, webkit_web_database_get_expected_size(webDatabase)); 146 break; 147 case PROP_SIZE: 148 g_value_set_uint64(value, webkit_web_database_get_size(webDatabase)); 149 break; 150 case PROP_PATH: 151 g_value_set_string(value, webkit_web_database_get_filename(webDatabase)); 152 break; 153 default: 154 G_OBJECT_WARN_INVALID_PROPERTY_ID(object, propId, pspec); 155 break; 156 } 157 } 158 159 static void webkit_web_database_class_init(WebKitWebDatabaseClass* klass) 160 { 161 GObjectClass* gobjectClass = G_OBJECT_CLASS(klass); 162 gobjectClass->dispose = webkit_web_database_dispose; 163 gobjectClass->finalize = webkit_web_database_finalize; 164 gobjectClass->set_property = webkit_web_database_set_property; 165 gobjectClass->get_property = webkit_web_database_get_property; 166 167 /** 168 * WebKitWebDatabase:security-origin: 169 * 170 * The security origin of the database. 171 * 172 * Since: 1.1.14 173 */ 174 g_object_class_install_property(gobjectClass, PROP_SECURITY_ORIGIN, 175 g_param_spec_object("security-origin", 176 _("Security Origin"), 177 _("The security origin of the database"), 178 WEBKIT_TYPE_SECURITY_ORIGIN, 179 (GParamFlags) (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY))); 180 181 /** 182 * WebKitWebDatabase:name: 183 * 184 * The name of the Web Database database. 185 * 186 * Since: 1.1.14 187 */ 188 g_object_class_install_property(gobjectClass, PROP_NAME, 189 g_param_spec_string("name", 190 _("Name"), 191 _("The name of the Web Database database"), 192 NULL, 193 (GParamFlags) (G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY))); 194 195 /** 196 * WebKitWebDatabase:display-name: 197 * 198 * The display name of the Web Database database. 199 * 200 * Since: 1.1.14 201 */ 202 g_object_class_install_property(gobjectClass, PROP_DISPLAY_NAME, 203 g_param_spec_string("display-name", 204 _("Display Name"), 205 _("The display name of the Web Storage database"), 206 NULL, 207 WEBKIT_PARAM_READABLE)); 208 209 /** 210 * WebKitWebDatabase:expected-size: 211 * 212 * The expected size of the database in bytes as defined by the web author. 213 * 214 * Since: 1.1.14 215 */ 216 g_object_class_install_property(gobjectClass, PROP_EXPECTED_SIZE, 217 g_param_spec_uint64("expected-size", 218 _("Expected Size"), 219 _("The expected size of the Web Database database"), 220 0, G_MAXUINT64, 0, 221 WEBKIT_PARAM_READABLE)); 222 /** 223 * WebKitWebDatabase:size: 224 * 225 * The current size of the database in bytes. 226 * 227 * Since: 1.1.14 228 */ 229 g_object_class_install_property(gobjectClass, PROP_SIZE, 230 g_param_spec_uint64("size", 231 _("Size"), 232 _("The current size of the Web Database database"), 233 0, G_MAXUINT64, 0, 234 WEBKIT_PARAM_READABLE)); 235 /** 236 * WebKitWebDatabase:filename: 237 * 238 * The absolute filename of the Web Database database. 239 * 240 * Since: 1.1.14 241 */ 242 g_object_class_install_property(gobjectClass, PROP_PATH, 243 g_param_spec_string("filename", 244 _("Filename"), 245 _("The absolute filename of the Web Storage database"), 246 NULL, 247 WEBKIT_PARAM_READABLE)); 248 249 g_type_class_add_private(klass, sizeof(WebKitWebDatabasePrivate)); 250 } 251 252 static void webkit_web_database_init(WebKitWebDatabase* webDatabase) 253 { 254 webDatabase->priv = WEBKIT_WEB_DATABASE_GET_PRIVATE(webDatabase); 255 } 256 257 // Internal use only 258 static void webkit_web_database_set_security_origin(WebKitWebDatabase *webDatabase, WebKitSecurityOrigin *securityOrigin) 259 { 260 g_return_if_fail(WEBKIT_IS_WEB_DATABASE(webDatabase)); 261 g_return_if_fail(WEBKIT_IS_SECURITY_ORIGIN(securityOrigin)); 262 263 WebKitWebDatabasePrivate* priv = webDatabase->priv; 264 265 if (priv->origin) 266 g_object_unref(priv->origin); 267 268 g_object_ref(securityOrigin); 269 priv->origin = securityOrigin; 270 } 271 272 static void webkit_web_database_set_name(WebKitWebDatabase* webDatabase, const gchar* name) 273 { 274 g_return_if_fail(WEBKIT_IS_WEB_DATABASE(webDatabase)); 275 276 WebKitWebDatabasePrivate* priv = webDatabase->priv; 277 g_free(priv->name); 278 priv->name = g_strdup(name); 279 } 280 281 /** 282 * webkit_web_database_get_security_origin: 283 * @web_database: a #WebKitWebDatabase 284 * 285 * Returns the security origin of the #WebKitWebDatabase. 286 * 287 * Returns: the security origin of the database 288 * 289 * Since: 1.1.14 290 **/ 291 WebKitSecurityOrigin* webkit_web_database_get_security_origin(WebKitWebDatabase* webDatabase) 292 { 293 g_return_val_if_fail(WEBKIT_IS_WEB_DATABASE(webDatabase), NULL); 294 WebKitWebDatabasePrivate* priv = webDatabase->priv; 295 296 return priv->origin; 297 } 298 299 /** 300 * webkit_web_database_get_name: 301 * @web_database: a #WebKitWebDatabase 302 * 303 * Returns the canonical name of the #WebKitWebDatabase. 304 * 305 * Returns: the name of the database 306 * 307 * Since: 1.1.14 308 **/ 309 G_CONST_RETURN gchar* webkit_web_database_get_name(WebKitWebDatabase* webDatabase) 310 { 311 g_return_val_if_fail(WEBKIT_IS_WEB_DATABASE(webDatabase), NULL); 312 WebKitWebDatabasePrivate* priv = webDatabase->priv; 313 314 return priv->name; 315 } 316 317 /** 318 * webkit_web_database_get_display_name: 319 * @web_database: a #WebKitWebDatabase 320 * 321 * Returns the name of the #WebKitWebDatabase as seen by the user. 322 * 323 * Returns: the name of the database as seen by the user. 324 * 325 * Since: 1.1.14 326 **/ 327 G_CONST_RETURN gchar* webkit_web_database_get_display_name(WebKitWebDatabase* webDatabase) 328 { 329 g_return_val_if_fail(WEBKIT_IS_WEB_DATABASE(webDatabase), NULL); 330 331 #if ENABLE(DATABASE) 332 WebKitWebDatabasePrivate* priv = webDatabase->priv; 333 WebCore::DatabaseDetails details = WebCore::DatabaseTracker::tracker().detailsForNameAndOrigin(priv->name, core(priv->origin)); 334 WebCore::String displayName = details.displayName(); 335 336 if (displayName.isEmpty()) 337 return ""; 338 339 g_free(priv->displayName); 340 priv->displayName = g_strdup(displayName.utf8().data()); 341 return priv->displayName; 342 #else 343 return ""; 344 #endif 345 } 346 347 /** 348 * webkit_web_database_get_expected_size: 349 * @web_database: a #WebKitWebDatabase 350 * 351 * Returns the expected size of the #WebKitWebDatabase in bytes as defined by the 352 * web author. The Web Database standard allows web authors to specify an expected 353 * size of the database to optimize the user experience. 354 * 355 * Returns: the expected size of the database in bytes 356 * 357 * Since: 1.1.14 358 **/ 359 guint64 webkit_web_database_get_expected_size(WebKitWebDatabase* webDatabase) 360 { 361 g_return_val_if_fail(WEBKIT_IS_WEB_DATABASE(webDatabase), 0); 362 363 #if ENABLE(DATABASE) 364 WebKitWebDatabasePrivate* priv = webDatabase->priv; 365 WebCore::DatabaseDetails details = WebCore::DatabaseTracker::tracker().detailsForNameAndOrigin(priv->name, core(priv->origin)); 366 return details.expectedUsage(); 367 #else 368 return 0; 369 #endif 370 } 371 372 /** 373 * webkit_web_database_get_size: 374 * @web_database: a #WebKitWebDatabase 375 * 376 * Returns the actual size of the #WebKitWebDatabase space on disk in bytes. 377 * 378 * Returns: the actual size of the database in bytes 379 * 380 * Since: 1.1.14 381 **/ 382 guint64 webkit_web_database_get_size(WebKitWebDatabase* webDatabase) 383 { 384 g_return_val_if_fail(WEBKIT_IS_WEB_DATABASE(webDatabase), 0); 385 386 #if ENABLE(DATABASE) 387 WebKitWebDatabasePrivate* priv = webDatabase->priv; 388 WebCore::DatabaseDetails details = WebCore::DatabaseTracker::tracker().detailsForNameAndOrigin(priv->name, core(priv->origin)); 389 return details.currentUsage(); 390 #else 391 return 0; 392 #endif 393 } 394 395 /** 396 * webkit_web_database_get_filename: 397 * @web_database: a #WebKitWebDatabase 398 * 399 * Returns the absolute filename to the #WebKitWebDatabase file on disk. 400 * 401 * Returns: the absolute filename of the database 402 * 403 * Since: 1.1.14 404 **/ 405 G_CONST_RETURN gchar* webkit_web_database_get_filename(WebKitWebDatabase* webDatabase) 406 { 407 g_return_val_if_fail(WEBKIT_IS_WEB_DATABASE(webDatabase), NULL); 408 409 #if ENABLE(DATABASE) 410 WebKitWebDatabasePrivate* priv = webDatabase->priv; 411 WebCore::String coreName = WebCore::String::fromUTF8(priv->name); 412 WebCore::String corePath = WebCore::DatabaseTracker::tracker().fullPathForDatabase(core(priv->origin), coreName); 413 414 if (corePath.isEmpty()) 415 return""; 416 417 g_free(priv->filename); 418 priv->filename = g_strdup(corePath.utf8().data()); 419 return priv->filename; 420 421 #else 422 return ""; 423 #endif 424 } 425 426 /** 427 * webkit_web_database_remove: 428 * @web_database: a #WebKitWebDatabase 429 * 430 * Removes the #WebKitWebDatabase from its security origin and destroys all data 431 * stored in the database. 432 * 433 * Since: 1.1.14 434 **/ 435 void webkit_web_database_remove(WebKitWebDatabase* webDatabase) 436 { 437 g_return_if_fail(WEBKIT_IS_WEB_DATABASE(webDatabase)); 438 439 #if ENABLE(DATABASE) 440 WebKitWebDatabasePrivate* priv = webDatabase->priv; 441 WebCore::DatabaseTracker::tracker().deleteDatabase(core(priv->origin), priv->name); 442 #endif 443 } 444 445 /** 446 * webkit_remove_all_web_databases: 447 * 448 * Removes all web databases from the current database directory path. 449 * 450 * Since: 1.1.14 451 **/ 452 void webkit_remove_all_web_databases() 453 { 454 #if ENABLE(DATABASE) 455 WebCore::DatabaseTracker::tracker().deleteAllDatabases(); 456 #endif 457 } 458 459 /** 460 * webkit_get_web_database_directory_path: 461 * 462 * Returns the current path to the directory WebKit will write Web 463 * Database databases. By default this path will be in the user data 464 * directory. 465 * 466 * Returns: the current database directory path 467 * 468 * Since: 1.1.14 469 **/ 470 G_CONST_RETURN gchar* webkit_get_web_database_directory_path() 471 { 472 #if ENABLE(DATABASE) 473 WebCore::String path = WebCore::DatabaseTracker::tracker().databaseDirectoryPath(); 474 475 if (path.isEmpty()) 476 return ""; 477 478 g_free(webkit_database_directory_path); 479 webkit_database_directory_path = g_strdup(path.utf8().data()); 480 return webkit_database_directory_path; 481 #else 482 return ""; 483 #endif 484 } 485 486 /** 487 * webkit_set_web_database_directory_path: 488 * @path: the new database directory path 489 * 490 * Sets the current path to the directory WebKit will write Web 491 * Database databases. 492 * 493 * Since: 1.1.14 494 **/ 495 void webkit_set_web_database_directory_path(const gchar* path) 496 { 497 #if ENABLE(DATABASE) 498 WebCore::String corePath = WebCore::String::fromUTF8(path); 499 WebCore::DatabaseTracker::tracker().setDatabaseDirectoryPath(corePath); 500 501 g_free(webkit_database_directory_path); 502 webkit_database_directory_path = g_strdup(corePath.utf8().data()); 503 #endif 504 } 505 506 /** 507 * webkit_get_default_web_database_quota: 508 * 509 * Returns the default quota for Web Database databases. By default 510 * this value is 5MB. 511 512 * Returns: the current default database quota in bytes 513 * 514 * Since: 1.1.14 515 **/ 516 guint64 webkit_get_default_web_database_quota() 517 { 518 return webkit_default_database_quota; 519 } 520 521 /** 522 * webkit_set_default_web_database_quota: 523 * @default_quota: the new default database quota 524 * 525 * Sets the current path to the directory WebKit will write Web 526 * Database databases. 527 * 528 * Since: 1.1.14 529 **/ 530 void webkit_set_default_web_database_quota(guint64 defaultQuota) 531 { 532 webkit_default_database_quota = defaultQuota; 533 } 534