mirror of
https://github.com/roytam1/palemoon27.git
synced 2026-05-26 14:18:48 +00:00
ee05861206
- Bug 1187056 - Dispatch the meta tag mutation events sooner so that any meta-viewport changes can be processed before scripts continue running. r=smaug (2e6f76079f)
- Bug 1238804. Make <base> actually work in a srcdoc document. r=smaug (a421e7c598)
- Bug 1239585 - Remove eSupportSVG from nsObjectLoadingContent capabilities; r=bz (68a79ef21b)
- Bug 1170572 - MQ CSS change not observed by picture source elements r=jdm (efc0be616e)
- Bug 1206720 - Remove invalid assertions during response image loading. r=jdm (0b6485de95)
- Bug 1229032 - don't copy arrays in PerformanceObserver::Observe; r=baku (f1b70e0bd2)
- Bug 1241840 - Set table cell colspan=0 to 1 instead per the HTML spec. r=bz (1900962d4c)
- Bug 812899 part 1. Split the "image is overflow" concept in ImageDocument into two separate booleans for vertical and horizontal overflow. r=khuey (8735b610f3)
- Bug 812899 part 2. Change the centering code in nsImageDocument to only try vertically centering via auto margins when we're not overflowing in the vertical direction, because if we _are_ overflowing that should cut off part of the image per spec. r=khuey (c3b84a8048)
- Bug 812899 part 3 - Make vertical 'auto' margins on absolutely positioned elements always center, even when the margins are negative. r=dbaron (e345fb9383)
- Bug 1238427 - Avoid a strong reference from the timeout timer to nsGeolocationRequest. r=jdm (2ad4dd3955)
- Bug 1240906 - Shut down geolocation service at xpcom-shutdown instead of quit-application. r=dougt (1e7fc9e624)
- Bug 1129633 - part1. Use win8 geolocation with a fallback to MLS - r=m_kato (3323b4a120)
- Bug 1145111: ensure the pos. cache isn't reset when nsGeolocationService shuts down provider. r=jdm (e69cab889a)
- Bug 1240664 - Only enable bug 1216148's behavior when there is a wakelock support. r=kanru (543a3a55b4)
- Bug 1240766 - Fix startup crash in Geolocation::Init() when principal URI is null r=jdm (1ece684418)
- Bug 1238873 - Handle the bug that if we take cached data, we might not get any update later. r=kchen. r=jdm. (ca186e89b3)
- Bug 1240666 - Follow-up to bug 1216148. r=kchen. (3f650b5f72)
- Bug 1227119 - Set a default value for variable ret. r=dougt (5b68dd1a22)
- Bug 1027734 - Convert mozPay to WebIDL. r=bzbarsky. (a4fd10d539)
- Bug 1214488 - Allow native callers in GetEntryGlobal. r=me (ca68cc8896)
- Bug 1248719. Fix things so that taking ownership of error reporting on an AutoJSAPI on a worker is OK even if that AutoJSAPI was initialized without an explicit global. r=bholley (b8e59eebc6)
- Bug 1156065 - Send cloneable messages from SiteSpecificUserAgent.js to fix UA overrides r=billm (e5cdbe96f6)
- Bug 1210099 - Fix structured clone of expanded principal (r=bholley) (01a5fd4e47)
- Bug 1230351: Replace ThirdPartyUtil::IsThirdPartyInternal's warning-spammy NS_ENSURE_ARG with an equivalent check that lacks the warning. r=mrbkap (037c39472c)
- Bug 1184293 - Don't call ThirdPartyUtil::GetBaseDomain if aUri is null. r=jduell (4853c0e9e0)
- Bug 862147 - instrument usage of window.sidebar.addSearchEngine, r=froydnj,smaug. (ef52ded1c0)
- Bug 1214764 - Convert NS_ENSURE to a plain return in nsDocument::IsScriptEnabled. r=bholley (0f3b6d63b4)
- Bug 1245950: Privately inherit from legacy interfaces nsIDOMWindow/nsIDOMWindowInternal. r=smaug (ff1d431d0d)
- Bug 1245950: Followup to null check before asserting. r=me CLOSED TREE (6e93af4a4a)
- Bug 1236607, pointerlock code should null check inner window before using it, r=xidorn (896d9723d5)
- Bug 1245245 - Fix typo in error string URL. r=botond (58c9548f15)
- Bug 1220604 - Remove dead code from nsGlobalWindow::SetNewDocument. r=baku (fc875db5e4)
- Bug 1247049 - Optimize GetScreenXY by using the new nsDeviceContext method to get desktop scale factor. r=emk (de66d59631)
- missing bit of Bug 962249 part 3 (0b15f8b670)
- Bug 1240978 - Shorten timeout for black screen in fullscreen transition. r=smaug (2554a8e5a7)
- Bug 1246346 - patch 1 - Expose a DesktopToDevice scale factor on nsDeviceContext. r=emk (03856ec7b4)
- Bug 1246346 - patch 2 - Correct the origin of the DOM screen coordinates (screen.left, screen.top) for secondary display on a mixed-DPI configuration. r=emk (15ac2d3be6)
- Bug 1196159 - Set nsGlobalWindow::mIsClosed properly after window.close(). r=billm (27334e4b61)
- Bug 1240241 - Don't recurse infinitely in FilterCachedColorModels::ForColorModel if the original filter node was null. r=roc (1730db5ca7)
- Bug 1247706 - "Please don't disable WebGL if crashed on WebGL context". r=dvander (e25621753e)
- Bug 1244742. Use the default copy constructor and assignment operators. (0dac3bcbfb)
- Bug 1230929 - modified the logic in order to prvent null pointer dereference. r=jmuizelaar (1d5761abc9)
- Bug 1247979. Optimize ScaleToOutsidePixels. r=kats (2b9ef41111)
- Bug 1249368 - use UniquePtr instead of nsAutoArrayPtr in gfxAlphaBoxBlur; r=jrmuizel (e60419d49d)
- Bug 1082598 - Part 4: Workaround for naming conflict in unified sources for Skia and thebes DWrite fonts. r=jrmuizel (84a9e11ded)
- Bug 1172817 - Remove PL_DHashTableEnumerate() use from FontNameCache. r=jtd. (b0632cd825)
- Bug 1197717 - Load fonts from profile-agnostic writable location. r=jfkthame (c9227268ff)
- Bug 1246889 - Correctly check whether hb_blob_create failed in ShareTableAndGetBlob. r=jfkthame (f8c62776be)
- Bug 1246834 - Fix memory reporting of nsFontFamily{List,Name}. r=jfkthame. (0535b8c110)
- Bug 1238134 P1 Provide a Response.cloneUnfiltered() method for chrome code to access internal Response state. r=ehsan (3dc25b1501)
- Bug 1238134 P2 Test chrome-only Response.cloneUnfiltered(). r=ehsan (3c307c4ec0)
- Bug 1100949 - wrap font info reads with structured exception handler. r=bas (2c2cacb05e)
- Bug 1241931 - On shutdown stop any ongoing loading of fonts; GDI in particular. r=jdaggett (057aae8cab)
- Bug 1154182 - enable native keybindings for graphene. r=billm (33e706a020)
- Bug 1167081 - Call PuppetWidget::Destroy() in its destructor. r=roc (58115c3029)
- Bug 1222662 - Disable cursor caching in the content process on Windows. r=aklotz (e760794ee2)
- Bug 1240891 - Silence warning from calling GetNativeData(NS_NATIVE_WINDOW). r=roc (d766a47f66)
- Bug 1248981 - Fix spelling error in nsMenuUtilsX.mm, a=tomcat (b93c16b961)
- Bug 1197925 - Use channel->Open2() in intl/hyphenation/hnjstdio.cpp (r=sicking) (2bf5dd3cd3)
- Bug 1248339 - fix header sort order of hal. r=gsvelto (01b61a2f5d)
- Bug 1232687: Add system-service interface to HAL, r=gsvelto (ab692e1508)
- Bug 1236762 - Simplify locking APIs for SharedSurface. - r=jrmuizel (901ae94a85)
635 lines
24 KiB
C++
635 lines
24 KiB
C++
/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* vim: set ts=8 sts=2 et sw=2 tw=80: */
|
|
/* This Source Code Form is subject to the terms of the Mozilla Public
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
|
|
|
/*
|
|
* A base class implementing nsIObjectLoadingContent for use by
|
|
* various content nodes that want to provide plugin/document/image
|
|
* loading functionality (eg <embed>, <object>, <applet>, etc).
|
|
*/
|
|
|
|
#ifndef NSOBJECTLOADINGCONTENT_H_
|
|
#define NSOBJECTLOADINGCONTENT_H_
|
|
|
|
#include "mozilla/Attributes.h"
|
|
#include "nsImageLoadingContent.h"
|
|
#include "nsIStreamListener.h"
|
|
#include "nsIChannelEventSink.h"
|
|
#include "nsIContentPolicy.h"
|
|
#include "nsIObjectLoadingContent.h"
|
|
#include "nsIRunnable.h"
|
|
#include "nsIThreadInternal.h"
|
|
#include "nsIFrame.h"
|
|
#include "nsIFrameLoader.h"
|
|
|
|
class nsAsyncInstantiateEvent;
|
|
class nsStopPluginRunnable;
|
|
class AutoSetInstantiatingToFalse;
|
|
class nsPluginFrame;
|
|
class nsFrameLoader;
|
|
class nsXULElement;
|
|
class nsPluginInstanceOwner;
|
|
|
|
namespace mozilla {
|
|
namespace dom {
|
|
template<typename T> class Sequence;
|
|
struct MozPluginParameter;
|
|
} // namespace dom
|
|
} // namespace mozilla
|
|
|
|
class nsObjectLoadingContent : public nsImageLoadingContent
|
|
, public nsIStreamListener
|
|
, public nsIFrameLoaderOwner
|
|
, public nsIObjectLoadingContent
|
|
, public nsIChannelEventSink
|
|
{
|
|
friend class AutoSetInstantiatingToFalse;
|
|
friend class AutoSetLoadingToFalse;
|
|
friend class CheckPluginStopEvent;
|
|
friend class nsStopPluginRunnable;
|
|
friend class nsAsyncInstantiateEvent;
|
|
|
|
public:
|
|
// This enum's values must be the same as the constants on
|
|
// nsIObjectLoadingContent
|
|
enum ObjectType {
|
|
// Loading, type not yet known. We may be waiting for a channel to open.
|
|
eType_Loading = TYPE_LOADING,
|
|
// Content is a *non-svg* image
|
|
eType_Image = TYPE_IMAGE,
|
|
// Content is a plugin
|
|
eType_Plugin = TYPE_PLUGIN,
|
|
// Content is a subdocument, possibly SVG
|
|
eType_Document = TYPE_DOCUMENT,
|
|
// No content loaded (fallback). May be showing alternate content or
|
|
// a custom error handler - *including* click-to-play dialogs
|
|
eType_Null = TYPE_NULL
|
|
};
|
|
enum FallbackType {
|
|
// The content type is not supported (e.g. plugin not installed)
|
|
eFallbackUnsupported = nsIObjectLoadingContent::PLUGIN_UNSUPPORTED,
|
|
// Showing alternate content
|
|
eFallbackAlternate = nsIObjectLoadingContent::PLUGIN_ALTERNATE,
|
|
// The plugin exists, but is disabled
|
|
eFallbackDisabled = nsIObjectLoadingContent::PLUGIN_DISABLED,
|
|
// The plugin is blocklisted and disabled
|
|
eFallbackBlocklisted = nsIObjectLoadingContent::PLUGIN_BLOCKLISTED,
|
|
// The plugin is considered outdated, but not disabled
|
|
eFallbackOutdated = nsIObjectLoadingContent::PLUGIN_OUTDATED,
|
|
// The plugin has crashed
|
|
eFallbackCrashed = nsIObjectLoadingContent::PLUGIN_CRASHED,
|
|
// Suppressed by security policy
|
|
eFallbackSuppressed = nsIObjectLoadingContent::PLUGIN_SUPPRESSED,
|
|
// Blocked by content policy
|
|
eFallbackUserDisabled = nsIObjectLoadingContent::PLUGIN_USER_DISABLED,
|
|
/// ** All values >= eFallbackClickToPlay are plugin placeholder types
|
|
/// that would be replaced by a real plugin if activated (PlayPlugin())
|
|
/// ** Furthermore, values >= eFallbackClickToPlay and
|
|
/// <= eFallbackVulnerableNoUpdate are click-to-play types.
|
|
// The plugin is disabled until the user clicks on it
|
|
eFallbackClickToPlay = nsIObjectLoadingContent::PLUGIN_CLICK_TO_PLAY,
|
|
// The plugin is vulnerable (update available)
|
|
eFallbackVulnerableUpdatable = nsIObjectLoadingContent::PLUGIN_VULNERABLE_UPDATABLE,
|
|
// The plugin is vulnerable (no update available)
|
|
eFallbackVulnerableNoUpdate = nsIObjectLoadingContent::PLUGIN_VULNERABLE_NO_UPDATE,
|
|
};
|
|
|
|
nsObjectLoadingContent();
|
|
virtual ~nsObjectLoadingContent();
|
|
|
|
NS_DECL_NSIREQUESTOBSERVER
|
|
NS_DECL_NSISTREAMLISTENER
|
|
NS_DECL_NSIFRAMELOADEROWNER
|
|
NS_DECL_NSIOBJECTLOADINGCONTENT
|
|
NS_DECL_NSICHANNELEVENTSINK
|
|
|
|
/**
|
|
* Object state. This is a bitmask of NS_EVENT_STATEs epresenting the
|
|
* current state of the object.
|
|
*/
|
|
mozilla::EventStates ObjectState() const;
|
|
|
|
ObjectType Type() const { return mType; }
|
|
|
|
void SetIsNetworkCreated(bool aNetworkCreated)
|
|
{
|
|
mNetworkCreated = aNetworkCreated;
|
|
}
|
|
|
|
/**
|
|
* When the object is loaded, the attributes and all nested <param>
|
|
* elements are cached as name:value string pairs to be passed as
|
|
* parameters when instantiating the plugin.
|
|
*
|
|
* Note: these cached values can be overriden for different quirk cases.
|
|
*/
|
|
// Returns the cached attributes array.
|
|
void GetPluginAttributes(nsTArray<mozilla::dom::MozPluginParameter>& aAttributes);
|
|
|
|
// Returns the cached <param> array.
|
|
void GetPluginParameters(nsTArray<mozilla::dom::MozPluginParameter>& aParameters);
|
|
|
|
/**
|
|
* Immediately instantiate a plugin instance. This is a no-op if mType !=
|
|
* eType_Plugin or a plugin is already running.
|
|
*
|
|
* aIsLoading indicates that we are in the loading code, and we can bypass
|
|
* the mIsLoading check.
|
|
*/
|
|
nsresult InstantiatePluginInstance(bool aIsLoading = false);
|
|
|
|
/**
|
|
* Notify this class the document state has changed
|
|
* Called by nsDocument so we may suspend plugins in inactive documents)
|
|
*/
|
|
void NotifyOwnerDocumentActivityChanged();
|
|
|
|
/**
|
|
* When a plug-in is instantiated, it can create a scriptable
|
|
* object that the page wants to interact with. We expose this
|
|
* object by placing it on the prototype chain of our element,
|
|
* between the element itself and its most-derived DOM prototype.
|
|
*
|
|
* SetupProtoChain handles actually inserting the plug-in
|
|
* scriptable object into the proto chain if needed.
|
|
*
|
|
* DoResolve is a hook that allows us to find out when the web
|
|
* page is looking up a property name on our object and make sure
|
|
* that our plug-in, if any, is instantiated.
|
|
*/
|
|
// Helper for WebIDL node wrapping
|
|
void SetupProtoChain(JSContext* aCx, JS::Handle<JSObject*> aObject);
|
|
|
|
// Remove plugin from protochain
|
|
void TeardownProtoChain();
|
|
|
|
// Helper for WebIDL NeedResolve
|
|
bool DoResolve(JSContext* aCx, JS::Handle<JSObject*> aObject,
|
|
JS::Handle<jsid> aId,
|
|
JS::MutableHandle<JS::PropertyDescriptor> aDesc);
|
|
// The return value is whether DoResolve might end up resolving the given
|
|
// id. If in doubt, return true.
|
|
static bool MayResolve(jsid aId);
|
|
|
|
// Helper for WebIDL enumeration
|
|
void GetOwnPropertyNames(JSContext* aCx, nsTArray<nsString>& /* unused */,
|
|
mozilla::ErrorResult& aRv);
|
|
|
|
// WebIDL API
|
|
nsIDocument* GetContentDocument();
|
|
void GetActualType(nsAString& aType) const
|
|
{
|
|
CopyUTF8toUTF16(mContentType, aType);
|
|
}
|
|
uint32_t DisplayedType() const
|
|
{
|
|
return mType;
|
|
}
|
|
uint32_t GetContentTypeForMIMEType(const nsAString& aMIMEType)
|
|
{
|
|
return GetTypeOfContent(NS_ConvertUTF16toUTF8(aMIMEType));
|
|
}
|
|
void PlayPlugin(mozilla::ErrorResult& aRv)
|
|
{
|
|
aRv = PlayPlugin();
|
|
}
|
|
void Reload(bool aClearActivation, mozilla::ErrorResult& aRv)
|
|
{
|
|
aRv = Reload(aClearActivation);
|
|
}
|
|
bool Activated() const
|
|
{
|
|
return mActivated;
|
|
}
|
|
nsIURI* GetSrcURI() const
|
|
{
|
|
return mURI;
|
|
}
|
|
|
|
/**
|
|
* The default state that this plugin would be without manual activation.
|
|
* @returns PLUGIN_ACTIVE if the default state would be active.
|
|
*/
|
|
uint32_t DefaultFallbackType();
|
|
|
|
uint32_t PluginFallbackType() const
|
|
{
|
|
return mFallbackType;
|
|
}
|
|
bool HasRunningPlugin() const
|
|
{
|
|
return !!mInstanceOwner;
|
|
}
|
|
void SwapFrameLoaders(nsXULElement& aOtherOwner, mozilla::ErrorResult& aRv)
|
|
{
|
|
aRv.Throw(NS_ERROR_NOT_IMPLEMENTED);
|
|
}
|
|
void LegacyCall(JSContext* aCx, JS::Handle<JS::Value> aThisVal,
|
|
const mozilla::dom::Sequence<JS::Value>& aArguments,
|
|
JS::MutableHandle<JS::Value> aRetval,
|
|
mozilla::ErrorResult& aRv);
|
|
|
|
uint32_t GetRunID(mozilla::ErrorResult& aRv)
|
|
{
|
|
uint32_t runID;
|
|
nsresult rv = GetRunID(&runID);
|
|
if (NS_FAILED(rv)) {
|
|
aRv.Throw(rv);
|
|
return 0;
|
|
}
|
|
|
|
return runID;
|
|
}
|
|
|
|
protected:
|
|
/**
|
|
* Begins loading the object when called
|
|
*
|
|
* Attributes of |this| QI'd to nsIContent will be inspected, depending on
|
|
* the node type. This function currently assumes it is a <applet>,
|
|
* <object>, or <embed> tag.
|
|
*
|
|
* The instantiated plugin depends on:
|
|
* - The URI (<embed src>, <object data>)
|
|
* - The type 'hint' (type attribute)
|
|
* - The mime type returned by opening the URI
|
|
* - Enabled plugins claiming the ultimate mime type
|
|
* - The capabilities returned by GetCapabilities
|
|
* - The classid attribute, if eSupportClassID is among the capabilities
|
|
*
|
|
* If eAllowPluginSkipChannel is true, we may skip opening the URI if our
|
|
* type hint points to a valid plugin, deferring that responsibility to the
|
|
* plugin.
|
|
* Similarly, if no URI is provided, but a type hint for a valid plugin is
|
|
* present, that plugin will be instantiated
|
|
*
|
|
* Otherwise a request to that URI is made and the type sent by the server
|
|
* is used to find a suitable handler, EXCEPT when:
|
|
* - The type hint refers to a *supported* plugin, in which case that
|
|
* plugin will be instantiated regardless of the server provided type
|
|
* - The server returns a binary-stream type, and our type hint refers to
|
|
* a valid non-document type, we will use the type hint
|
|
*
|
|
* @param aNotify If we should send notifications. If false, content
|
|
* loading may be deferred while appropriate frames are
|
|
* created
|
|
* @param aForceLoad If we should reload this content (and re-attempt the
|
|
* channel open) even if our parameters did not change
|
|
*/
|
|
nsresult LoadObject(bool aNotify,
|
|
bool aForceLoad = false);
|
|
|
|
enum Capabilities {
|
|
eSupportImages = 1u << 0, // Images are supported (imgILoader)
|
|
eSupportPlugins = 1u << 1, // Plugins are supported (nsIPluginHost)
|
|
eSupportDocuments = 1u << 2, // Documents are supported
|
|
// (nsIDocumentLoaderFactory)
|
|
// This flag always includes SVG
|
|
eSupportClassID = 1u << 3, // The classid attribute is supported
|
|
|
|
// If possible to get a *plugin* type from the type attribute *or* file
|
|
// extension, we can use that type and begin loading the plugin before
|
|
// opening a channel.
|
|
// A side effect of this is if the channel fails, the plugin is still
|
|
// running.
|
|
eAllowPluginSkipChannel = 1u << 4
|
|
};
|
|
|
|
/**
|
|
* Returns the list of capabilities this content node supports. This is a
|
|
* bitmask consisting of flags from the Capabilities enum.
|
|
*
|
|
* The default implementation supports all types but not
|
|
* eSupportClassID or eAllowPluginSkipChannel
|
|
*/
|
|
virtual uint32_t GetCapabilities() const;
|
|
|
|
/**
|
|
* Destroys all loaded documents/plugins and releases references
|
|
*/
|
|
void DestroyContent();
|
|
|
|
static void Traverse(nsObjectLoadingContent *tmp,
|
|
nsCycleCollectionTraversalCallback &cb);
|
|
|
|
void CreateStaticClone(nsObjectLoadingContent* aDest) const;
|
|
|
|
void DoStopPlugin(nsPluginInstanceOwner* aInstanceOwner, bool aDelayedStop,
|
|
bool aForcedReentry = false);
|
|
|
|
nsresult BindToTree(nsIDocument* aDocument, nsIContent* aParent,
|
|
nsIContent* aBindingParent,
|
|
bool aCompileEventHandler);
|
|
void UnbindFromTree(bool aDeep = true,
|
|
bool aNullParent = true);
|
|
|
|
/**
|
|
* Return the content policy type used for loading the element.
|
|
*/
|
|
virtual nsContentPolicyType GetContentPolicyType() const = 0;
|
|
|
|
private:
|
|
|
|
// Object parameter changes returned by UpdateObjectParameters
|
|
enum ParameterUpdateFlags {
|
|
eParamNoChange = 0,
|
|
// Parameters that potentially affect the channel changed
|
|
// - mOriginalURI, mOriginalContentType
|
|
eParamChannelChanged = 1u << 0,
|
|
// Parameters that affect displayed content changed
|
|
// - mURI, mContentType, mType, mBaseURI
|
|
eParamStateChanged = 1u << 1,
|
|
// The effective content type changed, independant of object type. This
|
|
// can happen when changing from Loading -> Final type, but doesn't
|
|
// necessarily happen when changing between object types. E.g., if a PDF
|
|
// handler was installed between the last load of this object and now, we
|
|
// might change from eType_Document -> eType_Plugin without changing
|
|
// ContentType
|
|
eParamContentTypeChanged = 1u << 2
|
|
};
|
|
|
|
/**
|
|
* Getter for child <param> elements that are not nested in another plugin
|
|
* dom element.
|
|
* This is an internal helper function and should not be used directly for
|
|
* passing parameters to the plugin instance.
|
|
*
|
|
* See GetPluginParameters and GetPluginAttributes, which also handle
|
|
* quirk-overrides.
|
|
*
|
|
* @param aParameters The array containing pairs of name/value strings
|
|
* from nested <param> objects.
|
|
* @param aIgnoreCodebase Flag for ignoring the "codebase" param when
|
|
* building the array. This is useful when loading
|
|
* java.
|
|
*/
|
|
void GetNestedParams(nsTArray<mozilla::dom::MozPluginParameter>& aParameters,
|
|
bool aIgnoreCodebase);
|
|
|
|
void BuildParametersArray();
|
|
|
|
/**
|
|
* Loads fallback content with the specified FallbackType
|
|
*
|
|
* @param aType FallbackType value for type of fallback we're loading
|
|
* @param aNotify Send notifications and events. If false, caller is
|
|
* responsible for doing so
|
|
*/
|
|
void LoadFallback(FallbackType aType, bool aNotify);
|
|
|
|
/**
|
|
* Internal version of LoadObject that should only be used by this class
|
|
* aLoadingChannel is passed by the LoadObject call from OnStartRequest,
|
|
* primarily for sanity-preservation
|
|
*/
|
|
nsresult LoadObject(bool aNotify,
|
|
bool aForceLoad,
|
|
nsIRequest *aLoadingChannel);
|
|
|
|
/**
|
|
* Introspects the object and sets the following member variables:
|
|
* - mOriginalContentType : This is the type attribute on the element
|
|
* - mOriginalURI : The src or data attribute on the element
|
|
* - mURI : The final URI, considering mChannel if
|
|
* mChannelLoaded is set
|
|
* - mContentType : The final content type, considering mChannel if
|
|
* mChannelLoaded is set
|
|
* - mBaseURI : The object's base URI, which may be set by the
|
|
* object (codebase attribute)
|
|
* - mType : The type the object is determined to be based
|
|
* on the above
|
|
*
|
|
* NOTE The class assumes that mType is the currently loaded type at various
|
|
* points, so the caller of this function must take the appropriate
|
|
* actions to ensure this
|
|
*
|
|
* NOTE This function does not perform security checks, only determining the
|
|
* requested type and parameters of the object.
|
|
*
|
|
* @param aJavaURI Specify that the URI will be consumed by java, which
|
|
* changes codebase parsing and URI construction. Used
|
|
* internally.
|
|
*
|
|
* @return Returns a bitmask of ParameterUpdateFlags values
|
|
*/
|
|
ParameterUpdateFlags UpdateObjectParameters(bool aJavaURI = false);
|
|
|
|
/**
|
|
* Queue a CheckPluginStopEvent and track it in mPendingCheckPluginStopEvent
|
|
*/
|
|
void QueueCheckPluginStopEvent();
|
|
|
|
void NotifyContentObjectWrapper();
|
|
|
|
/**
|
|
* Opens the channel pointed to by mURI into mChannel.
|
|
*/
|
|
nsresult OpenChannel();
|
|
|
|
/**
|
|
* Closes and releases references to mChannel and, if opened, mFinalListener
|
|
*/
|
|
nsresult CloseChannel();
|
|
|
|
/**
|
|
* If this object is allowed to play plugin content, or if it would display
|
|
* click-to-play instead.
|
|
* NOTE that this does not actually check if the object is a loadable plugin
|
|
* NOTE This ignores the current activated state. The caller should check this if appropriate.
|
|
*/
|
|
bool ShouldPlay(FallbackType &aReason, bool aIgnoreCurrentType);
|
|
|
|
/*
|
|
* Helper to check if mBaseURI can be used by java as a codebase
|
|
*/
|
|
bool CheckJavaCodebase();
|
|
|
|
/**
|
|
* Helper to check if our current URI passes policy
|
|
*
|
|
* @param aContentPolicy [out] The result of the content policy decision
|
|
*
|
|
* @return true if call succeeded and NS_CP_ACCEPTED(*aContentPolicy)
|
|
*/
|
|
bool CheckLoadPolicy(int16_t *aContentPolicy);
|
|
|
|
/**
|
|
* Helper to check if the object passes process policy. Assumes we have a
|
|
* final determined type.
|
|
*
|
|
* @param aContentPolicy [out] The result of the content policy decision
|
|
*
|
|
* @return true if call succeeded and NS_CP_ACCEPTED(*aContentPolicy)
|
|
*/
|
|
bool CheckProcessPolicy(int16_t *aContentPolicy);
|
|
|
|
/**
|
|
* Checks whether the given type is a supported document type
|
|
*
|
|
* NOTE Does not take content policy or capabilities into account
|
|
*/
|
|
bool IsSupportedDocument(const nsCString& aType);
|
|
|
|
/**
|
|
* Gets the plugin instance and creates a plugin stream listener, assigning
|
|
* it to mFinalListener
|
|
*/
|
|
bool MakePluginListener();
|
|
|
|
/**
|
|
* Unloads all content and resets the object to a completely unloaded state
|
|
*
|
|
* NOTE Calls StopPluginInstance() and may spin the event loop
|
|
*
|
|
* @param aResetState Reset the object type to 'loading' and destroy channel
|
|
* as well
|
|
*/
|
|
void UnloadObject(bool aResetState = true);
|
|
|
|
/**
|
|
* Notifies document observes about a new type/state of this object.
|
|
* Triggers frame construction as needed. mType must be set correctly when
|
|
* this method is called. This method is cheap if the type and state didn't
|
|
* actually change.
|
|
*
|
|
* @param aSync If a synchronous frame construction is required. If false,
|
|
* the construction may either be sync or async.
|
|
* @param aNotify if false, only need to update the state of our element.
|
|
*/
|
|
void NotifyStateChanged(ObjectType aOldType,
|
|
mozilla::EventStates aOldState,
|
|
bool aSync, bool aNotify);
|
|
|
|
/**
|
|
* Returns a ObjectType value corresponding to the type of content we would
|
|
* support the given MIME type as, taking capabilities and plugin state
|
|
* into account
|
|
*
|
|
* NOTE this does not consider whether the content would be suppressed by
|
|
* click-to-play or other content policy checks
|
|
*/
|
|
ObjectType GetTypeOfContent(const nsCString& aMIMEType);
|
|
|
|
/**
|
|
* Gets the frame that's associated with this content node.
|
|
* Does not flush.
|
|
*/
|
|
nsPluginFrame* GetExistingFrame();
|
|
|
|
// Helper class for SetupProtoChain
|
|
class SetupProtoChainRunner final : public nsIRunnable
|
|
{
|
|
~SetupProtoChainRunner();
|
|
public:
|
|
NS_DECL_ISUPPORTS
|
|
|
|
explicit SetupProtoChainRunner(nsObjectLoadingContent* aContent);
|
|
|
|
NS_IMETHOD Run() override;
|
|
|
|
private:
|
|
// We store an nsIObjectLoadingContent because we can
|
|
// unambiguously refcount that.
|
|
RefPtr<nsIObjectLoadingContent> mContent;
|
|
};
|
|
|
|
// Utility getter for getting our nsNPAPIPluginInstance in a safe way.
|
|
nsresult ScriptRequestPluginInstance(JSContext* aCx,
|
|
nsNPAPIPluginInstance** aResult);
|
|
|
|
// Utility method for getting our plugin JSObject
|
|
static nsresult GetPluginJSObject(JSContext *cx,
|
|
JS::Handle<JSObject*> obj,
|
|
nsNPAPIPluginInstance *plugin_inst,
|
|
JS::MutableHandle<JSObject*> plugin_obj,
|
|
JS::MutableHandle<JSObject*> plugin_proto);
|
|
|
|
// The final listener for mChannel (uriloader, pluginstreamlistener, etc.)
|
|
nsCOMPtr<nsIStreamListener> mFinalListener;
|
|
|
|
// Frame loader, for content documents we load.
|
|
RefPtr<nsFrameLoader> mFrameLoader;
|
|
|
|
// Track if we have a pending AsyncInstantiateEvent
|
|
nsCOMPtr<nsIRunnable> mPendingInstantiateEvent;
|
|
|
|
// Tracks if we have a pending CheckPluginStopEvent
|
|
nsCOMPtr<nsIRunnable> mPendingCheckPluginStopEvent;
|
|
|
|
// The content type of our current load target, updated by
|
|
// UpdateObjectParameters(). Takes the channel's type into account once
|
|
// opened.
|
|
//
|
|
// May change if a channel is opened, does not imply a loaded state
|
|
nsCString mContentType;
|
|
|
|
// The content type 'hint' provided by the element's type attribute. May
|
|
// or may not be used as a final type
|
|
nsCString mOriginalContentType;
|
|
|
|
// The channel that's currently being loaded. If set, but mChannelLoaded is
|
|
// false, has not yet reached OnStartRequest
|
|
nsCOMPtr<nsIChannel> mChannel;
|
|
|
|
// The URI of the current content.
|
|
// May change as we open channels and encounter redirects - does not imply
|
|
// a loaded type
|
|
nsCOMPtr<nsIURI> mURI;
|
|
|
|
// The original URI obtained from inspecting the element (codebase, and
|
|
// src/data). May differ from mURI due to redirects
|
|
nsCOMPtr<nsIURI> mOriginalURI;
|
|
|
|
// The baseURI used for constructing mURI, and used by some plugins (java)
|
|
// as a root for other resource requests.
|
|
nsCOMPtr<nsIURI> mBaseURI;
|
|
|
|
|
|
|
|
// Type of the currently-loaded content.
|
|
ObjectType mType : 8;
|
|
// The type of fallback content we're showing (see ObjectState())
|
|
FallbackType mFallbackType : 8;
|
|
|
|
uint32_t mRunID;
|
|
bool mHasRunID;
|
|
|
|
// If true, we have opened a channel as the listener and it has reached
|
|
// OnStartRequest. Does not get set for channels that are passed directly to
|
|
// the plugin listener.
|
|
bool mChannelLoaded : 1;
|
|
|
|
// Whether we are about to call instantiate on our frame. If we aren't,
|
|
// SetFrame needs to asynchronously call Instantiate.
|
|
bool mInstantiating : 1;
|
|
|
|
// True when the object is created for an element which the parser has
|
|
// created using NS_FROM_PARSER_NETWORK flag. If the element is modified,
|
|
// it may lose the flag.
|
|
bool mNetworkCreated : 1;
|
|
|
|
// Used to keep track of whether or not a plugin has been explicitly
|
|
// activated by PlayPlugin(). (see ShouldPlay())
|
|
bool mActivated : 1;
|
|
|
|
// Protects DoStopPlugin from reentry (bug 724781).
|
|
bool mIsStopping : 1;
|
|
|
|
// Protects LoadObject from re-entry
|
|
bool mIsLoading : 1;
|
|
|
|
// For plugin stand-in types (click-to-play) tracks
|
|
// whether content js has tried to access the plugin script object.
|
|
bool mScriptRequested : 1;
|
|
|
|
nsWeakFrame mPrintFrame;
|
|
|
|
RefPtr<nsPluginInstanceOwner> mInstanceOwner;
|
|
nsTArray<mozilla::dom::MozPluginParameter> mCachedAttributes;
|
|
nsTArray<mozilla::dom::MozPluginParameter> mCachedParameters;
|
|
};
|
|
|
|
#endif
|