[SCM] WebKit Debian packaging branch, webkit-1.3, updated. upstream/1.3.7-4207-g178b198

jam at chromium.org jam at chromium.org
Sun Feb 20 22:55:28 UTC 2011


The following commit has been merged in the webkit-1.3 branch:
commit ca3890fe74d94d85d6bfa48f9ea497b094d8e717
Author: jam at chromium.org <jam at chromium.org@268f45cc-cd09-0410-ab3c-d52691b4dbfc>
Date:   Thu Jan 13 20:07:25 2011 +0000

    2011-01-11  John Abd-El-Malek  <jam at chromium.org>
    
            Reviewed by Darin Fisher.
    
            [chromium] Add support to allow printing just a plugin in a frame
            https://bugs.webkit.org/show_bug.cgi?id=52134
    
            * public/WebContextMenuData.h:
            * public/WebFrame.h:
            * src/ContextMenuClientImpl.cpp:
            (WebKit::ContextMenuClientImpl::getCustomMenuFromDefaultItems):
            * src/WebFrameImpl.cpp:
            (WebKit::ChromePluginPrintContext::ChromePluginPrintContext):
            (WebKit::ChromePluginPrintContext::end):
            (WebKit::ChromePluginPrintContext::computePageRects):
            (WebKit::ChromePluginPrintContext::spoolPage):
            (WebKit::WebFrameImpl::printBegin):
    
    
    git-svn-id: http://svn.webkit.org/repository/webkit/trunk@75730 268f45cc-cd09-0410-ab3c-d52691b4dbfc

diff --git a/WebKit/chromium/ChangeLog b/WebKit/chromium/ChangeLog
index 6710785..0531e1e 100644
--- a/WebKit/chromium/ChangeLog
+++ b/WebKit/chromium/ChangeLog
@@ -1,3 +1,21 @@
+2011-01-11  John Abd-El-Malek  <jam at chromium.org>
+
+        Reviewed by Darin Fisher.
+
+        [chromium] Add support to allow printing just a plugin in a frame
+        https://bugs.webkit.org/show_bug.cgi?id=52134
+
+        * public/WebContextMenuData.h:
+        * public/WebFrame.h:
+        * src/ContextMenuClientImpl.cpp:
+        (WebKit::ContextMenuClientImpl::getCustomMenuFromDefaultItems):
+        * src/WebFrameImpl.cpp:
+        (WebKit::ChromePluginPrintContext::ChromePluginPrintContext):
+        (WebKit::ChromePluginPrintContext::end):
+        (WebKit::ChromePluginPrintContext::computePageRects):
+        (WebKit::ChromePluginPrintContext::spoolPage):
+        (WebKit::WebFrameImpl::printBegin):
+
 2011-01-13  Tony Chang  <tony at chromium.org>
 
         Reviewed by Kent Tamura.
diff --git a/WebKit/chromium/public/WebContextMenuData.h b/WebKit/chromium/public/WebContextMenuData.h
index e3aee4e..606994b 100644
--- a/WebKit/chromium/public/WebContextMenuData.h
+++ b/WebKit/chromium/public/WebContextMenuData.h
@@ -32,6 +32,7 @@
 #define WebContextMenuData_h
 
 #include "WebMenuItemInfo.h"
+#include "WebNode.h"
 #include "WebPoint.h"
 #include "WebString.h"
 #include "WebURL.h"
@@ -50,6 +51,8 @@ struct WebContextMenuData {
         MediaTypeVideo,
         // An audio node is selected.
         MediaTypeAudio,
+        // A plugin node is selected.
+        MediaTypePlugin,
     };
     // The type of media the context menu is being invoked on.
     MediaType mediaType;
@@ -85,6 +88,7 @@ struct WebContextMenuData {
         MediaHasAudio = 0x20,
         MediaHasVideo = 0x40,
         MediaControls = 0x80,
+        MediaCanPrint = 0x100,
     };
 
     // Extra attributes describing media elements.
