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) { ...@@ -531,6 +531,14 @@ String Deprecation::DeprecationMessage(WebFeature feature) {
return DeprecatedWillBeDisabledByFeaturePolicyInCrossOriginIframe( return DeprecatedWillBeDisabledByFeaturePolicyInCrossOriginIframe(
"requestMIDIAccess", "midi", M63); "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. // Features that aren't deprecated don't have a deprecation message.
default: default:
return String(); return String();
......
...@@ -6,7 +6,9 @@ ...@@ -6,7 +6,9 @@
#include <memory> #include <memory>
#include "core/dom/Document.h" #include "core/dom/Document.h"
#include "core/frame/Deprecation.h"
#include "core/frame/LocalFrame.h" #include "core/frame/LocalFrame.h"
#include "core/frame/UseCounter.h"
#include "modules/presentation/PresentationConnection.h" #include "modules/presentation/PresentationConnection.h"
#include "platform/wtf/PtrUtil.h" #include "platform/wtf/PtrUtil.h"
#include "public/platform/WebString.h" #include "public/platform/WebString.h"
...@@ -93,6 +95,7 @@ WebPresentationConnection* PresentationController::DidStartDefaultPresentation( ...@@ -93,6 +95,7 @@ WebPresentationConnection* PresentationController::DidStartDefaultPresentation(
if (!presentation_ || !presentation_->defaultRequest()) if (!presentation_ || !presentation_->defaultRequest())
return nullptr; return nullptr;
PresentationRequest::RecordStartOriginTypeAccess(*GetExecutionContext());
return PresentationConnection::Take(this, presentation_info, return PresentationConnection::Take(this, presentation_info,
presentation_->defaultRequest()); presentation_->defaultRequest());
} }
......
...@@ -10,6 +10,7 @@ ...@@ -10,6 +10,7 @@
#include "core/dom/Document.h" #include "core/dom/Document.h"
#include "core/dom/ExceptionCode.h" #include "core/dom/ExceptionCode.h"
#include "core/dom/ExecutionContext.h" #include "core/dom/ExecutionContext.h"
#include "core/frame/Deprecation.h"
#include "core/frame/LocalDOMWindow.h" #include "core/frame/LocalDOMWindow.h"
#include "core/frame/LocalFrame.h" #include "core/frame/LocalFrame.h"
#include "core/frame/Navigator.h" #include "core/frame/Navigator.h"
...@@ -25,7 +26,6 @@ namespace blink { ...@@ -25,7 +26,6 @@ namespace blink {
PresentationReceiver::PresentationReceiver(LocalFrame* frame, PresentationReceiver::PresentationReceiver(LocalFrame* frame,
WebPresentationClient* client) WebPresentationClient* client)
: ContextClient(frame) { : ContextClient(frame) {
RecordOriginTypeAccess(frame->GetDocument());
connection_list_ = new PresentationConnectionList(frame->GetDocument()); connection_list_ = new PresentationConnectionList(frame->GetDocument());
if (client) if (client)
...@@ -45,10 +45,12 @@ PresentationReceiver* PresentationReceiver::From(Document& document) { ...@@ -45,10 +45,12 @@ PresentationReceiver* PresentationReceiver::From(Document& document) {
} }
ScriptPromise PresentationReceiver::connectionList(ScriptState* script_state) { ScriptPromise PresentationReceiver::connectionList(ScriptState* script_state) {
if (!connection_list_property_) ExecutionContext* execution_context = ExecutionContext::From(script_state);
connection_list_property_ = RecordOriginTypeAccess(*execution_context);
new ConnectionListProperty(ExecutionContext::From(script_state), this, if (!connection_list_property_) {
ConnectionListProperty::kReady); connection_list_property_ = new ConnectionListProperty(
execution_context, this, ConnectionListProperty::kReady);
}
if (!connection_list_->IsEmpty() && connection_list_property_->GetState() == if (!connection_list_->IsEmpty() && connection_list_property_->GetState() ==
ScriptPromisePropertyBase::kPending) ScriptPromisePropertyBase::kPending)
...@@ -113,13 +115,15 @@ void PresentationReceiver::RegisterConnection( ...@@ -113,13 +115,15 @@ void PresentationReceiver::RegisterConnection(
connection_list_->AddConnection(connection); connection_list_->AddConnection(connection);
} }
void PresentationReceiver::RecordOriginTypeAccess(Document* document) const { // static
DCHECK(document); void PresentationReceiver::RecordOriginTypeAccess(
if (document->IsSecureContext()) { ExecutionContext& execution_context) {
UseCounter::Count(document, WebFeature::kPresentationReceiverSecureOrigin); if (execution_context.IsSecureContext()) {
UseCounter::Count(&execution_context,
WebFeature::kPresentationReceiverSecureOrigin);
} else { } else {
UseCounter::Count(document, Deprecation::CountDeprecation(
WebFeature::kPresentationReceiverInsecureOrigin); &execution_context, WebFeature::kPresentationReceiverInsecureOrigin);
} }
} }
......
...@@ -61,7 +61,7 @@ class MODULES_EXPORT PresentationReceiver final ...@@ -61,7 +61,7 @@ class MODULES_EXPORT PresentationReceiver final
private: private:
friend class PresentationReceiverTest; friend class PresentationReceiverTest;
void RecordOriginTypeAccess(Document*) const; static void RecordOriginTypeAccess(ExecutionContext&);
Member<ConnectionListProperty> connection_list_property_; Member<ConnectionListProperty> connection_list_property_;
Member<PresentationConnectionList> connection_list_; Member<PresentationConnectionList> connection_list_;
......
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
#include "core/dom/Document.h" #include "core/dom/Document.h"
#include "core/dom/ExecutionContext.h" #include "core/dom/ExecutionContext.h"
#include "core/dom/UserGestureIndicator.h" #include "core/dom/UserGestureIndicator.h"
#include "core/frame/Deprecation.h"
#include "core/frame/Settings.h" #include "core/frame/Settings.h"
#include "core/frame/UseCounter.h" #include "core/frame/UseCounter.h"
#include "core/loader/MixedContentChecker.h" #include "core/loader/MixedContentChecker.h"
...@@ -119,8 +120,22 @@ bool PresentationRequest::HasPendingActivity() const { ...@@ -119,8 +120,22 @@ bool PresentationRequest::HasPendingActivity() const {
ScriptPromisePropertyBase::kPending; 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) { 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 = bool is_user_gesture_required =
!context_settings || !context_settings ||
context_settings->GetPresentationRequiresUserGesture(); context_settings->GetPresentationRequiresUserGesture();
...@@ -134,7 +149,7 @@ ScriptPromise PresentationRequest::start(ScriptState* script_state) { ...@@ -134,7 +149,7 @@ ScriptPromise PresentationRequest::start(ScriptState* script_state) {
"PresentationRequest::start() requires user gesture.")); "PresentationRequest::start() requires user gesture."));
WebPresentationClient* client = WebPresentationClient* client =
PresentationController::ClientFromContext(GetExecutionContext()); PresentationController::ClientFromContext(execution_context);
if (!client) if (!client)
return ScriptPromise::RejectWithDOMException( return ScriptPromise::RejectWithDOMException(
script_state, script_state,
...@@ -142,6 +157,7 @@ ScriptPromise PresentationRequest::start(ScriptState* script_state) { ...@@ -142,6 +157,7 @@ ScriptPromise PresentationRequest::start(ScriptState* script_state) {
kInvalidStateError, kInvalidStateError,
"The PresentationRequest is no longer associated to a frame.")); "The PresentationRequest is no longer associated to a frame."));
RecordStartOriginTypeAccess(*execution_context);
ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state); ScriptPromiseResolver* resolver = ScriptPromiseResolver::Create(script_state);
client->StartPresentation( client->StartPresentation(
urls_, WTF::MakeUnique<PresentationConnectionCallbacks>(resolver, this)); urls_, WTF::MakeUnique<PresentationConnectionCallbacks>(resolver, this));
...@@ -215,17 +231,17 @@ DEFINE_TRACE(PresentationRequest) { ...@@ -215,17 +231,17 @@ DEFINE_TRACE(PresentationRequest) {
PresentationRequest::PresentationRequest(ExecutionContext* execution_context, PresentationRequest::PresentationRequest(ExecutionContext* execution_context,
const Vector<KURL>& urls) const Vector<KURL>& urls)
: ContextClient(execution_context), urls_(urls) { : ContextClient(execution_context), urls_(urls) {
RecordOriginTypeAccess(execution_context); RecordConstructorOriginTypeAccess(*execution_context);
} }
void PresentationRequest::RecordOriginTypeAccess( // static
ExecutionContext* execution_context) const { void PresentationRequest::RecordConstructorOriginTypeAccess(
DCHECK(execution_context); ExecutionContext& execution_context) {
if (execution_context->IsSecureContext()) { if (execution_context.IsSecureContext()) {
UseCounter::Count(execution_context, UseCounter::Count(&execution_context,
WebFeature::kPresentationRequestSecureOrigin); WebFeature::kPresentationRequestSecureOrigin);
} else { } else {
UseCounter::Count(execution_context, UseCounter::Count(&execution_context,
WebFeature::kPresentationRequestInsecureOrigin); WebFeature::kPresentationRequestInsecureOrigin);
} }
} }
......
...@@ -44,6 +44,8 @@ class MODULES_EXPORT PresentationRequest final ...@@ -44,6 +44,8 @@ class MODULES_EXPORT PresentationRequest final
// ScriptWrappable implementation. // ScriptWrappable implementation.
bool HasPendingActivity() const final; bool HasPendingActivity() const final;
static void RecordStartOriginTypeAccess(ExecutionContext&);
ScriptPromise start(ScriptState*); ScriptPromise start(ScriptState*);
ScriptPromise reconnect(ScriptState*, const String& id); ScriptPromise reconnect(ScriptState*, const String& id);
ScriptPromise getAvailability(ScriptState*); ScriptPromise getAvailability(ScriptState*);
...@@ -53,7 +55,6 @@ class MODULES_EXPORT PresentationRequest final ...@@ -53,7 +55,6 @@ class MODULES_EXPORT PresentationRequest final
DEFINE_ATTRIBUTE_EVENT_LISTENER(connectionavailable); DEFINE_ATTRIBUTE_EVENT_LISTENER(connectionavailable);
DECLARE_VIRTUAL_TRACE(); DECLARE_VIRTUAL_TRACE();
protected: protected:
// EventTarget implementation. // EventTarget implementation.
void AddedEventListener(const AtomicString& event_type, void AddedEventListener(const AtomicString& event_type,
...@@ -61,8 +62,7 @@ class MODULES_EXPORT PresentationRequest final ...@@ -61,8 +62,7 @@ class MODULES_EXPORT PresentationRequest final
private: private:
PresentationRequest(ExecutionContext*, const Vector<KURL>&); PresentationRequest(ExecutionContext*, const Vector<KURL>&);
static void RecordConstructorOriginTypeAccess(ExecutionContext&);
void RecordOriginTypeAccess(ExecutionContext*) const;
Member<PresentationAvailabilityProperty> availability_property_; Member<PresentationAvailabilityProperty> availability_property_;
Vector<KURL> urls_; Vector<KURL> urls_;
......
...@@ -1598,6 +1598,8 @@ enum WebFeature { ...@@ -1598,6 +1598,8 @@ enum WebFeature {
kMediaSourceKeyframeTimeGreaterThanDependant = 2060, kMediaSourceKeyframeTimeGreaterThanDependant = 2060,
kMediaSourceMuxedSequenceMode = 2061, kMediaSourceMuxedSequenceMode = 2061,
kPrepareModuleScript = 2062, kPrepareModuleScript = 2062,
kPresentationRequestStartSecureOrigin = 2063,
kPresentationRequestStartInsecureOrigin = 2064,
// Add new features immediately above this line. Don't change assigned // Add new features immediately above this line. Don't change assigned
// numbers of any item, and don't reuse removed slots. // 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. ...@@ -15936,6 +15936,8 @@ uploading your change for review. These are checked by presubmit scripts.
<int value="2060" label="MediaSourceKeyframeTimeGreaterThanDependant"/> <int value="2060" label="MediaSourceKeyframeTimeGreaterThanDependant"/>
<int value="2061" label="MediaSourceMuxedSequenceMode"/> <int value="2061" label="MediaSourceMuxedSequenceMode"/>
<int value="2062" label="PrepareModuleScript"/> <int value="2062" label="PrepareModuleScript"/>
<int value="2063" label="PresentationRequestStartSecureOrigin"/>
<int value="2064" label="PresentationRequestStartInsecureOrigin"/>
</enum> </enum>
<enum name="FeedbackSource"> <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