mirror of
https://bitbucket.org/chromiumembedded/cef
synced 2025-06-05 21:39:12 +02:00
Create 2062 release branch for CEF3.
git-svn-id: https://chromiumembedded.googlecode.com/svn/branches/2062@1783 5089003a-bbd8-11dd-ad1f-f1f9622dbc98
This commit is contained in:
78
patch/patches/browser_web_contents_1257.patch
Normal file
78
patch/patches/browser_web_contents_1257.patch
Normal file
@@ -0,0 +1,78 @@
|
||||
Index: web_contents_impl.cc
|
||||
===================================================================
|
||||
--- web_contents_impl.cc (revision 286351)
|
||||
+++ web_contents_impl.cc (working copy)
|
||||
@@ -1066,22 +1066,29 @@
|
||||
params.browser_context, params.site_instance, params.routing_id,
|
||||
params.main_frame_routing_id);
|
||||
|
||||
- WebContentsViewDelegate* delegate =
|
||||
- GetContentClient()->browser()->GetWebContentsViewDelegate(this);
|
||||
+ if (params.view && params.delegate_view) {
|
||||
+ view_.reset(params.view);
|
||||
+ render_view_host_delegate_view_ = params.delegate_view;
|
||||
+ }
|
||||
|
||||
- if (browser_plugin_guest_) {
|
||||
- scoped_ptr<WebContentsView> platform_view(CreateWebContentsView(
|
||||
- this, delegate, &render_view_host_delegate_view_));
|
||||
+ if (!view_) {
|
||||
+ WebContentsViewDelegate* delegate =
|
||||
+ GetContentClient()->browser()->GetWebContentsViewDelegate(this);
|
||||
|
||||
- WebContentsViewGuest* rv = new WebContentsViewGuest(
|
||||
- this, browser_plugin_guest_.get(), platform_view.Pass(),
|
||||
- render_view_host_delegate_view_);
|
||||
- render_view_host_delegate_view_ = rv;
|
||||
- view_.reset(rv);
|
||||
- } else {
|
||||
- // Regular WebContentsView.
|
||||
- view_.reset(CreateWebContentsView(
|
||||
- this, delegate, &render_view_host_delegate_view_));
|
||||
+ if (browser_plugin_guest_) {
|
||||
+ scoped_ptr<WebContentsView> platform_view(CreateWebContentsView(
|
||||
+ this, delegate, &render_view_host_delegate_view_));
|
||||
+
|
||||
+ WebContentsViewGuest* rv = new WebContentsViewGuest(
|
||||
+ this, browser_plugin_guest_.get(), platform_view.Pass(),
|
||||
+ render_view_host_delegate_view_);
|
||||
+ render_view_host_delegate_view_ = rv;
|
||||
+ view_.reset(rv);
|
||||
+ } else {
|
||||
+ // Regular WebContentsView.
|
||||
+ view_.reset(CreateWebContentsView(
|
||||
+ this, delegate, &render_view_host_delegate_view_));
|
||||
+ }
|
||||
}
|
||||
CHECK(render_view_host_delegate_view_);
|
||||
CHECK(view_.get());
|
||||
@@ -1398,6 +1405,9 @@
|
||||
static_cast<SessionStorageNamespaceImpl*>(session_storage_namespace);
|
||||
CHECK(session_storage_namespace_impl->IsFromContext(dom_storage_context));
|
||||
|
||||
+ content::WebContentsView* view = NULL;
|
||||
+ content::RenderViewHostDelegateView* delegate_view = NULL;
|
||||
+
|
||||
if (delegate_ &&
|
||||
!delegate_->ShouldCreateWebContents(this,
|
||||
route_id,
|
||||
@@ -1405,7 +1415,9 @@
|
||||
params.frame_name,
|
||||
params.target_url,
|
||||
partition_id,
|
||||
- session_storage_namespace)) {
|
||||
+ session_storage_namespace,
|
||||
+ &view,
|
||||
+ &delegate_view)) {
|
||||
if (route_id != MSG_ROUTING_NONE &&
|
||||
!RenderViewHost::FromID(render_process_id, route_id)) {
|
||||
// If the embedder didn't create a WebContents for this route, we need to
|
||||
@@ -1425,6 +1437,8 @@
|
||||
create_params.main_frame_routing_id = main_frame_route_id;
|
||||
create_params.opener = this;
|
||||
create_params.opener_suppressed = params.opener_suppressed;
|
||||
+ create_params.view = view;
|
||||
+ create_params.delegate_view = delegate_view;
|
||||
if (params.disposition == NEW_BACKGROUND_TAB)
|
||||
create_params.initially_hidden = true;
|
||||
|
54
patch/patches/build.patch
Normal file
54
patch/patches/build.patch
Normal file
@@ -0,0 +1,54 @@
|
||||
Index: mac/strip_save_dsym
|
||||
===================================================================
|
||||
--- mac/strip_save_dsym (revision 286351)
|
||||
+++ mac/strip_save_dsym (working copy)
|
||||
@@ -48,7 +48,7 @@
|
||||
"bundle"]
|
||||
macho_types_re = "Mach-O (?:64-bit )?(?:" + "|".join(macho_types) + ")"
|
||||
|
||||
- file_cmd = subprocess.Popen(["/usr/bin/file", "-b", "--", macho],
|
||||
+ file_cmd = subprocess.Popen(["/usr/bin/file", "-b", "-L", "--", macho],
|
||||
stdout=subprocess.PIPE)
|
||||
|
||||
archs = []
|
||||
Index: gyp_chromium
|
||||
===================================================================
|
||||
--- gyp_chromium (revision 286351)
|
||||
+++ gyp_chromium (working copy)
|
||||
@@ -251,12 +251,6 @@
|
||||
if sys.platform not in ('darwin',):
|
||||
args.append('--no-circular-check')
|
||||
|
||||
- # We explicitly don't support the make gyp generator (crbug.com/348686). Be
|
||||
- # nice and fail here, rather than choking in gyp.
|
||||
- if re.search(r'(^|,|\s)make($|,|\s)', os.environ.get('GYP_GENERATORS', '')):
|
||||
- print 'Error: make gyp generator not supported (check GYP_GENERATORS).'
|
||||
- sys.exit(1)
|
||||
-
|
||||
# Default to ninja on linux and windows, but only if no generator has
|
||||
# explicitly been set.
|
||||
# Also default to ninja on mac, but only when not building chrome/ios.
|
||||
Index: common.gypi
|
||||
===================================================================
|
||||
--- common.gypi (revision 286351)
|
||||
+++ common.gypi (working copy)
|
||||
@@ -9,6 +9,9 @@
|
||||
# Variables expected to be overriden on the GYP command line (-D) or by
|
||||
# ~/.gyp/include.gypi.
|
||||
'variables': {
|
||||
+ # Directory for CEF source files. This will be set by cef.gypi.
|
||||
+ 'cef_directory%' : '',
|
||||
+
|
||||
# Putting a variables dict inside another variables dict looks kind of
|
||||
# weird. This is done so that 'host_arch', 'chromeos', etc are defined as
|
||||
# variables within the outer variables dict here. This is necessary
|
||||
@@ -5119,6 +5122,9 @@
|
||||
# removed as code is fixed.
|
||||
4100, 4121, 4125, 4127, 4130, 4131, 4189, 4201, 4238, 4244, 4245,
|
||||
4310, 4428, 4481, 4505, 4510, 4512, 4530, 4610, 4611, 4701, 4706,
|
||||
+ # Disable Warning 4702 ("Unreachable code")
|
||||
+ # https://code.google.com/p/chromium/issues/detail?id=346399#c55
|
||||
+ 4702,
|
||||
],
|
||||
'msvs_settings': {
|
||||
'VCCLCompilerTool': {
|
60
patch/patches/content_nav_1129.patch
Normal file
60
patch/patches/content_nav_1129.patch
Normal file
@@ -0,0 +1,60 @@
|
||||
Index: public/renderer/content_renderer_client.cc
|
||||
===================================================================
|
||||
--- public/renderer/content_renderer_client.cc (revision 286351)
|
||||
+++ public/renderer/content_renderer_client.cc (working copy)
|
||||
@@ -92,7 +92,6 @@
|
||||
return false;
|
||||
}
|
||||
|
||||
-#ifdef OS_ANDROID
|
||||
bool ContentRendererClient::HandleNavigation(
|
||||
RenderFrame* render_frame,
|
||||
DocumentState* document_state,
|
||||
@@ -104,7 +103,6 @@
|
||||
bool is_redirect) {
|
||||
return false;
|
||||
}
|
||||
-#endif
|
||||
|
||||
bool ContentRendererClient::ShouldFork(blink::WebFrame* frame,
|
||||
const GURL& url,
|
||||
Index: public/renderer/content_renderer_client.h
|
||||
===================================================================
|
||||
--- public/renderer/content_renderer_client.h (revision 286351)
|
||||
+++ public/renderer/content_renderer_client.h (working copy)
|
||||
@@ -176,7 +176,6 @@
|
||||
// Returns true if a popup window should be allowed.
|
||||
virtual bool AllowPopup();
|
||||
|
||||
-#ifdef OS_ANDROID
|
||||
// TODO(sgurun) This callback is deprecated and will be removed as soon
|
||||
// as android webview completes implementation of a resource throttle based
|
||||
// shouldoverrideurl implementation. See crbug.com/325351
|
||||
@@ -191,7 +190,6 @@
|
||||
blink::WebNavigationType type,
|
||||
blink::WebNavigationPolicy default_policy,
|
||||
bool is_redirect);
|
||||
-#endif
|
||||
|
||||
// Returns true if we should fork a new process for the given navigation.
|
||||
// If |send_referrer| is set to false (which is the default), no referrer
|
||||
Index: renderer/render_frame_impl.cc
|
||||
===================================================================
|
||||
--- renderer/render_frame_impl.cc (revision 286351)
|
||||
+++ renderer/render_frame_impl.cc (working copy)
|
||||
@@ -3121,7 +3121,6 @@
|
||||
WebNavigationType type,
|
||||
WebNavigationPolicy default_policy,
|
||||
bool is_redirect) {
|
||||
-#ifdef OS_ANDROID
|
||||
// The handlenavigation API is deprecated and will be removed once
|
||||
// crbug.com/325351 is resolved.
|
||||
if (request.url() != GURL(kSwappedOutURL) &&
|
||||
@@ -3136,7 +3135,6 @@
|
||||
is_redirect)) {
|
||||
return blink::WebNavigationPolicyIgnore;
|
||||
}
|
||||
-#endif
|
||||
|
||||
Referrer referrer(RenderViewImpl::GetReferrerFromRequest(frame, request));
|
||||
|
17
patch/patches/gritsettings.patch
Normal file
17
patch/patches/gritsettings.patch
Normal file
@@ -0,0 +1,17 @@
|
||||
Index: resource_ids
|
||||
===================================================================
|
||||
--- resource_ids (revision 286351)
|
||||
+++ resource_ids (working copy)
|
||||
@@ -16,6 +16,12 @@
|
||||
{
|
||||
"SRCDIR": "../..",
|
||||
|
||||
+ "cef/libcef/resources/cef_resources.grd": {
|
||||
+ "includes": [27500],
|
||||
+ },
|
||||
+ "cef/libcef/resources/cef_strings.grd": {
|
||||
+ "messages": [28000],
|
||||
+ },
|
||||
"chrome/browser/browser_resources.grd": {
|
||||
"includes": [500],
|
||||
"structures": [750],
|
22
patch/patches/gyp_331.patch
Normal file
22
patch/patches/gyp_331.patch
Normal file
@@ -0,0 +1,22 @@
|
||||
Index: gyp/generator/ninja.py
|
||||
===================================================================
|
||||
--- gyp/generator/ninja.py (revision 1944)
|
||||
+++ gyp/generator/ninja.py (working copy)
|
||||
@@ -740,7 +740,16 @@
|
||||
for path in copy['files']:
|
||||
# Normalize the path so trailing slashes don't confuse us.
|
||||
path = os.path.normpath(path)
|
||||
- basename = os.path.split(path)[1]
|
||||
+ (parent_path, basename) = os.path.split(path)
|
||||
+
|
||||
+ # Xcode uses .lproj directories for localized resources. Add a special
|
||||
+ # case to maintain the localization directory component if present.
|
||||
+ if parent_path != '':
|
||||
+ parent_basename = os.path.basename(parent_path)
|
||||
+ (parent_root, parent_ext) = os.path.splitext(parent_basename)
|
||||
+ if parent_ext == '.lproj':
|
||||
+ basename = os.path.join(parent_basename, basename)
|
||||
+
|
||||
src = self.GypPathToNinja(path, env)
|
||||
dst = self.GypPathToNinja(os.path.join(copy['destination'], basename),
|
||||
env)
|
13
patch/patches/message_loop_443.patch
Normal file
13
patch/patches/message_loop_443.patch
Normal file
@@ -0,0 +1,13 @@
|
||||
Index: message_loop.cc
|
||||
===================================================================
|
||||
--- message_loop.cc (revision 286351)
|
||||
+++ message_loop.cc (working copy)
|
||||
@@ -154,7 +154,7 @@
|
||||
MessageLoop::~MessageLoop() {
|
||||
DCHECK_EQ(this, current());
|
||||
|
||||
- DCHECK(!run_loop_);
|
||||
+ //DCHECK(!run_loop_);
|
||||
|
||||
// Clean up any unprocessed tasks, but take care: deleting a task could
|
||||
// result in the addition of more tasks (e.g., via DeleteSoon). We set a
|
25
patch/patches/prefs_content_1161.patch
Normal file
25
patch/patches/prefs_content_1161.patch
Normal file
@@ -0,0 +1,25 @@
|
||||
Index: public/common/common_param_traits_macros.h
|
||||
===================================================================
|
||||
--- public/common/common_param_traits_macros.h (revision 286351)
|
||||
+++ public/common/common_param_traits_macros.h (working copy)
|
||||
@@ -175,6 +175,7 @@
|
||||
IPC_STRUCT_TRAITS_MEMBER(initialize_at_minimum_page_scale)
|
||||
IPC_STRUCT_TRAITS_MEMBER(smart_insert_delete_enabled)
|
||||
IPC_STRUCT_TRAITS_MEMBER(compositor_touch_hit_testing)
|
||||
+ IPC_STRUCT_TRAITS_MEMBER(base_background_color)
|
||||
IPC_STRUCT_TRAITS_MEMBER(cookie_enabled)
|
||||
IPC_STRUCT_TRAITS_MEMBER(navigate_on_drag_drop)
|
||||
IPC_STRUCT_TRAITS_MEMBER(spatial_navigation_enabled)
|
||||
Index: renderer/web_preferences.cc
|
||||
===================================================================
|
||||
--- renderer/web_preferences.cc (revision 286351)
|
||||
+++ renderer/web_preferences.cc (working copy)
|
||||
@@ -167,6 +167,8 @@
|
||||
|
||||
settings->setJavaEnabled(prefs.java_enabled);
|
||||
|
||||
+ web_view->setBaseBackgroundColor(prefs.base_background_color);
|
||||
+
|
||||
// By default, allow_universal_access_from_file_urls is set to false and thus
|
||||
// we mitigate attacks from local HTML files by not granting file:// URLs
|
||||
// universal access. Only test shell will enable this.
|
24
patch/patches/prefs_webkit_1161.patch
Normal file
24
patch/patches/prefs_webkit_1161.patch
Normal file
@@ -0,0 +1,24 @@
|
||||
Index: common/webpreferences.cc
|
||||
===================================================================
|
||||
--- common/webpreferences.cc (revision 286351)
|
||||
+++ common/webpreferences.cc (working copy)
|
||||
@@ -112,6 +112,7 @@
|
||||
use_solid_color_scrollbars(false),
|
||||
compositor_touch_hit_testing(true),
|
||||
navigate_on_drag_drop(true),
|
||||
+ base_background_color(0xFFFFFFFF), // Color::white
|
||||
cookie_enabled(true),
|
||||
pepper_accelerated_video_decode_enabled(false)
|
||||
#if defined(OS_ANDROID)
|
||||
Index: common/webpreferences.h
|
||||
===================================================================
|
||||
--- common/webpreferences.h (revision 286351)
|
||||
+++ common/webpreferences.h (working copy)
|
||||
@@ -148,6 +148,7 @@
|
||||
bool use_solid_color_scrollbars;
|
||||
bool compositor_touch_hit_testing;
|
||||
bool navigate_on_drag_drop;
|
||||
+ uint32_t base_background_color;
|
||||
|
||||
// This flags corresponds to a Page's Settings' setCookieEnabled state. It
|
||||
// only controls whether or not the "document.cookie" field is properly
|
132
patch/patches/public_browser_1161_1257.patch
Normal file
132
patch/patches/public_browser_1161_1257.patch
Normal file
@@ -0,0 +1,132 @@
|
||||
Index: content_browser_client.cc
|
||||
===================================================================
|
||||
--- content_browser_client.cc (revision 286351)
|
||||
+++ content_browser_client.cc (working copy)
|
||||
@@ -280,6 +280,10 @@
|
||||
return true;
|
||||
}
|
||||
|
||||
+SkColor ContentBrowserClient::GetBaseBackgroundColor(RenderViewHost* rvh) {
|
||||
+ return SK_ColorWHITE;
|
||||
+}
|
||||
+
|
||||
base::FilePath ContentBrowserClient::GetDefaultDownloadDirectory() {
|
||||
return base::FilePath();
|
||||
}
|
||||
Index: content_browser_client.h
|
||||
===================================================================
|
||||
--- content_browser_client.h (revision 286351)
|
||||
+++ content_browser_client.h (working copy)
|
||||
@@ -23,6 +23,7 @@
|
||||
#include "net/cookies/canonical_cookie.h"
|
||||
#include "net/url_request/url_request_interceptor.h"
|
||||
#include "net/url_request/url_request_job_factory.h"
|
||||
+#include "third_party/skia/include/core/SkColor.h"
|
||||
#include "third_party/WebKit/public/web/WebNotificationPresenter.h"
|
||||
#include "ui/base/window_open_disposition.h"
|
||||
#include "webkit/browser/fileapi/file_system_context.h"
|
||||
@@ -556,6 +557,9 @@
|
||||
// Clears browser cookies.
|
||||
virtual void ClearCookies(RenderViewHost* rvh) {}
|
||||
|
||||
+ // Returns the base background color.
|
||||
+ virtual SkColor GetBaseBackgroundColor(RenderViewHost* rvh);
|
||||
+
|
||||
// Returns the default download directory.
|
||||
// This can be called on any thread.
|
||||
virtual base::FilePath GetDefaultDownloadDirectory();
|
||||
Index: web_contents.cc
|
||||
===================================================================
|
||||
--- web_contents.cc (revision 286351)
|
||||
+++ web_contents.cc (working copy)
|
||||
@@ -17,7 +17,9 @@
|
||||
main_frame_routing_id(MSG_ROUTING_NONE),
|
||||
initially_hidden(false),
|
||||
guest_instance_id(0),
|
||||
- context(NULL) {}
|
||||
+ context(NULL),
|
||||
+ view(NULL),
|
||||
+ delegate_view(NULL) {}
|
||||
|
||||
WebContents::CreateParams::CreateParams(
|
||||
BrowserContext* context, SiteInstance* site)
|
||||
@@ -29,7 +31,9 @@
|
||||
main_frame_routing_id(MSG_ROUTING_NONE),
|
||||
initially_hidden(false),
|
||||
guest_instance_id(0),
|
||||
- context(NULL) {}
|
||||
+ context(NULL),
|
||||
+ view(NULL),
|
||||
+ delegate_view(NULL) {}
|
||||
|
||||
WebContents::CreateParams::~CreateParams() {
|
||||
}
|
||||
Index: web_contents.h
|
||||
===================================================================
|
||||
--- web_contents.h (revision 286351)
|
||||
+++ web_contents.h (working copy)
|
||||
@@ -50,9 +50,11 @@
|
||||
class RenderFrameHost;
|
||||
class RenderProcessHost;
|
||||
class RenderViewHost;
|
||||
+class RenderViewHostDelegateView;
|
||||
class RenderWidgetHostView;
|
||||
class SiteInstance;
|
||||
class WebContentsDelegate;
|
||||
+class WebContentsView;
|
||||
struct CustomContextMenuContext;
|
||||
struct DropData;
|
||||
struct RendererPreferences;
|
||||
@@ -120,6 +122,10 @@
|
||||
// Used to specify the location context which display the new view should
|
||||
// belong. This can be NULL if not needed.
|
||||
gfx::NativeView context;
|
||||
+
|
||||
+ // Optionally specify the view and delegate view.
|
||||
+ content::WebContentsView* view;
|
||||
+ content::RenderViewHostDelegateView* delegate_view;
|
||||
};
|
||||
|
||||
// Creates a new WebContents.
|
||||
Index: web_contents_delegate.cc
|
||||
===================================================================
|
||||
--- web_contents_delegate.cc (revision 286351)
|
||||
+++ web_contents_delegate.cc (working copy)
|
||||
@@ -136,7 +136,9 @@
|
||||
const base::string16& frame_name,
|
||||
const GURL& target_url,
|
||||
const std::string& partition_id,
|
||||
- SessionStorageNamespace* session_storage_namespace) {
|
||||
+ SessionStorageNamespace* session_storage_namespace,
|
||||
+ content::WebContentsView** view,
|
||||
+ content::RenderViewHostDelegateView** delegate_view) {
|
||||
return true;
|
||||
}
|
||||
|
||||
Index: web_contents_delegate.h
|
||||
===================================================================
|
||||
--- web_contents_delegate.h (revision 286351)
|
||||
+++ web_contents_delegate.h (working copy)
|
||||
@@ -36,9 +36,11 @@
|
||||
class JavaScriptDialogManager;
|
||||
class PageState;
|
||||
class RenderViewHost;
|
||||
+class RenderViewHostDelegateView;
|
||||
class SessionStorageNamespace;
|
||||
class WebContents;
|
||||
class WebContentsImpl;
|
||||
+class WebContentsView;
|
||||
struct ColorSuggestion;
|
||||
struct ContextMenuParams;
|
||||
struct DropData;
|
||||
@@ -312,7 +314,9 @@
|
||||
const base::string16& frame_name,
|
||||
const GURL& target_url,
|
||||
const std::string& partition_id,
|
||||
- SessionStorageNamespace* session_storage_namespace);
|
||||
+ SessionStorageNamespace* session_storage_namespace,
|
||||
+ content::WebContentsView** view,
|
||||
+ content::RenderViewHostDelegateView** delegate_view);
|
||||
|
||||
// Notifies the delegate about the creation of a new WebContents. This
|
||||
// typically happens when popups are created.
|
128
patch/patches/renderer_host_1161.patch
Normal file
128
patch/patches/renderer_host_1161.patch
Normal file
@@ -0,0 +1,128 @@
|
||||
Index: compositing_iosurface_layer_mac.mm
|
||||
===================================================================
|
||||
--- compositing_iosurface_layer_mac.mm (revision 286351)
|
||||
+++ compositing_iosurface_layer_mac.mm (working copy)
|
||||
@@ -202,7 +202,7 @@
|
||||
TRACE_EVENT0("browser", "CompositingIOSurfaceLayer::drawInCGLContext");
|
||||
|
||||
if (!iosurface_->HasIOSurface() || context_->cgl_context() != glContext) {
|
||||
- glClearColor(1, 1, 1, 1);
|
||||
+ glClearColor(0, 0, 0, 0);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
return;
|
||||
}
|
||||
Index: compositing_iosurface_mac.mm
|
||||
===================================================================
|
||||
--- compositing_iosurface_mac.mm (revision 286351)
|
||||
+++ compositing_iosurface_mac.mm (working copy)
|
||||
@@ -350,7 +350,7 @@
|
||||
glUseProgram(0); CHECK_AND_SAVE_GL_ERROR();
|
||||
} else {
|
||||
// Should match the clear color of RenderWidgetHostViewMac.
|
||||
- glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
+ glClearColor(0, 0, 0, 0);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
}
|
||||
|
||||
Index: compositing_iosurface_shader_programs_mac.cc
|
||||
===================================================================
|
||||
--- compositing_iosurface_shader_programs_mac.cc (revision 286351)
|
||||
+++ compositing_iosurface_shader_programs_mac.cc (working copy)
|
||||
@@ -11,6 +11,8 @@
|
||||
#include "base/debug/trace_event.h"
|
||||
#include "base/logging.h"
|
||||
#include "base/memory/scoped_ptr.h"
|
||||
+#include "base/strings/stringprintf.h"
|
||||
+#include "base/strings/string_number_conversions.h"
|
||||
#include "base/values.h"
|
||||
#include "content/browser/gpu/gpu_data_manager_impl.h"
|
||||
#include "gpu/config/gpu_driver_bug_workaround_type.h"
|
||||
@@ -51,6 +53,7 @@
|
||||
}
|
||||
);
|
||||
|
||||
+float bgcolor[] = {1.0f, 1.0f, 1.0f};
|
||||
|
||||
// Only calculates position.
|
||||
const char kvsSolidWhite[] = GLSL_PROGRAM_AS_STRING(
|
||||
@@ -238,6 +241,18 @@
|
||||
const GLuint shader = glCreateShader(shader_type);
|
||||
DCHECK_NE(shader, 0u);
|
||||
|
||||
+ // Support customization of the background color.
|
||||
+ std::string bg_shader;
|
||||
+ if (shader_program == SHADER_PROGRAM_SOLID_WHITE &&
|
||||
+ shader_type == GL_FRAGMENT_SHADER) {
|
||||
+ bg_shader = base::StringPrintf(
|
||||
+ "void main() { gl_FragColor = vec4(%s, %s, %s, 1.0); }",
|
||||
+ base::DoubleToString(bgcolor[0]).c_str(),
|
||||
+ base::DoubleToString(bgcolor[1]).c_str(),
|
||||
+ base::DoubleToString(bgcolor[2]).c_str());
|
||||
+ kFragmentShaderSourceCodeMap[shader_program] = bg_shader.c_str();
|
||||
+ }
|
||||
+
|
||||
// Select and compile the shader program source code.
|
||||
if (shader_type == GL_VERTEX_SHADER) {
|
||||
const GLchar* source_snippets[] = {
|
||||
@@ -412,6 +427,14 @@
|
||||
Reset();
|
||||
}
|
||||
|
||||
+// static
|
||||
+void CompositingIOSurfaceShaderPrograms::SetBackgroundColor(
|
||||
+ float r, float g, float b) {
|
||||
+ bgcolor[0] = r;
|
||||
+ bgcolor[1] = g;
|
||||
+ bgcolor[2] = b;
|
||||
+}
|
||||
+
|
||||
GLuint CompositingIOSurfaceShaderPrograms::GetShaderProgram(int which) {
|
||||
if (shader_programs_[which] == 0u) {
|
||||
shader_programs_[which] =
|
||||
Index: compositing_iosurface_shader_programs_mac.h
|
||||
===================================================================
|
||||
--- compositing_iosurface_shader_programs_mac.h (revision 286351)
|
||||
+++ compositing_iosurface_shader_programs_mac.h (working copy)
|
||||
@@ -48,6 +48,8 @@
|
||||
return rgb_to_yv12_output_format_;
|
||||
}
|
||||
|
||||
+ static void SetBackgroundColor(float r, float g, float b);
|
||||
+
|
||||
protected:
|
||||
FRIEND_TEST_ALL_PREFIXES(CompositingIOSurfaceTransformerTest,
|
||||
TransformsRGBToYV12);
|
||||
Index: render_widget_host_view_aura.cc
|
||||
===================================================================
|
||||
--- render_widget_host_view_aura.cc (revision 286351)
|
||||
+++ render_widget_host_view_aura.cc (working copy)
|
||||
@@ -1654,8 +1654,14 @@
|
||||
// For non-opaque windows, we don't draw anything, since we depend on the
|
||||
// canvas coming from the compositor to already be initialized as
|
||||
// transparent.
|
||||
- if (window_->layer()->fills_bounds_opaquely())
|
||||
- canvas->DrawColor(SK_ColorWHITE);
|
||||
+ if (window_->layer()->fills_bounds_opaquely()) {
|
||||
+ if (host_->IsRenderView()) {
|
||||
+ canvas->DrawColor(GetContentClient()->browser()->GetBaseBackgroundColor(
|
||||
+ RenderViewHost::From(host_)));
|
||||
+ } else {
|
||||
+ canvas->DrawColor(SK_ColorWHITE);
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
void RenderWidgetHostViewAura::OnDeviceScaleFactorChanged(
|
||||
Index: render_widget_host_view_mac.mm
|
||||
===================================================================
|
||||
--- render_widget_host_view_mac.mm (revision 286351)
|
||||
+++ render_widget_host_view_mac.mm (working copy)
|
||||
@@ -473,7 +473,7 @@
|
||||
|
||||
background_layer_.reset([[CALayer alloc] init]);
|
||||
[background_layer_
|
||||
- setBackgroundColor:CGColorGetConstantColor(kCGColorWhite)];
|
||||
+ setBackgroundColor:CGColorGetConstantColor(kCGColorClear)];
|
||||
[cocoa_view_ setLayer:background_layer_];
|
||||
[cocoa_view_ setWantsLayer:YES];
|
||||
|
34
patch/patches/spi_webcore_364.patch
Normal file
34
patch/patches/spi_webcore_364.patch
Normal file
@@ -0,0 +1,34 @@
|
||||
Index: core/frame/FrameView.cpp
|
||||
===================================================================
|
||||
--- core/frame/FrameView.cpp (revision 179174)
|
||||
+++ core/frame/FrameView.cpp (working copy)
|
||||
@@ -138,8 +138,10 @@
|
||||
if (!m_frame->isMainFrame())
|
||||
return;
|
||||
|
||||
+#if 0
|
||||
ScrollableArea::setVerticalScrollElasticity(ScrollElasticityAllowed);
|
||||
ScrollableArea::setHorizontalScrollElasticity(ScrollElasticityAllowed);
|
||||
+#endif
|
||||
}
|
||||
|
||||
PassRefPtr<FrameView> FrameView::create(LocalFrame* frame)
|
||||
Index: platform/scroll/ScrollbarThemeMacCommon.mm
|
||||
===================================================================
|
||||
--- platform/scroll/ScrollbarThemeMacCommon.mm (revision 179174)
|
||||
+++ platform/scroll/ScrollbarThemeMacCommon.mm (working copy)
|
||||
@@ -355,10 +355,14 @@
|
||||
// static
|
||||
bool ScrollbarThemeMacCommon::isOverlayAPIAvailable()
|
||||
{
|
||||
+#if 0
|
||||
static bool apiAvailable =
|
||||
[NSClassFromString(@"NSScrollerImp") respondsToSelector:@selector(scrollerImpWithStyle:controlSize:horizontal:replacingScrollerImp:)]
|
||||
&& [NSClassFromString(@"NSScrollerImpPair") instancesRespondToSelector:@selector(scrollerStyle)];
|
||||
return apiAvailable;
|
||||
+#else
|
||||
+ return false;
|
||||
+#endif
|
||||
}
|
||||
|
||||
} // namespace WebCore
|
14
patch/patches/ui_dragdrop_355390.patch
Normal file
14
patch/patches/ui_dragdrop_355390.patch
Normal file
@@ -0,0 +1,14 @@
|
||||
Index: os_exchange_data_provider_aurax11.cc
|
||||
===================================================================
|
||||
--- os_exchange_data_provider_aurax11.cc (revision 286351)
|
||||
+++ os_exchange_data_provider_aurax11.cc (working copy)
|
||||
@@ -155,7 +155,8 @@
|
||||
format_map_.Insert(atom_cache_.GetAtom(kMimeTypeMozillaURL), mem);
|
||||
|
||||
// Set a string fallback as well.
|
||||
- SetString(spec);
|
||||
+ if (!HasString())
|
||||
+ SetString(spec);
|
||||
|
||||
// Return early if this drag already contains file contents (this implies
|
||||
// that file contents must be populated before URLs). Nautilus (and possibly
|
13
patch/patches/underlay_1051.patch
Normal file
13
patch/patches/underlay_1051.patch
Normal file
@@ -0,0 +1,13 @@
|
||||
Index: underlay_opengl_hosting_window.h
|
||||
===================================================================
|
||||
--- underlay_opengl_hosting_window.h (revision 286351)
|
||||
+++ underlay_opengl_hosting_window.h (working copy)
|
||||
@@ -12,7 +12,7 @@
|
||||
// Common base class for windows that host a OpenGL surface that renders under
|
||||
// the window. Contains methods relating to hole punching so that the OpenGL
|
||||
// surface is visible through the window.
|
||||
-UI_BASE_EXPORT
|
||||
+__attribute__((visibility("default")))
|
||||
@interface UnderlayOpenGLHostingWindow : NSWindow
|
||||
@end
|
||||
|
223
patch/patches/views_widget_180.patch
Normal file
223
patch/patches/views_widget_180.patch
Normal file
@@ -0,0 +1,223 @@
|
||||
Index: desktop_aura/desktop_screen_win.cc
|
||||
===================================================================
|
||||
--- desktop_aura/desktop_screen_win.cc (revision 286351)
|
||||
+++ desktop_aura/desktop_screen_win.cc (working copy)
|
||||
@@ -54,6 +54,8 @@
|
||||
}
|
||||
|
||||
HWND DesktopScreenWin::GetHWNDFromNativeView(gfx::NativeView window) const {
|
||||
+ if (!window)
|
||||
+ return NULL;
|
||||
aura::WindowTreeHost* host = window->GetHost();
|
||||
return host ? host->GetAcceleratedWidget() : NULL;
|
||||
}
|
||||
Index: desktop_aura/desktop_screen_x11.cc
|
||||
===================================================================
|
||||
--- desktop_aura/desktop_screen_x11.cc (revision 286351)
|
||||
+++ desktop_aura/desktop_screen_x11.cc (working copy)
|
||||
@@ -220,6 +220,9 @@
|
||||
|
||||
gfx::Display DesktopScreenX11::GetDisplayNearestWindow(
|
||||
gfx::NativeView window) const {
|
||||
+ if (!window)
|
||||
+ return GetPrimaryDisplay();
|
||||
+
|
||||
// Getting screen bounds here safely is hard.
|
||||
//
|
||||
// You'd think we'd be able to just call window->GetBoundsInScreen(), but we
|
||||
Index: desktop_aura/desktop_window_tree_host_win.cc
|
||||
===================================================================
|
||||
--- desktop_aura/desktop_window_tree_host_win.cc (revision 286351)
|
||||
+++ desktop_aura/desktop_window_tree_host_win.cc (working copy)
|
||||
@@ -129,7 +129,9 @@
|
||||
native_widget_delegate_);
|
||||
|
||||
HWND parent_hwnd = NULL;
|
||||
- if (params.parent && params.parent->GetHost())
|
||||
+ if (params.parent_widget)
|
||||
+ parent_hwnd = params.parent_widget;
|
||||
+ else if (params.parent && params.parent->GetHost())
|
||||
parent_hwnd = params.parent->GetHost()->GetAcceleratedWidget();
|
||||
|
||||
message_handler_->set_remove_standard_frame(params.remove_standard_frame);
|
||||
@@ -774,6 +776,7 @@
|
||||
|
||||
void DesktopWindowTreeHostWin::HandleNativeFocus(HWND last_focused_window) {
|
||||
// TODO(beng): inform the native_widget_delegate_.
|
||||
+ GetWidget()->GetNativeWindow()->Focus();
|
||||
InputMethod* input_method = GetInputMethod();
|
||||
if (input_method)
|
||||
input_method->OnFocus();
|
||||
@@ -781,6 +784,7 @@
|
||||
|
||||
void DesktopWindowTreeHostWin::HandleNativeBlur(HWND focused_window) {
|
||||
// TODO(beng): inform the native_widget_delegate_.
|
||||
+ GetWidget()->GetNativeWindow()->Blur();
|
||||
InputMethod* input_method = GetInputMethod();
|
||||
if (input_method)
|
||||
input_method->OnBlur();
|
||||
Index: desktop_aura/desktop_window_tree_host_x11.cc
|
||||
===================================================================
|
||||
--- desktop_aura/desktop_window_tree_host_x11.cc (revision 286351)
|
||||
+++ desktop_aura/desktop_window_tree_host_x11.cc (working copy)
|
||||
@@ -148,7 +148,8 @@
|
||||
window_parent_(NULL),
|
||||
window_shape_(NULL),
|
||||
custom_window_shape_(false),
|
||||
- urgency_hint_set_(false) {
|
||||
+ urgency_hint_set_(false),
|
||||
+ xwindow_destroyed_(false) {
|
||||
}
|
||||
|
||||
DesktopWindowTreeHostX11::~DesktopWindowTreeHostX11() {
|
||||
@@ -348,7 +349,8 @@
|
||||
// Actually free our native resources.
|
||||
if (ui::PlatformEventSource::GetInstance())
|
||||
ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);
|
||||
- XDestroyWindow(xdisplay_, xwindow_);
|
||||
+ if (!xwindow_destroyed_)
|
||||
+ XDestroyWindow(xdisplay_, xwindow_);
|
||||
xwindow_ = None;
|
||||
|
||||
desktop_native_widget_aura_->OnHostClosed();
|
||||
@@ -444,6 +446,8 @@
|
||||
}
|
||||
|
||||
gfx::Rect DesktopWindowTreeHostX11::GetWindowBoundsInScreen() const {
|
||||
+ if (!screen_bounds_.IsEmpty())
|
||||
+ return screen_bounds_;
|
||||
return bounds_;
|
||||
}
|
||||
|
||||
@@ -456,6 +460,8 @@
|
||||
// Attempts to calculate the rect by asking the NonClientFrameView what it
|
||||
// thought its GetBoundsForClientView() were broke combobox drop down
|
||||
// placement.
|
||||
+ if (!screen_bounds_.IsEmpty())
|
||||
+ return screen_bounds_;
|
||||
return bounds_;
|
||||
}
|
||||
|
||||
@@ -904,6 +910,8 @@
|
||||
}
|
||||
|
||||
gfx::Point DesktopWindowTreeHostX11::GetLocationOnNativeScreen() const {
|
||||
+ if (!screen_bounds_.IsEmpty())
|
||||
+ return screen_bounds_.origin();
|
||||
return bounds_.origin();
|
||||
}
|
||||
|
||||
@@ -1047,9 +1055,13 @@
|
||||
}
|
||||
}
|
||||
|
||||
+ gfx::AcceleratedWidget parent_widget = params.parent_widget;
|
||||
+ if (parent_widget == gfx::kNullAcceleratedWidget)
|
||||
+ parent_widget = x_root_window_;
|
||||
+
|
||||
bounds_ = params.bounds;
|
||||
xwindow_ = XCreateWindow(
|
||||
- xdisplay_, x_root_window_,
|
||||
+ xdisplay_, parent_widget,
|
||||
bounds_.x(), bounds_.y(),
|
||||
bounds_.width(), bounds_.height(),
|
||||
0, // border width
|
||||
@@ -1603,6 +1615,10 @@
|
||||
}
|
||||
break;
|
||||
}
|
||||
+ case DestroyNotify:
|
||||
+ xwindow_destroyed_ = true;
|
||||
+ CloseNow();
|
||||
+ break;
|
||||
case FocusOut:
|
||||
if (xev->xfocus.mode != NotifyGrab) {
|
||||
ReleaseCapture();
|
||||
Index: desktop_aura/desktop_window_tree_host_x11.h
|
||||
===================================================================
|
||||
--- desktop_aura/desktop_window_tree_host_x11.h (revision 286351)
|
||||
+++ desktop_aura/desktop_window_tree_host_x11.h (working copy)
|
||||
@@ -85,6 +85,8 @@
|
||||
// Deallocates the internal list of open windows.
|
||||
static void CleanUpWindowList();
|
||||
|
||||
+ void set_screen_bounds(const gfx::Rect& bounds) { screen_bounds_ = bounds; }
|
||||
+
|
||||
protected:
|
||||
// Overridden from DesktopWindowTreeHost:
|
||||
virtual void Init(aura::Window* content_window,
|
||||
@@ -254,6 +256,9 @@
|
||||
// The bounds of |xwindow_|.
|
||||
gfx::Rect bounds_;
|
||||
|
||||
+ // Override the screen bounds when the host is a child window.
|
||||
+ gfx::Rect screen_bounds_;
|
||||
+
|
||||
// Whenever the bounds are set, we keep the previous set of bounds around so
|
||||
// we can have a better chance of getting the real |restored_bounds_|. Window
|
||||
// managers tend to send a Configure message with the maximized bounds, and
|
||||
@@ -337,6 +342,9 @@
|
||||
|
||||
base::CancelableCallback<void()> delayed_resize_task_;
|
||||
|
||||
+ // True if the xwindow has already been destroyed.
|
||||
+ bool xwindow_destroyed_;
|
||||
+
|
||||
DISALLOW_COPY_AND_ASSIGN(DesktopWindowTreeHostX11);
|
||||
};
|
||||
|
||||
Index: widget.cc
|
||||
===================================================================
|
||||
--- widget.cc (revision 286351)
|
||||
+++ widget.cc (working copy)
|
||||
@@ -116,6 +116,7 @@
|
||||
show_state(ui::SHOW_STATE_DEFAULT),
|
||||
double_buffer(false),
|
||||
parent(NULL),
|
||||
+ parent_widget(gfx::kNullAcceleratedWidget),
|
||||
native_widget(NULL),
|
||||
desktop_window_tree_host(NULL),
|
||||
layer_type(aura::WINDOW_LAYER_TEXTURED),
|
||||
@@ -140,6 +141,7 @@
|
||||
show_state(ui::SHOW_STATE_DEFAULT),
|
||||
double_buffer(false),
|
||||
parent(NULL),
|
||||
+ parent_widget(gfx::kNullAcceleratedWidget),
|
||||
native_widget(NULL),
|
||||
desktop_window_tree_host(NULL),
|
||||
layer_type(aura::WINDOW_LAYER_TEXTURED),
|
||||
@@ -314,7 +316,7 @@
|
||||
InitParams params = in_params;
|
||||
|
||||
params.child |= (params.type == InitParams::TYPE_CONTROL);
|
||||
- is_top_level_ = !params.child;
|
||||
+ is_top_level_ = !params.child || params.parent_widget;
|
||||
|
||||
if (params.opacity == views::Widget::InitParams::INFER_OPACITY &&
|
||||
params.type != views::Widget::InitParams::TYPE_WINDOW &&
|
||||
@@ -375,7 +377,12 @@
|
||||
Minimize();
|
||||
} else if (params.delegate) {
|
||||
SetContentsView(params.delegate->GetContentsView());
|
||||
- SetInitialBoundsForFramelessWindow(params.bounds);
|
||||
+ if (params.parent_widget) {
|
||||
+ // Set the bounds directly instead of applying an inset.
|
||||
+ SetBounds(params.bounds);
|
||||
+ } else {
|
||||
+ SetInitialBoundsForFramelessWindow(params.bounds);
|
||||
+ }
|
||||
}
|
||||
// This must come after SetContentsView() or it might not be able to find
|
||||
// the correct NativeTheme (on Linux). See http://crbug.com/384492
|
||||
Index: widget.h
|
||||
===================================================================
|
||||
--- widget.h (revision 286351)
|
||||
+++ widget.h (working copy)
|
||||
@@ -225,6 +225,7 @@
|
||||
// Should the widget be double buffered? Default is false.
|
||||
bool double_buffer;
|
||||
gfx::NativeView parent;
|
||||
+ gfx::AcceleratedWidget parent_widget;
|
||||
// Specifies the initial bounds of the Widget. Default is empty, which means
|
||||
// the NativeWidget may specify a default size. If the parent is specified,
|
||||
// |bounds| is in the parent's coordinate system. If the parent is not
|
13
patch/patches/webkit_933.patch
Normal file
13
patch/patches/webkit_933.patch
Normal file
@@ -0,0 +1,13 @@
|
||||
Index: WebNode.cpp
|
||||
===================================================================
|
||||
--- WebNode.cpp (revision 179174)
|
||||
+++ WebNode.cpp (working copy)
|
||||
@@ -173,7 +173,7 @@
|
||||
void WebNode::addEventListener(const WebString& eventType, WebDOMEventListener* listener, bool useCapture)
|
||||
{
|
||||
// Please do not add more eventTypes to this list without an API review.
|
||||
- RELEASE_ASSERT(eventType == "mousedown");
|
||||
+ // RELEASE_ASSERT(eventType == "mousedown");
|
||||
|
||||
EventListenerWrapper* listenerWrapper = listener->createEventListenerWrapper(eventType, useCapture, m_private.get());
|
||||
// The listenerWrapper is only referenced by the actual Node. Once it goes
|
76
patch/patches/webkit_popups.patch
Normal file
76
patch/patches/webkit_popups.patch
Normal file
@@ -0,0 +1,76 @@
|
||||
Index: public/web/WebView.h
|
||||
===================================================================
|
||||
--- public/web/WebView.h (revision 179174)
|
||||
+++ public/web/WebView.h (working copy)
|
||||
@@ -416,6 +416,7 @@
|
||||
|
||||
// Sets whether select popup menus should be rendered by the browser.
|
||||
BLINK_EXPORT static void setUseExternalPopupMenus(bool);
|
||||
+ virtual void setUseExternalPopupMenusThisInstance(bool) = 0;
|
||||
|
||||
// Hides any popup (suggestions, selects...) that might be showing.
|
||||
virtual void hidePopups() = 0;
|
||||
Index: Source/web/ChromeClientImpl.cpp
|
||||
===================================================================
|
||||
--- Source/web/ChromeClientImpl.cpp (revision 179174)
|
||||
+++ Source/web/ChromeClientImpl.cpp (working copy)
|
||||
@@ -727,7 +727,7 @@
|
||||
|
||||
PassRefPtr<PopupMenu> ChromeClientImpl::createPopupMenu(LocalFrame& frame, PopupMenuClient* client) const
|
||||
{
|
||||
- if (WebViewImpl::useExternalPopupMenus())
|
||||
+ if (m_webView->useExternalPopupMenus())
|
||||
return adoptRef(new ExternalPopupMenu(frame, client, *m_webView));
|
||||
|
||||
return adoptRef(new PopupMenuChromium(frame, client));
|
||||
Index: Source/web/WebViewImpl.cpp
|
||||
===================================================================
|
||||
--- Source/web/WebViewImpl.cpp (revision 179174)
|
||||
+++ Source/web/WebViewImpl.cpp (working copy)
|
||||
@@ -368,6 +368,7 @@
|
||||
, m_fakePageScaleAnimationPageScaleFactor(0)
|
||||
, m_fakePageScaleAnimationUseAnchor(false)
|
||||
, m_contextMenuAllowed(false)
|
||||
+ , m_shouldUseExternalPopupMenus(shouldUseExternalPopupMenus)
|
||||
, m_doingDragAndDrop(false)
|
||||
, m_ignoreInputEvents(false)
|
||||
, m_compositorDeviceScaleFactorOverride(0)
|
||||
@@ -3673,9 +3674,14 @@
|
||||
updateLayerTreeViewport();
|
||||
}
|
||||
|
||||
+void WebViewImpl::setUseExternalPopupMenusThisInstance(bool useExternalPopupMenus)
|
||||
+{
|
||||
+ m_shouldUseExternalPopupMenus = useExternalPopupMenus;
|
||||
+}
|
||||
+
|
||||
bool WebViewImpl::useExternalPopupMenus()
|
||||
{
|
||||
- return shouldUseExternalPopupMenus;
|
||||
+ return m_shouldUseExternalPopupMenus;
|
||||
}
|
||||
|
||||
void WebViewImpl::startDragging(LocalFrame* frame,
|
||||
Index: Source/web/WebViewImpl.h
|
||||
===================================================================
|
||||
--- Source/web/WebViewImpl.h (revision 179174)
|
||||
+++ Source/web/WebViewImpl.h (working copy)
|
||||
@@ -353,7 +353,8 @@
|
||||
|
||||
// Returns true if popup menus should be rendered by the browser, false if
|
||||
// they should be rendered by WebKit (which is the default).
|
||||
- static bool useExternalPopupMenus();
|
||||
+ void setUseExternalPopupMenusThisInstance(bool);
|
||||
+ bool useExternalPopupMenus();
|
||||
|
||||
bool contextMenuAllowed() const
|
||||
{
|
||||
@@ -629,6 +630,8 @@
|
||||
|
||||
bool m_contextMenuAllowed;
|
||||
|
||||
+ bool m_shouldUseExternalPopupMenus;
|
||||
+
|
||||
bool m_doingDragAndDrop;
|
||||
|
||||
bool m_ignoreInputEvents;
|
13
patch/patches/zlib.patch
Normal file
13
patch/patches/zlib.patch
Normal file
@@ -0,0 +1,13 @@
|
||||
Index: contrib/minizip/unzip.c
|
||||
===================================================================
|
||||
--- contrib/minizip/unzip.c (revision 286351)
|
||||
+++ contrib/minizip/unzip.c (working copy)
|
||||
@@ -69,7 +69,7 @@
|
||||
#include <string.h>
|
||||
|
||||
#ifndef NOUNCRYPT
|
||||
- #define NOUNCRYPT
|
||||
+// #define NOUNCRYPT
|
||||
#endif
|
||||
|
||||
#include "third_party/zlib/zlib.h"
|
Reference in New Issue
Block a user