/* * Copyright (C) 2012 Google Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above * copyright notice, this list of conditions and the following disclaimer * in the documentation and/or other materials provided with the * distribution. * * Neither the name of Google Inc. nor the names of its * contributors may be used to endorse or promote products derived from * this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "config.h" #include "WebHelperPluginImpl.h" #include "DocumentLoader.h" #include "EmptyClients.h" #include "FocusController.h" #include "FrameView.h" #include "HTMLPlugInElement.h" #include "NodeList.h" #include "Page.h" #include "PageWidgetDelegate.h" #include "Settings.h" #include "WebFrameImpl.h" #include "WebPlugin.h" #include "WebPluginContainerImpl.h" #include "WebViewClient.h" #include "WebViewImpl.h" #include "WebWidgetClient.h" using namespace WebCore; namespace WebKit { #define addLiteral(literal, writer) writer.addData(literal, sizeof(literal) - 1) static inline void addString(const String& str, DocumentWriter& writer) { CString str8 = str.utf8(); writer.addData(str8.data(), str8.length()); } void writeDocument(WebCore::DocumentWriter& writer, const String& pluginType) { writer.setMIMEType("text/html"); writer.setEncoding("UTF-8", false); writer.begin(); addLiteral("
\n", writer); String objectTag = ""; addString(objectTag, writer); addLiteral("\n", writer); writer.end(); } class HelperPluginChromeClient : public EmptyChromeClient { WTF_MAKE_NONCOPYABLE(HelperPluginChromeClient); WTF_MAKE_FAST_ALLOCATED; public: explicit HelperPluginChromeClient(WebHelperPluginImpl* widget) : m_widget(widget) { ASSERT(m_widget->m_widgetClient); } private: virtual void closeWindowSoon() OVERRIDE { m_widget->closeHelperPlugin(); } virtual void* webView() const OVERRIDE { return m_widget->m_webView; } WebHelperPluginImpl* m_widget; }; // WebHelperPluginImpl ---------------------------------------------------------------- WebHelperPluginImpl::WebHelperPluginImpl(WebWidgetClient* client) : m_widgetClient(client) , m_webView(0) { ASSERT(client); } WebHelperPluginImpl::~WebHelperPluginImpl() { ASSERT(!m_page); } bool WebHelperPluginImpl::init(WebViewImpl* webView, const String& pluginType) { ASSERT(webView); m_webView = webView; if (!initPage(webView, pluginType)) return false; m_widgetClient->show(WebNavigationPolicy()); setFocus(true); return true; } void WebHelperPluginImpl::closeHelperPlugin() { if (m_page) { m_page->setGroupName(String()); m_page->mainFrame()->loader()->stopAllLoaders(); m_page->mainFrame()->loader()->stopLoading(UnloadEventPolicyNone); } // m_widgetClient might be 0 because this widget might be already closed. if (m_widgetClient) { // closeWidgetSoon() will call this->close() later. m_widgetClient->closeWidgetSoon(); } } void WebHelperPluginImpl::initializeFrame(WebFrameClient* client) { ASSERT(m_page); RefPtr