Web Replay: memoize plugin data for navigator.mimeTypes and navigator.plugins
[WebKit-https.git] / Source / WebCore / plugins / DOMMimeTypeArray.cpp
1 /*
2  *  Copyright (C) 2008 Nokia Corporation and/or its subsidiary(-ies)
3  *  Copyright (C) 2008 Apple Inc. All rights reserved.
4  *
5  *  This library is free software; you can redistribute it and/or
6  *  modify it under the terms of the GNU Lesser General Public
7  *  License as published by the Free Software Foundation; either
8  *  version 2 of the License, or (at your option) any later version.
9  *
10  *  This library is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  *  Lesser General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Lesser General Public
16  *  License along with this library; if not, write to the Free Software
17  *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18  */
19
20 #include "config.h"
21 #include "DOMMimeTypeArray.h"
22
23 #include "DOMPlugin.h"
24 #include "Frame.h"
25 #include "Page.h"
26 #include "PluginData.h"
27 #include <wtf/text/AtomicString.h>
28
29 #if ENABLE(WEB_REPLAY)
30 #include "Document.h"
31 #include "WebReplayInputs.h"
32 #include <replay/InputCursor.h>
33 #endif
34
35 namespace WebCore {
36
37 DOMMimeTypeArray::DOMMimeTypeArray(Frame* frame)
38     : DOMWindowProperty(frame)
39 {
40 }
41
42 DOMMimeTypeArray::~DOMMimeTypeArray()
43 {
44 }
45
46 unsigned DOMMimeTypeArray::length() const
47 {
48     PluginData* data = getPluginData();
49     if (!data)
50         return 0;
51     return data->mimes().size();
52 }
53
54 PassRefPtr<DOMMimeType> DOMMimeTypeArray::item(unsigned index)
55 {
56     PluginData* data = getPluginData();
57     if (!data)
58         return 0;
59     const Vector<MimeClassInfo>& mimes = data->mimes();
60     if (index >= mimes.size())
61         return 0;
62     return DOMMimeType::create(data, m_frame, index).get();
63 }
64
65 bool DOMMimeTypeArray::canGetItemsForName(const AtomicString& propertyName)
66 {
67     PluginData *data = getPluginData();
68     if (!data)
69         return 0;
70     const Vector<MimeClassInfo>& mimes = data->mimes();
71     for (unsigned i = 0; i < mimes.size(); ++i) {
72         if (mimes[i].type == propertyName)
73             return true;
74     }
75     return false;
76 }
77
78 PassRefPtr<DOMMimeType> DOMMimeTypeArray::namedItem(const AtomicString& propertyName)
79 {
80     PluginData *data = getPluginData();
81     if (!data)
82         return 0;
83     const Vector<MimeClassInfo>& mimes = data->mimes();
84     for (unsigned i = 0; i < mimes.size(); ++i) {
85         if (mimes[i].type == propertyName)
86             return DOMMimeType::create(data, m_frame, i).get();
87     }
88     return 0;
89 }
90
91 PluginData* DOMMimeTypeArray::getPluginData() const
92 {
93     if (!m_frame)
94         return nullptr;
95
96     Page* page = m_frame->page();
97     if (!page)
98         return nullptr;
99
100     PluginData* pluginData = &page->pluginData();
101
102 #if ENABLE(WEB_REPLAY)
103     if (!m_frame->document())
104         return pluginData;
105
106     InputCursor& cursor = m_frame->document()->inputCursor();
107     if (cursor.isCapturing())
108         cursor.appendInput<FetchPluginData>(pluginData);
109     else if (cursor.isReplaying()) {
110         if (FetchPluginData* input = cursor.fetchInput<FetchPluginData>())
111             pluginData = input->pluginData().get();
112     }
113 #endif
114
115     return pluginData;
116 }
117
118 } // namespace WebCore