@@ -136,6 +140,9 @@ struct WebContextMenuData {
     // Custom context menu items provided by the WebCore internals.
     WebVector<WebMenuItemInfo> customItems;
 
+    // The node that was clicked.
+    WebNode node;
+
     WebContextMenuData()
         : mediaType(MediaTypeNone)
         , isImageBlocked(false)
diff --git a/WebKit/chromium/public/WebFrame.h b/WebKit/chromium/public/WebFrame.h
index 30bf03b..c2a0650 100644
--- a/WebKit/chromium/public/WebFrame.h
+++ b/WebKit/chromium/public/WebFrame.h
@@ -32,6 +32,7 @@
 #define WebFrame_h
 
 #include "WebCanvas.h"
+#include "WebNode.h"
 #include "WebURL.h"
 
 struct NPObject;
@@ -71,6 +72,9 @@ struct WebScriptSource;
 struct WebSize;
 template <typename T> class WebVector;
 
+// FIXME(jam): take this out once Chromium has this
+#define WEBFRAME_PRINTBEGIN_TAKES_NODE
+
 class WebFrame {
 public:
     // Returns the number of live WebFrame objects, used for leak checking.
@@ -397,12 +401,16 @@ public:
     // Printing ------------------------------------------------------------
 
     // Reformats the WebFrame for printing. pageSize is the page size in
-    // points (a point in 1/72 of an inch). printerDPI is the user selected,
-    // DPI for the printer. Returns the number of pages that
-    // can be printed at the given page size. The out param useBrowserOverlays
+    // points (a point in 1/72 of an inch). If |constrainToNode| node is
+    // specified, then only the given node is printed (for now only plugins are
+    // supported), instead of the entire frame.  printerDPI is the user
+    // selected, DPI for the printer. Returns the number of pages that can be
+    // printed at the given page size. The out param useBrowserOverlays
     // specifies whether the browser process should use its overlays (header,
     // footer, margins etc) or whether the renderer controls this.
-    virtual int printBegin(const WebSize& pageSize, int printerDPI = 72,
+    virtual int printBegin(const WebSize& pageSize,
+                           const WebNode& constrainToNode = WebNode(),
+                           int printerDPI = 72,
                            bool* useBrowserOverlays = 0) = 0;
 
     // Returns the page shrinking factor calculated by webkit (usually
diff --git a/WebKit/chromium/src/ContextMenuClientImpl.cpp b/WebKit/chromium/src/ContextMenuClientImpl.cpp
index 7bd1a2b..d166d9d 100644
--- a/WebKit/chromium/src/ContextMenuClientImpl.cpp
+++ b/WebKit/chromium/src/ContextMenuClientImpl.cpp
@@ -44,6 +44,7 @@
 #include "HitTestResult.h"
 #include "HTMLMediaElement.h"
 #include "HTMLNames.h"
+#include "HTMLPlugInImageElement.h"
 #include "KURL.h"
 #include "MediaError.h"
 #include "Page.h"
@@ -211,6 +212,7 @@ PlatformMenuDescription ContextMenuClientImpl::getCustomMenuFromDefaultItems(
         if (object && object->isWidget()) {
             Widget* widget = toRenderWidget(object)->widget();
             if (widget && widget->isPluginContainer()) {
+                data.mediaType = WebContextMenuData::MediaTypePlugin;
                 WebPluginContainerImpl* plugin = static_cast<WebPluginContainerImpl*>(widget);
                 WebString text = plugin->plugin()->selectionAsText();
                 if (!text.isEmpty()) {
@@ -219,6 +221,12 @@ PlatformMenuDescription ContextMenuClientImpl::getCustomMenuFromDefaultItems(
                 }
                 data.editFlags &= ~WebContextMenuData::CanTranslate;
                 data.linkURL = plugin->plugin()->linkAtPosition(data.mousePosition);
+                if (plugin->plugin()->supportsPaginatedPrint())
+                    data.mediaFlags |= WebContextMenuData::MediaCanPrint;
+
+                HTMLPlugInImageElement* pluginElement = static_cast<HTMLPlugInImageElement*>(r.innerNonSharedNode());
+                data.srcURL = pluginElement->document()->completeURL(pluginElement->url());
+                data.mediaFlags |= WebContextMenuData::MediaCanSave;
             }
         }
     }
@@ -268,6 +276,8 @@ PlatformMenuDescription ContextMenuClientImpl::getCustomMenuFromDefaultItems(
     // Filter out custom menu elements and add them into the data.
     populateCustomMenuItems(defaultMenu, &data);
 
+    data.node = r.innerNonSharedNode();
+
     WebFrame* selected_web_frame = WebFrameImpl::fromFrame(selectedFrame);
     if (m_webView->client())
         m_webView->client()->showContextMenu(selected_web_frame, data);
diff --git a/WebKit/chromium/src/WebFrameImpl.cpp b/WebKit/chromium/src/WebFrameImpl.cpp
index 1237ddd..18e6d4c 100644
--- a/WebKit/chromium/src/WebFrameImpl.cpp
+++ b/WebKit/chromium/src/WebFrameImpl.cpp
@@ -106,6 +106,7 @@
 #include "PluginDocument.h"
 #include "PrintContext.h"
 #include "RenderFrame.h"
+#include "RenderObject.h"
 #include "RenderTreeAsText.h"
 #include "RenderView.h"
 #include "RenderWidget.h"
@@ -134,6 +135,7 @@
 #include "WebFrameClient.h"
 #include "WebHistoryItem.h"
 #include "WebInputElement.h"
+#include "WebNode.h"
 #include "WebPasswordAutocompleteListener.h"
 #include "WebPerformance.h"
 #include "WebPlugin.h"
@@ -355,11 +357,9 @@ private:
 // want to delegate all printing related calls to the plugin.
 class ChromePluginPrintContext : public ChromePrintContext {
 public:
-    ChromePluginPrintContext(Frame* frame, int printerDPI)
-        : ChromePrintContext(frame), m_pageCount(0), m_printerDPI(printerDPI)
+    ChromePluginPrintContext(Frame* frame, WebPluginContainerImpl* plugin, int printerDPI)
+        : ChromePrintContext(frame), m_plugin(plugin), m_pageCount(0), m_printerDPI(printerDPI)
     {
-        // This HAS to be a frame hosting a full-mode plugin
-        ASSERT(frame->document()->isPluginDocument());
     }
 
     virtual void begin(float width)
@@ -368,11 +368,7 @@ public:
 
     virtual void end()
     {
-        WebPluginContainerImpl* pluginContainer = WebFrameImpl::pluginContainerFromFrame(m_frame);
-        if (pluginContainer && pluginContainer->supportsPaginatedPrint())
-            pluginContainer->printEnd();
-        else
-            ASSERT_NOT_REACHED();
+        m_plugin->printEnd();
     }
 
     virtual float getPageShrink(int pageNumber) const
@@ -383,11 +379,7 @@ public:
 
     virtual void computePageRects(const FloatRect& printRect, float headerHeight, float footerHeight, float userScaleFactor, float& outPageHeight)
     {
-        WebPluginContainerImpl* pluginContainer = WebFrameImpl::pluginContainerFromFrame(m_frame);
-        if (pluginContainer && pluginContainer->supportsPaginatedPrint())
-            m_pageCount = pluginContainer->printBegin(IntRect(printRect), m_printerDPI);
-        else
-            ASSERT_NOT_REACHED();
+        m_pageCount = m_plugin->printBegin(IntRect(printRect), m_printerDPI);
     }
 
     virtual int pageCount() const
@@ -400,11 +392,7 @@ public:
     // instead.  Returns the scale to be applied.
     virtual float spoolPage(GraphicsContext& ctx, int pageNumber)
     {
-        WebPluginContainerImpl* pluginContainer = WebFrameImpl::pluginContainerFromFrame(m_frame);
-        if (pluginContainer && pluginContainer->supportsPaginatedPrint())
-            pluginContainer->printPage(pageNumber, &ctx);
-        else
-            ASSERT_NOT_REACHED();
+        m_plugin->printPage(pageNumber, &ctx);
         return 1.0;
     }
 
@@ -415,6 +403,7 @@ public:
 
 private:
     // Set when printing.
+    WebPluginContainerImpl* m_plugin;
     int m_pageCount;
     int m_printerDPI;
 };
@@ -1284,14 +1273,32 @@ bool WebFrameImpl::selectWordAroundCaret()
     return true;
 }
 
-int WebFrameImpl::printBegin(const WebSize& pageSize, int printerDPI, bool *useBrowserOverlays)
+int WebFrameImpl::printBegin(const WebSize& pageSize,
+                             const WebNode& constrainToNode,
+                             int printerDPI,
+                             bool* useBrowserOverlays)
 {
     ASSERT(!frame()->document()->isFrameSet());
-    // If this is a plugin document, check if the plugin supports its own
-    // printing. If it does, we will delegate all printing to that.
-    WebPluginContainerImpl* pluginContainer = pluginContainerFromFrame(frame());
+    WebPluginContainerImpl* pluginContainer = 0;
+    if (constrainToNode.isNull()) {
+        // If this is a plugin document, check if the plugin supports its own
+        // printing. If it does, we will delegate all printing to that.
+        pluginContainer = pluginContainerFromFrame(frame());
+    } else {
+        // We only support printing plugin nodes for now.
+        const Node* coreNode = constrainToNode.constUnwrap<Node>();
+        if (coreNode->hasTagName(HTMLNames::objectTag) && coreNode->hasTagName(HTMLNames::embedTag)) {
+            RenderObject* object = coreNode->renderer();
+            if (object && object->isWidget()) {
+                Widget* widget = toRenderWidget(object)->widget();
+                if (widget && widget->isPluginContainer())
+                    pluginContainer =  static_cast<WebPluginContainerImpl*>(widget);
+            }
+        }
+    }
+
     if (pluginContainer && pluginContainer->supportsPaginatedPrint())
-        m_printContext.set(new ChromePluginPrintContext(frame(), printerDPI));
+        m_printContext.set(new ChromePluginPrintContext(frame(), pluginContainer, printerDPI));
     else
         m_printContext.set(new ChromePrintContext(frame()));
 
diff --git a/WebKit/chromium/src/WebFrameImpl.h b/WebKit/chromium/src/WebFrameImpl.h
index 52d9db4..b7ac100 100644
--- a/WebKit/chromium/src/WebFrameImpl.h
+++ b/WebKit/chromium/src/WebFrameImpl.h
@@ -150,7 +150,9 @@ public:
     virtual WebString selectionAsText() const;
     virtual WebString selectionAsMarkup() const;
     virtual bool selectWordAroundCaret();
-    virtual int printBegin(const WebSize& pageSize, int printerDPI,
+    virtual int printBegin(const WebSize& pageSize,
+                           const WebNode& constrainToNode,
+                           int printerDPI,
                            bool* useBrowserOverlays);
     virtual float printPage(int pageToPrint, WebCanvas*);
     virtual float getPrintPageShrink(int page);

-- 
WebKit Debian packaging



More information about the Pkg-webkit-commits mailing list