18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2006, 2007 Apple Inc.
3db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h"
22db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block#include "SearchPopupMenuWin.h"
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
24f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick#include <wtf/text/AtomicString.h>
25dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
2681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(CF)
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/RetainPtr.h>
28dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#endif
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
32db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockSearchPopupMenuWin::SearchPopupMenuWin(PopupMenuClient* client)
33db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    : m_popup(adoptRef(new PopupMenuWin(client)))
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
37db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve BlockPopupMenu* SearchPopupMenuWin::popupMenu()
38db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{
39db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block    return m_popup.get();
40db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block}
41db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block
42db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockbool SearchPopupMenuWin::enabled()
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
4481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(CF)
458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return true;
46dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#else
47dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return false;
48dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#endif
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
5181bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(CF)
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic RetainPtr<CFStringRef> autosaveKey(const String& name)
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String key = "com.apple.WebKit.searchField:" + name;
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return RetainPtr<CFStringRef>(AdoptCF, key.createCFString());
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
57dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#endif
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
59db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid SearchPopupMenuWin::saveRecentSearches(const AtomicString& name, const Vector<String>& searchItems)
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (name.isEmpty())
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
6481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(CF)
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RetainPtr<CFMutableArrayRef> items;
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    size_t size = searchItems.size();
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (size) {
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        items.adoptCF(CFArrayCreateMutable(0, size, &kCFTypeArrayCallBacks));
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        for (size_t i = 0; i < size; ++i) {
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            RetainPtr<CFStringRef> item(AdoptCF, searchItems[i].createCFString());
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            CFArrayAppendValue(items.get(), item.get());
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        }
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFPreferencesSetAppValue(autosaveKey(name).get(), items.get(), kCFPreferencesCurrentApplication);
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CFPreferencesAppSynchronize(kCFPreferencesCurrentApplication);
78dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#endif
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
81db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid SearchPopupMenuWin::loadRecentSearches(const AtomicString& name, Vector<String>& searchItems)
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (name.isEmpty())
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
8681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#if USE(CF)
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    searchItems.clear();
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    RetainPtr<CFArrayRef> items(AdoptCF, reinterpret_cast<CFArrayRef>(CFPreferencesCopyAppValue(autosaveKey(name).get(), kCFPreferencesCurrentApplication)));
898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (!items || CFGetTypeID(items.get()) != CFArrayGetTypeID())
918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return;
928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    size_t size = CFArrayGetCount(items.get());
948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    for (size_t i = 0; i < size; ++i) {
958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CFStringRef item = (CFStringRef)CFArrayGetValueAtIndex(items.get(), i);
968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        if (CFGetTypeID(item) == CFStringGetTypeID())
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project            searchItems.append(item);
988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
99dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#endif
1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
103