• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * Copyright (C) 2008 Apple Inc. All Rights Reserved.
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. ``AS IS'' AND ANY
14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 */
25
26#import "WebIconFetcher.h"
27
28#import "WebFrameInternal.h"
29#import "WebIconFetcherInternal.h"
30
31#import <WebCore/Frame.h>
32#import <WebCore/IconFetcher.h>
33#import <WebCore/SharedBuffer.h>
34#import <wtf/PassRefPtr.h>
35
36using namespace WebCore;
37
38class WebIconFetcherClient : public IconFetcherClient {
39public:
40    WebIconFetcherClient(id target, SEL selector)
41        : m_target(target)
42        , m_selector(selector)
43    {
44    }
45
46    virtual void finishedFetchingIcon(PassRefPtr<SharedBuffer> iconData)
47    {
48        RetainPtr<NSData> data;
49        if (iconData)
50            data = iconData->createNSData();
51
52        [m_target performSelector:m_selector withObject:m_fetcher.get() withObject:data.get()];
53
54        delete this;
55    }
56
57    void setFetcher(WebIconFetcher *fetcher) { m_fetcher = fetcher; }
58
59private:
60    RetainPtr<WebIconFetcher> m_fetcher;
61    id m_target;
62    SEL m_selector;
63};
64
65@implementation WebIconFetcher
66
67- (id)init
68{
69    return nil;
70}
71
72- (void)dealloc
73{
74    if (_private)
75        reinterpret_cast<IconFetcher*>(_private)->deref();
76
77    [super dealloc];
78}
79
80- (void)finalize
81{
82    if (_private)
83        reinterpret_cast<IconFetcher*>(_private)->deref();
84
85    [super finalize];
86}
87
88- (void)cancel
89{
90    reinterpret_cast<IconFetcher*>(_private)->cancel();
91}
92
93@end
94
95@implementation WebIconFetcher (WebInternal)
96
97- (id)_initWithIconFetcher:(PassRefPtr<IconFetcher>)iconFetcher client:(WebIconFetcherClient *)client
98{
99    ASSERT(iconFetcher);
100
101    self = [super init];
102    if (!self)
103        return nil;
104
105    client->setFetcher(self);
106    _private = reinterpret_cast<WebIconFetcherPrivate*>(iconFetcher.releaseRef());
107
108    return self;
109}
110
111+ (WebIconFetcher *)_fetchApplicationIconForFrame:(WebFrame *)webFrame
112                                           target:(id)target
113                                         selector:(SEL)selector
114{
115    Frame* frame = core(webFrame);
116
117    WebIconFetcherClient* client = new WebIconFetcherClient(target, selector);
118
119    RefPtr<IconFetcher> fetcher = IconFetcher::create(frame, client);
120
121    if (!fetcher)
122        return nil;
123
124    return [[[WebIconFetcher alloc] _initWithIconFetcher:fetcher.release() client:client] autorelease];
125}
126
127@end
128
129