diff options
author | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-12 05:29:03 +0000 |
---|---|---|
committer | brettw@chromium.org <brettw@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-05-12 05:29:03 +0000 |
commit | bd1b93d983c6cbf8e32458bd36a3aadf7490a770 (patch) | |
tree | 4670a311dfa2faf487a9b1810ca2eda6df64e8e6 /webkit | |
parent | beaafbaf7a599c92912702bc2b5b3e770849a74a (diff) | |
download | chromium_src-bd1b93d983c6cbf8e32458bd36a3aadf7490a770.zip chromium_src-bd1b93d983c6cbf8e32458bd36a3aadf7490a770.tar.gz chromium_src-bd1b93d983c6cbf8e32458bd36a3aadf7490a770.tar.bz2 |
Implement a version of WebPlugin for Pepper to bypass the current NPAPI
WebPluginImpl. We don't need most of that NPAPI cruft and can remove this extra
layer of abstraction to keep our code simpler.
TEST=none
BUG=none
Review URL: http://codereview.chromium.org/2001014
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@47010 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'webkit')
-rw-r--r-- | webkit/glue/plugins/pepper_webplugin_delegate_impl.cc | 160 | ||||
-rw-r--r-- | webkit/glue/plugins/pepper_webplugin_delegate_impl.h | 86 | ||||
-rw-r--r-- | webkit/glue/plugins/pepper_webplugin_impl.cc | 124 | ||||
-rw-r--r-- | webkit/glue/plugins/pepper_webplugin_impl.h | 75 | ||||
-rw-r--r-- | webkit/glue/webkit_glue.gypi | 4 |
5 files changed, 201 insertions, 248 deletions
diff --git a/webkit/glue/plugins/pepper_webplugin_delegate_impl.cc b/webkit/glue/plugins/pepper_webplugin_delegate_impl.cc deleted file mode 100644 index 473dd58..0000000 --- a/webkit/glue/plugins/pepper_webplugin_delegate_impl.cc +++ /dev/null @@ -1,160 +0,0 @@ -// Copyright (c) 2010 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. - -#include "webkit/glue/plugins/pepper_webplugin_delegate_impl.h" - -#include "base/logging.h" -#include "base/ref_counted.h" -#include "webkit/glue/plugins/pepper_device_context_2d.h" -#include "webkit/glue/plugins/pepper_plugin_instance.h" -#include "webkit/glue/plugins/pepper_plugin_module.h" -#include "webkit/glue/plugins/webplugin.h" - -namespace pepper { - -WebPluginDelegateImpl::WebPluginDelegateImpl(PluginInstance* instance) - : instance_(instance), - web_plugin_(NULL) { -} - -WebPluginDelegateImpl::~WebPluginDelegateImpl() { -} - -// static -WebPluginDelegateImpl* WebPluginDelegateImpl::Create(PluginDelegate* delegate, - const FilePath& filename) { - scoped_refptr<PluginModule> module = PluginModule::CreateModule(filename); - if (!module.get()) - return NULL; - - scoped_refptr<PluginInstance> instance = module->CreateInstance(delegate); - return new WebPluginDelegateImpl(instance.get()); -} - -bool WebPluginDelegateImpl::Initialize( - const GURL& url, - const std::vector<std::string>& arg_names, - const std::vector<std::string>& arg_values, - webkit_glue::WebPlugin* plugin, - bool load_manually) { - web_plugin_ = plugin; - - if (!instance_->Initialize(arg_names, arg_values)) { - LOG(WARNING) << "Plugin instance initialization failed."; - return false; - } - - // Declare we're in Windowless mode to WebKit. - web_plugin_->SetWindow(0); - return true; -} - -void WebPluginDelegateImpl::PluginDestroyed() { - // TODO(brettw) we may need something like in the NPAPI version that checks - // for reentrancy and doesn't delete until later. - instance_->Delete(); - delete this; -} - -void WebPluginDelegateImpl::UpdateGeometry(const gfx::Rect& window_rect, - const gfx::Rect& clip_rect) { - window_rect_ = window_rect; - instance_->ViewChanged(window_rect, clip_rect); -} - -void WebPluginDelegateImpl::Paint(WebKit::WebCanvas* canvas, - const gfx::Rect& rect) { - instance_->Paint(canvas, window_rect_, rect); -} - -void WebPluginDelegateImpl::Print(gfx::NativeDrawingContext hdc) { -} - -void WebPluginDelegateImpl::SetFocus(bool focused) { -} - -bool WebPluginDelegateImpl::HandleInputEvent(const WebKit::WebInputEvent& event, - WebKit::WebCursorInfo* cursor) { - return instance_->HandleInputEvent(event, cursor); -} - -NPObject* WebPluginDelegateImpl::GetPluginScriptableObject() { - return NULL; -} - -void WebPluginDelegateImpl::DidFinishLoadWithReason(const GURL& url, - NPReason reason, - int notify_id) { -} - -int WebPluginDelegateImpl::GetProcessId() { - return -1; // TODO(brettw) work out what this should do. -} - -void WebPluginDelegateImpl::SendJavaScriptStream(const GURL& url, - const std::string& result, - bool success, - int notify_id) { -} - -void WebPluginDelegateImpl::DidReceiveManualResponse( - const GURL& url, - const std::string& mime_type, - const std::string& headers, - uint32 expected_length, - uint32 last_modified) { -} - -void WebPluginDelegateImpl::DidReceiveManualData(const char* buffer, - int length) { -} - -void WebPluginDelegateImpl::DidFinishManualLoading() { -} - -void WebPluginDelegateImpl::DidManualLoadFail() { -} - -void WebPluginDelegateImpl::InstallMissingPlugin() { -} - -webkit_glue::WebPluginResourceClient* -WebPluginDelegateImpl::CreateResourceClient(unsigned long resource_id, - const GURL& url, - int notify_id) { - return NULL; -} - -webkit_glue::WebPluginResourceClient* -WebPluginDelegateImpl::CreateSeekableResourceClient(unsigned long resource_id, - int range_request_id) { - return NULL; -} - -bool WebPluginDelegateImpl::SupportsFind() { - return false; -} - -void WebPluginDelegateImpl::StartFind(const std::string& search_text, - bool case_sensitive, - int identifier) { -} - -void WebPluginDelegateImpl::SelectFindResult(bool forward) { -} - -void WebPluginDelegateImpl::StopFind() { -} - -void WebPluginDelegateImpl::NumberOfFindResultsChanged(int total, - bool final_result) { -} - -void WebPluginDelegateImpl::SelectedFindResultChanged(int index) { -} - -void WebPluginDelegateImpl::Zoom(int factor) { -} - -} // namespace pepper diff --git a/webkit/glue/plugins/pepper_webplugin_delegate_impl.h b/webkit/glue/plugins/pepper_webplugin_delegate_impl.h deleted file mode 100644 index a4bb58a..0000000 --- a/webkit/glue/plugins/pepper_webplugin_delegate_impl.h +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (c) 2010 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. - -#ifndef WEBKIT_GLUE_PLUGINS_PEPPER_WEBPLUGIN_DELEGATE_IMPL_H_ -#define WEBKIT_GLUE_PLUGINS_PEPPER_WEBPLUGIN_DELEGATE_IMPL_H_ - -#include "base/basictypes.h" -#include "base/ref_counted.h" -#include "gfx/rect.h" -#include "webkit/glue/plugins/webplugin_delegate.h" - -namespace pepper { - -class DeviceContext2D; -class PluginDelegate; -class PluginInstance; - -class WebPluginDelegateImpl : public webkit_glue::WebPluginDelegate { - public: - virtual ~WebPluginDelegateImpl(); - - static WebPluginDelegateImpl* Create(PluginDelegate* delegate, - const FilePath& filename); - - // webkit_glue::WebPluginDelegate implementation. - virtual bool Initialize(const GURL& url, - const std::vector<std::string>& arg_names, - const std::vector<std::string>& arg_values, - webkit_glue::WebPlugin* plugin, - bool load_manually); - virtual void PluginDestroyed(); - virtual void UpdateGeometry(const gfx::Rect& window_rect, - const gfx::Rect& clip_rect); - virtual void Paint(WebKit::WebCanvas* canvas, const gfx::Rect& rect); - virtual void Print(gfx::NativeDrawingContext hdc); - virtual void SetFocus(bool focused); - virtual bool HandleInputEvent(const WebKit::WebInputEvent& event, - WebKit::WebCursorInfo* cursor); - virtual NPObject* GetPluginScriptableObject(); - virtual void DidFinishLoadWithReason(const GURL& url, NPReason reason, - int notify_id); - virtual int GetProcessId(); - virtual void SendJavaScriptStream(const GURL& url, - const std::string& result, - bool success, - int notify_id); - virtual void DidReceiveManualResponse(const GURL& url, - const std::string& mime_type, - const std::string& headers, - uint32 expected_length, - uint32 last_modified); - virtual void DidReceiveManualData(const char* buffer, int length); - virtual void DidFinishManualLoading(); - virtual void DidManualLoadFail(); - virtual void InstallMissingPlugin(); - virtual webkit_glue::WebPluginResourceClient* CreateResourceClient( - unsigned long resource_id, - const GURL& url, - int notify_id); - virtual webkit_glue::WebPluginResourceClient* CreateSeekableResourceClient( - unsigned long resource_id, int range_request_id); - virtual bool SupportsFind(); - virtual void StartFind(const std::string& search_text, - bool case_sensitive, - int identifier); - virtual void SelectFindResult(bool forward); - virtual void StopFind(); - virtual void NumberOfFindResultsChanged(int total, bool final_result); - virtual void SelectedFindResultChanged(int index); - virtual void Zoom(int factor); - - private: - WebPluginDelegateImpl(PluginInstance* instance); - - scoped_refptr<PluginInstance> instance_; - webkit_glue::WebPlugin* web_plugin_; - - gfx::Rect window_rect_; - - DISALLOW_COPY_AND_ASSIGN(WebPluginDelegateImpl); -}; - -} // namespace - -#endif // WEBKIT_GLUE_PLUGINS_PEPPER_WEBPLUGIN_DELEGATE_IMPL_H_ diff --git a/webkit/glue/plugins/pepper_webplugin_impl.cc b/webkit/glue/plugins/pepper_webplugin_impl.cc new file mode 100644 index 0000000..fa20107 --- /dev/null +++ b/webkit/glue/plugins/pepper_webplugin_impl.cc @@ -0,0 +1,124 @@ +// Copyright (c) 2010 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. + +#include "webkit/glue/plugins/pepper_webplugin_impl.h" + +#include "base/file_path.h" +#include "base/message_loop.h" +#include "third_party/WebKit/WebKit/chromium/public/WebPluginParams.h" +#include "third_party/WebKit/WebKit/chromium/public/WebRect.h" +#include "webkit/glue/plugins/pepper_plugin_instance.h" +#include "webkit/glue/plugins/pepper_plugin_module.h" + +using WebKit::WebCanvas; +using WebKit::WebPluginContainer; +using WebKit::WebPluginParams; +using WebKit::WebRect; +using WebKit::WebVector; + +namespace pepper { + +WebPluginImpl::WebPluginImpl( + WebKit::WebFrame* frame, + const WebPluginParams& params, + const base::WeakPtr<PluginDelegate>& plugin_delegate) + : plugin_delegate_(plugin_delegate), + container_(NULL) { + for (size_t i = 0; i < params.attributeNames.size(); ++i) { + arg_names_.push_back(params.attributeNames[i].utf8()); + arg_values_.push_back(params.attributeValues[i].utf8()); + } +} + +WebPluginImpl::~WebPluginImpl() { +} + +bool WebPluginImpl::initialize(WebPluginContainer* container) { + // TODO(brettw) don't hardcode this! + scoped_refptr<PluginModule> module = PluginModule::CreateModule( + FilePath(FILE_PATH_LITERAL( + "/usr/local/google/home/src3/src/out/Debug/lib.target/libppapi_example.so"))); + if (!module.get()) + return false; + + if (!plugin_delegate_) + return false; + instance_ = module->CreateInstance(plugin_delegate_); + bool success = instance_->Initialize(arg_names_, arg_values_); + if (!success) { + instance_->Delete(); + instance_ = NULL; + return false; + } + + container_ = container; + return true; +} + +void WebPluginImpl::destroy() { + container_ = NULL; + + instance_->Delete(); + instance_ = NULL; + + MessageLoop::current()->DeleteSoon(FROM_HERE, this); +} + +NPObject* WebPluginImpl::scriptableObject() { + // TODO(brettw): implement getting this from the plugin instance. + return NULL; +} + +void WebPluginImpl::paint(WebCanvas* canvas, const WebRect& rect) { + instance_->Paint(canvas, plugin_rect_, rect); +} + +void WebPluginImpl::updateGeometry( + const WebRect& window_rect, + const WebRect& clip_rect, + const WebVector<WebRect>& cut_outs_rects, + bool is_visible) { + plugin_rect_ = window_rect; + instance_->ViewChanged(plugin_rect_, clip_rect); +} + +void WebPluginImpl::updateFocus(bool focused) { +} + +void WebPluginImpl::updateVisibility(bool visible) { +} + +bool WebPluginImpl::acceptsInputEvents() { + return true; +} + +bool WebPluginImpl::handleInputEvent(const WebKit::WebInputEvent& event, + WebKit::WebCursorInfo& cursor_info) { + return instance_->HandleInputEvent(event, &cursor_info); +} + +void WebPluginImpl::didReceiveResponse( + const WebKit::WebURLResponse& response) { +} + +void WebPluginImpl::didReceiveData(const char* data, int data_length) { +} + +void WebPluginImpl::didFinishLoading() { +} + +void WebPluginImpl::didFailLoading(const WebKit::WebURLError&) { +} + +void WebPluginImpl::didFinishLoadingFrameRequest(const WebKit::WebURL& url, + void* notify_data) { +} + +void WebPluginImpl::didFailLoadingFrameRequest( + const WebKit::WebURL& url, + void* notify_data, + const WebKit::WebURLError& error) { +} + +} // namespace pepper diff --git a/webkit/glue/plugins/pepper_webplugin_impl.h b/webkit/glue/plugins/pepper_webplugin_impl.h new file mode 100644 index 0000000..5213cbb --- /dev/null +++ b/webkit/glue/plugins/pepper_webplugin_impl.h @@ -0,0 +1,75 @@ +// Copyright (c) 2010 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. + +#ifndef WEBKIT_GLUE_PLUGINS_PEPPER_WEBPLUGIN_IMPL_H_ +#define WEBKIT_GLUE_PLUGINS_PEPPER_WEBPLUGIN_IMPL_H_ + +#include <vector> + +#include "base/weak_ptr.h" +#include "gfx/rect.h" +#include "third_party/WebKit/WebKit/chromium/public/WebPlugin.h" + +namespace WebKit { +class WebFrame; +struct WebPluginParams; +} + +namespace pepper { + +class PluginDelegate; +class PluginInstance; + +class WebPluginImpl : public WebKit::WebPlugin { + public: + WebPluginImpl(WebKit::WebFrame* frame, + const WebKit::WebPluginParams& params, + const base::WeakPtr<PluginDelegate>& plugin_delegate); + ~WebPluginImpl(); + + // WebKit::WebPlugin implementation. + virtual bool initialize(WebKit::WebPluginContainer* container); + virtual void destroy(); + virtual NPObject* scriptableObject(); + virtual void paint(WebKit::WebCanvas* canvas, const WebKit::WebRect& rect); + virtual void updateGeometry( + const WebKit::WebRect& frame_rect, + const WebKit::WebRect& clip_rect, + const WebKit::WebVector<WebKit::WebRect>& cut_outs_rects, + bool is_visible); + virtual void updateFocus(bool focused); + virtual void updateVisibility(bool visible); + virtual bool acceptsInputEvents(); + virtual bool handleInputEvent(const WebKit::WebInputEvent& event, + WebKit::WebCursorInfo& cursor_info); + virtual void didReceiveResponse(const WebKit::WebURLResponse& response); + virtual void didReceiveData(const char* data, int data_length); + virtual void didFinishLoading(); + virtual void didFailLoading(const WebKit::WebURLError&); + virtual void didFinishLoadingFrameRequest(const WebKit::WebURL& url, + void* notify_data); + virtual void didFailLoadingFrameRequest(const WebKit::WebURL& url, + void* notify_data, + const WebKit::WebURLError& error); + + public: + base::WeakPtr<PluginDelegate> plugin_delegate_; + + scoped_refptr<PluginInstance> instance_; + + // Can be NULL. + WebKit::WebPluginContainer* container_; + + // Holds the list of argument names and values passed to the plugin. + std::vector<std::string> arg_names_; + std::vector<std::string> arg_values_; + + gfx::Rect plugin_rect_; + + DISALLOW_COPY_AND_ASSIGN(WebPluginImpl); +}; + +} // namespace pepper + +#endif // WEBKIT_GLUE_PLUGINS_PEPPER_WEBPLUGIN_IMPL_H_ diff --git a/webkit/glue/webkit_glue.gypi b/webkit/glue/webkit_glue.gypi index 87f3d36..f357109 100644 --- a/webkit/glue/webkit_glue.gypi +++ b/webkit/glue/webkit_glue.gypi @@ -177,8 +177,8 @@ 'plugins/pepper_resource.h', 'plugins/pepper_var.cc', 'plugins/pepper_var.h', - 'plugins/pepper_webplugin_delegate_impl.cc', - 'plugins/pepper_webplugin_delegate_impl.h', + 'plugins/pepper_webplugin_impl.cc', + 'plugins/pepper_webplugin_impl.h', 'plugins/plugin_constants_win.h', 'plugins/plugin_host.cc', 'plugins/plugin_host.h', |