1/*
2 * Copyright (C) 2009 Google 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 are
6 * met:
7 *
8 *     * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 *     * Redistributions in binary form must reproduce the above
11 * copyright notice, this list of conditions and the following disclaimer
12 * in the documentation and/or other materials provided with the
13 * distribution.
14 *     * Neither the name of Google Inc. nor the names of its
15 * contributors may be used to endorse or promote products derived from
16 * this software without specific prior written permission.
17 *
18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */
30
31#include "config.h"
32#include "StorageEventDispatcherImpl.h"
33
34#if ENABLE(DOM_STORAGE)
35
36#include "DOMWindow.h"
37#include "EventNames.h"
38#include "Frame.h"
39#include "KURL.h"
40#include "Page.h"
41#include "PageGroup.h"
42#include "SecurityOrigin.h"
43#include "StorageEvent.h"
44
45namespace WebCore {
46
47StorageEventDispatcherImpl::StorageEventDispatcherImpl(const String& groupName)
48    : m_pageGroup(PageGroup::pageGroup(groupName))
49{
50    ASSERT(m_pageGroup);
51}
52
53void StorageEventDispatcherImpl::dispatchStorageEvent(const String& key, const String& oldValue,
54                                                      const String& newValue, SecurityOrigin* securityOrigin,
55                                                      const KURL& url, StorageType storageType)
56{
57    // FIXME: Implement
58    if (storageType == SessionStorage)
59        return;
60
61    // We need to copy all relevant frames from every page to a vector since sending the event to one frame might mutate the frame tree
62    // of any given page in the group or mutate the page group itself.
63    Vector<RefPtr<Frame> > frames;
64
65    const HashSet<Page*>& pages = m_pageGroup->pages();
66    HashSet<Page*>::const_iterator end = pages.end();
67    for (HashSet<Page*>::const_iterator it = pages.begin(); it != end; ++it) {
68        for (Frame* frame = (*it)->mainFrame(); frame; frame = frame->tree()->traverseNext()) {
69            if (frame->document()->securityOrigin()->equal(securityOrigin))
70                frames.append(frame);
71        }
72    }
73
74    for (unsigned i = 0; i < frames.size(); ++i) {
75        ExceptionCode ec = 0;
76        Storage* storage = frames[i]->domWindow()->localStorage(ec);
77        if (!ec)
78            frames[i]->document()->dispatchWindowEvent(StorageEvent::create(eventNames().storageEvent, key, oldValue, newValue, url, storage));
79    }
80}
81
82} // namespace WebCore
83
84#endif // ENABLE(DOM_STORAGE)
85