Commit f7bed1a6 authored by mark a. foltz's avatar mark a. foltz Committed by Commit Bot

[Presentation API] Deprecate on insecure contexts.

- Adds UseCounters to count presentations started on secure/insecure
  origins.
- Logs a deprecation warning only when presentations are started,
  because of the warning frequency on PresentationRequest constructor or
  getAvailability.

Blink-dev thread:
https://groups.google.com/a/chromium.org/d/topic/blink-dev/lumj0lVdtHA/discussion

Bug: 733381
Change-Id: I4352b2b9d3e887ade122bb8efb6e9a8efcbfd874
Reviewed-on: https://chromium-review.googlesource.com/578687
Commit-Queue: mark a. foltz <mfoltz@chromium.org>
Reviewed-by: default avatarDaniel Cheng <dcheng@chromium.org>
Reviewed-by: default avatarMounir Lamouri <mlamouri@chromium.org>
Cr-Commit-Position: refs/heads/master@{#488681}
parent a5d3b30a
......@@ -531,6 +531,14 @@ String Deprecation::DeprecationMessage(WebFeature feature) {
return DeprecatedWillBeDisabledByFeaturePolicyInCrossOriginIframe(
"requestMIDIAccess", "midi", M63);
case WebFeature::kPresentationRequestStartInsecureOrigin:
case WebFeature::kPresentationReceiverInsecureOrigin:
return String(
"Using the Presentation API on insecure origins is "
"deprecated and will be removed in M68. You should consider "
"switching your application to a secure origin, such as HTTPS. See "
"https://goo.gl/rStTGz for more details.");
// Features that aren't deprecated don't have a deprecation message.
default:
return String();
......
......@@ -6,7 +6,9 @@
#include <memory>
#include "core/dom/Document.h"
#include "core/frame/Deprecation.h"
#include "core/frame/LocalFrame.h"
#include "core/frame/UseCounter.h"
#include "modules/presentation/PresentationConnection.h"
#include "platform/wtf/PtrUtil.h"
#include "public/platform/WebString.h"
......@@ -93,6 +95,7 @@ WebPresentationConnection* PresentationController::DidStartDefaultPresentation(
if (!presentation_ || !presentation_->defaultRequest())
return nullptr;
PresentationRequest::RecordStartOriginTypeAccess(*GetExecutionContext());
return PresentationConnection::Take(this, presentation_info,
presentation_->defaultRequest());
}
......
......@@ -10,6 +10,7 @@
#include "core/dom/Document.h"
#include "core/dom/ExceptionCode.h"
#include "core/dom/ExecutionContext.h"
#include "core/frame/Deprecation.h"
#include "core/frame/LocalDOMWindow.h"
#include "core/frame/LocalFrame.h"
#include "core/frame/Navigator.h"
......@@ -25,7 +26,6 @@ namespace blink {
PresentationReceiver::PresentationReceiver(LocalFrame* frame,
WebPresentationClient* client)
: ContextClient(frame) {
RecordOriginTypeAccess(frame->GetDocument());
connection_list_ = new PresentationConnectionList(frame->GetDocument());
if (client)
......@@ -45,10 +45,12 @@ PresentationReceiver* PresentationReceiver::From(Document& document) {
}
ScriptPromise PresentationReceiver::connectionList(ScriptState* script_state) {
if (!connection_list_property_)
connection_list_property_ =
new ConnectionListProperty(ExecutionContext::From(script_state), this,
ConnectionListProperty::kReady);
ExecutionContext* execution_context = ExecutionContext::From(script_state);
RecordOriginTypeAccess(*execution_context);
if (!connection_list_property_) {
connection_list_property_ = new ConnectionListProperty(
execution_context, this, ConnectionListProperty::kReady);
}
if (!connection_list_->IsEmpty() && connection_list_property_->GetState() ==
ScriptPromisePropertyBase::kPending)
......@@ -113,13 +115,15 @@ void PresentationReceiver::RegisterConnection(
connection_list_->AddConnection(connection);
}
void PresentationReceiver::RecordOriginTypeAccess(Document* document) const {
DCHECK(document);
if (document->IsSecureContext()) {
UseCounter::Count(document, WebFeature::kPresentationReceiverSecureOrigin);
// static
void PresentationReceiver::RecordOriginTypeAccess(
ExecutionContext& execution_context) {
if (execution_context.IsSecureContext()) {
UseCounter::Count(&execution_context,
WebFeature::kPresentationReceiverSecureOrigin);
} else {
UseCounter::Count(document,
WebFeature::kPresentationReceiverInsecureOrigin);
Deprecation::CountDeprecation(
&execution_context, WebFeature::kPresentationReceiverInsecureOrigin);
}
}
......
......@@ -61,7 +61,7 @@ class MODULES_EXPORT PresentationReceiver final
private:
friend class PresentationReceiverTest;
void RecordOriginTypeAccess(Document*) const;
static void RecordOriginTypeAccess(ExecutionContext&);
Member<ConnectionListProperty> connection_list_property_;
Member<PresentationConnectionList> connection_list_;
......
......@@ -12,6 +12,7 @@
#include "core/dom/Document.h"
#include "core/dom/ExecutionContext.h"
#include "core/dom/UserGestureIndicator.h"
#include "core/frame/Deprecation.h"
#include "core/frame/Settings.h"
#include "core/frame/UseCounter.h"
#include "core/loader/MixedContentChecker.h"
......@@ -119,8 +120,22 @@ bool PresentationRequest::HasPendingActivity() const {
ScriptPromisePropertyBase::kPending;
}
// static
void PresentationRequest::RecordStartOriginTypeAccess(
ExecutionContext& execution_context) {
if (execution_context.IsSecureContext()) {
UseCounter::Count(&execution_context,
WebFeature::kPresentationRequestStartSecureOrigin);
} else {
Deprecation::CountDeprecation(
&execution_context,
WebFeature::kPresentationRequestStartInsecureOrigin);
}
}
ScriptPromise PresentationRequest::start(ScriptState* script_state) {
Settings* context_settings = GetSettings(GetExecutionContext());
ExecutionContext* execution_context = GetExecutionContext();
Settings* context_settings = GetSettings(execution_context);
bool is_user_gesture_required =
!context_settings ||
context_settings->GetPresentationRequiresUserGesture();
......@@ -134,7 +149,7 @@ ScriptPromise PresentationRequest::start(ScriptState* script_state) {
"PresentationRequest::start() requires user gesture."));
WebPresentationClient* client =
PresentationController::ClientFromContext(GetExecutionContext());
PresentationController::ClientFromContext(execution_context);
if (!client)
return ScriptPromise::RejectWithDOMException(
script_state,
......@@ -142,6 +157,7 @@ ScriptPromise PresentationRequest::start(ScriptState* script_state) {
kInvalidStateError,
"The PresentationRequest is no longer associated to a frame."));
RecordStartOriginTypeAccess(*execution_context);
ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state);
client->StartPresentation(
urls_, WTF::MakeUnique<PresentationConnectionCallbacks>(resolver, this));
......@@ -215,17 +231,17 @@ DEFINE_TRACE(PresentationRequest) {
PresentationRequest::PresentationRequest(ExecutionContext* execution_context,
const Vector<KURL>& urls)
: ContextClient(execution_context), urls_(urls) {
RecordOriginTypeAccess(execution_context);
RecordConstructorOriginTypeAccess(*execution_context);
}
void PresentationRequest::RecordOriginTypeAccess(
ExecutionContext* execution_context) const {
DCHECK(execution_context);
if (execution_context->IsSecureContext()) {
UseCounter::Count(execution_context,
// static
void PresentationRequest::RecordConstructorOriginTypeAccess(
ExecutionContext& execution_context) {
if (execution_context.IsSecureContext()) {
UseCounter::Count(&execution_context,
WebFeature::kPresentationRequestSecureOrigin);
} else {
UseCounter::Count(execution_context,
UseCounter::Count(&execution_context,
WebFeature::kPresentationRequestInsecureOrigin);
}
}
......
......@@ -44,6 +44,8 @@ class MODULES_EXPORT PresentationRequest final
// ScriptWrappable implementation.
bool HasPendingActivity() const final;
static void RecordStartOriginTypeAccess(ExecutionContext&);
ScriptPromise start(ScriptState*);
ScriptPromise reconnect(ScriptState*, const String& id);
ScriptPromise getAvailability(ScriptState*);
......@@ -53,7 +55,6 @@ class MODULES_EXPORT PresentationRequest final
DEFINE_ATTRIBUTE_EVENT_LISTENER(connectionavailable);
DECLARE_VIRTUAL_TRACE();
protected:
// EventTarget implementation.
void AddedEventListener(const AtomicString& event_type,
......@@ -61,8 +62,7 @@ class MODULES_EXPORT PresentationRequest final
private:
PresentationRequest(ExecutionContext*, const Vector<KURL>&);
void RecordOriginTypeAccess(ExecutionContext*) const;
static void RecordConstructorOriginTypeAccess(ExecutionContext&);
Member<PresentationAvailabilityProperty> availability_property_;
Vector<KURL> urls_;
......
......@@ -1598,6 +1598,8 @@ enum WebFeature {
kMediaSourceKeyframeTimeGreaterThanDependant = 2060,
kMediaSourceMuxedSequenceMode = 2061,
kPrepareModuleScript = 2062,
kPresentationRequestStartSecureOrigin = 2063,
kPresentationRequestStartInsecureOrigin = 2064,
// Add new features immediately above this line. Don't change assigned
// numbers of any item, and don't reuse removed slots.
......
......@@ -15936,6 +15936,8 @@ uploading your change for review. These are checked by presubmit scripts.
<int value="2060" label="MediaSourceKeyframeTimeGreaterThanDependant"/>
<int value="2061" label="MediaSourceMuxedSequenceMode"/>
<int value="2062" label="PrepareModuleScript"/>
<int value="2063" label="PresentationRequestStartSecureOrigin"/>
<int value="2064" label="PresentationRequestStartInsecureOrigin"/>
</enum>
<enum name="FeedbackSource">
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment