7ae800b3b7e27069d9d50f711a7cc0604c9f2ad7
[WebKit-https.git] / Source / WebCore / platform / win / SearchPopupMenuWin.cpp
1 /*
2  * Copyright (C) 2006, 2007 Apple Inc.
3  * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #include "config.h"
22 #include "SearchPopupMenuWin.h"
23
24 #include <wtf/text/AtomicString.h>
25
26 #if PLATFORM(CF)
27 #include <wtf/RetainPtr.h>
28 #endif
29
30 namespace WebCore {
31
32 SearchPopupMenuWin::SearchPopupMenuWin(PopupMenuClient* client)
33     : m_popup(adoptRef(new PopupMenuWin(client)))
34 {
35 }
36
37 PopupMenu* SearchPopupMenuWin::popupMenu()
38 {
39     return m_popup.get();
40 }
41
42 bool SearchPopupMenuWin::enabled()
43 {
44 #if PLATFORM(CF)
45     return true;
46 #else
47     return false;
48 #endif
49 }
50
51 #if PLATFORM(CF)
52 static RetainPtr<CFStringRef> autosaveKey(const String& name)
53 {
54     String key = "com.apple.WebKit.searchField:" + name;
55     return RetainPtr<CFStringRef>(AdoptCF, key.createCFString());
56 }
57 #endif
58
59 void SearchPopupMenuWin::saveRecentSearches(const AtomicString& name, const Vector<String>& searchItems)
60 {
61     if (name.isEmpty())
62         return;
63
64 #if PLATFORM(CF)
65     RetainPtr<CFMutableArrayRef> items;
66
67     size_t size = searchItems.size();
68     if (size) {
69         items.adoptCF(CFArrayCreateMutable(0, size, &kCFTypeArrayCallBacks));
70         for (size_t i = 0; i < size; ++i) {
71             RetainPtr<CFStringRef> item(AdoptCF, searchItems[i].createCFString());
72             CFArrayAppendValue(items.get(), item.get());
73         }
74     }
75
76     CFPreferencesSetAppValue(autosaveKey(name).get(), items.get(), kCFPreferencesCurrentApplication);
77     CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
78 #endif
79 }
80
81 void SearchPopupMenuWin::loadRecentSearches(const AtomicString& name, Vector<String>& searchItems)
82 {
83     if (name.isEmpty())
84         return;
85
86 #if PLATFORM(CF)
87     searchItems.clear();
88     RetainPtr<CFArrayRef> items(AdoptCF, reinterpret_cast<CFArrayRef>(CFPreferencesCopyAppValue(autosaveKey(name).get(), kCFPreferencesCurrentApplication)));
89
90     if (!items || CFGetTypeID(items.get()) != CFArrayGetTypeID())
91         return;
92
93     size_t size = CFArrayGetCount(items.get());
94     for (size_t i = 0; i < size; ++i) {
95         CFStringRef item = (CFStringRef)CFArrayGetValueAtIndex(items.get(), i);
96         if (CFGetTypeID(item) == CFStringGetTypeID())
97             searchItems.append(item);
98     }
99 #endif
100 }
101
102 }