8c10371fd680602c0f845e481336dd624750a050
[WebKit-https.git] / Source / WebKit2 / WebProcess / NetworkInfo / WebNetworkInfoManager.cpp
1 /*
2  * Copyright (C) 2012 Intel Corporation. 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. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "WebNetworkInfoManager.h"
28
29 #if ENABLE(NETWORK_INFO)
30
31 #include "WebNetworkInfoManagerProxyMessages.h"
32 #include "WebPage.h"
33 #include "WebProcess.h"
34 #include <WebCore/NetworkInfo.h>
35 #include <WebCore/NetworkInfoController.h>
36 #include <limits.h>
37
38 using namespace WebCore;
39
40 namespace WebKit {
41
42 WebNetworkInfoManager::WebNetworkInfoManager(WebProcess* process)
43     : m_process(process)
44 {
45 }
46
47 WebNetworkInfoManager::~WebNetworkInfoManager()
48 {
49 }
50
51 void WebNetworkInfoManager::didReceiveMessage(CoreIPC::Connection* connection, CoreIPC::MessageID messageID, CoreIPC::ArgumentDecoder* arguments)
52 {
53     didReceiveWebNetworkInfoManagerMessage(connection, messageID, arguments);
54 }
55
56 void WebNetworkInfoManager::registerWebPage(WebPage* page)
57 {
58     bool wasEmpty = m_pageSet.isEmpty();
59
60     m_pageSet.add(page);
61
62     if (wasEmpty)
63         m_process->connection()->send(Messages::WebNetworkInfoManagerProxy::StartUpdating(), 0);
64 }
65
66 void WebNetworkInfoManager::unregisterWebPage(WebPage* page)
67 {
68     m_pageSet.remove(page);
69
70     if (m_pageSet.isEmpty())
71         m_process->connection()->send(Messages::WebNetworkInfoManagerProxy::StopUpdating(), 0);
72 }
73
74 double WebNetworkInfoManager::bandwidth(WebPage* page) const
75 {
76     // The spec indicates that we should return "infinity" if the bandwidth is unknown.
77     double bandwidth = std::numeric_limits<double>::infinity();
78     m_process->connection()->sendSync(Messages::WebNetworkInfoManagerProxy::GetBandwidth(), Messages::WebNetworkInfoManagerProxy::GetBandwidth::Reply(bandwidth), page->pageID());
79     return bandwidth;
80 }
81
82 bool WebNetworkInfoManager::metered(WebPage* page) const
83 {
84     bool metered = false;
85     m_process->connection()->sendSync(Messages::WebNetworkInfoManagerProxy::IsMetered(), Messages::WebNetworkInfoManagerProxy::IsMetered::Reply(metered), page->pageID());
86     return metered;
87 }
88
89 void WebNetworkInfoManager::didChangeNetworkInformation(const AtomicString& eventType, const WebNetworkInfo::Data& data)
90 {
91     RefPtr<NetworkInfo> networkInformation = NetworkInfo::create(data.bandwidth, data.metered);
92
93     HashSet<WebPage*>::const_iterator it = m_pageSet.begin();
94     HashSet<WebPage*>::const_iterator end = m_pageSet.end();
95     for (; it != end; ++it) {
96         WebPage* page = *it;
97         if (page->corePage())
98             NetworkInfoController::from(page->corePage())->didChangeNetworkInformation(eventType, networkInformation.get());
99     }
100 }
101
102 } // namespace WebKit
103
104 #endif // ENABLE(NETWORK_INFO)