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