| Index: webkit/glue/plugins/webplugin_delegate_impl.cc
|
| ===================================================================
|
| --- webkit/glue/plugins/webplugin_delegate_impl.cc (revision 69426)
|
| +++ webkit/glue/plugins/webplugin_delegate_impl.cc (working copy)
|
| @@ -1,304 +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/webplugin_delegate_impl.h"
|
| -
|
| -#include <string>
|
| -#include <vector>
|
| -
|
| -#include "base/file_util.h"
|
| -#include "base/message_loop.h"
|
| -#include "base/process_util.h"
|
| -#include "base/scoped_ptr.h"
|
| -#include "base/string_util.h"
|
| -#include "third_party/WebKit/WebKit/chromium/public/WebInputEvent.h"
|
| -#include "webkit/glue/plugins/plugin_constants_win.h"
|
| -#include "webkit/glue/plugins/plugin_instance.h"
|
| -#include "webkit/glue/plugins/plugin_lib.h"
|
| -#include "webkit/glue/plugins/plugin_list.h"
|
| -#include "webkit/glue/plugins/plugin_stream_url.h"
|
| -#include "webkit/glue/webkit_glue.h"
|
| -
|
| -using webkit_glue::WebPlugin;
|
| -using webkit_glue::WebPluginDelegate;
|
| -using webkit_glue::WebPluginResourceClient;
|
| -using WebKit::WebCursorInfo;
|
| -using WebKit::WebKeyboardEvent;
|
| -using WebKit::WebInputEvent;
|
| -using WebKit::WebMouseEvent;
|
| -
|
| -WebPluginDelegateImpl* WebPluginDelegateImpl::Create(
|
| - const FilePath& filename,
|
| - const std::string& mime_type,
|
| - gfx::PluginWindowHandle containing_view) {
|
| - scoped_refptr<NPAPI::PluginLib> plugin_lib(
|
| - NPAPI::PluginLib::CreatePluginLib(filename));
|
| - if (plugin_lib.get() == NULL)
|
| - return NULL;
|
| -
|
| - NPError err = plugin_lib->NP_Initialize();
|
| - if (err != NPERR_NO_ERROR)
|
| - return NULL;
|
| -
|
| - scoped_refptr<NPAPI::PluginInstance> instance(
|
| - plugin_lib->CreateInstance(mime_type));
|
| - return new WebPluginDelegateImpl(containing_view, instance.get());
|
| -}
|
| -
|
| -void WebPluginDelegateImpl::PluginDestroyed() {
|
| - if (handle_event_depth_) {
|
| - MessageLoop::current()->DeleteSoon(FROM_HERE, this);
|
| - } else {
|
| - delete this;
|
| - }
|
| -}
|
| -
|
| -bool WebPluginDelegateImpl::Initialize(
|
| - const GURL& url,
|
| - const std::vector<std::string>& arg_names,
|
| - const std::vector<std::string>& arg_values,
|
| - WebPlugin* plugin,
|
| - bool load_manually) {
|
| - plugin_ = plugin;
|
| -
|
| - instance_->set_web_plugin(plugin_);
|
| - if (quirks_ & PLUGIN_QUIRK_DONT_ALLOW_MULTIPLE_INSTANCES) {
|
| - NPAPI::PluginLib* plugin_lib = instance()->plugin_lib();
|
| - if (plugin_lib->instance_count() > 1) {
|
| - return false;
|
| - }
|
| - }
|
| -
|
| - if (quirks_ & PLUGIN_QUIRK_DIE_AFTER_UNLOAD)
|
| - webkit_glue::SetForcefullyTerminatePluginProcess(true);
|
| -
|
| - int argc = 0;
|
| - scoped_array<char*> argn(new char*[arg_names.size()]);
|
| - scoped_array<char*> argv(new char*[arg_names.size()]);
|
| - for (size_t i = 0; i < arg_names.size(); ++i) {
|
| - if (quirks_ & PLUGIN_QUIRK_NO_WINDOWLESS &&
|
| - LowerCaseEqualsASCII(arg_names[i], "windowlessvideo")) {
|
| - continue;
|
| - }
|
| - argn[argc] = const_cast<char*>(arg_names[i].c_str());
|
| - argv[argc] = const_cast<char*>(arg_values[i].c_str());
|
| - argc++;
|
| - }
|
| -
|
| - creation_succeeded_ = instance_->Start(
|
| - url, argn.get(), argv.get(), argc, load_manually);
|
| - if (!creation_succeeded_)
|
| - return false;
|
| -
|
| - windowless_ = instance_->windowless();
|
| - if (!windowless_) {
|
| - if (!WindowedCreatePlugin())
|
| - return false;
|
| - } else {
|
| - // For windowless plugins we should set the containing window handle
|
| - // as the instance window handle. This is what Safari does. Not having
|
| - // a valid window handle causes subtle bugs with plugins which retrieve
|
| - // the window handle and validate the same. The window handle can be
|
| - // retrieved via NPN_GetValue of NPNVnetscapeWindow.
|
| - instance_->set_window_handle(parent_);
|
| - }
|
| -
|
| - bool should_load = PlatformInitialize();
|
| -
|
| - plugin_url_ = url.spec();
|
| -
|
| - return should_load;
|
| -}
|
| -
|
| -void WebPluginDelegateImpl::DestroyInstance() {
|
| - if (instance_ && (instance_->npp()->ndata != NULL)) {
|
| - // Shutdown all streams before destroying so that
|
| - // no streams are left "in progress". Need to do
|
| - // this before calling set_web_plugin(NULL) because the
|
| - // instance uses the helper to do the download.
|
| - instance_->CloseStreams();
|
| -
|
| - window_.window = NULL;
|
| - if (creation_succeeded_ &&
|
| - !(quirks_ & PLUGIN_QUIRK_DONT_SET_NULL_WINDOW_HANDLE_ON_DESTROY)) {
|
| - instance_->NPP_SetWindow(&window_);
|
| - }
|
| -
|
| - instance_->NPP_Destroy();
|
| -
|
| - instance_->set_web_plugin(NULL);
|
| -
|
| - PlatformDestroyInstance();
|
| -
|
| - instance_ = 0;
|
| - }
|
| -}
|
| -
|
| -void WebPluginDelegateImpl::UpdateGeometry(
|
| - const gfx::Rect& window_rect,
|
| - const gfx::Rect& clip_rect) {
|
| -
|
| - if (first_set_window_call_) {
|
| - first_set_window_call_ = false;
|
| - // Plugins like media player on Windows have a bug where in they handle the
|
| - // first geometry update and ignore the rest resulting in painting issues.
|
| - // This quirk basically ignores the first set window call sequence for
|
| - // these plugins and has been tested for Windows plugins only.
|
| - if (quirks_ & PLUGIN_QUIRK_IGNORE_FIRST_SETWINDOW_CALL)
|
| - return;
|
| - }
|
| -
|
| - if (windowless_) {
|
| - WindowlessUpdateGeometry(window_rect, clip_rect);
|
| - } else {
|
| - WindowedUpdateGeometry(window_rect, clip_rect);
|
| - }
|
| -}
|
| -
|
| -void WebPluginDelegateImpl::SetFocus(bool focused) {
|
| - DCHECK(windowless_);
|
| - // This is called when internal WebKit focus (the focused element on the page)
|
| - // changes, but plugins need to know about OS-level focus, so we have an extra
|
| - // layer of focus tracking.
|
| - //
|
| - // On Windows, historically browsers did not set focus events to windowless
|
| - // plugins when the toplevel window focus changes. Sending such focus events
|
| - // breaks full screen mode in Flash because it will come out of full screen
|
| - // mode when it loses focus, and its full screen window causes the browser to
|
| - // lose focus.
|
| - has_webkit_focus_ = focused;
|
| -#ifndef OS_WIN
|
| - if (containing_view_has_focus_)
|
| - SetPluginHasFocus(focused);
|
| -#else
|
| - SetPluginHasFocus(focused);
|
| -#endif
|
| -}
|
| -
|
| -void WebPluginDelegateImpl::SetPluginHasFocus(bool focused) {
|
| - if (focused == plugin_has_focus_)
|
| - return;
|
| - if (PlatformSetPluginHasFocus(focused))
|
| - plugin_has_focus_ = focused;
|
| -}
|
| -
|
| -void WebPluginDelegateImpl::SetContentAreaHasFocus(bool has_focus) {
|
| - containing_view_has_focus_ = has_focus;
|
| - if (!windowless_)
|
| - return;
|
| -#ifndef OS_WIN // See SetFocus above.
|
| - SetPluginHasFocus(containing_view_has_focus_ && has_webkit_focus_);
|
| -#endif
|
| -}
|
| -
|
| -NPObject* WebPluginDelegateImpl::GetPluginScriptableObject() {
|
| - return instance_->GetPluginScriptableObject();
|
| -}
|
| -
|
| -void WebPluginDelegateImpl::DidFinishLoadWithReason(const GURL& url,
|
| - NPReason reason,
|
| - int notify_id) {
|
| - if (quirks_ & PLUGIN_QUIRK_ALWAYS_NOTIFY_SUCCESS &&
|
| - reason == NPRES_NETWORK_ERR) {
|
| - // Flash needs this or otherwise it unloads the launching swf object.
|
| - reason = NPRES_DONE;
|
| - }
|
| -
|
| - instance()->DidFinishLoadWithReason(url, reason, notify_id);
|
| -}
|
| -
|
| -int WebPluginDelegateImpl::GetProcessId() {
|
| - // We are in process, so the plugin pid is this current process pid.
|
| - return base::GetCurrentProcId();
|
| -}
|
| -
|
| -void WebPluginDelegateImpl::SendJavaScriptStream(const GURL& url,
|
| - const std::string& result,
|
| - bool success,
|
| - int notify_id) {
|
| - instance()->SendJavaScriptStream(url, result, success, notify_id);
|
| -}
|
| -
|
| -void WebPluginDelegateImpl::DidReceiveManualResponse(
|
| - const GURL& url, const std::string& mime_type,
|
| - const std::string& headers, uint32 expected_length, uint32 last_modified) {
|
| - if (!windowless_) {
|
| - // Calling NPP_WriteReady before NPP_SetWindow causes movies to not load in
|
| - // Flash. See http://b/issue?id=892174.
|
| - DCHECK(windowed_did_set_window_);
|
| - }
|
| -
|
| - instance()->DidReceiveManualResponse(url, mime_type, headers,
|
| - expected_length, last_modified);
|
| -}
|
| -
|
| -void WebPluginDelegateImpl::DidReceiveManualData(const char* buffer,
|
| - int length) {
|
| - instance()->DidReceiveManualData(buffer, length);
|
| -}
|
| -
|
| -void WebPluginDelegateImpl::DidFinishManualLoading() {
|
| - instance()->DidFinishManualLoading();
|
| -}
|
| -
|
| -void WebPluginDelegateImpl::DidManualLoadFail() {
|
| - instance()->DidManualLoadFail();
|
| -}
|
| -
|
| -FilePath WebPluginDelegateImpl::GetPluginPath() {
|
| - return instance()->plugin_lib()->plugin_info().path;
|
| -}
|
| -
|
| -void WebPluginDelegateImpl::WindowedUpdateGeometry(
|
| - const gfx::Rect& window_rect,
|
| - const gfx::Rect& clip_rect) {
|
| - if (WindowedReposition(window_rect, clip_rect) ||
|
| - !windowed_did_set_window_) {
|
| - // Let the plugin know that it has been moved
|
| - WindowedSetWindow();
|
| - }
|
| -}
|
| -
|
| -bool WebPluginDelegateImpl::HandleInputEvent(const WebInputEvent& event,
|
| - WebCursorInfo* cursor_info) {
|
| - DCHECK(windowless_) << "events should only be received in windowless mode";
|
| -
|
| - bool pop_user_gesture = false;
|
| - if (IsUserGesture(event)) {
|
| - pop_user_gesture = true;
|
| - instance()->PushPopupsEnabledState(true);
|
| - }
|
| -
|
| - bool handled = PlatformHandleInputEvent(event, cursor_info);
|
| -
|
| - if (pop_user_gesture) {
|
| - instance()->PopPopupsEnabledState();
|
| - }
|
| -
|
| - return handled;
|
| -}
|
| -
|
| -bool WebPluginDelegateImpl::IsUserGesture(const WebInputEvent& event) {
|
| - switch (event.type) {
|
| - case WebInputEvent::MouseDown:
|
| - case WebInputEvent::MouseUp:
|
| - case WebInputEvent::KeyDown:
|
| - case WebInputEvent::KeyUp:
|
| - return true;
|
| - default:
|
| - return false;
|
| - }
|
| - return false;
|
| -}
|
| -
|
| -WebPluginResourceClient* WebPluginDelegateImpl::CreateResourceClient(
|
| - unsigned long resource_id, const GURL& url, int notify_id) {
|
| - return instance()->CreateStream(
|
| - resource_id, url, std::string(), notify_id);
|
| -}
|
| -
|
| -WebPluginResourceClient* WebPluginDelegateImpl::CreateSeekableResourceClient(
|
| - unsigned long resource_id, int range_request_id) {
|
| - return instance()->GetRangeRequest(range_request_id);
|
| -}
|
|
|