diff options
author | bbudge@chromium.org <bbudge@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-11 21:40:36 +0000 |
---|---|---|
committer | bbudge@chromium.org <bbudge@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2012-01-11 21:40:36 +0000 |
commit | 81375e87af56fea163883cf2db9e2721929f41b4 (patch) | |
tree | f4cb600989229080d8135381adc87cfa93a38003 | |
parent | 298aabcd096d8b54ebdac50948618547874206cd (diff) | |
download | chromium_src-81375e87af56fea163883cf2db9e2721929f41b4.zip chromium_src-81375e87af56fea163883cf2db9e2721929f41b4.tar.gz chromium_src-81375e87af56fea163883cf2db9e2721929f41b4.tar.bz2 |
Allow plugins to add rotate commands to Chrome context menus.
BUG=63249
TEST=manual
Review URL: http://codereview.chromium.org/9045007
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@117297 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/app/chrome_command_ids.h | 4 | ||||
-rw-r--r-- | chrome/app/generated_resources.grd | 12 | ||||
-rw-r--r-- | chrome/browser/tab_contents/render_view_context_menu.cc | 43 | ||||
-rw-r--r-- | chrome/browser/tab_contents/render_view_context_menu.h | 3 | ||||
-rw-r--r-- | content/browser/renderer_host/render_view_host.cc | 8 | ||||
-rw-r--r-- | content/browser/renderer_host/render_view_host.h | 10 | ||||
-rw-r--r-- | content/common/view_messages.h | 15 | ||||
-rw-r--r-- | content/renderer/render_view_impl.cc | 9 | ||||
-rw-r--r-- | content/renderer/render_view_impl.h | 5 | ||||
-rw-r--r-- | webkit/plugins/ppapi/ppapi_plugin_instance.cc | 19 | ||||
-rw-r--r-- | webkit/plugins/ppapi/ppapi_plugin_instance.h | 4 | ||||
-rw-r--r-- | webkit/plugins/ppapi/ppapi_webplugin_impl.cc | 8 | ||||
-rw-r--r-- | webkit/plugins/ppapi/ppapi_webplugin_impl.h | 5 | ||||
-rw-r--r-- | webkit/plugins/ppapi/ppp_pdf.h | 11 |
14 files changed, 149 insertions, 7 deletions
diff --git a/chrome/app/chrome_command_ids.h b/chrome/app/chrome_command_ids.h index 58bdbee..c0e11a1 100644 --- a/chrome/app/chrome_command_ids.h +++ b/chrome/app/chrome_command_ids.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -254,6 +254,8 @@ #define IDC_CONTENT_CONTEXT_MUTE 50131 #define IDC_CONTENT_CONTEXT_LOOP 50132 #define IDC_CONTENT_CONTEXT_CONTROLS 50133 +#define IDC_CONTENT_CONTEXT_ROTATECW 50134 +#define IDC_CONTENT_CONTEXT_ROTATECCW 50135 // Edit items. #define IDC_CONTENT_CONTEXT_COPY 50140 #define IDC_CONTENT_CONTEXT_CUT 50141 diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 30ef5fa..d4e902f 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd @@ -442,6 +442,12 @@ are declared in build/common.gypi. <message name="IDS_CONTENT_CONTEXT_CONTROLS" desc="The name of the Show Controls command for audio and video playback in the content area context menu"> Show &Controls </message> + <message name="IDS_CONTENT_CONTEXT_ROTATECW" desc="The name of the Rotate clockwise command for media playback in the content area context menu"> + Rotate &Clockwise + </message> + <message name="IDS_CONTENT_CONTEXT_ROTATECCW" desc="The name of the Rotate counterclockwise command for media playback in the content area context menu"> + Rotate C&ounterclockwise + </message> <message name="IDS_CONTENT_CONTEXT_SAVEVIDEOAS" desc="The name of the Save Video As command in the content area context menu"> Sa&ve video as... @@ -651,6 +657,12 @@ are declared in build/common.gypi. <message name="IDS_CONTENT_CONTEXT_CONTROLS" desc="In Title Case: The name of the Show Controls command for audio and video playback in the content area context menu"> Show &Controls </message> + <message name="IDS_CONTENT_CONTEXT_ROTATECW" desc="In Title Case: The name of the Rotate Clockwise command for media playback in the content area context menu"> + Rotate &Clockwise + </message> + <message name="IDS_CONTENT_CONTEXT_ROTATECCW" desc="In Title Case: The name of the Rotate Counterclockwise command for media playback in the content area context menu"> + Rotate C&ounterclockwise + </message> <message name="IDS_CONTENT_CONTEXT_SAVEVIDEOAS" desc="In Title Case: The name of the Save Video As command in the content area context menu"> Sa&ve Video As... diff --git a/chrome/browser/tab_contents/render_view_context_menu.cc b/chrome/browser/tab_contents/render_view_context_menu.cc index 6edf617..943b399 100644 --- a/chrome/browser/tab_contents/render_view_context_menu.cc +++ b/chrome/browser/tab_contents/render_view_context_menu.cc @@ -79,6 +79,7 @@ #include "net/base/net_util.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebContextMenuData.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaPlayerAction.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginAction.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/text/text_elider.h" #include "ui/gfx/favicon_size.h" @@ -96,6 +97,7 @@ using content::UserMetricsAction; using content::WebContents; using WebKit::WebContextMenuData; using WebKit::WebMediaPlayerAction; +using WebKit::WebPluginAction; using WebKit::WebURL; using WebKit::WebString; @@ -813,6 +815,14 @@ void RenderViewContextMenu::AppendPluginItems() { IDS_CONTENT_CONTEXT_SAVEPAGEAS); menu_model_.AddItemWithStringId(IDC_PRINT, IDS_CONTENT_CONTEXT_PRINT); } + + if (params_.media_flags & WebContextMenuData::MediaCanRotate) { + menu_model_.AddSeparator(); + menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_ROTATECW, + IDS_CONTENT_CONTEXT_ROTATECW); + menu_model_.AddItemWithStringId(IDC_CONTENT_CONTEXT_ROTATECCW, + IDS_CONTENT_CONTEXT_ROTATECCW); + } } void RenderViewContextMenu::AppendPageItems() { @@ -1187,6 +1197,11 @@ bool RenderViewContextMenu::IsCommandIdEnabled(int id) const { return (params_.media_flags & WebContextMenuData::MediaHasVideo) != 0; + case IDC_CONTENT_CONTEXT_ROTATECW: + case IDC_CONTENT_CONTEXT_ROTATECCW: + return + (params_.media_flags & WebContextMenuData::MediaCanRotate) != 0; + case IDC_CONTENT_CONTEXT_COPYAVLOCATION: case IDC_CONTENT_CONTEXT_COPYIMAGELOCATION: return params_.src_url.is_valid(); @@ -1547,6 +1562,26 @@ void RenderViewContextMenu::ExecuteCommand(int id, int event_flags) { !IsCommandIdChecked(IDC_CONTENT_CONTEXT_CONTROLS))); break; + case IDC_CONTENT_CONTEXT_ROTATECW: + content::RecordAction( + UserMetricsAction("PluginContextMenu_RotateClockwise")); + PluginActionAt( + gfx::Point(params_.x, params_.y), + WebPluginAction( + WebPluginAction::Rotate90Clockwise, + true)); + break; + + case IDC_CONTENT_CONTEXT_ROTATECCW: + content::RecordAction( + UserMetricsAction("PluginContextMenu_RotateCounterclockwise")); + PluginActionAt( + gfx::Point(params_.x, params_.y), + WebPluginAction( + WebPluginAction::Rotate90Counterclockwise, + true)); + break; + case IDC_BACK: source_web_contents_->GetController().GoBack(); break; @@ -1897,3 +1932,11 @@ void RenderViewContextMenu::MediaPlayerActionAt( source_web_contents_->GetRenderViewHost()-> ExecuteMediaPlayerActionAtLocation(location, action); } + +void RenderViewContextMenu::PluginActionAt( + const gfx::Point& location, + const WebPluginAction& action) { + source_web_contents_->GetRenderViewHost()-> + ExecutePluginActionAtLocation(location, action); +} + diff --git a/chrome/browser/tab_contents/render_view_context_menu.h b/chrome/browser/tab_contents/render_view_context_menu.h index d07bb49..e28bb76 100644 --- a/chrome/browser/tab_contents/render_view_context_menu.h +++ b/chrome/browser/tab_contents/render_view_context_menu.h @@ -39,6 +39,7 @@ class Point; namespace WebKit { struct WebMediaPlayerAction; +struct WebPluginAction; } // An interface that controls a RenderViewContextMenu instance from observers. @@ -250,6 +251,8 @@ class RenderViewContextMenu : public ui::SimpleMenuModel::Delegate, void MediaPlayerActionAt(const gfx::Point& location, const WebKit::WebMediaPlayerAction& action); + void PluginActionAt(const gfx::Point& location, + const WebKit::WebPluginAction& action); bool IsDevCommandEnabled(int id) const; diff --git a/content/browser/renderer_host/render_view_host.cc b/content/browser/renderer_host/render_view_host.cc index 96d76c8..dfc0fb9 100644 --- a/content/browser/renderer_host/render_view_host.cc +++ b/content/browser/renderer_host/render_view_host.cc @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -63,6 +63,7 @@ using WebKit::WebDragOperationNone; using WebKit::WebDragOperationsMask; using WebKit::WebInputEvent; using WebKit::WebMediaPlayerAction; +using WebKit::WebPluginAction; namespace { @@ -1384,6 +1385,11 @@ void RenderViewHost::ExecuteMediaPlayerActionAtLocation( Send(new ViewMsg_MediaPlayerActionAt(routing_id(), location, action)); } +void RenderViewHost::ExecutePluginActionAtLocation( + const gfx::Point& location, const WebKit::WebPluginAction& action) { + Send(new ViewMsg_PluginActionAt(routing_id(), location, action)); +} + void RenderViewHost::DisassociateFromPopupCount() { Send(new ViewMsg_DisassociateFromPopupCount(routing_id())); } diff --git a/content/browser/renderer_host/render_view_host.h b/content/browser/renderer_host/render_view_host.h index 1f52eaa..087da5b 100644 --- a/content/browser/renderer_host/render_view_host.h +++ b/content/browser/renderer_host/render_view_host.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -73,8 +73,9 @@ struct CustomContextMenuContext; } // namespace webkit_glue namespace WebKit { -struct WebMediaPlayerAction; struct WebFindOptions; +struct WebMediaPlayerAction; +struct WebPluginAction; } // namespace WebKit // NotificationObserver used to listen for EXECUTE_JAVASCRIPT_RESULT @@ -466,6 +467,11 @@ class CONTENT_EXPORT RenderViewHost : public RenderWidgetHost { void ExecuteMediaPlayerActionAtLocation( const gfx::Point& location, const WebKit::WebMediaPlayerAction& action); + // Tells the renderer to perform the given action on the plugin located at + // the given point. + void ExecutePluginActionAtLocation( + const gfx::Point& location, const WebKit::WebPluginAction& action); + // Sent to the renderer when a popup window should no longer count against // the current popup count (either because it's not a popup or because it was // a generated by a user action). diff --git a/content/common/view_messages.h b/content/common/view_messages.h index 65fb343..576a2ae 100644 --- a/content/common/view_messages.h +++ b/content/common/view_messages.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -30,6 +30,7 @@ #include "third_party/WebKit/Source/WebKit/chromium/public/WebInputEvent.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebFindOptions.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebMediaPlayerAction.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginAction.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebPopupType.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebScreenInfo.h" #include "ui/base/ime/text_input_type.h" @@ -58,6 +59,7 @@ IPC_ENUM_TRAITS(ViewHostMsg_AccEvent::Value) IPC_ENUM_TRAITS(ViewMsg_Navigate_Type::Value) IPC_ENUM_TRAITS(WebKit::WebContextMenuData::MediaType) IPC_ENUM_TRAITS(WebKit::WebMediaPlayerAction::Type) +IPC_ENUM_TRAITS(WebKit::WebPluginAction::Type) IPC_ENUM_TRAITS(WebKit::WebPopupType) IPC_ENUM_TRAITS(WebKit::WebReferrerPolicy) IPC_ENUM_TRAITS(WebKit::WebTextDirection) @@ -139,6 +141,11 @@ IPC_STRUCT_TRAITS_BEGIN(WebKit::WebMediaPlayerAction) IPC_STRUCT_TRAITS_MEMBER(enable) IPC_STRUCT_TRAITS_END() +IPC_STRUCT_TRAITS_BEGIN(WebKit::WebPluginAction) + IPC_STRUCT_TRAITS_MEMBER(type) + IPC_STRUCT_TRAITS_MEMBER(enable) +IPC_STRUCT_TRAITS_END() + IPC_STRUCT_TRAITS_BEGIN(WebKit::WebRect) IPC_STRUCT_TRAITS_MEMBER(x) IPC_STRUCT_TRAITS_MEMBER(y) @@ -869,6 +876,12 @@ IPC_MESSAGE_ROUTED2(ViewMsg_MediaPlayerActionAt, gfx::Point, /* location */ WebKit::WebMediaPlayerAction) +// Tells the renderer to perform the given action on the plugin located at +// the given point. +IPC_MESSAGE_ROUTED2(ViewMsg_PluginActionAt, + gfx::Point, /* location */ + WebKit::WebPluginAction) + // Request for the renderer to evaluate an xpath to a frame and execute a // javascript: url in that frame's context. The message is completely // asynchronous and no corresponding response message is sent back. diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index cffbbba..d92ef49 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -106,6 +106,7 @@ #include "third_party/WebKit/Source/WebKit/chromium/public/WebNodeList.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebPageSerializer.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebPlugin.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginAction.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginContainer.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginDocument.h" #include "third_party/WebKit/Source/WebKit/chromium/public/WebPluginParams.h" @@ -208,6 +209,7 @@ using WebKit::WebNode; using WebKit::WebPageSerializer; using WebKit::WebPageSerializerClient; using WebKit::WebPlugin; +using WebKit::WebPluginAction; using WebKit::WebPluginContainer; using WebKit::WebPluginDocument; using WebKit::WebPluginParams; @@ -662,6 +664,7 @@ bool RenderViewImpl::OnMessageReceived(const IPC::Message& message) { OnDisableScrollbarsForSmallWindows) IPC_MESSAGE_HANDLER(ViewMsg_SetRendererPrefs, OnSetRendererPrefs) IPC_MESSAGE_HANDLER(ViewMsg_MediaPlayerActionAt, OnMediaPlayerActionAt) + IPC_MESSAGE_HANDLER(ViewMsg_PluginActionAt, OnPluginActionAt) IPC_MESSAGE_HANDLER(ViewMsg_SetActive, OnSetActive) #if defined(OS_MACOSX) IPC_MESSAGE_HANDLER(ViewMsg_SetWindowVisibility, OnSetWindowVisibility) @@ -3979,6 +3982,12 @@ void RenderViewImpl::OnMediaPlayerActionAt(const gfx::Point& location, webview()->performMediaPlayerAction(action, location); } +void RenderViewImpl::OnPluginActionAt(const gfx::Point& location, + const WebPluginAction& action) { + if (webview()) + webview()->performPluginAction(action, location); +} + void RenderViewImpl::OnGetAllSavableResourceLinksForCurrentPage( const GURL& page_url) { // Prepare list to storage all savable resource links. diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h index 22a555f..b04e3f7 100644 --- a/content/renderer/render_view_impl.h +++ b/content/renderer/render_view_impl.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -127,6 +127,7 @@ class WebURLRequest; struct WebFileChooserParams; struct WebFindOptions; struct WebMediaPlayerAction; +struct WebPluginAction; struct WebPoint; struct WebWindowFeatures; } @@ -791,6 +792,8 @@ class RenderViewImpl : public RenderWidget, void OnLockMouseACK(bool succeeded); void OnMediaPlayerActionAt(const gfx::Point& location, const WebKit::WebMediaPlayerAction& action); + void OnPluginActionAt(const gfx::Point& location, + const WebKit::WebPluginAction& action); void OnMouseLockLost(); void OnMoveOrResizeStarted(); CONTENT_EXPORT void OnNavigate(const ViewMsg_Navigate_Params& params); diff --git a/webkit/plugins/ppapi/ppapi_plugin_instance.cc b/webkit/plugins/ppapi/ppapi_plugin_instance.cc index ddd052d..7f849f6 100644 --- a/webkit/plugins/ppapi/ppapi_plugin_instance.cc +++ b/webkit/plugins/ppapi/ppapi_plugin_instance.cc @@ -116,6 +116,7 @@ using WebKit::WebDocument; using WebKit::WebElement; using WebKit::WebFrame; using WebKit::WebInputEvent; +using WebKit::WebPlugin; using WebKit::WebPluginContainer; using WebKit::WebString; using WebKit::WebURLRequest; @@ -1192,6 +1193,24 @@ void PluginInstance::PrintEnd() { #endif // defined(OS_MACOSX) } +bool PluginInstance::CanRotateView() { + if (!LoadPdfInterface()) + return false; + + return true; +} + +void PluginInstance::RotateView(WebPlugin::RotationType type) { + if (!LoadPdfInterface()) + return; + PP_PrivatePageTransformType transform_type = + type == WebPlugin::RotationType90Clockwise ? + PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CW : + PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CCW; + plugin_pdf_interface_->Transform(pp_instance(), transform_type); + // NOTE: plugin instance may have been deleted. +} + bool PluginInstance::FlashIsFullscreenOrPending() { return fullscreen_container_ != NULL; } diff --git a/webkit/plugins/ppapi/ppapi_plugin_instance.h b/webkit/plugins/ppapi/ppapi_plugin_instance.h index 3caef5c..086125f 100644 --- a/webkit/plugins/ppapi/ppapi_plugin_instance.h +++ b/webkit/plugins/ppapi/ppapi_plugin_instance.h @@ -38,6 +38,7 @@ #include "third_party/skia/include/core/SkRefCnt.h" #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebCanvas.h" #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" +#include "third_party/WebKit/Source/WebKit/chromium/public/WebPlugin.h" #include "ui/base/ime/text_input_type.h" #include "ui/gfx/rect.h" #include "webkit/plugins/ppapi/plugin_delegate.h" @@ -227,6 +228,9 @@ class WEBKIT_PLUGINS_EXPORT PluginInstance : bool PrintPage(int page_number, WebKit::WebCanvas* canvas); void PrintEnd(); + bool CanRotateView(); + void RotateView(WebKit::WebPlugin::RotationType type); + void Graphics3DContextLost(); // There are 2 implementations of the fullscreen interface diff --git a/webkit/plugins/ppapi/ppapi_webplugin_impl.cc b/webkit/plugins/ppapi/ppapi_webplugin_impl.cc index df52705..c505741 100644 --- a/webkit/plugins/ppapi/ppapi_webplugin_impl.cc +++ b/webkit/plugins/ppapi/ppapi_webplugin_impl.cc @@ -260,5 +260,13 @@ void WebPluginImpl::printEnd() { return instance_->PrintEnd(); } +bool WebPluginImpl::canRotateView() { + return instance_->CanRotateView(); +} + +void WebPluginImpl::rotateView(RotationType type) { + instance_->RotateView(type); +} + } // namespace ppapi } // namespace webkit diff --git a/webkit/plugins/ppapi/ppapi_webplugin_impl.h b/webkit/plugins/ppapi/ppapi_webplugin_impl.h index 21e693f..e853281 100644 --- a/webkit/plugins/ppapi/ppapi_webplugin_impl.h +++ b/webkit/plugins/ppapi/ppapi_webplugin_impl.h @@ -1,4 +1,4 @@ -// Copyright (c) 2011 The Chromium Authors. All rights reserved. +// Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. @@ -81,6 +81,9 @@ class WebPluginImpl : public WebKit::WebPlugin { virtual bool printPage(int page_number, WebKit::WebCanvas* canvas) OVERRIDE; virtual void printEnd() OVERRIDE; + virtual bool canRotateView() OVERRIDE; + virtual void rotateView(RotationType type) OVERRIDE; + struct InitData; scoped_ptr<InitData> init_data_; // Cleared upon successful initialization. diff --git a/webkit/plugins/ppapi/ppp_pdf.h b/webkit/plugins/ppapi/ppp_pdf.h index 4076b60..9f4cfcd 100644 --- a/webkit/plugins/ppapi/ppp_pdf.h +++ b/webkit/plugins/ppapi/ppp_pdf.h @@ -12,10 +12,21 @@ #define PPP_PDF_INTERFACE_1 "PPP_Pdf;1" #define PPP_PDF_INTERFACE PPP_PDF_INTERFACE_1 +typedef enum { + // Rotates the page 90 degrees clockwise from its current orientation. + PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CW, + // Rotates the page 90 degrees counterclockwise from its current orientation. + PP_PRIVATEPAGETRANSFORMTYPE_ROTATE_90_CCW +} PP_PrivatePageTransformType; +PP_COMPILE_ASSERT_SIZE_IN_BYTES(PP_PrivatePageTransformType, 4); + struct PPP_Pdf_1 { // Returns an absolute URL if the position is over a link. PP_Var (*GetLinkAtPosition)(PP_Instance instance, PP_Point point); + + // Requests that the plugin apply the given transform to its view. + void (*Transform)(PP_Instance instance, PP_PrivatePageTransformType type); }; typedef PPP_Pdf_1 PPP_Pdf; |