OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <algorithm> | 5 #include <algorithm> |
6 | 6 |
7 #include "base/file_util.h" | 7 #include "base/file_util.h" |
8 #include "base/json/json_reader.h" | 8 #include "base/json/json_reader.h" |
9 #include "base/json/json_writer.h" | 9 #include "base/json/json_writer.h" |
10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
(...skipping 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 | 291 |
292 bool WaitFor(const std::string& event_name, const std::string& json_args) { | 292 bool WaitFor(const std::string& event_name, const std::string& json_args) { |
293 return events_listener_->WaitFor( | 293 return events_listener_->WaitFor( |
294 current_browser()->profile(), event_name, json_args); | 294 current_browser()->profile(), event_name, json_args); |
295 } | 295 } |
296 | 296 |
297 bool WaitForInterruption(DownloadItem* item, int expected_error, | 297 bool WaitForInterruption(DownloadItem* item, int expected_error, |
298 const std::string& on_created_event) { | 298 const std::string& on_created_event) { |
299 if (!WaitFor(events::kOnDownloadCreated, on_created_event)) | 299 if (!WaitFor(events::kOnDownloadCreated, on_created_event)) |
300 return false; | 300 return false; |
301 // The item may or may not be interrupted before the onCreated event fires. | 301 // Now, onCreated is always fired before interruption. |
302 if (item->IsInterrupted()) { | 302 return WaitFor(events::kOnDownloadChanged, |
303 scoped_ptr<base::Value> args(base::JSONReader::Read(on_created_event)); | 303 base::StringPrintf("[{\"id\": %d," |
304 base::ListValue* args_list = NULL; | 304 " \"error\": {\"current\": %d}," |
305 base::DictionaryValue* args_dict = NULL; | 305 " \"state\": {" |
306 if (!args->GetAsList(&args_list) || | 306 " \"previous\": \"in_progress\"," |
307 !args_list->GetDictionary(0, &args_dict)) | 307 " \"current\": \"interrupted\"}}]", |
308 return false; | 308 item->GetId(), |
309 args_dict->SetString("state", "interrupted"); | 309 expected_error)); |
310 args_dict->SetInteger("error", expected_error); | |
311 std::string created_error; | |
312 base::JSONWriter::Write(args_list, &created_error); | |
313 // This is not waiting for a different event, it's refining the | |
314 // expectations on the onCreated event that was just caught. Specifically, | |
315 // if a DownloadItem is already interrupted by the time the onCreated | |
316 // event fires, then the onCreated event should already describe the | |
317 // error. | |
318 return WaitFor(events::kOnDownloadCreated, created_error); | |
319 } else { | |
320 return WaitFor(events::kOnDownloadChanged, | |
321 base::StringPrintf("[{\"id\": %d," | |
322 " \"error\": {\"current\": %d}," | |
323 " \"state\": {" | |
324 " \"previous\": \"in_progress\"," | |
325 " \"current\": \"interrupted\"}}]", | |
326 item->GetId(), | |
327 expected_error)); | |
328 } | |
329 } | 310 } |
330 | 311 |
331 std::string GetExtensionURL() { | 312 std::string GetExtensionURL() { |
332 return extension_->url().spec(); | 313 return extension_->url().spec(); |
333 } | 314 } |
334 | 315 |
335 std::string GetFilename(const char* path) { | 316 std::string GetFilename(const char* path) { |
336 std::string result = | 317 std::string result = |
337 downloads_directory_.path().AppendASCII(path).AsUTF8Unsafe(); | 318 downloads_directory_.path().AppendASCII(path).AsUTF8Unsafe(); |
338 #if defined(OS_WIN) | 319 #if defined(OS_WIN) |
(...skipping 1158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1497 int result_id = -1; | 1478 int result_id = -1; |
1498 ASSERT_TRUE(result->GetAsInteger(&result_id)); | 1479 ASSERT_TRUE(result->GetAsInteger(&result_id)); |
1499 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | 1480 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); |
1500 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | 1481 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); |
1501 ASSERT_TRUE(item); | 1482 ASSERT_TRUE(item); |
1502 ScopedCancellingItem canceller(item); | 1483 ScopedCancellingItem canceller(item); |
1503 ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); | 1484 ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); |
1504 | 1485 |
1505 ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, | 1486 ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, |
1506 base::StringPrintf("[{\"danger\": \"safe\"," | 1487 base::StringPrintf("[{\"danger\": \"safe\"," |
1507 " \"filename\": \"%s\"," | |
1508 " \"incognito\": false," | 1488 " \"incognito\": false," |
1509 " \"mime\": \"text/plain\"," | 1489 " \"mime\": \"text/plain\"," |
1510 " \"paused\": false," | 1490 " \"paused\": false," |
1511 " \"url\": \"%s\"}]", | 1491 " \"url\": \"%s\"}]", |
1512 GetFilename("slow.txt.crdownload").c_str(), | |
1513 download_url.c_str()))); | 1492 download_url.c_str()))); |
1514 ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, | 1493 ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, |
1515 base::StringPrintf("[{\"id\": %d," | 1494 base::StringPrintf("[{\"id\": %d," |
1516 " \"filename\": {" | 1495 " \"filename\": {" |
1517 " \"previous\": \"%s\"," | 1496 " \"previous\": \"%s\"," |
1518 " \"current\": \"%s\"}," | 1497 " \"current\": \"%s\"}," |
1519 " \"state\": {" | 1498 " \"state\": {" |
1520 " \"previous\": \"in_progress\"," | 1499 " \"previous\": \"in_progress\"," |
1521 " \"current\": \"complete\"}}]", | 1500 " \"current\": \"complete\"}}]", |
1522 result_id, | 1501 result_id, |
(...skipping 17 matching lines...) Expand all Loading... |
1540 int result_id = -1; | 1519 int result_id = -1; |
1541 ASSERT_TRUE(result->GetAsInteger(&result_id)); | 1520 ASSERT_TRUE(result->GetAsInteger(&result_id)); |
1542 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | 1521 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); |
1543 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | 1522 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); |
1544 ASSERT_TRUE(item); | 1523 ASSERT_TRUE(item); |
1545 ScopedCancellingItem canceller(item); | 1524 ScopedCancellingItem canceller(item); |
1546 ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); | 1525 ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); |
1547 | 1526 |
1548 ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, | 1527 ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, |
1549 base::StringPrintf("[{\"danger\": \"safe\"," | 1528 base::StringPrintf("[{\"danger\": \"safe\"," |
1550 " \"filename\": \"%s\"," | |
1551 " \"incognito\": true," | 1529 " \"incognito\": true," |
1552 " \"mime\": \"text/plain\"," | 1530 " \"mime\": \"text/plain\"," |
1553 " \"paused\": false," | 1531 " \"paused\": false," |
1554 " \"url\": \"%s\"}]", | 1532 " \"url\": \"%s\"}]", |
1555 GetFilename("slow.txt.crdownload").c_str(), | |
1556 download_url.c_str()))); | 1533 download_url.c_str()))); |
1557 ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, | 1534 ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, |
1558 base::StringPrintf("[{\"id\":%d," | 1535 base::StringPrintf("[{\"id\":%d," |
1559 " \"filename\": {" | 1536 " \"filename\": {" |
1560 " \"previous\": \"%s\"," | 1537 " \"previous\": \"%s\"," |
1561 " \"current\": \"%s\"}," | 1538 " \"current\": \"%s\"}," |
1562 " \"state\": {" | 1539 " \"state\": {" |
1563 " \"current\": \"complete\"," | 1540 " \"current\": \"complete\"," |
1564 " \"previous\": \"in_progress\"}}]", | 1541 " \"previous\": \"in_progress\"}}]", |
1565 result_id, | 1542 result_id, |
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1696 int result_id = -1; | 1673 int result_id = -1; |
1697 ASSERT_TRUE(result->GetAsInteger(&result_id)); | 1674 ASSERT_TRUE(result->GetAsInteger(&result_id)); |
1698 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | 1675 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); |
1699 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | 1676 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); |
1700 ASSERT_TRUE(item); | 1677 ASSERT_TRUE(item); |
1701 ScopedCancellingItem canceller(item); | 1678 ScopedCancellingItem canceller(item); |
1702 ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); | 1679 ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); |
1703 | 1680 |
1704 ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, | 1681 ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, |
1705 base::StringPrintf("[{\"danger\": \"safe\"," | 1682 base::StringPrintf("[{\"danger\": \"safe\"," |
1706 " \"filename\": \"%s\"," | |
1707 " \"incognito\": false," | 1683 " \"incognito\": false," |
1708 " \"mime\": \"text/plain\"," | 1684 " \"mime\": \"text/plain\"," |
1709 " \"paused\": false," | 1685 " \"paused\": false," |
1710 " \"url\": \"%s\"}]", | 1686 " \"url\": \"%s\"}]", |
1711 GetFilename("slow.txt.crdownload").c_str(), | |
1712 download_url.c_str()))); | 1687 download_url.c_str()))); |
1713 ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, | 1688 ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, |
1714 base::StringPrintf("[{\"id\": %d," | 1689 base::StringPrintf("[{\"id\": %d," |
1715 " \"filename\": {" | 1690 " \"filename\": {" |
1716 " \"previous\": \"%s\"," | 1691 " \"previous\": \"%s\"," |
1717 " \"current\": \"%s\"}," | 1692 " \"current\": \"%s\"}," |
1718 " \"state\": {" | 1693 " \"state\": {" |
1719 " \"previous\": \"in_progress\"," | 1694 " \"previous\": \"in_progress\"," |
1720 " \"current\": \"complete\"}}]", | 1695 " \"current\": \"complete\"}}]", |
1721 result_id, | 1696 result_id, |
(...skipping 17 matching lines...) Expand all Loading... |
1739 int result_id = -1; | 1714 int result_id = -1; |
1740 ASSERT_TRUE(result->GetAsInteger(&result_id)); | 1715 ASSERT_TRUE(result->GetAsInteger(&result_id)); |
1741 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | 1716 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); |
1742 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | 1717 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); |
1743 ASSERT_TRUE(item); | 1718 ASSERT_TRUE(item); |
1744 ScopedCancellingItem canceller(item); | 1719 ScopedCancellingItem canceller(item); |
1745 ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); | 1720 ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); |
1746 | 1721 |
1747 ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, | 1722 ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, |
1748 base::StringPrintf("[{\"danger\": \"safe\"," | 1723 base::StringPrintf("[{\"danger\": \"safe\"," |
1749 " \"filename\": \"%s\"," | |
1750 " \"incognito\": false," | 1724 " \"incognito\": false," |
1751 " \"mime\": \"text/plain\"," | 1725 " \"mime\": \"text/plain\"," |
1752 " \"paused\": false," | 1726 " \"paused\": false," |
1753 " \"url\": \"%s\"}]", | 1727 " \"url\": \"%s\"}]", |
1754 GetFilename("data.txt.crdownload").c_str(), | |
1755 download_url.c_str()))); | 1728 download_url.c_str()))); |
1756 ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, | 1729 ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, |
1757 base::StringPrintf("[{\"id\": %d," | 1730 base::StringPrintf("[{\"id\": %d," |
1758 " \"filename\": {" | 1731 " \"filename\": {" |
1759 " \"previous\": \"%s\"," | 1732 " \"previous\": \"%s\"," |
1760 " \"current\": \"%s\"}," | 1733 " \"current\": \"%s\"}," |
1761 " \"state\": {" | 1734 " \"state\": {" |
1762 " \"previous\": \"in_progress\"," | 1735 " \"previous\": \"in_progress\"," |
1763 " \"current\": \"complete\"}}]", | 1736 " \"current\": \"complete\"}}]", |
1764 result_id, | 1737 result_id, |
(...skipping 20 matching lines...) Expand all Loading... |
1785 int result_id = -1; | 1758 int result_id = -1; |
1786 ASSERT_TRUE(result->GetAsInteger(&result_id)); | 1759 ASSERT_TRUE(result->GetAsInteger(&result_id)); |
1787 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | 1760 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); |
1788 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | 1761 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); |
1789 ASSERT_TRUE(item); | 1762 ASSERT_TRUE(item); |
1790 ScopedCancellingItem canceller(item); | 1763 ScopedCancellingItem canceller(item); |
1791 ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); | 1764 ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); |
1792 | 1765 |
1793 ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, | 1766 ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, |
1794 base::StringPrintf("[{\"danger\": \"safe\"," | 1767 base::StringPrintf("[{\"danger\": \"safe\"," |
1795 " \"filename\": \"%s\"," | |
1796 " \"incognito\": false," | 1768 " \"incognito\": false," |
1797 " \"mime\": \"text/html\"," | 1769 " \"mime\": \"text/html\"," |
1798 " \"paused\": false," | 1770 " \"paused\": false," |
1799 " \"url\": \"%s\"}]", | 1771 " \"url\": \"%s\"}]", |
1800 GetFilename("file.txt.crdownload").c_str(), | |
1801 download_url.c_str()))); | 1772 download_url.c_str()))); |
1802 ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, | 1773 ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, |
1803 base::StringPrintf("[{\"id\": %d," | 1774 base::StringPrintf("[{\"id\": %d," |
1804 " \"filename\": {" | 1775 " \"filename\": {" |
1805 " \"previous\": \"%s\"," | 1776 " \"previous\": \"%s\"," |
1806 " \"current\": \"%s\"}," | 1777 " \"current\": \"%s\"}," |
1807 " \"state\": {" | 1778 " \"state\": {" |
1808 " \"previous\": \"in_progress\"," | 1779 " \"previous\": \"in_progress\"," |
1809 " \"current\": \"complete\"}}]", | 1780 " \"current\": \"complete\"}}]", |
1810 result_id, | 1781 result_id, |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1992 int result_id = -1; | 1963 int result_id = -1; |
1993 ASSERT_TRUE(result->GetAsInteger(&result_id)); | 1964 ASSERT_TRUE(result->GetAsInteger(&result_id)); |
1994 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | 1965 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); |
1995 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | 1966 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); |
1996 ASSERT_TRUE(item); | 1967 ASSERT_TRUE(item); |
1997 ScopedCancellingItem canceller(item); | 1968 ScopedCancellingItem canceller(item); |
1998 ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); | 1969 ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); |
1999 | 1970 |
2000 ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, | 1971 ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, |
2001 base::StringPrintf("[{\"danger\": \"safe\"," | 1972 base::StringPrintf("[{\"danger\": \"safe\"," |
2002 " \"incognito\": false," | 1973 " \"incognito\": false," |
2003 " \"mime\": \"application/octet-stream\"," | 1974 " \"mime\": \"application/octet-stream\"," |
2004 " \"paused\": false," | 1975 " \"paused\": false," |
2005 " \"bytesReceived\": 164," | 1976 " \"url\": \"%s\"}]", download_url.c_str()))); |
2006 " \"url\": \"%s\"}]", download_url.c_str()))); | |
2007 ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, | 1977 ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, |
2008 base::StringPrintf("[{\"id\": %d," | 1978 base::StringPrintf("[{\"id\": %d," |
2009 " \"state\": {" | 1979 " \"state\": {" |
2010 " \"previous\": \"in_progress\"," | 1980 " \"previous\": \"in_progress\"," |
2011 " \"current\": \"complete\"}}]", result_id))); | 1981 " \"current\": \"complete\"}," |
| 1982 " \"filename\": {" |
| 1983 " \"previous\": \"%s\"," |
| 1984 " \"current\": \"%s\"}}]", |
| 1985 result_id, |
| 1986 GetFilename("post-succeed.txt.crdownload").c_str(), |
| 1987 GetFilename("post-succeed.txt").c_str()))); |
2012 } | 1988 } |
2013 | 1989 |
2014 // Test that downloadPostSuccess would fail if the resource requires the POST | 1990 // Test that downloadPostSuccess would fail if the resource requires the POST |
2015 // method, and chrome fails to propagate the |method| parameter back to the | 1991 // method, and chrome fails to propagate the |method| parameter back to the |
2016 // server. This tests both that testserver.py does not succeed when it should | 1992 // server. This tests both that testserver.py does not succeed when it should |
2017 // fail, and this tests how the downloads extension api exposes the failure to | 1993 // fail, and this tests how the downloads extension api exposes the failure to |
2018 // extensions. | 1994 // extensions. |
2019 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, | 1995 IN_PROC_BROWSER_TEST_F(DownloadExtensionTest, |
2020 DownloadExtensionTest_Download_Post_Get) { | 1996 DownloadExtensionTest_Download_Post_Get) { |
2021 LoadExtension("downloads_split"); | 1997 LoadExtension("downloads_split"); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2157 ASSERT_TRUE(result->GetAsInteger(&result_id)); | 2133 ASSERT_TRUE(result->GetAsInteger(&result_id)); |
2158 | 2134 |
2159 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); | 2135 DownloadItem* item = GetCurrentManager()->GetActiveDownloadItem(result_id); |
2160 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); | 2136 if (!item) item = GetCurrentManager()->GetDownloadItem(result_id); |
2161 ASSERT_TRUE(item); | 2137 ASSERT_TRUE(item); |
2162 ScopedCancellingItem canceller(item); | 2138 ScopedCancellingItem canceller(item); |
2163 ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); | 2139 ASSERT_EQ(download_url, item->GetOriginalUrl().spec()); |
2164 | 2140 |
2165 ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, | 2141 ASSERT_TRUE(WaitFor(events::kOnDownloadCreated, |
2166 base::StringPrintf("[{\"danger\": \"safe\"," | 2142 base::StringPrintf("[{\"danger\": \"safe\"," |
2167 " \"filename\": \"%s\"," | |
2168 " \"incognito\": false," | 2143 " \"incognito\": false," |
2169 " \"mime\": \"text/plain\"," | 2144 " \"mime\": \"text/plain\"," |
2170 " \"paused\": false," | 2145 " \"paused\": false," |
2171 " \"url\": \"%s\"}]", | 2146 " \"url\": \"%s\"}]", |
2172 GetFilename("on_record.txt.crdownload").c_str(), | |
2173 download_url.c_str()))); | 2147 download_url.c_str()))); |
2174 ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, | 2148 ASSERT_TRUE(WaitFor(events::kOnDownloadChanged, |
2175 base::StringPrintf("[{\"id\": %d," | 2149 base::StringPrintf("[{\"id\": %d," |
2176 " \"filename\": {" | 2150 " \"filename\": {" |
2177 " \"previous\": \"%s\"," | 2151 " \"previous\": \"%s\"," |
2178 " \"current\": \"%s\"}," | 2152 " \"current\": \"%s\"}," |
2179 " \"state\": {" | 2153 " \"state\": {" |
2180 " \"previous\": \"in_progress\"," | 2154 " \"previous\": \"in_progress\"," |
2181 " \"current\": \"complete\"}}]", | 2155 " \"current\": \"complete\"}}]", |
2182 result_id, | 2156 result_id, |
2183 GetFilename("on_record.txt.crdownload").c_str(), | 2157 GetFilename("on_record.txt.crdownload").c_str(), |
2184 GetFilename("on_record.txt").c_str()))); | 2158 GetFilename("on_record.txt").c_str()))); |
2185 std::string disk_data; | 2159 std::string disk_data; |
2186 EXPECT_TRUE(file_util::ReadFileToString(item->GetFullPath(), &disk_data)); | 2160 EXPECT_TRUE(file_util::ReadFileToString(item->GetFullPath(), &disk_data)); |
2187 EXPECT_STREQ(kPayloadData, disk_data.c_str()); | 2161 EXPECT_STREQ(kPayloadData, disk_data.c_str()); |
2188 } | 2162 } |
OLD | NEW |