RefPtr<API::Object> UserData::transform(API::Object* object, const std::function<RefPtr<API::Object> (const API::Object&)> transformer) { if (!object) return nullptr; if (object->type() == API::Object::Type::Array) { auto& array = static_cast<API::Array&>(*object); Vector<RefPtr<API::Object>> elements; elements.reserveInitialCapacity(array.elements().size()); for (const auto& element : array.elements()) elements.uncheckedAppend(transform(element.get(), transformer)); return API::Array::create(std::move(elements)); } if (object->type() == API::Object::Type::Dictionary) { auto& dictionary = static_cast<ImmutableDictionary&>(*object); ImmutableDictionary::MapType map; for (const auto& keyValuePair : dictionary.map()) map.add(keyValuePair.key, transform(keyValuePair.value.get(), transformer)); return ImmutableDictionary::create(std::move(map)); } if (auto transformedObject = transformer(*object)) return transformedObject; return object; }
PassRefPtr<ImmutableDictionary> createPlugInInformationDictionary(const PluginModuleInfo& plugInModuleInfo, bool pageContainsNonPlayingInstanceOfPlugIn) { ImmutableDictionary::MapType map; getPluginModuleInformation(plugInModuleInfo, map); map.set(plugInInformationPageContainsNonPlayingInstanceOfPlugInKey(), WebBoolean::create(pageContainsNonPlayingInstanceOfPlugIn)); return ImmutableDictionary::adopt(map); }
void getPluginModuleInformation(const PluginModuleInfo& plugin, ImmutableDictionary::MapType& map) { #if ENABLE(NETSCAPE_PLUGIN_API) map.set(pluginInformationPathKey(), WebString::create(plugin.path)); map.set(pluginInformationDisplayNameKey(), WebString::create(plugin.info.name)); map.set(pluginInformationDefaultLoadPolicyKey(), WebUInt64::create(toWKPluginLoadPolicy(PluginInfoStore::defaultLoadPolicyForPlugin(plugin)))); getPlatformPluginModuleInformation(plugin, map); #endif }
bool WebFormClient::willSubmitForm(WebPageProxy* page, WebFrameProxy* frame, WebFrameProxy* sourceFrame, const Vector<std::pair<String, String>>& textFieldValues, API::Object* userData, WebFormSubmissionListenerProxy* listener) { if (!m_client.willSubmitForm) return false; ImmutableDictionary::MapType map; for (size_t i = 0; i < textFieldValues.size(); ++i) map.set(textFieldValues[i].first, WebString::create(textFieldValues[i].second)); RefPtr<ImmutableDictionary> textFieldsMap = ImmutableDictionary::adopt(map); m_client.willSubmitForm(toAPI(page), toAPI(frame), toAPI(sourceFrame), toAPI(textFieldsMap.get()), toAPI(userData), toAPI(listener), m_client.clientInfo); return true; }
PassRefPtr<ImmutableDictionary> createPluginInformationDictionary(const String& mimeType, const String& frameURLString, const String& pageURLString) { ImmutableDictionary::MapType map; if (!frameURLString.isEmpty()) map.set(pluginInformationFrameURLKey(), API::URL::create(frameURLString)); if (!mimeType.isEmpty()) map.set(pluginInformationMIMETypeKey(), API::String::create(mimeType)); if (!pageURLString.isEmpty()) map.set(pluginInformationPageURLKey(), API::URL::create(pageURLString)); return ImmutableDictionary::create(std::move(map)); }
void InjectedBundlePageFormClient::willSendSubmitEvent(WebPage* page, HTMLFormElement* formElement, WebFrame* frame, WebFrame* sourceFrame, const Vector<std::pair<String, String>>& values) { if (!m_client.willSendSubmitEvent) return; RefPtr<InjectedBundleNodeHandle> nodeHandle = InjectedBundleNodeHandle::getOrCreate(formElement); ImmutableDictionary::MapType map; for (size_t i = 0; i < values.size(); ++i) map.set(values[i].first, API::String::create(values[i].second)); auto textFieldsMap = ImmutableDictionary::create(std::move(map)); m_client.willSendSubmitEvent(toAPI(page), toAPI(nodeHandle.get()), toAPI(frame), toAPI(sourceFrame), toAPI(textFieldsMap.get()), m_client.base.clientInfo); }
void InjectedBundlePageFormClient::willSubmitForm(WebPage* page, HTMLFormElement* formElement, WebFrame* frame, WebFrame* sourceFrame, const Vector<std::pair<String, String>>& values, RefPtr<API::Object>& userData) { if (!m_client.willSubmitForm) return; RefPtr<InjectedBundleNodeHandle> nodeHandle = InjectedBundleNodeHandle::getOrCreate(formElement); ImmutableDictionary::MapType map; for (size_t i = 0; i < values.size(); ++i) map.set(values[i].first, WebString::create(values[i].second)); RefPtr<ImmutableDictionary> textFieldsMap = ImmutableDictionary::adopt(map); WKTypeRef userDataToPass = 0; m_client.willSubmitForm(toAPI(page), toAPI(nodeHandle.get()), toAPI(frame), toAPI(sourceFrame), toAPI(textFieldsMap.get()), &userDataToPass, m_client.clientInfo); userData = adoptRef(toImpl(userDataToPass)); }
void WebContext::pluginInfoStoreDidLoadPlugins(PluginInfoStore* store) { #ifdef NDEBUG UNUSED_PARAM(store); #endif ASSERT(store == &m_pluginInfoStore); Vector<PluginModuleInfo> pluginModules = m_pluginInfoStore.plugins(); Vector<RefPtr<API::Object>> plugins; plugins.reserveInitialCapacity(pluginModules.size()); for (const auto& pluginModule : pluginModules) { ImmutableDictionary::MapType map; map.set(ASCIILiteral("path"), API::String::create(pluginModule.path)); map.set(ASCIILiteral("name"), API::String::create(pluginModule.info.name)); map.set(ASCIILiteral("file"), API::String::create(pluginModule.info.file)); map.set(ASCIILiteral("desc"), API::String::create(pluginModule.info.desc)); Vector<RefPtr<API::Object>> mimeTypes; mimeTypes.reserveInitialCapacity(pluginModule.info.mimes.size()); for (const auto& mimeClassInfo : pluginModule.info.mimes) mimeTypes.uncheckedAppend(API::String::create(mimeClassInfo.type)); map.set(ASCIILiteral("mimes"), API::Array::create(std::move(mimeTypes))); #if PLATFORM(COCOA) map.set(ASCIILiteral("bundleId"), API::String::create(pluginModule.bundleIdentifier)); map.set(ASCIILiteral("version"), API::String::create(pluginModule.versionString)); #endif plugins.uncheckedAppend(ImmutableDictionary::create(std::move(map))); } m_client.plugInInformationBecameAvailable(this, API::Array::create(std::move(plugins)).get()); }
PassRefPtr<ImmutableDictionary> PlugInAutoStartProvider::autoStartOriginsTableCopy() const { ImmutableDictionary::MapType map; AutoStartTable::const_iterator end = m_autoStartTable.end(); double now = currentTime(); for (AutoStartTable::const_iterator it = m_autoStartTable.begin(); it != end; ++it) { ImmutableDictionary::MapType hashMap; PlugInAutoStartOriginHash::const_iterator valueEnd = it->value.end(); for (PlugInAutoStartOriginHash::const_iterator valueIt = it->value.begin(); valueIt != valueEnd; ++valueIt) { if (now > valueIt->value) continue; hashMap.set(String::number(valueIt->key), WebDouble::create(valueIt->value)); } if (hashMap.size()) map.set(it->key, ImmutableDictionary::adopt(hashMap)); } return ImmutableDictionary::adopt(map); }
PassRefPtr<ImmutableDictionary> createPluginInformationDictionary(const PluginModuleInfo& plugin, const String& frameURLString, const String& mimeType, const String& pageURLString, const String& pluginspageAttributeURLString, const String& pluginURLString, bool replacementObscured) { ImmutableDictionary::MapType map; getPluginModuleInformation(plugin, map); if (!frameURLString.isEmpty()) map.set(pluginInformationFrameURLKey(), API::URL::create(frameURLString)); if (!mimeType.isEmpty()) map.set(pluginInformationMIMETypeKey(), API::String::create(mimeType)); if (!pageURLString.isEmpty()) map.set(pluginInformationPageURLKey(), API::URL::create(pageURLString)); if (!pluginspageAttributeURLString.isEmpty()) map.set(pluginInformationPluginspageAttributeURLKey(), API::URL::create(pluginspageAttributeURLString)); if (!pluginURLString.isEmpty()) map.set(pluginInformationPluginURLKey(), API::URL::create(pluginURLString)); map.set(plugInInformationReplacementObscuredKey(), API::Boolean::create(replacementObscured)); return ImmutableDictionary::create(std::move(map)); }
PassRefPtr<WebPageProxy> WebUIClient::createNewPage(WebPageProxy* page, const WindowFeatures& windowFeatures, WebEvent::Modifiers modifiers, WebMouseEvent::Button button) { if (!m_client.createNewPage) return 0; ImmutableDictionary::MapType map; if (windowFeatures.xSet) map.set("x", WebDouble::create(windowFeatures.x)); if (windowFeatures.ySet) map.set("y", WebDouble::create(windowFeatures.y)); if (windowFeatures.widthSet) map.set("width", WebDouble::create(windowFeatures.width)); if (windowFeatures.heightSet) map.set("height", WebDouble::create(windowFeatures.height)); map.set("menuBarVisible", WebBoolean::create(windowFeatures.menuBarVisible)); map.set("statusBarVisible", WebBoolean::create(windowFeatures.statusBarVisible)); map.set("toolBarVisible", WebBoolean::create(windowFeatures.toolBarVisible)); map.set("scrollbarsVisible", WebBoolean::create(windowFeatures.scrollbarsVisible)); map.set("resizable", WebBoolean::create(windowFeatures.resizable)); map.set("fullscreen", WebBoolean::create(windowFeatures.fullscreen)); map.set("dialog", WebBoolean::create(windowFeatures.dialog)); RefPtr<ImmutableDictionary> featuresMap = ImmutableDictionary::adopt(map); return adoptRef(toImpl(m_client.createNewPage(toAPI(page), toAPI(featuresMap.get()), toAPI(modifiers), toAPI(button), m_client.clientInfo))); }
PassRefPtr<WebPageProxy> WebUIClient::createNewPage(WebPageProxy* page, const ResourceRequest& resourceRequest, const WindowFeatures& windowFeatures, WebEvent::Modifiers modifiers, WebMouseEvent::Button button) { if (!m_client.version && !m_client.createNewPage_deprecatedForUseWithV0) return 0; if (m_client.version == kWKPageUIClientCurrentVersion && !m_client.createNewPage) return 0; ImmutableDictionary::MapType map; if (windowFeatures.xSet) map.set("x", WebDouble::create(windowFeatures.x)); if (windowFeatures.ySet) map.set("y", WebDouble::create(windowFeatures.y)); if (windowFeatures.widthSet) map.set("width", WebDouble::create(windowFeatures.width)); if (windowFeatures.heightSet) map.set("height", WebDouble::create(windowFeatures.height)); map.set("menuBarVisible", WebBoolean::create(windowFeatures.menuBarVisible)); map.set("statusBarVisible", WebBoolean::create(windowFeatures.statusBarVisible)); map.set("toolBarVisible", WebBoolean::create(windowFeatures.toolBarVisible)); map.set("locationBarVisible", WebBoolean::create(windowFeatures.locationBarVisible)); map.set("scrollbarsVisible", WebBoolean::create(windowFeatures.scrollbarsVisible)); map.set("resizable", WebBoolean::create(windowFeatures.resizable)); map.set("fullscreen", WebBoolean::create(windowFeatures.fullscreen)); map.set("dialog", WebBoolean::create(windowFeatures.dialog)); RefPtr<ImmutableDictionary> featuresMap = ImmutableDictionary::adopt(map); if (!m_client.version) return adoptRef(toImpl(m_client.createNewPage_deprecatedForUseWithV0(toAPI(page), toAPI(featuresMap.get()), toAPI(modifiers), toAPI(button), m_client.clientInfo))); RefPtr<WebURLRequest> request = WebURLRequest::create(resourceRequest); return adoptRef(toImpl(m_client.createNewPage(toAPI(page), toAPI(request.get()), toAPI(featuresMap.get()), toAPI(modifiers), toAPI(button), m_client.clientInfo))); }
bool UserData::decode(IPC::ArgumentDecoder& decoder, RefPtr<API::Object>& result) { API::Object::Type type; if (!decoder.decodeEnum(type)) return false; switch (type) { case API::Object::Type::Array: { uint64_t size; if (!decoder.decode(size)) return false; Vector<RefPtr<API::Object>> elements; for (size_t i = 0; i < size; ++i) { RefPtr<API::Object> element; if (!decode(decoder, element)) return false; elements.append(std::move(element)); } result = API::Array::create(std::move(elements)); break; } case API::Object::Type::Boolean: if (!API::Boolean::decode(decoder, result)) return false; break; case API::Object::Type::Data: if (!API::Data::decode(decoder, result)) return false; break; case API::Object::Type::Dictionary: { uint64_t size; if (!decoder.decode(size)) return false; ImmutableDictionary::MapType map; for (size_t i = 0; i < size; ++i) { String key; if (!decoder.decode(key)) return false; RefPtr<API::Object> value; if (!decode(decoder, value)) return false; if (!map.add(std::move(key), std::move(value)).isNewEntry) return false; } result = ImmutableDictionary::create(std::move(map)); break; } case API::Object::Type::Double: if (!API::Double::decode(decoder, result)) return false; break; case API::Object::Type::Error: if (!API::Error::decode(decoder, result)) return false; break; case API::Object::Type::FrameHandle: { uint64_t frameID; if (!decoder.decode(frameID)) return false; result = API::FrameHandle::create(frameID); break; } case API::Object::Type::Null: result = nullptr; break; case API::Object::Type::Point: if (!API::Point::decode(decoder, result)) return false; break; case API::Object::Type::Rect: if (!API::Rect::decode(decoder, result)) return false; break; case API::Object::Type::SerializedScriptValue: { IPC::DataReference dataReference; if (!decoder.decode(dataReference)) return false; auto vector = dataReference.vector(); result = WebSerializedScriptValue::adopt(vector); break; } case API::Object::Type::Size: if (!API::Size::decode(decoder, result)) return false; break; case API::Object::Type::String: { String string; if (!decoder.decode(string)) return false; result = API::String::create(string); break; } case API::Object::Type::URL: if (!API::URL::decode(decoder, result)) return false; break; case API::Object::Type::URLRequest: if (!API::URLRequest::decode(decoder, result)) return false; break; case API::Object::Type::URLResponse: if (!API::URLResponse::decode(decoder, result)) return false; break; case API::Object::Type::UInt64: if (!API::UInt64::decode(decoder, result)) return false; break; default: ASSERT_NOT_REACHED(); } return true; }