1/* 2 * Copyright (C) 2012 Samsung Electronics 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 28#include "UnitTestUtils/EWK2UnitTestBase.h" 29 30using namespace EWK2UnitTest; 31 32struct OriginData { 33 Eina_List* originList; 34 Ewk_Storage_Manager* manager; 35 bool didReceiveOriginsCallback; 36 bool isSynchronized; 37 unsigned timeToCheck; 38 39 OriginData() 40 : originList(0) 41 , manager(0) 42 , didReceiveOriginsCallback(false) 43 , isSynchronized(false) 44 , timeToCheck(10) 45 { } 46}; 47 48static void getStorageOriginsCallback(Eina_List* origins, Ewk_Error* error, void* userData) 49{ 50 ASSERT_FALSE(error); 51 52 OriginData* originData = static_cast<OriginData*>(userData); 53 originData->didReceiveOriginsCallback = true; 54 55 Eina_List* l; 56 void* data; 57 EINA_LIST_FOREACH(origins, l, data) { 58 originData->originList = eina_list_append(originData->originList, data); 59 Ewk_Security_Origin* origin = static_cast<Ewk_Security_Origin*>(data); 60 if (!strcmp(ewk_security_origin_protocol_get(origin), "http") 61 && !strcmp(ewk_security_origin_host_get(origin), "www.storagetest.com") 62 && !ewk_security_origin_port_get(origin)) { 63 originData->isSynchronized = true; 64 ecore_main_loop_quit(); 65 } 66 } 67} 68 69static bool timerCallback(void* userData) 70{ 71 OriginData* originData = static_cast<OriginData*>(userData); 72 73 if (originData->isSynchronized || !--(originData->timeToCheck)) { 74 ecore_main_loop_quit(); 75 return ECORE_CALLBACK_CANCEL; 76 } 77 78 if (originData->didReceiveOriginsCallback) { 79 originData->didReceiveOriginsCallback = false; 80 ewk_storage_manager_origins_get(originData->manager, getStorageOriginsCallback, originData); 81 } 82 83 return ECORE_CALLBACK_RENEW; 84} 85 86static bool checkOrigin(Eina_List* origins, Ewk_Security_Origin** origin) 87{ 88 Eina_List* l; 89 void* data; 90 EINA_LIST_FOREACH(origins, l, data) { 91 *origin = static_cast<Ewk_Security_Origin*>(data); 92 if (!strcmp(ewk_security_origin_protocol_get(*origin), "http") 93 && !strcmp(ewk_security_origin_host_get(*origin), "www.storagetest.com") 94 && !ewk_security_origin_port_get(*origin)) 95 return true; 96 } 97 98 return false; 99} 100 101TEST_F(EWK2UnitTestBase, ewk_storage_manager_origins_get) 102{ 103 Evas_Object* view = webView(); 104 const char* storageHTML = 105 "<html><head><title>original title</title></head>" 106 "<body>" 107 "<script type='text/javascript'>" 108 " localStorage.setItem('item', 'storage');" 109 "</script>" 110 "</body></html>"; 111 112 ewk_view_html_string_load(view, storageHTML, "http://www.storagetest.com", 0); 113 114 OriginData originData; 115 originData.manager = ewk_context_storage_manager_get(ewk_view_context_get(view)); 116 ASSERT_TRUE(ewk_storage_manager_origins_get(originData.manager, getStorageOriginsCallback, &originData)); 117 Ecore_Timer* storage_timer = ecore_timer_add(1, reinterpret_cast<Ecore_Task_Cb>(timerCallback), &originData); 118 119 ecore_main_loop_begin(); 120 if (storage_timer) 121 ecore_timer_del(storage_timer); 122 123 ASSERT_TRUE(originData.isSynchronized); 124 ASSERT_LE(1, eina_list_count(originData.originList)); 125 126 Ewk_Security_Origin* origin = 0; 127 EXPECT_TRUE(checkOrigin(originData.originList, &origin)); 128 129 EXPECT_EQ(origin, ewk_object_ref(origin)); 130 ewk_object_unref(origin); 131} 132