72
71
#include "shared/browser/compositor/oxide_compositor.h"
73
72
#include "shared/browser/compositor/oxide_compositor_frame_handle.h"
73
#include "shared/browser/permissions/oxide_permission_request_dispatcher.h"
74
74
#include "shared/common/oxide_content_client.h"
75
75
#include "shared/common/oxide_enum_flags.h"
76
76
#include "shared/common/oxide_messages.h"
78
#include "third_party/WebKit/public/web/WebFindOptions.h"
80
78
#include "oxide_browser_context.h"
81
79
#include "oxide_browser_process_main.h"
82
80
#include "oxide_content_browser_client.h"
167
165
void CreateHelpers(content::WebContents* contents,
168
WebViewContentsHelper* opener = nullptr) {
170
new WebViewContentsHelper(contents);
173
new WebViewContentsHelper(contents, opener);
166
content::WebContents* opener = nullptr) {
167
new WebViewContentsHelper(contents, opener);
168
PermissionRequestDispatcher::CreateForWebContents(contents);
176
169
#if defined(ENABLE_MEDIAHUB)
177
170
new MediaWebContentsObserver(contents);
222
215
WebView::Params::Params()
223
216
: context(nullptr),
224
217
incognito(false) {}
225
219
WebView::Params::~Params() {}
221
struct WebView::InitData {
223
: restore_type(content::NavigationController::RESTORE_LAST_SESSION_EXITED_CLEANLY),
226
scoped_ptr<content::NavigationController::LoadURLParams> load_params;
228
content::NavigationController::RestoreType restore_type;
229
std::vector<sessions::SerializedNavigationEntry> restore_state;
228
234
WebViewIterator WebView::GetAllWebViews() {
229
235
return WebViewIterator(g_all_web_views.Get());
806
812
const content::MediaResponseCallback& callback) {
807
813
DCHECK_VALID_SOURCE_CONTENTS
809
if (request.video_type == content::MEDIA_DEVICE_AUDIO_OUTPUT ||
810
request.audio_type == content::MEDIA_DEVICE_AUDIO_OUTPUT) {
811
callback.Run(content::MediaStreamDevices(),
812
content::MEDIA_DEVICE_INVALID_STATE,
817
if (request.video_type == content::MEDIA_NO_SERVICE &&
818
request.audio_type == content::MEDIA_NO_SERVICE) {
819
callback.Run(content::MediaStreamDevices(),
820
content::MEDIA_DEVICE_INVALID_STATE,
825
// Desktop / tab capture not supported
826
if (request.video_type == content::MEDIA_DESKTOP_VIDEO_CAPTURE ||
827
request.audio_type == content::MEDIA_DESKTOP_AUDIO_CAPTURE ||
828
request.video_type == content::MEDIA_TAB_VIDEO_CAPTURE ||
829
request.audio_type == content::MEDIA_TAB_AUDIO_CAPTURE) {
830
callback.Run(content::MediaStreamDevices(),
831
content::MEDIA_DEVICE_NOT_SUPPORTED,
836
// Only MEDIA_GENERATE_STREAM is valid here - MEDIA_DEVICE_ACCESS doesn't
837
// come from media stream, MEDIA_ENUMERATE_DEVICES doesn't trigger a
838
// permission request and MEDIA_OPEN_DEVICE is used from pepper
839
if (request.request_type != content::MEDIA_GENERATE_STREAM) {
840
callback.Run(content::MediaStreamDevices(),
841
content::MEDIA_DEVICE_NOT_SUPPORTED,
846
content::MediaCaptureDevices* devices =
847
content::MediaCaptureDevices::GetInstance();
849
if (request.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE &&
850
devices->GetAudioCaptureDevices().empty()) {
851
callback.Run(content::MediaStreamDevices(),
852
content::MEDIA_DEVICE_NO_HARDWARE,
857
if (request.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE &&
858
devices->GetVideoCaptureDevices().empty()) {
859
callback.Run(content::MediaStreamDevices(),
860
content::MEDIA_DEVICE_NO_HARDWARE,
865
content::RenderFrameHost* rfh =
866
content::RenderFrameHost::FromID(request.render_process_id,
867
request.render_frame_id);
869
callback.Run(content::MediaStreamDevices(),
870
content::MEDIA_DEVICE_PERMISSION_DENIED,
875
WebFrame* frame = WebFrame::FromRenderFrameHost(rfh);
877
callback.Run(content::MediaStreamDevices(),
878
content::MEDIA_DEVICE_PERMISSION_DENIED,
883
scoped_ptr<MediaAccessPermissionRequest> req(
884
new MediaAccessPermissionRequest(
885
&permission_request_manager_,
887
request.security_origin,
888
web_contents_->GetLastCommittedURL().GetOrigin(),
889
request.audio_type == content::MEDIA_DEVICE_AUDIO_CAPTURE,
890
request.video_type == content::MEDIA_DEVICE_VIDEO_CAPTURE,
893
client_->RequestMediaAccessPermission(req.Pass());
815
PermissionRequestDispatcher::FromWebContents(web_contents_.get())
816
->RequestMediaAccessPermission(request, callback);
896
819
void WebView::RenderFrameCreated(content::RenderFrameHost* render_frame_host) {
1025
948
const content::LoadCommittedDetails& details,
1026
949
const content::FrameNavigateParams& params) {
1027
950
if (details.is_navigation_to_different_page()) {
1028
permission_request_manager_.CancelPendingRequests();
951
// XXX(chrisccoulson): Make PermissionRequestDispatcher a
952
// WebContentsObserver
953
PermissionRequestDispatcher::FromWebContents(web_contents_.get())
954
->CancelPendingRequests();
1030
956
blocked_content_ = CONTENT_TYPE_NONE;
1031
957
client_->ContentBlocked();
1180
1112
selection_anchor_position_(0),
1181
1113
web_contents_helper_(nullptr),
1182
1114
compositor_(Compositor::Create(this)),
1183
restore_type_(content::NavigationController::RESTORE_LAST_SESSION_EXITED_CLEANLY),
1115
init_data_(new InitData()),
1185
1116
is_fullscreen_(false),
1186
1117
blocked_content_(CONTENT_TYPE_NONE),
1187
1118
location_bar_height_pix_(0),
1265
1196
content::WebContents::Create(content_params)));
1266
1197
CHECK(web_contents_.get()) << "Failed to create WebContents";
1268
if (!restore_state_.empty()) {
1199
if (!init_data_->restore_state.empty()) {
1269
1200
ScopedVector<content::NavigationEntry> entries =
1270
1201
sessions::ContentSerializedNavigationBuilder::ToNavigationEntries(
1271
restore_state_, context.get());
1202
init_data_->restore_state, context.get());
1272
1203
web_contents_->GetController().Restore(
1274
content::NavigationController::RESTORE_LAST_SESSION_EXITED_CLEANLY,
1204
init_data_->restore_index,
1205
init_data_->restore_type,
1275
1206
&entries.get());
1276
restore_state_.clear();
1279
1209
CreateHelpers(web_contents_.get());
1400
1332
std::vector<sessions::SerializedNavigationEntry> state,
1402
1334
DCHECK(!web_contents_);
1403
restore_type_ = type;
1404
restore_state_ = state;
1405
initial_index_ = index;
1335
init_data_->restore_type = type;
1336
init_data_->restore_state = state;
1337
init_data_->restore_index = index;
1408
void WebView::LoadData(const std::string& encodedData,
1409
const std::string& mimeType,
1410
const GURL& baseUrl) {
1340
void WebView::LoadData(const std::string& encoded_data,
1341
const std::string& mime_type,
1342
const GURL& base_url) {
1411
1343
std::string url("data:");
1412
url.append(mimeType);
1344
url.append(mime_type);
1413
1345
url.append(",");
1414
url.append(encodedData);
1346
url.append(encoded_data);
1416
1348
content::NavigationController::LoadURLParams params((GURL(url)));
1417
1349
params.load_type = content::NavigationController::LOAD_TYPE_DATA;
1418
params.base_url_for_data_url = baseUrl;
1419
params.virtual_url_for_data_url = baseUrl.is_empty() ? GURL(url::kAboutBlankURL) : baseUrl;
1350
params.base_url_for_data_url = base_url;
1351
params.virtual_url_for_data_url =
1352
base_url.is_empty() ? GURL(url::kAboutBlankURL) : base_url;
1420
1353
params.can_load_local_resources = true;
1422
if (web_contents_) {
1423
web_contents_->GetController().LoadURLWithParams(params);
1425
initial_data_.reset(new content::NavigationController::LoadURLParams(params));
1426
initial_url_ = GURL();
1355
if (!web_contents_) {
1356
init_data_->load_params.reset(
1357
new content::NavigationController::LoadURLParams(params));
1361
web_contents_->GetController().LoadURLWithParams(params);
1430
1364
std::string WebView::GetTitle() const {
1998
1932
active_popup_menu_->Close();
2001
void WebView::RequestGeolocationPermission(
2002
const GURL& requesting_frame,
2004
const base::Callback<void(content::PermissionStatus)>& callback) {
2005
PermissionRequestID request_id(
2006
web_contents_->GetRenderProcessHost()->GetID(),
2007
web_contents_->GetRenderViewHost()->GetRoutingID(),
2011
scoped_ptr<SimplePermissionRequest> request(
2012
new SimplePermissionRequest(
2013
&permission_request_manager_,
2016
web_contents_->GetLastCommittedURL().GetOrigin(),
2019
client_->RequestGeolocationPermission(request.Pass());
2022
void WebView::CancelGeolocationPermissionRequest(
2023
const GURL& requesting_frame,
2025
PermissionRequestID request_id(
2026
web_contents_->GetRenderProcessHost()->GetID(),
2027
web_contents_->GetRenderViewHost()->GetRoutingID(),
2031
permission_request_manager_.CancelPendingRequestForID(request_id);
2034
1935
void WebView::AllowCertificateError(
2035
1936
content::RenderFrameHost* rfh,
2036
1937
int cert_error,