diff --git a/DEPS b/DEPS index 6185422..6b66d9a 100644 --- a/DEPS +++ b/DEPS
@@ -40,11 +40,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '1d06078fef78bdc6b367a3d4b1cd3a9b8370ddd0', + 'skia_revision': 'a0485d94529905e76320b7aa941a0d94b5578ac2', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': '86e7f46cd00bb3d18409576a62859e9e8757510b', + 'v8_revision': '72cd1985ae49192a10d2590bd6add57ba6dd20eb', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling swarming_client # and whatever else without interference from each other. @@ -64,7 +64,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling PDFium # and whatever else without interference from each other. - 'pdfium_revision': 'd321ef9bb7143e393deb9b0ff7420c96db6a0e4c', + 'pdfium_revision': 'c71fdcb1c9c4bc4457afff0f0358d3862ef3b8b7', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling openmax_dl # and whatever else without interference from each other. @@ -516,7 +516,7 @@ Var('chromium_git') + '/external/github.com/GoogleChrome/custom-tabs-client.git' + '@' + '4889dd9d552d24f08584dde29f639c0da4ea0f12', 'src/third_party/gvr-android-sdk/src': - Var('chromium_git') + '/external/github.com/googlevr/gvr-android-sdk.git' + '@' + 'a27f768b13682189c23eed69656319db5ef7cbfc', + Var('chromium_git') + '/external/github.com/googlevr/gvr-android-sdk.git' + '@' + '8d1395957283ee13ebe2bc672ba24e5ca4ec343f', }, }
diff --git a/cc/debug/debug_colors.cc b/cc/debug/debug_colors.cc index 89e3d0bc..db0fbd7 100644 --- a/cc/debug/debug_colors.cc +++ b/cc/debug/debug_colors.cc
@@ -78,7 +78,7 @@ return SkColorSetARGB(100, 80, 200, 200); } int DebugColors::HighResTileBorderWidth(float device_scale_factor) { - return Scale(3, device_scale_factor); + return Scale(1, device_scale_factor); } // Low-res tile borders are purple.
diff --git a/cc/layers/layer.cc b/cc/layers/layer.cc index 91fbb27..c51d673 100644 --- a/cc/layers/layer.cc +++ b/cc/layers/layer.cc
@@ -94,6 +94,8 @@ may_contain_video_(false), is_scroll_clip_layer_(false), needs_show_scrollbars_(false), + has_transform_node_(false), + has_scroll_node_(false), subtree_has_copy_request_(false), safe_opaque_background_color_(0), num_unclipped_descendants_(0) {} @@ -122,7 +124,6 @@ return; if (layer_tree_host_) { - layer_tree_host_->property_trees()->RemoveIdFromIdToIndexMaps(id()); layer_tree_host_->property_trees()->needs_rebuild = true; layer_tree_host_->UnregisterLayer(this); if (!layer_tree_host_->GetSettings().use_layer_lists && @@ -297,10 +298,9 @@ SetPropertyTreesNeedRebuild(); } - if (scrollable()) { - if (ScrollNode* node = - layer_tree_host_->property_trees() - ->scroll_tree.UpdateNodeFromOwningLayerId(id())) { + if (scrollable() && has_scroll_node_) { + if (ScrollNode* node = layer_tree_host_->property_trees()->scroll_tree.Node( + scroll_tree_index())) { node->bounds = inputs_.bounds; } } @@ -593,14 +593,14 @@ return; SetSubtreePropertyChanged(); - PropertyTrees* property_trees = layer_tree_host_->property_trees(); - if (TransformNode* transform_node = - property_trees->transform_tree.UpdateNodeFromOwningLayerId(id())) { - DCHECK_EQ(transform_tree_index(), transform_node->id); + TransformNode* transform_node = GetTransformNode(); + if (transform_node) { transform_node->update_post_local_transform(position, transform_origin()); transform_node->needs_local_transform_update = true; transform_node->transform_changed = true; layer_tree_host_->property_trees()->transform_tree.set_needs_update(true); + } else { + SetPropertyTreesNeedRebuild(); } SetNeedsCommit(); @@ -632,21 +632,26 @@ SetSubtreePropertyChanged(); if (layer_tree_host_) { - PropertyTrees* property_trees = layer_tree_host_->property_trees(); - if (TransformNode* transform_node = - property_trees->transform_tree.UpdateNodeFromOwningLayerId(id())) { - // We need to trigger a rebuild if we could have affected 2d axis - // alignment. We'll check to see if transform and inputs_.transform are - // axis align with respect to one another. - DCHECK_EQ(transform_tree_index(), transform_node->id); - bool preserves_2d_axis_alignment = - Are2dAxisAligned(inputs_.transform, transform); - transform_node->local = transform; - transform_node->needs_local_transform_update = true; - transform_node->transform_changed = true; - layer_tree_host_->property_trees()->transform_tree.set_needs_update(true); - if (!preserves_2d_axis_alignment) - SetPropertyTreesNeedRebuild(); + if (has_transform_node_) { + PropertyTrees* property_trees = layer_tree_host_->property_trees(); + if (TransformNode* transform_node = + property_trees->transform_tree.Node(transform_tree_index())) { + // We need to trigger a rebuild if we could have affected 2d axis + // alignment. We'll check to see if transform and inputs_.transform are + // axis align with respect to one another. + DCHECK_EQ(transform_tree_index(), transform_node->id); + bool preserves_2d_axis_alignment = + Are2dAxisAligned(inputs_.transform, transform); + transform_node->local = transform; + transform_node->needs_local_transform_update = true; + transform_node->transform_changed = true; + layer_tree_host_->property_trees()->transform_tree.set_needs_update( + true); + if (!preserves_2d_axis_alignment) + SetPropertyTreesNeedRebuild(); + } + } else { + SetPropertyTreesNeedRebuild(); } } @@ -665,15 +670,16 @@ return; SetSubtreePropertyChanged(); - PropertyTrees* property_trees = layer_tree_host_->property_trees(); - if (TransformNode* transform_node = - property_trees->transform_tree.UpdateNodeFromOwningLayerId(id())) { + TransformNode* transform_node = GetTransformNode(); + if (transform_node) { DCHECK_EQ(transform_tree_index(), transform_node->id); transform_node->update_pre_local_transform(transform_origin); transform_node->update_post_local_transform(position(), transform_origin); transform_node->needs_local_transform_update = true; transform_node->transform_changed = true; layer_tree_host_->property_trees()->transform_tree.set_needs_update(true); + } else { + SetPropertyTreesNeedRebuild(); } SetNeedsCommit(); @@ -839,10 +845,12 @@ if (!layer_tree_host_) return; - if (ScrollNode* node = layer_tree_host_->property_trees() - ->scroll_tree.UpdateNodeFromOwningLayerId(id())) { - node->user_scrollable_horizontal = horizontal; - node->user_scrollable_vertical = vertical; + if (has_scroll_node_) { + if (ScrollNode* node = layer_tree_host_->property_trees()->scroll_tree.Node( + scroll_tree_index())) { + node->user_scrollable_horizontal = horizontal; + node->user_scrollable_vertical = vertical; + } } SetNeedsCommit(); } @@ -1321,6 +1329,13 @@ inputs_.opacity = opacity; } +TransformNode* Layer::GetTransformNode() const { + return has_transform_node_ + ? layer_tree_host_->property_trees()->transform_tree.Node( + transform_tree_index_) + : nullptr; +} + void Layer::OnTransformAnimated(const gfx::Transform& transform) { inputs_.transform = transform; }
diff --git a/cc/layers/layer.h b/cc/layers/layer.h index a92218da..2663ce14 100644 --- a/cc/layers/layer.h +++ b/cc/layers/layer.h
@@ -174,6 +174,8 @@ return inputs_.sticky_position_constraint; } + TransformNode* GetTransformNode() const; + void SetTransform(const gfx::Transform& transform); const gfx::Transform& transform() const { return inputs_.transform; } @@ -427,6 +429,10 @@ // Called on the scroll layer to trigger showing the overlay scrollbars. void ShowScrollbars() { needs_show_scrollbars_ = true; } + bool has_transform_node() { return has_transform_node_; } + void SetHasTransformNode(bool val) { has_transform_node_ = val; } + void SetHasScrollNode(bool val) { has_scroll_node_ = val; } + protected: friend class LayerImpl; friend class TreeSynchronizer; @@ -630,6 +636,10 @@ bool may_contain_video_ : 1; bool is_scroll_clip_layer_ : 1; bool needs_show_scrollbars_ : 1; + // Whether the nodes referred to by *_tree_index_ + // "belong" to this layer. Only applicable if use_layer_lists is false. + bool has_transform_node_ : 1; + bool has_scroll_node_ : 1; // This value is valid only when LayerTreeHost::has_copy_request() is true bool subtree_has_copy_request_ : 1; SkColor safe_opaque_background_color_;
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc index ec86ec9..4e1c1fe 100644 --- a/cc/layers/layer_impl.cc +++ b/cc/layers/layer_impl.cc
@@ -543,13 +543,13 @@ if (masks_to_bounds()) { // If layer is clipping, then update the clip node using the new bounds. - if (ClipNode* clip_node = - property_trees->clip_tree.UpdateNodeFromOwningLayerId(id())) { - DCHECK_EQ(clip_node->id, clip_tree_index()); - clip_node->clip = gfx::RectF(gfx::PointF() + offset_to_transform_parent(), - gfx::SizeF(bounds())); - property_trees->clip_tree.set_needs_update(true); - } + ClipNode* clip_node = property_trees->clip_tree.Node(clip_tree_index()); + CHECK(clip_node); + DCHECK_EQ(clip_node->id, clip_tree_index()); + clip_node->clip = gfx::RectF(gfx::PointF() + offset_to_transform_parent(), + gfx::SizeF(bounds())); + property_trees->clip_tree.set_needs_update(true); + property_trees->full_tree_damaged = true; layer_tree_impl()->set_needs_update_draw_properties(); } else {
diff --git a/cc/layers/layer_impl_test_properties.cc b/cc/layers/layer_impl_test_properties.cc index 9de5d11..3c1e5a7 100644 --- a/cc/layers/layer_impl_test_properties.cc +++ b/cc/layers/layer_impl_test_properties.cc
@@ -41,8 +41,6 @@ auto it = std::find(children.begin(), children.end(), child); if (it != children.end()) children.erase(it); - owning_layer->layer_tree_impl()->property_trees()->RemoveIdFromIdToIndexMaps( - child->id()); auto layer = owning_layer->layer_tree_impl()->RemoveLayer(child->id()); owning_layer->layer_tree_impl()->BuildLayerListForTesting(); return layer;
diff --git a/cc/trees/layer_tree_host.cc b/cc/trees/layer_tree_host.cc index 64e4236..86a6ecec 100644 --- a/cc/trees/layer_tree_host.cc +++ b/cc/trees/layer_tree_host.cc
@@ -1378,10 +1378,7 @@ DCHECK(layer); layer->OnTransformAnimated(transform); - if (TransformNode* node = - property_trees_.transform_tree.UpdateNodeFromOwningLayerId( - layer->id())) { - DCHECK_EQ(layer->transform_tree_index(), node->id); + if (TransformNode* node = layer->GetTransformNode()) { if (node->local == transform) return;
diff --git a/cc/trees/layer_tree_host_common_unittest.cc b/cc/trees/layer_tree_host_common_unittest.cc index b165db4..7f5565b 100644 --- a/cc/trees/layer_tree_host_common_unittest.cc +++ b/cc/trees/layer_tree_host_common_unittest.cc
@@ -10111,8 +10111,6 @@ scroll_root1.user_scrollable_vertical = true; scroll_root1.transform_id = root1->transform_tree_index(); expected_scroll_tree.Insert(scroll_root1, 0); - expected_scroll_tree.SetOwningLayerIdForNode(expected_scroll_tree.back(), - root1->id()); // The node owned by parent2 ScrollNode scroll_parent2; @@ -10130,8 +10128,6 @@ scroll_parent2.user_scrollable_vertical = true; scroll_parent2.transform_id = parent2->transform_tree_index(); expected_scroll_tree.Insert(scroll_parent2, 1); - expected_scroll_tree.SetOwningLayerIdForNode(expected_scroll_tree.back(), - parent2->id()); // The node owned by child6 ScrollNode scroll_child6; @@ -10144,8 +10140,6 @@ scroll_child6.user_scrollable_vertical = true; scroll_child6.transform_id = child6->transform_tree_index(); expected_scroll_tree.Insert(scroll_child6, 2); - expected_scroll_tree.SetOwningLayerIdForNode(expected_scroll_tree.back(), - child6->id()); // The node owned by child7, child7 also owns a transform node ScrollNode scroll_child7; @@ -10159,8 +10153,6 @@ scroll_child7.user_scrollable_vertical = true; scroll_child7.transform_id = child7->transform_tree_index(); expected_scroll_tree.Insert(scroll_child7, 1); - expected_scroll_tree.SetOwningLayerIdForNode(expected_scroll_tree.back(), - child7->id()); // The node owned by grand_child11, grand_child11 also owns a transform node ScrollNode scroll_grand_child11; @@ -10172,8 +10164,6 @@ scroll_grand_child11.user_scrollable_vertical = true; scroll_grand_child11.transform_id = grand_child11->transform_tree_index(); expected_scroll_tree.Insert(scroll_grand_child11, 4); - expected_scroll_tree.SetOwningLayerIdForNode(expected_scroll_tree.back(), - grand_child11->id()); // The node owned by parent5 ScrollNode scroll_parent5; @@ -10186,8 +10176,6 @@ scroll_parent5.user_scrollable_vertical = true; scroll_parent5.transform_id = parent5->transform_tree_index(); expected_scroll_tree.Insert(scroll_parent5, 1); - expected_scroll_tree.SetOwningLayerIdForNode(expected_scroll_tree.back(), - parent5->id()); expected_scroll_tree.SetScrollOffset(parent2->element_id(), gfx::ScrollOffset(0, 0));
diff --git a/cc/trees/property_tree.cc b/cc/trees/property_tree.cc index ee31533..32ffa3ec 100644 --- a/cc/trees/property_tree.cc +++ b/cc/trees/property_tree.cc
@@ -76,7 +76,6 @@ nodes_.push_back(T()); back()->id = kRootNodeId; back()->parent_id = kInvalidNodeId; - owning_layer_id_to_node_index_.clear(); #if DCHECK_IS_ON() PropertyTree<T> tree; @@ -86,8 +85,7 @@ template <typename T> bool PropertyTree<T>::operator==(const PropertyTree<T>& other) const { - return nodes_ == other.nodes() && needs_update_ == other.needs_update() && - owning_layer_id_to_node_index_ == other.owning_layer_id_to_node_index_; + return nodes_ == other.nodes() && needs_update_ == other.needs_update(); } template <typename T> @@ -790,12 +788,6 @@ return node->subtree_hidden ? 0.f : node->opacity; } -#if DCHECK_IS_ON() -bool EffectTree::SupportsNodeLookupFromOwningLayerId() const { - return false; -} -#endif - void EffectTree::UpdateOpacities(EffectNode* node, EffectNode* parent_node) { node->screen_space_opacity = EffectiveOpacity(node); @@ -1798,12 +1790,6 @@ inner_viewport_scroll_bounds_delta_ = bounds_delta; } -void PropertyTrees::RemoveIdFromIdToIndexMaps(int id) { - transform_tree.SetOwningLayerIdForNode(nullptr, id); - clip_tree.SetOwningLayerIdForNode(nullptr, id); - scroll_tree.SetOwningLayerIdForNode(nullptr, id); -} - void PropertyTrees::UpdateChangeTracking() { for (int id = EffectTree::kContentsRootNodeId; id < static_cast<int>(effect_tree.size()); ++id) {
diff --git a/cc/trees/property_tree.h b/cc/trees/property_tree.h index 18ce854bd..2171043 100644 --- a/cc/trees/property_tree.h +++ b/cc/trees/property_tree.h
@@ -102,62 +102,8 @@ void AsValueInto(base::trace_event::TracedValue* value) const; - T* UpdateNodeFromOwningLayerId(int id) { -#if DCHECK_IS_ON() - DCHECK(SupportsNodeLookupFromOwningLayerId()); -#endif - int index = FindNodeIndexFromOwningLayerId(id); - if (index == kInvalidNodeId) { - DCHECK(property_trees()->is_main_thread); - property_trees()->needs_rebuild = true; - } - - return Node(index); - } - - void SetOwningLayerIdForNode(const T* node, int id) { -#if DCHECK_IS_ON() - DCHECK(SupportsNodeLookupFromOwningLayerId()); -#endif - if (!node) { - owning_layer_id_to_node_index_[id] = kInvalidNodeId; - return; - } - - DCHECK(node == Node(node->id)); - owning_layer_id_to_node_index_[id] = node->id; - } - protected: -#if DCHECK_IS_ON() - virtual bool SupportsNodeLookupFromOwningLayerId() const { return true; } -#endif - - private: - const T* FindNodeFromOwningLayerId(int id) const { -#if DCHECK_IS_ON() - DCHECK(SupportsNodeLookupFromOwningLayerId()); -#endif - return Node(FindNodeIndexFromOwningLayerId(id)); - } - int FindNodeIndexFromOwningLayerId(int id) const { -#if DCHECK_IS_ON() - DCHECK(SupportsNodeLookupFromOwningLayerId()); -#endif - auto iter = owning_layer_id_to_node_index_.find(id); - if (iter == owning_layer_id_to_node_index_.end()) - return kInvalidNodeId; - else - return iter->second; - } - std::vector<T> nodes_; - - // Maps from layer id to the property tree node index. This container is - // typically very small and the memory overhead of unordered_map will - // dominate so use a flat_map. See http://crbug.com/709243 - base::flat_map<int, int> owning_layer_id_to_node_index_; - bool needs_update_; PropertyTrees* property_trees_; }; @@ -423,11 +369,6 @@ std::vector<std::unique_ptr<RenderSurfaceImpl>>* old_render_surfaces, LayerTreeImpl* layer_tree_impl); - protected: -#if DCHECK_IS_ON() - bool SupportsNodeLookupFromOwningLayerId() const override; -#endif - private: void UpdateOpacities(EffectNode* node, EffectNode* parent_node); void UpdateIsDrawn(EffectNode* node, EffectNode* parent_node); @@ -701,7 +642,6 @@ void SetInnerViewportContainerBoundsDelta(gfx::Vector2dF bounds_delta); void SetOuterViewportContainerBoundsDelta(gfx::Vector2dF bounds_delta); void SetInnerViewportScrollBoundsDelta(gfx::Vector2dF bounds_delta); - void RemoveIdFromIdToIndexMaps(int id); void UpdateChangeTracking(); void PushChangeTrackingTo(PropertyTrees* tree); void ResetAllChangeTracking();
diff --git a/cc/trees/property_tree_builder.cc b/cc/trees/property_tree_builder.cc index 4d5e088..5a45e96 100644 --- a/cc/trees/property_tree_builder.cc +++ b/cc/trees/property_tree_builder.cc
@@ -285,8 +285,6 @@ } data_for_children->clip_tree_parent = data_for_children->property_trees->clip_tree.Insert(node, parent_id); - data_for_children->property_trees->clip_tree.SetOwningLayerIdForNode( - data_for_children->property_trees->clip_tree.back(), layer->id()); } layer->SetClipTreeIndex(data_for_children->clip_tree_parent); @@ -431,8 +429,6 @@ TransformNode* node = data_for_children->property_trees->transform_tree.back(); layer->SetTransformTreeIndex(node->id); - data_for_children->property_trees->transform_tree.SetOwningLayerIdForNode( - node, layer->id()); // For animation subsystem purposes, if this layer has a compositor element // id, we build a map from that id to this transform node. @@ -1002,6 +998,16 @@ return layer->test_properties()->user_scrollable_vertical; } +void SetHasTransformNode(LayerImpl* layer, bool val) {} +void SetHasTransformNode(Layer* layer, bool val) { + layer->SetHasTransformNode(val); +} + +void SetHasScrollNode(LayerImpl* layer, bool val) {} +void SetHasScrollNode(Layer* layer, bool val) { + layer->SetHasScrollNode(val); +} + template <typename LayerType> void AddScrollNodeIfNeeded( const DataForRecursion<LayerType>& data_from_ancestor, @@ -1033,6 +1039,7 @@ if (!requires_node) { node_id = parent_id; data_for_children->scroll_tree_parent = node_id; + SetHasScrollNode(layer, false); } else { ScrollNode node; node.owning_layer_id = layer->id(); @@ -1074,8 +1081,6 @@ node.main_thread_scrolling_reasons; data_for_children->scroll_tree_parent_created_by_uninheritable_criteria = scroll_node_uninheritable_criteria; - data_for_children->property_trees->scroll_tree.SetOwningLayerIdForNode( - data_for_children->property_trees->scroll_tree.back(), layer->id()); // For animation subsystem purposes, if this layer has a compositor element // id, we build a map from that id to this scroll node. if (layer->element_id()) { @@ -1087,6 +1092,7 @@ data_for_children->property_trees->scroll_tree.SetBaseScrollOffset( layer->element_id(), layer->CurrentScrollOffset()); } + SetHasScrollNode(layer, true); } layer->SetScrollTreeIndex(node_id); @@ -1166,6 +1172,7 @@ bool created_transform_node = AddTransformNodeIfNeeded( data_from_parent, layer, created_render_surface, &data_for_children); + SetHasTransformNode(layer, created_transform_node); AddClipNodeIfNeeded(data_from_parent, layer, created_transform_node, &data_for_children);
diff --git a/chrome/BUILD.gn b/chrome/BUILD.gn index 813057f..7024bd3 100644 --- a/chrome/BUILD.gn +++ b/chrome/BUILD.gn
@@ -389,6 +389,7 @@ "//chrome/common:features", "//chrome/install_static:install_static_util", "//chrome/install_static:secondary_module", + "//chrome/profiling", "//chrome_elf", "//components/crash/content/app", "//components/policy:generated",
diff --git a/chrome/VERSION b/chrome/VERSION index 8383d27..5ec670d3 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=61 MINOR=0 -BUILD=3131 +BUILD=3132 PATCH=0
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java index ffa8bf8..1d748ee5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr_shell/VrShellImpl.java
@@ -277,7 +277,7 @@ mRenderToSurfaceLayoutParent = new FrameLayout(mActivity) { @Override public boolean dispatchTouchEvent(MotionEvent event) { - getContainer().dispatchTouchEvent(event); + getUiLayout().dispatchTouchEvent(event); return true; } };
diff --git a/chrome/app/DEPS b/chrome/app/DEPS index 2b65bf89..67aebe80 100644 --- a/chrome/app/DEPS +++ b/chrome/app/DEPS
@@ -7,6 +7,7 @@ "+chrome/installer/util", "+chrome/install_static", "+chrome/gpu/chrome_content_gpu_client.h", + "+chrome/profiling/profiling_main.h", "+chrome/renderer/chrome_content_renderer_client.h", "+chrome/utility/chrome_content_utility_client.h", "+chrome_elf/chrome_elf_main.h",
diff --git a/chrome/app/chrome_main.cc b/chrome/app/chrome_main.cc index aec129c..9d09439d 100644 --- a/chrome/app/chrome_main.cc +++ b/chrome/app/chrome_main.cc
@@ -15,6 +15,10 @@ #include "headless/public/headless_shell.h" #include "ui/gfx/switches.h" +#if BUILDFLAG(ENABLE_OOP_HEAP_PROFILING) +#include "chrome/profiling/profiling_main.h" +#endif + #if BUILDFLAG(ENABLE_PACKAGE_MASH_SERVICES) #include "services/service_manager/runner/common/client_util.h" #endif @@ -92,6 +96,7 @@ const base::CommandLine* command_line(base::CommandLine::ForCurrentProcess()); ALLOW_UNUSED_LOCAL(command_line); + // Chrome-specific process modes. #if defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) if (command_line->HasSwitch(switches::kHeadless)) { #if defined(OS_MACOSX) @@ -101,6 +106,13 @@ } #endif // defined(OS_LINUX) || defined(OS_MACOSX) || defined(OS_WIN) +#if BUILDFLAG(ENABLE_OOP_HEAP_PROFILING) + if (command_line->GetSwitchValueASCII(switches::kProcessType) == + "profiling") { + return profiling::ProfilingMain(*command_line); + } +#endif // ENABLE_OOP_HEAP_PROFILING + #if defined(OS_CHROMEOS) && BUILDFLAG(ENABLE_PACKAGE_MASH_SERVICES) if (service_manager::ServiceManagerIsRemote()) params.env_mode = aura::Env::Mode::MUS;
diff --git a/chrome/browser/android/vr_shell/vr_shell_gl.cc b/chrome/browser/android/vr_shell/vr_shell_gl.cc index bdc3ee3..ff74f29 100644 --- a/chrome/browser/android/vr_shell/vr_shell_gl.cc +++ b/chrome/browser/android/vr_shell/vr_shell_gl.cc
@@ -380,6 +380,9 @@ DCHECK(submit_client_.get()); TRACE_EVENT0("gpu", "VrShellGl::SubmitWebVRFrame"); + webvr_time_js_submit_[frame_index % kPoseRingBufferSize] = + base::TimeTicks::Now(); + // Swapping twice on a Surface without calling updateTexImage in // between can lose frames, so don't draw+swap if we already have // a pending frame we haven't consumed yet. @@ -450,6 +453,8 @@ vr::Mat4f head_pose; device::GvrDelegate::GetGvrPoseWithNeckModel(gvr_api_.get(), &head_pose); webvr_head_pose_.assign(kPoseRingBufferSize, head_pose); + webvr_time_pose_.assign(kPoseRingBufferSize, base::TimeTicks()); + webvr_time_js_submit_.assign(kPoseRingBufferSize, base::TimeTicks()); std::vector<gvr::BufferSpec> specs; // For kFramePrimaryBuffer (primary VrShell and WebVR content) @@ -1105,6 +1110,20 @@ submit_client_->OnSubmitFrameRendered(); } + if (ShouldDrawWebVr()) { + base::TimeTicks now = base::TimeTicks::Now(); + base::TimeTicks pose_time = + webvr_time_pose_[frame_index % kPoseRingBufferSize]; + base::TimeTicks js_submit_time = + webvr_time_js_submit_[frame_index % kPoseRingBufferSize]; + int64_t pose_to_js_submit_us = + (js_submit_time - pose_time).InMicroseconds(); + webvr_js_time_->AddSample(pose_to_js_submit_us); + int64_t js_submit_to_gvr_submit_us = + (now - js_submit_time).InMicroseconds(); + webvr_render_time_->AddSample(js_submit_to_gvr_submit_us); + } + // After saving the timestamp, fps will be available via GetFPS(). // TODO(vollick): enable rendering of this framerate in a HUD. fps_meter_->AddFrame(base::TimeTicks::Now()); @@ -1591,6 +1610,7 @@ prediction_nanos); webvr_head_pose_[frame_index % kPoseRingBufferSize] = head_mat; + webvr_time_pose_[frame_index % kPoseRingBufferSize] = base::TimeTicks::Now(); std::move(callback).Run(std::move(pose), time, frame_index, device::mojom::VRVSyncProvider::Status::SUCCESS);
diff --git a/chrome/browser/android/vr_shell/vr_shell_gl.h b/chrome/browser/android/vr_shell/vr_shell_gl.h index a0ea1c064..6ea66a9 100644 --- a/chrome/browser/android/vr_shell/vr_shell_gl.h +++ b/chrome/browser/android/vr_shell/vr_shell_gl.h
@@ -251,6 +251,8 @@ gfx::Size webvr_surface_size_ = {0, 0}; std::vector<vr::Mat4f> webvr_head_pose_; + std::vector<base::TimeTicks> webvr_time_pose_; + std::vector<base::TimeTicks> webvr_time_js_submit_; bool web_vr_mode_; bool ready_to_draw_ = false; bool surfaceless_rendering_;
diff --git a/chrome/browser/offline_pages/background_loader_offliner.cc b/chrome/browser/offline_pages/background_loader_offliner.cc index 72f6705..91deb257 100644 --- a/chrome/browser/offline_pages/background_loader_offliner.cc +++ b/chrome/browser/offline_pages/background_loader_offliner.cc
@@ -28,6 +28,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/browser/web_contents_user_data.h" #include "content/public/common/previews_state.h" +#include "net/http/http_response_headers.h" namespace offline_pages { @@ -70,11 +71,11 @@ return adjusted_histogram_name; } -void RecordErrorCauseUMA(const ClientId& client_id, net::Error error_code) { +void RecordErrorCauseUMA(const ClientId& client_id, int error_code) { UMA_HISTOGRAM_SPARSE_SLOWLY( AddHistogramSuffix(client_id, - "OfflinePages.Background.BackgroundLoadingFailedCode"), - std::abs(error_code)); + "OfflinePages.Background.LoadingErrorStatusCode"), + error_code); } void RecordOffliningPreviewsUMA(const ClientId& client_id, @@ -332,7 +333,7 @@ // Mark as error page. Resetting here causes RecordNavigationMetrics to crash. if (navigation_handle->IsErrorPage()) { RecordErrorCauseUMA(pending_request_->client_id(), - navigation_handle->GetNetErrorCode()); + static_cast<int>(navigation_handle->GetNetErrorCode())); switch (navigation_handle->GetNetErrorCode()) { case net::ERR_INTERNET_DISCONNECTED: page_load_state_ = DELAY_RETRY; @@ -340,6 +341,17 @@ default: page_load_state_ = RETRIABLE; } + } else { + int status_code = navigation_handle->GetResponseHeaders()->response_code(); + // 2XX and 3XX are ok because they indicate success or redirection. + // We track 301 because it's MOVED_PERMANENTLY and usually accompanies an + // error page with new address. + // 400+ codes are client and server errors. + // We skip 418 because it's a teapot. + if (status_code == 301 || (status_code >= 400 && status_code != 418)) { + RecordErrorCauseUMA(pending_request_->client_id(), status_code); + page_load_state_ = RETRIABLE; + } } // Record UMA if we are offlining a previvew instead of an unmodified page. @@ -494,7 +506,14 @@ void BackgroundLoaderOffliner::ResetState() { pending_request_.reset(); - snapshot_controller_.reset(); + // Stop snapshot controller from triggering any more events. + snapshot_controller_->Stop(); + // Delete the snapshot controller after stack unwinds, so we don't + // corrupt stack in some edge cases. Deleting it soon should be safe because + // we check against pending_request_ with every action, and snapshot + // controller is configured to only call StartSnapshot once for BGL. + base::ThreadTaskRunnerHandle::Get()->DeleteSoon( + FROM_HERE, snapshot_controller_.release()); page_load_state_ = SUCCESS; network_bytes_ = 0LL; is_low_bar_met_ = false;
diff --git a/chrome/browser/offline_pages/background_loader_offliner_unittest.cc b/chrome/browser/offline_pages/background_loader_offliner_unittest.cc index b76fb25..08529ca4 100644 --- a/chrome/browser/offline_pages/background_loader_offliner_unittest.cc +++ b/chrome/browser/offline_pages/background_loader_offliner_unittest.cc
@@ -30,6 +30,7 @@ #include "content/public/test/test_browser_thread_bundle.h" #include "content/public/test/web_contents_tester.h" #include "net/base/net_errors.h" +#include "net/http/http_response_headers.h" #include "testing/gtest/include/gtest/gtest.h" namespace offline_pages { @@ -265,15 +266,6 @@ cancel_callback_called_ = true; } -// Two tests crash roughly 20% of runs on Android. http://crbug.com/722556. -#if defined(OS_ANDROID) -#define MAYBE_FailsOnErrorPage DISABLED_FailsOnErrorPage -#define MAYBE_NoNextOnInternetDisconnected DISABLED_NoNextOnInternetDisconnected -#else -#define MAYBE_FailsOnErrorPage FailsOnErrorPage -#define MAYBE_NoNextOnInternetDisconnected NoNextOnInternetDisconnected -#endif - TEST_F(BackgroundLoaderOfflinerTest, LoadTerminationListenerSetup) { // Verify that back pointer to offliner is set up in the listener. Offliner* base_offliner = offliner(); @@ -522,7 +514,7 @@ EXPECT_EQ(Offliner::RequestStatus::LOADING_FAILED, request_status()); } -TEST_F(BackgroundLoaderOfflinerTest, MAYBE_FailsOnErrorPage) { +TEST_F(BackgroundLoaderOfflinerTest, FailsOnErrorPage) { base::Time creation_time = base::Time::Now(); SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time, kUserRequested); @@ -537,8 +529,8 @@ // NavigationHandle destruction will trigger DidFinishNavigation code. handle.reset(); histograms().ExpectBucketCount( - "OfflinePages.Background.BackgroundLoadingFailedCode.async_loading", - 105, // ERR_NAME_NOT_RESOLVED + "OfflinePages.Background.LoadingErrorStatusCode.async_loading", + -105, // ERR_NAME_NOT_RESOLVED 1); CompleteLoading(); PumpLoop(); @@ -547,7 +539,7 @@ EXPECT_EQ(Offliner::RequestStatus::LOADING_FAILED, request_status()); } -TEST_F(BackgroundLoaderOfflinerTest, MAYBE_NoNextOnInternetDisconnected) { +TEST_F(BackgroundLoaderOfflinerTest, NoNextOnInternetDisconnected) { base::Time creation_time = base::Time::Now(); SavePageRequest request(kRequestId, kHttpUrl, kClientId, creation_time, kUserRequested); @@ -590,6 +582,12 @@ content::PreviewsTypes::PREVIEWS_NO_TRANSFORM); std::unique_ptr<content::NavigationData> navigation_data( chrome_navigation_data.release()); + offliner()->web_contents_tester()->SetNavigationData( + handle.get(), std::move(navigation_data)); + scoped_refptr<net::HttpResponseHeaders> header( + new net::HttpResponseHeaders("HTTP/1.1 200 OK")); + offliner()->web_contents_tester()->SetHttpResponseHeaders(handle.get(), + header); // Call DidFinishNavigation with handle. offliner()->DidFinishNavigation(handle.get()); @@ -620,6 +618,10 @@ chrome_navigation_data.release()); offliner()->web_contents_tester()->SetNavigationData( handle.get(), std::move(navigation_data)); + scoped_refptr<net::HttpResponseHeaders> header( + new net::HttpResponseHeaders("HTTP/1.1 200 OK")); + offliner()->web_contents_tester()->SetHttpResponseHeaders(handle.get(), + header); // Call DidFinishNavigation with handle. offliner()->DidFinishNavigation(handle.get());
diff --git a/chrome/browser/permissions/permission_dialog_delegate.cc b/chrome/browser/permissions/permission_dialog_delegate.cc index c3962c7..ff6fbc9 100644 --- a/chrome/browser/permissions/permission_dialog_delegate.cc +++ b/chrome/browser/permissions/permission_dialog_delegate.cc
@@ -148,11 +148,11 @@ return; } - // TODO(timloh): Handle grouped media permissions (camera + microphone). - DCHECK_EQ(1u, permission_prompt_->PermissionCount()); - - std::vector<int> content_settings_types{ - permission_prompt_->GetContentSettingType(0)}; + std::vector<int> content_settings_types; + for (size_t i = 0; i < permission_prompt_->PermissionCount(); ++i) { + content_settings_types.push_back( + permission_prompt_->GetContentSettingType(i)); + } j_delegate_.Reset(Java_PermissionDialogDelegate_create( env, reinterpret_cast<uintptr_t>(this), tab_->GetJavaObject(),
diff --git a/chrome/browser/permissions/permission_prompt_android.cc b/chrome/browser/permissions/permission_prompt_android.cc index 7e47372..9893147 100644 --- a/chrome/browser/permissions/permission_prompt_android.cc +++ b/chrome/browser/permissions/permission_prompt_android.cc
@@ -29,15 +29,14 @@ } void PermissionPromptAndroid::Show() { - // Grouped permission requests are not yet supported in dialogs. - // TODO(timloh): Handle grouped media permissions (camera + microphone). - if (delegate_->Requests().size() == 1) { - bool has_gesture = delegate_->Requests()[0]->GetGestureType() == - PermissionRequestGestureType::GESTURE; - if (PermissionDialogDelegate::ShouldShowDialog(has_gesture)) { - PermissionDialogDelegate::Create(web_contents_, this); - return; - } + bool has_gesture = true; + for (const PermissionRequest* request : delegate_->Requests()) { + has_gesture &= + request->GetGestureType() == PermissionRequestGestureType::GESTURE; + } + if (PermissionDialogDelegate::ShouldShowDialog(has_gesture)) { + PermissionDialogDelegate::Create(web_contents_, this); + return; } InfoBarService* infobar_service =
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller.mm index 4942e4b..c2e0a4fd 100644 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller.mm +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller.mm
@@ -267,7 +267,7 @@ if (!textFieldEditor_) textFieldEditor_.reset([[DialogTextFieldEditor alloc] init]); - return textFieldEditor_.get(); + return textFieldEditor_.autorelease(); } // Shows the bookmark editor sheet for more advanced editing.
diff --git a/chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller_unittest.mm b/chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller_unittest.mm index 69eef30..64f3fa0 100644 --- a/chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller_unittest.mm +++ b/chrome/browser/ui/cocoa/bookmarks/bookmark_bubble_controller_unittest.mm
@@ -485,6 +485,29 @@ EXPECT_EQ(0u, [[controller.syncPromoPlaceholder subviews] count]); } +// Tests to see if setting the title textfield multiple times will crash. +// See crbug.com/731284. +TEST_F(BookmarkBubbleControllerTest, TextfieldChanges) { + BookmarkModel* model = GetBookmarkModel(); + EXPECT_TRUE(model); + const BookmarkNode* bookmark_bar_node = model->bookmark_bar_node(); + EXPECT_TRUE(bookmark_bar_node); + const BookmarkNode* node = + model->AddURL(bookmark_bar_node, 0, ASCIIToUTF16("short-title"), + GURL(kTestBookmarkURL)); + + BookmarkBubbleController* controller = ControllerForNode(node); + EXPECT_TRUE(controller); + + const BookmarkNode* parent = node->parent(); + EXPECT_TRUE(parent); + + [controller setTitle:@"test" parentFolder:parent]; + [controller setTitle:@"" parentFolder:parent]; + [controller setTitle:@" " parentFolder:parent]; + [controller setTitle:@" test 2 " parentFolder:parent]; +} + // Verifies the bubble's touch bar. TEST_F(BookmarkBubbleControllerTest, TouchBar) { if (!base::mac::IsAtLeastOS10_12())
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn index e975e3e0..3fb26c6 100644 --- a/chrome/common/BUILD.gn +++ b/chrome/common/BUILD.gn
@@ -38,6 +38,7 @@ "ENABLE_HANGOUT_SERVICES_EXTENSION=$enable_hangout_services_extension", "ENABLE_ONE_CLICK_SIGNIN=$enable_one_click_signin", "ENABLE_NATIVE_NOTIFICATIONS=$enable_native_notifications", + "ENABLE_OOP_HEAP_PROFILING=$enable_oop_heap_profiling", "ENABLE_PACKAGE_MASH_SERVICES=$enable_package_mash_services", "ENABLE_SERVICE_DISCOVERY=$enable_service_discovery", "ENABLE_SESSION_SERVICE=$enable_session_service",
diff --git a/chrome/common/features.gni b/chrome/common/features.gni index 760668f..de9a2fc39 100644 --- a/chrome/common/features.gni +++ b/chrome/common/features.gni
@@ -53,6 +53,10 @@ # /device/gamepad as backend. enable_exo_ozone_gamepad = use_ozone + # Enable out-of-process logging of heap profiling data. Currently being + # implemented. + enable_oop_heap_profiling = false + # Set to true to bundle all the mash related mojo services into chrome. # Specify --mash to chrome to have chrome start the mash environment. enable_package_mash_services = is_chromeos
diff --git a/chrome/installer/util/BUILD.gn b/chrome/installer/util/BUILD.gn index e545edf..2307197b 100644 --- a/chrome/installer/util/BUILD.gn +++ b/chrome/installer/util/BUILD.gn
@@ -57,8 +57,14 @@ "chrome_browser_operations.h", "delete_after_reboot_helper.cc", "delete_after_reboot_helper.h", + "experiment.cc", + "experiment.h", "experiment_labels.cc", "experiment_labels.h", + "experiment_metrics.cc", + "experiment_metrics.h", + "experiment_storage.cc", + "experiment_storage.h", "google_chrome_distribution.cc", "google_chrome_distribution.h", "html_dialog.h", @@ -294,6 +300,8 @@ "delete_tree_work_item_unittest.cc", "duplicate_tree_detector_unittest.cc", "experiment_labels_unittest.cc", + "experiment_storage_unittest.cc", + "experiment_unittest.cc", "google_update_settings_unittest.cc", "install_util_unittest.cc", "installer_util_test_common.cc",
diff --git a/chrome/installer/util/experiment.cc b/chrome/installer/util/experiment.cc new file mode 100644 index 0000000..d497b10 --- /dev/null +++ b/chrome/installer/util/experiment.cc
@@ -0,0 +1,152 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/installer/util/experiment.h" + +#include <algorithm> +#include <cmath> + +#include "base/logging.h" + +namespace installer { + +namespace { + +// Returns closest integer of logarithm of |x| with base |b|. +double LogFloor(double x, double b) { + return std::round(std::log(x) / std::log(b)); +} + +// Returns the base to use for exponential buckets so that buckets +// 0,1,.. 2^|bits|-1 cover range [0, max_val]. If this function return b +// then Bucket value i will store values from [b^i, b^(i+1)] +double ExpBucketBase(int max_val, int bits) { + return std::exp(std::log(max_val + 1) / ((1 << bits) - 1)); +} + +} // namespace + +Experiment::Experiment() = default; +Experiment::Experiment(Experiment&&) = default; +Experiment::Experiment(const Experiment&) = default; +Experiment::~Experiment() = default; + +void Experiment::InitializeFromMetrics(const ExperimentMetrics& metrics) { + *this = Experiment(); + DCHECK(metrics.InInitialState() || + metrics.state == ExperimentMetrics::kGroupAssigned); + metrics_ = metrics; + state_ = metrics.state; + group_ = metrics.group; + if (metrics.state == ExperimentMetrics::kUninitialized) { + // Reset any value stored in experiment. + toast_location_ = ExperimentMetrics::kOverTaskbarPin; + inactive_days_ = 0; + toast_count_ = 0; + first_display_time_ = base::Time(); + latest_display_time_ = base::Time(); + user_session_uptime_ = base::TimeDelta(); + action_delay_ = base::TimeDelta(); + } +} + +void Experiment::SetState(ExperimentMetrics::State state) { + DCHECK_NE(ExperimentMetrics::kUninitialized, state); + state_ = state; + metrics_.state = state; +} + +void Experiment::AssignGroup(int group) { + DCHECK_GE(group, 0); + DCHECK_LT(group, ExperimentMetrics::kNumGroups); + DCHECK(metrics_.InInitialState()); + + group_ = group; + metrics_.group = group; + SetState(ExperimentMetrics::kGroupAssigned); +} + +void Experiment::SetToastLocation(ExperimentMetrics::ToastLocation location) { + DCHECK(!metrics_.InTerminalState()); + DCHECK(!metrics_.InInitialState()); + toast_location_ = location; + metrics_.toast_location = location; +} + +void Experiment::SetInactiveDays(int days) { + DCHECK(!metrics_.InTerminalState()); + DCHECK(!metrics_.InInitialState()); + DCHECK_GE(days, 0); + inactive_days_ = days; + double log_base = ExpBucketBase(ExperimentMetrics::kMaxLastUsed, + ExperimentMetrics::kLastUsedBucketBits); + metrics_.last_used_bucket = + LogFloor(1 + std::min(days, ExperimentMetrics::kMaxLastUsed), log_base); +} + +void Experiment::SetToastCount(int count) { + DCHECK(!metrics_.InTerminalState()); + DCHECK(!metrics_.InInitialState()); + toast_count_ = count; + metrics_.toast_count = std::min(count, ExperimentMetrics::kMaxToastCount); +} + +void Experiment::SetDisplayTime(base::Time time) { + DCHECK(!metrics_.InTerminalState()); + DCHECK(!metrics_.InInitialState()); + if (metrics_.first_toast_offset_days == 0) { + // This is the first time toast is shown so add user to today's cohort. + first_display_time_ = time; + metrics_.first_toast_offset_days = + (time - base::Time::UnixEpoch() - + base::TimeDelta::FromSeconds( + ExperimentMetrics::kExperimentStartSeconds)) + .InDays(); + // If display time is outside the experiment range (possible due to + // invalid local time), then set it to be kMaxFirstToastOffsetDays. + if (metrics_.first_toast_offset_days < 0) { + metrics_.first_toast_offset_days = + ExperimentMetrics::kMaxFirstToastOffsetDays; + } else { + metrics_.first_toast_offset_days = + std::min(metrics_.first_toast_offset_days, + ExperimentMetrics::kMaxFirstToastOffsetDays); + } + } + latest_display_time_ = time; + metrics_.toast_hour = (time - time.LocalMidnight()).InHours(); + DCHECK_LE(metrics_.toast_hour, 24); + DCHECK_GE(metrics_.toast_hour, 0); +} + +void Experiment::SetUserSessionUptime(base::TimeDelta time_delta) { + DCHECK(!metrics_.InTerminalState()); + DCHECK(!metrics_.InInitialState()); + user_session_uptime_ = time_delta; + double log_base = ExpBucketBase(ExperimentMetrics::kMaxSessionLength, + ExperimentMetrics::kSessionLengthBucketBits); + if (time_delta.InMinutes() < 0 || + time_delta.InMinutes() > ExperimentMetrics::kMaxSessionLength) { + time_delta = base::TimeDelta::FromMinutes( + ExperimentMetrics::ExperimentMetrics::kMaxSessionLength); + } + metrics_.session_length_bucket = + LogFloor(1 + time_delta.InMinutes(), log_base); +} + +void Experiment::SetActionDelay(base::TimeDelta time_delta) { + DCHECK(!metrics_.InTerminalState()); + DCHECK(!metrics_.InInitialState()); + action_delay_ = time_delta; + if (time_delta.InSeconds() < 0 || + time_delta.InSeconds() > ExperimentMetrics::kMaxActionDelay) { + time_delta = + base::TimeDelta::FromSeconds(ExperimentMetrics::kMaxActionDelay); + } + double log_base = ExpBucketBase(ExperimentMetrics::kMaxActionDelay, + ExperimentMetrics::kActionDelayBucketBits); + metrics_.action_delay_bucket = LogFloor(1 + time_delta.InSeconds(), log_base); +} + +} // namespace installer
diff --git a/chrome/installer/util/experiment.h b/chrome/installer/util/experiment.h new file mode 100644 index 0000000..cc75f1e --- /dev/null +++ b/chrome/installer/util/experiment.h
@@ -0,0 +1,96 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_INSTALLER_UTIL_EXPERIMENT_H_ +#define CHROME_INSTALLER_UTIL_EXPERIMENT_H_ + +#include "base/time/time.h" +#include "chrome/installer/util/experiment_metrics.h" + +namespace installer { + +class ExperimentStorage; + +// The experiment state for the current user. Experiment state is a combination +// of the per-install ExperimentMetrics and the per-user experiment data. +class Experiment { + public: + Experiment(); + Experiment(Experiment&&); + Experiment(const Experiment&); + ~Experiment(); + Experiment& operator=(Experiment&&) = default; + Experiment& operator=(const Experiment&) = default; + + // Initializes this instance based on |metrics|. + void InitializeFromMetrics(const ExperimentMetrics& metrics); + + // Moves this user into |state|, updating metrics as appropriate. + void SetState(ExperimentMetrics::State state); + + // Assigns this user to |group|. + void AssignGroup(int group); + + // Setters for storing data relating to experiment. These should only be + // called if the experiment is between initial and terminal states. + + // Fill toast location value. + void SetToastLocation(ExperimentMetrics::ToastLocation location); + + // Fill number of days user was inactive before toast was shown. + void SetInactiveDays(int days); + + // Fill number of times toast was displayed. + void SetToastCount(int count); + + // Fill fine grained timestamp for first time the toast was shown. + void SetDisplayTime(base::Time time); + + // Time delta between user session start and toast display. + void SetUserSessionUptime(base::TimeDelta time_delta); + + // Time delta between toast display and action taken on toast display. + void SetActionDelay(base::TimeDelta time_delta); + + const ExperimentMetrics& metrics() const { return metrics_; } + + ExperimentMetrics::State state() const { return state_; } + + int group() const { return group_; } + + ExperimentMetrics::ToastLocation toast_location() const { + return toast_location_; + } + + int inactive_days() const { return inactive_days_; } + + int toast_count() const { return toast_count_; } + + base::Time first_display_time() const { return first_display_time_; } + + base::Time latest_display_time() const { return latest_display_time_; } + + base::TimeDelta user_session_uptime() const { return user_session_uptime_; } + + base::TimeDelta action_delay() const { return action_delay_; } + + private: + friend class ExperimentStorage; + + ExperimentMetrics metrics_ = ExperimentMetrics(); + ExperimentMetrics::State state_ = ExperimentMetrics::kUninitialized; + int group_ = 0; + ExperimentMetrics::ToastLocation toast_location_ = + ExperimentMetrics::kOverTaskbarPin; + int inactive_days_ = 0; + int toast_count_ = 0; + base::Time first_display_time_; + base::Time latest_display_time_; + base::TimeDelta user_session_uptime_; + base::TimeDelta action_delay_; +}; + +} // namespace installer + +#endif // CHROME_INSTALLER_UTIL_EXPERIMENT_H_
diff --git a/chrome/installer/util/experiment_metrics.cc b/chrome/installer/util/experiment_metrics.cc new file mode 100644 index 0000000..66d8347e --- /dev/null +++ b/chrome/installer/util/experiment_metrics.cc
@@ -0,0 +1,30 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/installer/util/experiment_metrics.h" + +namespace installer { + +bool ExperimentMetrics::InInitialState() const { + return state < kGroupAssigned; +} + +bool ExperimentMetrics::InTerminalState() const { + return state == kSelectedNoThanks || state == kSelectedOpenChromeAndCrash || + state == kSelectedOpenChromeAndNoCrash || state == kSelectedClose || + state == kUserLogOff; +} + +bool ExperimentMetrics::operator==(const ExperimentMetrics& other) const { + return group == other.group && state == other.state && + toast_location == other.toast_location && + toast_count == other.toast_count && + first_toast_offset_days == other.first_toast_offset_days && + toast_hour == other.toast_hour && + last_used_bucket == other.last_used_bucket && + action_delay_bucket == other.action_delay_bucket && + session_length_bucket == other.session_length_bucket; +} + +} // namespace installer
diff --git a/chrome/installer/util/experiment_metrics.h b/chrome/installer/util/experiment_metrics.h new file mode 100644 index 0000000..fae52636 --- /dev/null +++ b/chrome/installer/util/experiment_metrics.h
@@ -0,0 +1,169 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_INSTALLER_UTIL_EXPERIMENT_METRICS_H_ +#define CHROME_INSTALLER_UTIL_EXPERIMENT_METRICS_H_ + +#include <stdint.h> + +namespace installer { + +// The various metrics reported for the status of the inactive user toast. This +// struct contains the information necessary to evaluate the efficacy of the +// toast on Chrome usage. +struct ExperimentMetrics { + public: + // The state of this install's participation in the experiment. + enum State { + kUninitialized = -1, + + // Relaunching setup.exe for a per-user install failed. Will retry on next + // update. + kRelaunchFailed = 0, + + // No user on console for per-machine install; waiting for invocation at + // next logon via Active Setup. + kWaitingForUserLogon = 1, + + // Waiting in user context for the setup singleton. + kWaitingForSingleton = 2, + + // Timed out waiting for the setup singleton. Will retry on next update. + kSingletonWaitTimeout = 3, + + // A group has been assigned. The experiment has moved out of the initial + // state at this point. This state is reached under the setup singleton. + kGroupAssigned = 4, + + // The user is not participating on account of using a tablet-like device. + kIsTabletDevice = 5, + + // Chrome has been run within the last 28 days. + kIsActive = 6, + + // The user has not been active on the machine much in the last 28 days. + kIsDormant = 7, + + // Deferring presentation until it's okay to show the toast. + kDeferringPresentation = 8, + + // Deferral was aborted on account of another process requiring the setup + // singleton. + kDeferredPresentationAborted = 9, + + // Launching Chrome for presentation. + kLaunchingChrome = 10, + + // User selected 'No Thanks' button from UI after toast was shown. + kSelectedNoThanks = 11, + + // User selected 'Open Chrome' button from UI after toast was shown but + // Chrome crashed after opening. + kSelectedOpenChromeAndCrash = 12, + + // User selected 'Open Chrome' button from UI after toast was shown and + // user successfully opened chrome. + kSelectedOpenChromeAndNoCrash = 13, + + // User selected [x] button from display. + kSelectedClose = 14, + + // User logged off (gracefully) without interacting with toast. + kUserLogOff = 15, + + NUM_STATES + }; + + // The location of the toast for those clients for which it was presented. + enum ToastLocation { + // The toast was shown positioned over Chrome's taskbar pin. + kOverTaskbarPin = 0, + + // The toast was shown over the notification area. + kOverNotificationArea = 1, + }; + + // Returns true if the install is in any of the states that precede group + // assignment. + bool InInitialState() const; + + // Returns true if the install is in a terminal state and should no longer + // participate in the experiment. + bool InTerminalState() const; + + bool operator==(const ExperimentMetrics& other) const; + + // The number of experiment groups (including the holdback group). + static constexpr int kNumGroups = 16; + + // Unix epoch of time from when time bucket for experiment is started. + // This will be subtracted from the day the toast was shown to bucket user + // into cohorts for analysing retention. (13 Jun 2017 00:00:00 PST) + static constexpr int64_t kExperimentStartSeconds = 1497337200; + + // Maximum number of time toast should be displayed (3 bits). + static constexpr int kMaxToastCount = 7; + + // Maximum value of first toast offset. (10 bits). + static constexpr int kMaxFirstToastOffsetDays = 1023; + + // Maximum value of last used bucket. (7 bits, in days and log scale). + static constexpr int kMaxLastUsed = 1825; // 5 yr in days. + + // Maximum value of user session length. (6 bits, in minutes and log scale). + static constexpr int kMaxSessionLength = 40320; // 28 days in minutes. + + // Maximum value of user session length. (5 bits, in seconds and log scale). + static constexpr int kMaxActionDelay = 604800; // 7 days in seconds. + + static constexpr int kSessionLengthBucketBits = 6; + + static constexpr int kActionDelayBucketBits = 5; + + static constexpr int kLastUsedBucketBits = 7; + + static constexpr int kToastHourBits = 5; + + static constexpr int kFirstToastOffsetBits = 10; + + static constexpr int kToastCountBits = 3; + + static constexpr int kToastLocationBits = 1; + + static constexpr int kStateBits = 4; + + static constexpr int kGroupBits = 4; + + // The group to which this install has been assigned. + int group = 0; + + State state = kUninitialized; + ToastLocation toast_location = kOverTaskbarPin; + + // The number of times the toast has been presented. + int toast_count = 0; + + // The number of days that have passed since (13 Jun 2017 00:00:00 PST) on + // the first day the toast was presented. + int first_toast_offset_days = 0; + + // The local (wall clock) hour in which the toast was presented. + int toast_hour = 0; + + // Days since the last time Chrome was used in the range [1-1825) in a + // 128-bucket log scale. + int last_used_bucket = 0; + + // Time delta (in seconds) between presentation and action in the range + // [1-604800) in a 32-bucket log scale. + int action_delay_bucket = 0; + + // Time delta (in minutes) between user session start and presentation in the + // range [1-40320) in a 64-bucket log scale. + int session_length_bucket = 0; +}; + +} // namespace installer + +#endif // CHROME_INSTALLER_UTIL_EXPERIMENT_METRICS_H_
diff --git a/chrome/installer/util/experiment_storage.cc b/chrome/installer/util/experiment_storage.cc new file mode 100644 index 0000000..6f8fe0e --- /dev/null +++ b/chrome/installer/util/experiment_storage.cc
@@ -0,0 +1,479 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/installer/util/experiment_storage.h" + +#include <windows.h> + +#include <stdint.h> + +#include <limits> +#include <string> + +#include "base/base64.h" +#include "base/bind.h" +#include "base/bind_helpers.h" +#include "base/logging.h" +#include "base/memory/ptr_util.h" +#include "base/strings/utf_string_conversions.h" +#include "base/task_scheduler/post_task.h" +#include "base/task_scheduler/task_traits.h" +#include "base/time/time.h" +#include "base/win/registry.h" +#include "base/win/win_util.h" +#include "chrome/install_static/install_details.h" +#include "chrome/install_static/install_modes.h" +#include "chrome/install_static/install_util.h" +#include "chrome/installer/util/experiment.h" +#include "chrome/installer/util/experiment_labels.h" +#include "chrome/installer/util/experiment_metrics.h" +#include "chrome/installer/util/google_update_settings.h" +#include "chrome/installer/util/shell_util.h" + +namespace installer { + +namespace { + +constexpr base::char16 kExperimentLabelName[] = L"CrExp60"; +constexpr wchar_t kRegKeyRetention[] = L"\\Retention"; +constexpr wchar_t kRegValueActionDelay[] = L"ActionDelay"; +constexpr wchar_t kRegValueFirstDisplayTime[] = L"FirstDisplayTime"; +constexpr wchar_t kRegValueGroup[] = L"Group"; +constexpr wchar_t kRegValueInactiveDays[] = L"InactiveDays"; +constexpr wchar_t kRegValueLatestDisplayTime[] = L"LatestDisplayTime"; +constexpr wchar_t kRegValueRetentionStudy[] = L"RetentionStudy"; +constexpr wchar_t kRegValueState[] = L"State"; +constexpr wchar_t kRegValueToastCount[] = L"ToastCount"; +constexpr wchar_t kRegValueToastLocation[] = L"ToastLocation"; +constexpr wchar_t kRegValueUserSessionUptime[] = L"UserSessionUptime"; + +constexpr int kSessionLengthBucketLowestBit = 0; +constexpr int kActionDelayBucketLowestBit = + ExperimentMetrics::kSessionLengthBucketBits + kSessionLengthBucketLowestBit; +constexpr int kLastUsedBucketLowestBit = + ExperimentMetrics::kActionDelayBucketBits + kActionDelayBucketLowestBit; +constexpr int kToastHourLowestBit = + ExperimentMetrics::kLastUsedBucketBits + kLastUsedBucketLowestBit; +constexpr int kFirstToastOffsetLowestBit = + ExperimentMetrics::kToastHourBits + kToastHourLowestBit; +constexpr int kToastCountLowestBit = + ExperimentMetrics::kFirstToastOffsetBits + kFirstToastOffsetLowestBit; +constexpr int kToastLocationLowestBit = + ExperimentMetrics::kToastCountBits + kToastCountLowestBit; +constexpr int kStateLowestBit = + ExperimentMetrics::kToastLocationBits + kToastLocationLowestBit; +constexpr int kGroupLowestBit = ExperimentMetrics::kStateBits + kStateLowestBit; +constexpr int kLowestUnusedBit = + ExperimentMetrics::kGroupBits + kGroupLowestBit; + +// Helper functions ------------------------------------------------------------ + +// Returns the name of the global mutex used to protect the storage location. +base::string16 GetMutexName() { + base::string16 name(L"Global\\"); + name.append(install_static::kCompanyPathName); + name.append(ShellUtil::GetBrowserModelId(!install_static::IsSystemInstall())); + name.append(L"ExperimentStorageMutex"); + return name; +} + +// Populates |path| with the path to the registry key in which the current +// user's experiment state is stored. Returns false if the path cannot be +// determined. +bool GetExperimentStateKeyPath(bool system_level, base::string16* path) { + const install_static::InstallDetails& install_details = + install_static::InstallDetails::Get(); + + if (!system_level) { + *path = install_details.GetClientStateKeyPath().append(kRegKeyRetention); + return true; + } + + base::string16 user_sid; + if (base::win::GetUserSidString(&user_sid)) { + *path = install_details.GetClientStateMediumKeyPath() + .append(kRegKeyRetention) + .append(L"\\") + .append(user_sid); + return true; + } + + NOTREACHED(); + return false; +} + +bool OpenParticipationKey(bool write_access, base::win::RegKey* key) { + const install_static::InstallDetails& details = + install_static::InstallDetails::Get(); + LONG result = key->Open( + details.system_level() ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER, + details.GetClientStateKeyPath().c_str(), + KEY_WOW64_32KEY | (write_access ? KEY_SET_VALUE : KEY_QUERY_VALUE)); + return result == ERROR_SUCCESS; +} + +// Reads |value_name| into |result|. Returns false if the value is not found or +// is out of range. +template <class T> +bool ReadBoundedDWORD(base::win::RegKey* key, + const wchar_t* value_name, + DWORD min_value, + DWORD max_value, + T* result) { + DWORD dword_value; + if (key->ReadValueDW(value_name, &dword_value) != ERROR_SUCCESS) + return false; + if (dword_value < min_value || dword_value > max_value) + return false; + *result = static_cast<T>(dword_value); + return true; +} + +// Reads the internal representation of a Time or TimeDelta from |value_name| +// into |result|. Returns false if the value is not found or is out of range. +template <class T> +bool ReadTime(base::win::RegKey* key, const wchar_t* value_name, T* result) { + int64_t qword_value; + if (key->ReadInt64(value_name, &qword_value) != ERROR_SUCCESS) + return false; + *result = T::FromInternalValue(qword_value); + return true; +} + +void WriteTime(base::win::RegKey* key, + const wchar_t* value_name, + int64_t internal_time_value) { + key->WriteValue(value_name, &internal_time_value, sizeof(internal_time_value), + REG_QWORD); +} + +} // namespace + +// ExperimentStorage::Lock ----------------------------------------------------- + +ExperimentStorage::Lock::~Lock() { + BOOL result = ::ReleaseMutex(storage_->mutex_.Get()); + DCHECK(result); +} + +bool ExperimentStorage::Lock::ReadParticipation(Participation* participation) { + base::win::RegKey key; + // A failure to open the key likely indicates that this isn't running from a + // real install of Chrome. + if (!OpenParticipationKey(false /* !write_access */, &key)) + return false; + + DWORD value = 0; + LONG result = key.ReadValueDW(kRegValueRetentionStudy, &value); + if (result != ERROR_SUCCESS) { + // This likely means that the value is not present. + *participation = Participation::kNotEvaluated; + } else if (value == 0) { + *participation = Participation::kNotParticipating; + } else { + *participation = Participation::kIsParticipating; + } + return true; +} + +bool ExperimentStorage::Lock::WriteParticipation(Participation participation) { + base::win::RegKey key; + // A failure to open the key likely indicates that this isn't running from a + // real install of Chrome. + if (!OpenParticipationKey(true /* write_access */, &key)) + return false; + + if (participation == Participation::kNotEvaluated) + return key.DeleteValue(kRegValueRetentionStudy) == ERROR_SUCCESS; + const DWORD value = participation == Participation::kIsParticipating ? 1 : 0; + return key.WriteValue(kRegValueRetentionStudy, value) == ERROR_SUCCESS; +} + +bool ExperimentStorage::Lock::LoadExperiment(Experiment* experiment) { + // This function loads both the experiment metrics and state from the + // registry. + // - If no metrics are found: |experiment| is cleared, and true is returned. + // (Per-user experiment data in the registry is ignored for all users.) + // - If metrics indicate an initial state (prior to a user being elected into + // an experiment group): |experiment| is populated with the metrics and true + // is returned. (Per-user experiment data in the registry is ignored for all + // users.) + // - If metrics indicate an intermediate or terminal state and per-user + // experiment data is in the same state: |experiment| is populated with all + // data from the registry and true is returned. + // Otherwise, the metrics correspond to a different user on the machine, so + // false is returned. + + *experiment = Experiment(); + + ExperimentMetrics metrics; + if (!storage_->LoadMetricsUnsafe(&metrics)) + return false; // Error reading metrics -- do nothing. + + if (metrics.InInitialState()) { + // There should be no per-user experiment data present (ignore it if there + // happens to be somehow). + experiment->InitializeFromMetrics(metrics); + return true; + } + + Experiment temp_experiment; + if (!storage_->LoadStateUnsafe(&temp_experiment)) + return false; + + // Verify that the state matches the metrics. Ignore the state if this is not + // the case, as the metrics are the source of truth. + if (temp_experiment.state() != metrics.state) + return false; + + *experiment = temp_experiment; + return true; +} + +bool ExperimentStorage::Lock::StoreExperiment(const Experiment& experiment) { + bool ret = storage_->StoreMetricsUnsafe(experiment.metrics()); + return storage_->StoreStateUnsafe(experiment) && ret; +} + +bool ExperimentStorage::Lock::LoadMetrics(ExperimentMetrics* metrics) { + DCHECK_EQ(ExperimentMetrics::kUninitialized, metrics->state); + return storage_->LoadMetricsUnsafe(metrics); +} + +bool ExperimentStorage::Lock::StoreMetrics(const ExperimentMetrics& metrics) { + DCHECK_NE(ExperimentMetrics::kUninitialized, metrics.state); + return storage_->StoreMetricsUnsafe(metrics); +} + +ExperimentStorage::Lock::Lock(ExperimentStorage* storage) : storage_(storage) { + DCHECK(storage); + DWORD result = ::WaitForSingleObject(storage_->mutex_.Get(), INFINITE); + PLOG_IF(FATAL, result == WAIT_FAILED) + << "Failed to lock ExperimentStorage mutex"; +} + +// ExperimentStorage ----------------------------------------------------------- + +ExperimentStorage::ExperimentStorage() + : mutex_(::CreateMutex(nullptr, FALSE, GetMutexName().c_str())) {} + +ExperimentStorage::~ExperimentStorage() {} + +std::unique_ptr<ExperimentStorage::Lock> ExperimentStorage::AcquireLock() { + return base::WrapUnique(new Lock(this)); +} + +// static +int ExperimentStorage::ReadUint64Bits(uint64_t source, + int bit_length, + int low_bit) { + DCHECK(bit_length > 0 && bit_length <= static_cast<int>(sizeof(int) * 8) && + low_bit + bit_length <= static_cast<int>(sizeof(source) * 8)); + uint64_t bit_mask = (1ULL << bit_length) - 1; + return static_cast<int>((source >> low_bit) & bit_mask); +} + +// static +void ExperimentStorage::SetUint64Bits(int value, + int bit_length, + int low_bit, + uint64_t* target) { + DCHECK(bit_length > 0 && bit_length <= static_cast<int>(sizeof(value) * 8) && + low_bit + bit_length <= static_cast<int>(sizeof(*target) * 8)); + uint64_t bit_mask = (1ULL << bit_length) - 1; + *target |= ((static_cast<uint64_t>(value) & bit_mask) << low_bit); +} + +bool ExperimentStorage::DecodeMetrics(base::StringPiece16 encoded_metrics, + ExperimentMetrics* metrics) { + std::string metrics_data; + + if (!base::Base64Decode(base::UTF16ToASCII(encoded_metrics), &metrics_data)) + return false; + + if (metrics_data.size() != 6) + return false; + + uint64_t metrics_value = 0; + for (size_t i = 0; i < metrics_data.size(); ++i) + SetUint64Bits(metrics_data[i], 8, 8 * i, &metrics_value); + + ExperimentMetrics result; + result.session_length_bucket = + ReadUint64Bits(metrics_value, ExperimentMetrics::kSessionLengthBucketBits, + kSessionLengthBucketLowestBit); + result.action_delay_bucket = + ReadUint64Bits(metrics_value, ExperimentMetrics::kActionDelayBucketBits, + kActionDelayBucketLowestBit); + result.last_used_bucket = + ReadUint64Bits(metrics_value, ExperimentMetrics::kLastUsedBucketBits, + kLastUsedBucketLowestBit); + result.toast_hour = ReadUint64Bits( + metrics_value, ExperimentMetrics::kToastHourBits, kToastHourLowestBit); + result.first_toast_offset_days = + ReadUint64Bits(metrics_value, ExperimentMetrics::kFirstToastOffsetBits, + kFirstToastOffsetLowestBit); + result.toast_count = ReadUint64Bits( + metrics_value, ExperimentMetrics::kToastCountBits, kToastCountLowestBit); + result.toast_location = static_cast<ExperimentMetrics::ToastLocation>( + ReadUint64Bits(metrics_value, ExperimentMetrics::kToastLocationBits, + kToastLocationLowestBit)); + + static_assert(ExperimentMetrics::State::NUM_STATES <= (1 << 4), + "Too many states for ExperimentMetrics encoding."); + result.state = static_cast<ExperimentMetrics::State>(ReadUint64Bits( + metrics_value, ExperimentMetrics::kStateBits, kStateLowestBit)); + result.group = ReadUint64Bits(metrics_value, ExperimentMetrics::kGroupBits, + kGroupLowestBit); + + if (ReadUint64Bits(metrics_value, + sizeof(metrics_value) * 8 - kLowestUnusedBit, + kLowestUnusedBit)) { + return false; + } + + *metrics = result; + return true; +} + +// static +base::string16 ExperimentStorage::EncodeMetrics( + const ExperimentMetrics& metrics) { + uint64_t metrics_value = 0; + SetUint64Bits(metrics.session_length_bucket, + ExperimentMetrics::kSessionLengthBucketBits, + kSessionLengthBucketLowestBit, &metrics_value); + SetUint64Bits(metrics.action_delay_bucket, + ExperimentMetrics::kActionDelayBucketBits, + kActionDelayBucketLowestBit, &metrics_value); + SetUint64Bits(metrics.last_used_bucket, + ExperimentMetrics::kLastUsedBucketBits, + kLastUsedBucketLowestBit, &metrics_value); + SetUint64Bits(metrics.toast_hour, ExperimentMetrics::kToastHourBits, + kToastHourLowestBit, &metrics_value); + SetUint64Bits(metrics.first_toast_offset_days, + ExperimentMetrics::kFirstToastOffsetBits, + kFirstToastOffsetLowestBit, &metrics_value); + SetUint64Bits(metrics.toast_count, ExperimentMetrics::kToastCountBits, + kToastCountLowestBit, &metrics_value); + SetUint64Bits(metrics.toast_location, ExperimentMetrics::kToastLocationBits, + kToastLocationLowestBit, &metrics_value); + static_assert(ExperimentMetrics::State::NUM_STATES <= (1 << 4), + "Too many states for ExperimentMetrics encoding."); + SetUint64Bits(metrics.state, ExperimentMetrics::kStateBits, kStateLowestBit, + &metrics_value); + SetUint64Bits(metrics.group, ExperimentMetrics::kGroupBits, kGroupLowestBit, + &metrics_value); + + std::string metrics_data(6, '\0'); + for (size_t i = 0; i < metrics_data.size(); ++i) { + metrics_data[i] = + static_cast<char>(ReadUint64Bits(metrics_value, 8, 8 * i)); + } + std::string encoded_metrics; + base::Base64Encode(metrics_data, &encoded_metrics); + return base::ASCIIToUTF16(encoded_metrics); +} + +bool ExperimentStorage::LoadMetricsUnsafe(ExperimentMetrics* metrics) { + base::string16 value; + + if (!GoogleUpdateSettings::ReadExperimentLabels( + install_static::IsSystemInstall(), &value)) { + return false; + } + + ExperimentLabels experiment_labels(value); + base::StringPiece16 encoded_metrics = + experiment_labels.GetValueForLabel(kExperimentLabelName); + if (encoded_metrics.empty()) { + *metrics = ExperimentMetrics(); + return true; + } + + return DecodeMetrics(encoded_metrics, metrics); +} + +bool ExperimentStorage::StoreMetricsUnsafe(const ExperimentMetrics& metrics) { + base::string16 value; + if (!GoogleUpdateSettings::ReadExperimentLabels( + install_static::IsSystemInstall(), &value)) { + return false; + } + ExperimentLabels experiment_labels(value); + + experiment_labels.SetValueForLabel(kExperimentLabelName, + EncodeMetrics(metrics), + base::TimeDelta::FromDays(182)); + + return GoogleUpdateSettings::SetExperimentLabels( + install_static::IsSystemInstall(), experiment_labels.value()); +} + +bool ExperimentStorage::LoadStateUnsafe(Experiment* experiment) { + const bool system_level = install_static::IsSystemInstall(); + + base::string16 path; + if (!GetExperimentStateKeyPath(system_level, &path)) + return false; + + const HKEY root = system_level ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; + base::win::RegKey key; + if (key.Open(root, path.c_str(), KEY_QUERY_VALUE | KEY_WOW64_32KEY) != + ERROR_SUCCESS) { + return false; + } + + return ReadBoundedDWORD(&key, kRegValueState, 0, + ExperimentMetrics::NUM_STATES, &experiment->state_) && + ReadBoundedDWORD(&key, kRegValueGroup, 0, + ExperimentMetrics::kNumGroups - 1, + &experiment->group_) && + ReadBoundedDWORD(&key, kRegValueToastLocation, 0, 1, + &experiment->toast_location_) && + ReadBoundedDWORD(&key, kRegValueInactiveDays, 0, INT_MAX, + &experiment->inactive_days_) && + ReadBoundedDWORD(&key, kRegValueToastCount, 0, + ExperimentMetrics::kMaxToastCount, + &experiment->toast_count_) && + ReadTime(&key, kRegValueFirstDisplayTime, + &experiment->first_display_time_) && + ReadTime(&key, kRegValueLatestDisplayTime, + &experiment->latest_display_time_) && + ReadTime(&key, kRegValueUserSessionUptime, + &experiment->user_session_uptime_) && + ReadTime(&key, kRegValueActionDelay, &experiment->action_delay_); +} + +bool ExperimentStorage::StoreStateUnsafe(const Experiment& experiment) { + const bool system_level = install_static::IsSystemInstall(); + + base::string16 path; + if (!GetExperimentStateKeyPath(system_level, &path)) + return false; + + const HKEY root = system_level ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; + base::win::RegKey key; + if (key.Create(root, path.c_str(), KEY_SET_VALUE | KEY_WOW64_32KEY) != + ERROR_SUCCESS) { + return false; + } + + key.WriteValue(kRegValueState, experiment.state()); + key.WriteValue(kRegValueGroup, experiment.group()); + key.WriteValue(kRegValueToastLocation, experiment.toast_location()); + key.WriteValue(kRegValueInactiveDays, experiment.inactive_days()); + key.WriteValue(kRegValueToastCount, experiment.toast_count()); + WriteTime(&key, kRegValueFirstDisplayTime, + experiment.first_display_time().ToInternalValue()); + WriteTime(&key, kRegValueLatestDisplayTime, + experiment.latest_display_time().ToInternalValue()); + WriteTime(&key, kRegValueUserSessionUptime, + experiment.user_session_uptime().ToInternalValue()); + WriteTime(&key, kRegValueActionDelay, + experiment.action_delay().ToInternalValue()); + return true; +} + +} // namespace installer
diff --git a/chrome/installer/util/experiment_storage.h b/chrome/installer/util/experiment_storage.h new file mode 100644 index 0000000..40ed1d2 --- /dev/null +++ b/chrome/installer/util/experiment_storage.h
@@ -0,0 +1,152 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_INSTALLER_UTIL_EXPERIMENT_STORAGE_H_ +#define CHROME_INSTALLER_UTIL_EXPERIMENT_STORAGE_H_ + +#include <memory> + +#include "base/macros.h" +#include "base/strings/string16.h" +#include "base/win/scoped_handle.h" + +namespace installer { + +class Experiment; +struct ExperimentMetrics; + +// Manages the storage of experiment state on the machine. +// +// Participation is a per-install property evaluated one time to determine +// whether or not the install as a whole participates in the study. It is +// stored in the install's ClientState key. +// +// ExperimentMetrics are stored in a per-install experiment_label, while the +// fine-grained Experiment data are stored in a per-user key in Chrome's +// ClientState or ClientStateMedium key. For system-level installs, metrics are +// reported for only a single user on the machine, so only that one user will +// participate in the experiment. +// +// Owing to this "metrics are per-install" property in the face of potentially +// multiple users running the same install, ExperimentMetrics are considered the +// source of truth for an install's participation in the experiment. For any +// given state expressed in the experiment_label holding these metrics, there +// should be matching Experiment data for precisely one user. +// +// As state is written across multiple locations in the registry, a global +// mutex is used for all reads and writes to ensure consistent state. +class ExperimentStorage { + public: + enum class Participation { + // No participation state was found for the install. + kNotEvaluated, + + // The client is not participating in the study. + kNotParticipating, + + // The client is participating in the study. + kIsParticipating, + }; + + // Grants the holder exclusive access to the data in the registry. Consumers + // are expected to not hold an instance across any blocking operations. + class Lock { + public: + ~Lock(); + + // Reads the participation state for the install. Returns false in case of + // error. + bool ReadParticipation(Participation* participation); + + // Writes the participation state for the install. Returns false if the + // write failed. + bool WriteParticipation(Participation participation); + + // Loads the experiment metrics and data from the registry. Returns false if + // the state in the registry corresponds to a different user or could not be + // read. + bool LoadExperiment(Experiment* experiment); + + // Stores the experiment metrics and data in |experiment| into the registry. + bool StoreExperiment(const Experiment& experiment); + + // Loads per-install experiment metrics into |metrics|. Returns true if a + // value was read or if none was found, in which case |metrics| is set to + // the uninitialized state. Returns false in case of any error reading or + // parsing the metrics. + bool LoadMetrics(ExperimentMetrics* metrics); + + // Stores |metrics| in the per-install experiment_label. + bool StoreMetrics(const ExperimentMetrics& metrics); + + private: + friend ExperimentStorage; + + explicit Lock(ExperimentStorage* storage); + + ExperimentStorage* storage_; + + DISALLOW_COPY_AND_ASSIGN(Lock); + }; + + ExperimentStorage(); + ~ExperimentStorage(); + + // Returns exclusive access to the experiment storage. The underlying + // ExperimentStorage instance must not be deleted while the Lock* returned + // here is still in use. + std::unique_ptr<Lock> AcquireLock(); + + private: + FRIEND_TEST_ALL_PREFIXES(ExperimentStorageTest, TestEncodeDecodeMetrics); + FRIEND_TEST_ALL_PREFIXES(ExperimentStorageTest, TestEncodeDecodeForMin); + FRIEND_TEST_ALL_PREFIXES(ExperimentStorageTest, TestEncodeDecodeForMax); + FRIEND_TEST_ALL_PREFIXES(ExperimentStorageTest, TestLoadStoreMetrics); + FRIEND_TEST_ALL_PREFIXES(ExperimentStorageTest, TestLoadStoreExperiment); + + // Reads |bit_length| bits ending at |low_bit| of a 64 bit unsigned int into + // an int. + static int ReadUint64Bits(uint64_t source, int bit_length, int low_bit); + + // Sets the last |bit_length| bits of |value| into |target| at bit position + // ending at low_bit. + static void SetUint64Bits(int value, + int bit_length, + int low_bit, + uint64_t* target); + + // Decodes |encoded_metrics| into |metrics|, return true on success. Returns + // false if the encoding is malformed. + static bool DecodeMetrics(base::StringPiece16 encoded_metrics, + ExperimentMetrics* metrics); + + // Returns the encoded form of |metrics|. + static base::string16 EncodeMetrics(const ExperimentMetrics& metrics); + + // Loads the per-install experiment metrics into |metrics|. Returns true if a + // value was read or if none was found, in which case |metrics| is set to the + // uninitialized state. Returns false in case of any error reading or parsing + // the metrics. + bool LoadMetricsUnsafe(ExperimentMetrics* metrics); + + // StoreMetrics without acquiring the mutex. + bool StoreMetricsUnsafe(const ExperimentMetrics& metrics); + + // Loads the experiment state for the current user's Retention key into + // |experiment|. Returns true if all values are read. Returns false otherwise, + // in which case |experiment| is left in an undefined state. + bool LoadStateUnsafe(Experiment* experiment); + + // Stores |experiment| in the current user's Retention key. + bool StoreStateUnsafe(const Experiment& experiment); + + // A global mutex with a distinct name for the current installation. + base::win::ScopedHandle mutex_; + + DISALLOW_COPY_AND_ASSIGN(ExperimentStorage); +}; + +} // namespace installer + +#endif // CHROME_INSTALLER_UTIL_EXPERIMENT_STORAGE_H_
diff --git a/chrome/installer/util/experiment_storage_unittest.cc b/chrome/installer/util/experiment_storage_unittest.cc new file mode 100644 index 0000000..5f4d2d3 --- /dev/null +++ b/chrome/installer/util/experiment_storage_unittest.cc
@@ -0,0 +1,182 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/installer/util/experiment_storage.h" + +#include "base/strings/string_piece.h" +#include "base/test/test_reg_util_win.h" +#include "chrome/install_static/install_details.h" +#include "chrome/install_static/test/scoped_install_details.h" +#include "chrome/installer/util/browser_distribution.h" +#include "chrome/installer/util/experiment.h" +#include "chrome/installer/util/experiment_metrics.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace installer { + +// A test fixture that can tests saving experiment data in windows registry. +// Individual tests provide a parameter, which is true if Chrome is installed +// in system level. +class ExperimentStorageTest : public ::testing::TestWithParam<bool> { + protected: + ExperimentStorageTest() + : system_level_install_(GetParam()), + scoped_install_details_(system_level_install_, 0) {} + + HKEY root() { + return system_level_install_ ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER; + } + + void SetUp() override { + ::testing::TestWithParam<bool>::SetUp(); + ASSERT_NO_FATAL_FAILURE(override_manager_.OverrideRegistry(root())); + + // Create an empty participation key since participation registry is assumed + // to be present for chrome build. + base::win::RegKey key; + ASSERT_EQ(ERROR_SUCCESS, key.Create(root(), + install_static::InstallDetails::Get() + .GetClientStateKeyPath() + .c_str(), + KEY_WOW64_32KEY | KEY_QUERY_VALUE)); + } + + bool system_level_install_; + + private: + install_static::ScopedInstallDetails scoped_install_details_; + registry_util::RegistryOverrideManager override_manager_; + + DISALLOW_COPY_AND_ASSIGN(ExperimentStorageTest); +}; + +TEST_P(ExperimentStorageTest, TestEncodeDecodeMetrics) { + ExperimentMetrics metrics; + metrics.state = ExperimentMetrics::kGroupAssigned; + metrics.toast_location = ExperimentMetrics::kOverTaskbarPin; + metrics.toast_count = 1; + metrics.first_toast_offset_days = 30; + metrics.toast_hour = 3; + metrics.last_used_bucket = 2; + metrics.action_delay_bucket = 11; + metrics.session_length_bucket = 36; + base::string16 encoded_metrics(ExperimentStorage::EncodeMetrics(metrics)); + EXPECT_EQ(L"5BIMD4IA", encoded_metrics); + ExperimentMetrics decoded_metrics; + ASSERT_TRUE( + ExperimentStorage::DecodeMetrics(encoded_metrics, &decoded_metrics)); + EXPECT_EQ(metrics, decoded_metrics); +} + +TEST_P(ExperimentStorageTest, TestEncodeDecodeForMax) { + Experiment experiment; + experiment.AssignGroup(ExperimentMetrics::kNumGroups - 1); + experiment.SetToastLocation(ExperimentMetrics::kOverNotificationArea); + experiment.SetInactiveDays(ExperimentMetrics::kMaxLastUsed); + experiment.SetToastCount(ExperimentMetrics::kMaxToastCount); + experiment.SetUserSessionUptime( + base::TimeDelta::FromMinutes(ExperimentMetrics::kMaxSessionLength)); + experiment.SetActionDelay( + base::TimeDelta::FromSeconds(ExperimentMetrics::kMaxActionDelay)); + experiment.SetDisplayTime( + base::Time::UnixEpoch() + + base::TimeDelta::FromSeconds(ExperimentMetrics::kExperimentStartSeconds) + + base::TimeDelta::FromDays(ExperimentMetrics::kMaxFirstToastOffsetDays)); + experiment.SetState(ExperimentMetrics::kUserLogOff); // Max state. + ExperimentMetrics metrics = experiment.metrics(); + // toast_hour uses LocalMidnight whose value depend on local time. So, reset + // it to its maximum value. + metrics.toast_hour = 24; + base::string16 encoded_metrics(ExperimentStorage::EncodeMetrics(metrics)); + EXPECT_EQ(L"///j//8f", encoded_metrics); + ExperimentMetrics decoded_metrics; + ASSERT_TRUE( + ExperimentStorage::DecodeMetrics(encoded_metrics, &decoded_metrics)); + EXPECT_EQ(decoded_metrics.state, ExperimentMetrics::kUserLogOff); + EXPECT_EQ(decoded_metrics.group, ExperimentMetrics::kNumGroups - 1); + EXPECT_EQ(decoded_metrics.toast_location, + ExperimentMetrics::kOverNotificationArea); + EXPECT_EQ(decoded_metrics.toast_count, ExperimentMetrics::kMaxToastCount); + EXPECT_EQ(decoded_metrics.first_toast_offset_days, + ExperimentMetrics::kMaxFirstToastOffsetDays); + EXPECT_EQ(decoded_metrics.toast_hour, 24); + // Following are exponential buckets. So, there max value will be + // 2^bits - 1 + EXPECT_EQ(decoded_metrics.last_used_bucket, + (1 << ExperimentMetrics::kLastUsedBucketBits) - 1); + EXPECT_EQ(decoded_metrics.action_delay_bucket, + (1 << ExperimentMetrics::kActionDelayBucketBits) - 1); + EXPECT_EQ(decoded_metrics.session_length_bucket, + (1 << ExperimentMetrics::kSessionLengthBucketBits) - 1); +} + +TEST_P(ExperimentStorageTest, TestEncodeDecodeForMin) { + ExperimentMetrics metrics; + metrics.state = ExperimentMetrics::kRelaunchFailed; + base::string16 encoded_metrics(ExperimentStorage::EncodeMetrics(metrics)); + EXPECT_EQ(L"AAAAAAAA", encoded_metrics); + ExperimentMetrics decoded_metrics; + ASSERT_TRUE( + ExperimentStorage::DecodeMetrics(encoded_metrics, &decoded_metrics)); + EXPECT_EQ(metrics, decoded_metrics); +} + +TEST_P(ExperimentStorageTest, TestReadWriteParticipation) { + ExperimentStorage storage; + ExperimentStorage::Participation expected = + ExperimentStorage::Participation::kIsParticipating; + ASSERT_TRUE(storage.AcquireLock()->WriteParticipation(expected)); + ExperimentStorage::Participation p; + ASSERT_TRUE(storage.AcquireLock()->ReadParticipation(&p)); + EXPECT_EQ(expected, p); +} + +TEST_P(ExperimentStorageTest, TestLoadStoreExperiment) { + Experiment experiment; + experiment.AssignGroup(5); + ExperimentStorage storage; + ASSERT_TRUE(storage.AcquireLock()->StoreExperiment(experiment)); + Experiment stored_experiment; + ASSERT_TRUE(storage.AcquireLock()->LoadExperiment(&stored_experiment)); + EXPECT_EQ(ExperimentMetrics::kGroupAssigned, stored_experiment.state()); + EXPECT_EQ(5, stored_experiment.group()); + // Verify that expeirment state is stored in correct location in registry. + base::win::RegKey key; + base::string16 client_state_path( + system_level_install_ + ? BrowserDistribution::GetDistribution()->GetStateMediumKey() + : BrowserDistribution::GetDistribution()->GetStateKey()); + client_state_path.append(L"\\Retention"); + EXPECT_EQ(ERROR_SUCCESS, key.Open(root(), client_state_path.c_str(), + KEY_QUERY_VALUE | KEY_WOW64_32KEY)); +} + +TEST_P(ExperimentStorageTest, TestLoadStoreMetrics) { + ExperimentStorage storage; + ExperimentMetrics metrics; + metrics.state = ExperimentMetrics::kGroupAssigned; + metrics.toast_location = ExperimentMetrics::kOverTaskbarPin; + metrics.toast_count = 1; + metrics.first_toast_offset_days = 30; + metrics.toast_hour = 3; + metrics.last_used_bucket = 2; + metrics.action_delay_bucket = 11; + metrics.session_length_bucket = 36; + ASSERT_TRUE(storage.AcquireLock()->StoreMetrics(metrics)); + ExperimentMetrics stored_metrics; + ASSERT_TRUE(storage.AcquireLock()->LoadMetrics(&stored_metrics)); + EXPECT_EQ(L"5BIMD4IA", ExperimentStorage::EncodeMetrics(stored_metrics)); + // Verify that expeirment labels are stored in registry. + EXPECT_EQ(metrics, stored_metrics); +} + +INSTANTIATE_TEST_CASE_P(UserLevel, + ExperimentStorageTest, + ::testing::Values(false)); + +INSTANTIATE_TEST_CASE_P(SystemLevel, + ExperimentStorageTest, + ::testing::Values(true)); + +} // namespace installer
diff --git a/chrome/installer/util/experiment_unittest.cc b/chrome/installer/util/experiment_unittest.cc new file mode 100644 index 0000000..e82c2b8ff --- /dev/null +++ b/chrome/installer/util/experiment_unittest.cc
@@ -0,0 +1,220 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/installer/util/experiment.h" + +#include <cmath> + +#include "base/time/time.h" +#include "chrome/installer/util/experiment_metrics.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace installer { + +TEST(ExperimentTest, TestInitializeFromMetrics) { + Experiment experiment; + ExperimentMetrics metrics_with_group; + metrics_with_group.state = ExperimentMetrics::kGroupAssigned; + metrics_with_group.group = 5; + experiment.InitializeFromMetrics(metrics_with_group); + EXPECT_EQ(ExperimentMetrics::kGroupAssigned, experiment.state()); + EXPECT_EQ(5, experiment.group()); + experiment.SetInactiveDays(2); + // Test initializing from empty ExperimentMetrics. + experiment.InitializeFromMetrics(ExperimentMetrics()); + EXPECT_EQ(ExperimentMetrics::kUninitialized, experiment.state()); + EXPECT_EQ(0, experiment.group()); + EXPECT_EQ(0, experiment.inactive_days()); +} + +TEST(ExperimentTest, TestSetState) { + Experiment experiment; + EXPECT_EQ(ExperimentMetrics::kUninitialized, experiment.state()); + EXPECT_EQ(ExperimentMetrics::kUninitialized, experiment.metrics().state); + experiment.SetState(ExperimentMetrics::kGroupAssigned); + EXPECT_EQ(ExperimentMetrics::kGroupAssigned, experiment.metrics().state); + EXPECT_EQ(ExperimentMetrics::kGroupAssigned, experiment.state()); +} + +TEST(ExperimentTest, TestAssignGroup) { + Experiment experiment; + experiment.AssignGroup(5); + EXPECT_EQ(5, experiment.metrics().group); + EXPECT_EQ(5, experiment.group()); + EXPECT_EQ(ExperimentMetrics::kGroupAssigned, experiment.metrics().state); + EXPECT_EQ(ExperimentMetrics::kGroupAssigned, experiment.state()); +} + +TEST(ExperimentTest, TestSetInactiveDays) { + Experiment experiment; + experiment.AssignGroup(5); + + experiment.SetInactiveDays(0); + EXPECT_EQ(0, experiment.metrics().last_used_bucket); + EXPECT_EQ(0, experiment.inactive_days()); + + experiment.SetInactiveDays(28); + EXPECT_EQ(57, experiment.metrics().last_used_bucket); + EXPECT_EQ(28, experiment.inactive_days()); + + experiment.SetInactiveDays(35); + EXPECT_EQ(61, experiment.metrics().last_used_bucket); + EXPECT_EQ(35, experiment.inactive_days()); + + experiment.SetInactiveDays(60); + EXPECT_EQ(70, experiment.metrics().last_used_bucket); + EXPECT_EQ(60, experiment.inactive_days()); + + experiment.SetInactiveDays(ExperimentMetrics::kMaxLastUsed); + EXPECT_EQ(127, experiment.metrics().last_used_bucket); + EXPECT_EQ(ExperimentMetrics::kMaxLastUsed, experiment.inactive_days()); + + experiment.SetInactiveDays(2 * ExperimentMetrics::kMaxLastUsed); + EXPECT_EQ(127, experiment.metrics().last_used_bucket); + EXPECT_EQ(2 * ExperimentMetrics::kMaxLastUsed, experiment.inactive_days()); +} + +TEST(ExperimentTest, TestSetDisplayTime) { + Experiment experiment; + experiment.AssignGroup(5); + base::Time zero_day = + base::Time::FromDoubleT(ExperimentMetrics::kExperimentStartSeconds); + experiment.SetDisplayTime(zero_day); + EXPECT_EQ(0, experiment.metrics().first_toast_offset_days); + EXPECT_EQ(zero_day, experiment.first_display_time()); + EXPECT_EQ(zero_day, experiment.latest_display_time()); + + base::Time one_day = zero_day + base::TimeDelta::FromDays(1); + experiment.SetDisplayTime(one_day); + EXPECT_EQ(1, experiment.metrics().first_toast_offset_days); + EXPECT_EQ(one_day, experiment.first_display_time()); + EXPECT_EQ(one_day, experiment.latest_display_time()); + + // Test that calling SetDisplayTime again will not reset + // first_toast_offset_days. + base::Time two_day = zero_day + base::TimeDelta::FromDays(2); + experiment.SetDisplayTime(two_day); + EXPECT_EQ(1, experiment.metrics().first_toast_offset_days); + EXPECT_EQ(one_day, experiment.first_display_time()); + EXPECT_EQ(two_day, experiment.latest_display_time()); + + // Test for maximum value. + Experiment new_experiment; + new_experiment.AssignGroup(5); + base::Time max_day = + zero_day + + base::TimeDelta::FromDays(ExperimentMetrics::kMaxFirstToastOffsetDays); + new_experiment.SetDisplayTime(max_day); + EXPECT_EQ(ExperimentMetrics::kMaxFirstToastOffsetDays, + new_experiment.metrics().first_toast_offset_days); + EXPECT_EQ(max_day, new_experiment.first_display_time()); + EXPECT_EQ(max_day, new_experiment.latest_display_time()); + + // Test setting toast_hour. Since it depends on local time it is + // tested by setting toast hour for two consecutive hours and verifying the + // difference is 1. + base::Time two_day_one_hour = two_day + base::TimeDelta::FromHours(1); + Experiment hour_experiment; + hour_experiment.AssignGroup(5); + hour_experiment.SetDisplayTime(two_day_one_hour); + int diff_hour = + hour_experiment.metrics().toast_hour - experiment.metrics().toast_hour; + EXPECT_EQ(1, diff_hour); +} + +TEST(ExperimentTest, TestSetUserSessionUptime) { + Experiment experiment; + experiment.AssignGroup(5); + experiment.SetUserSessionUptime(base::TimeDelta::FromMinutes(0)); + EXPECT_EQ(0, experiment.metrics().session_length_bucket); + EXPECT_EQ(0, experiment.user_session_uptime().InMinutes()); + + experiment.SetUserSessionUptime(base::TimeDelta::FromMinutes(60)); + EXPECT_EQ(24, experiment.metrics().session_length_bucket); + EXPECT_EQ(60, experiment.user_session_uptime().InMinutes()); + + experiment.SetUserSessionUptime(base::TimeDelta::FromMinutes(60 * 24)); + EXPECT_EQ(43, experiment.metrics().session_length_bucket); + EXPECT_EQ(60 * 24, experiment.user_session_uptime().InMinutes()); + + experiment.SetUserSessionUptime( + base::TimeDelta::FromMinutes(ExperimentMetrics::kMaxSessionLength)); + EXPECT_EQ(63, experiment.metrics().session_length_bucket); + EXPECT_EQ(ExperimentMetrics::kMaxSessionLength, + experiment.user_session_uptime().InMinutes()); + + experiment.SetUserSessionUptime( + base::TimeDelta::FromMinutes(2 * ExperimentMetrics::kMaxSessionLength)); + EXPECT_EQ(63, experiment.metrics().session_length_bucket); + EXPECT_EQ(2 * ExperimentMetrics::kMaxSessionLength, + experiment.user_session_uptime().InMinutes()); +} + +TEST(ExperimentTest, TestSetActionDelay) { + Experiment experiment; + experiment.AssignGroup(5); + experiment.SetActionDelay(base::TimeDelta::FromSeconds(0)); + EXPECT_EQ(0, experiment.metrics().action_delay_bucket); + EXPECT_EQ(0, experiment.user_session_uptime().InSeconds()); + + experiment.SetActionDelay(base::TimeDelta::FromSeconds(60)); + EXPECT_EQ(10, experiment.metrics().action_delay_bucket); + EXPECT_EQ(60, experiment.action_delay().InSeconds()); + + experiment.SetActionDelay(base::TimeDelta::FromSeconds(60 * 60)); + EXPECT_EQ(19, experiment.metrics().action_delay_bucket); + EXPECT_EQ(60 * 60, experiment.action_delay().InSeconds()); + + experiment.SetActionDelay( + base::TimeDelta::FromSeconds(ExperimentMetrics::kMaxActionDelay)); + EXPECT_EQ(31, experiment.metrics().action_delay_bucket); + EXPECT_EQ(ExperimentMetrics::kMaxActionDelay, + experiment.action_delay().InSeconds()); + + experiment.SetActionDelay( + base::TimeDelta::FromSeconds(2 * ExperimentMetrics::kMaxActionDelay)); + EXPECT_EQ(31, experiment.metrics().action_delay_bucket); + EXPECT_EQ(2 * ExperimentMetrics::kMaxActionDelay, + experiment.action_delay().InSeconds()); +} + +TEST(ExperimentTest, TestAllSetters) { + Experiment experiment; + experiment.AssignGroup(5); + experiment.SetState(ExperimentMetrics::kGroupAssigned); + experiment.SetToastLocation(ExperimentMetrics::kOverTaskbarPin); + experiment.SetInactiveDays(1621); + experiment.SetToastCount(1); + base::Time test_display_time = + (base::Time::UnixEpoch() + + base::TimeDelta::FromSeconds( + ExperimentMetrics::kExperimentStartSeconds) + + base::TimeDelta::FromDays(30) + base::TimeDelta::FromHours(3)); + experiment.SetDisplayTime(test_display_time); + experiment.SetUserSessionUptime(base::TimeDelta::FromMinutes(3962)); + experiment.SetActionDelay(base::TimeDelta::FromSeconds(32875)); + + EXPECT_EQ(ExperimentMetrics::kGroupAssigned, experiment.state()); + EXPECT_EQ(5, experiment.group()); + EXPECT_EQ(ExperimentMetrics::kOverTaskbarPin, experiment.toast_location()); + EXPECT_EQ(1621, experiment.inactive_days()); + EXPECT_EQ(1, experiment.toast_count()); + EXPECT_EQ(test_display_time, experiment.first_display_time()); + EXPECT_EQ(test_display_time, experiment.latest_display_time()); + EXPECT_EQ(base::TimeDelta::FromMinutes(3962), + experiment.user_session_uptime()); + EXPECT_EQ(base::TimeDelta::FromSeconds(32875), experiment.action_delay()); + + EXPECT_EQ(ExperimentMetrics::kGroupAssigned, experiment.metrics().state); + EXPECT_EQ(5, experiment.metrics().group); + EXPECT_EQ(ExperimentMetrics::kOverTaskbarPin, + experiment.metrics().toast_location); + EXPECT_EQ(1, experiment.metrics().toast_count); + EXPECT_EQ(30, experiment.metrics().first_toast_offset_days); + EXPECT_EQ(125, experiment.metrics().last_used_bucket); + EXPECT_EQ(24, experiment.metrics().action_delay_bucket); + EXPECT_EQ(49, experiment.metrics().session_length_bucket); +} + +} // namespace installer
diff --git a/chrome/profiling/BUILD.gn b/chrome/profiling/BUILD.gn new file mode 100644 index 0000000..5318bb21 --- /dev/null +++ b/chrome/profiling/BUILD.gn
@@ -0,0 +1,27 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//chrome/common/features.gni") + +if (enable_oop_heap_profiling) { + static_library("profiling") { + sources = [ + "profiling_main.cc", + "profiling_main.h", + ] + + deps = [ + "//base", + "//chrome/common", + ] + } +} else { + # Dummy target so this can be unconditionally depended on and header checking + # will work. + source_set("profiling") { + sources = [ + "profiling_main.h", + ] + } +}
diff --git a/chrome/profiling/README.md b/chrome/profiling/README.md new file mode 100644 index 0000000..ea5ffa8 --- /dev/null +++ b/chrome/profiling/README.md
@@ -0,0 +1,6 @@ +# chrome/profiling + +This directory contains the code for the "profiling" process. + +Currently this is used for out-of-process logging of heap profiling data and +is enabled by setting the GN flag `enable_oop_heap_profiling`.
diff --git a/chrome/profiling/profiling_main.cc b/chrome/profiling/profiling_main.cc new file mode 100644 index 0000000..fd582b6 --- /dev/null +++ b/chrome/profiling/profiling_main.cc
@@ -0,0 +1,25 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/profiling/profiling_main.h" + +#include "base/command_line.h" +#include "build/build_config.h" + +#if defined(OS_WIN) +#include "base/win/win_util.h" +#endif + +namespace profiling { + +int ProfilingMain(const base::CommandLine& cmdline) { + // TODO(brettw) implement this. + +#if defined(OS_WIN) + base::win::SetShouldCrashOnProcessDetach(false); +#endif + return 0; +} + +} // namespace profiling
diff --git a/chrome/profiling/profiling_main.h b/chrome/profiling/profiling_main.h new file mode 100644 index 0000000..0d30b02 --- /dev/null +++ b/chrome/profiling/profiling_main.h
@@ -0,0 +1,18 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_PROFILING_PROFILING_MAIN_H_ +#define CHROME_PROFILING_PROFILING_MAIN_H_ + +namespace base { +class CommandLine; +} + +namespace profiling { + +int ProfilingMain(const base::CommandLine& cmdline); + +} // namespace profiling + +#endif // CHROME_PROFILING_PROFILING_MAIN_H_
diff --git a/components/BUILD.gn b/components/BUILD.gn index 824a04e7d..a6e920843 100644 --- a/components/BUILD.gn +++ b/components/BUILD.gn
@@ -220,7 +220,7 @@ "//components/subresource_filter/content/renderer:unit_tests", "//components/tracing:unit_tests", "//components/visitedlink/test:unit_tests", - "//components/viz/display_compositor:unit_tests", + "//components/viz/service:unit_tests", "//components/wallpaper:unit_tests", "//components/web_cache/browser:unit_tests", "//components/webcrypto:unit_tests",
diff --git a/components/viz/BUILD.gn b/components/viz/BUILD.gn deleted file mode 100644 index 1a4f68c..0000000 --- a/components/viz/BUILD.gn +++ /dev/null
@@ -1,16 +0,0 @@ -# Copyright 2017 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//build/config/ui.gni") - -config("viz_implementation") { - defines = [ "VIZ_IMPLEMENTATION" ] -} - -component("viz") { - public_deps = [ - "//components/viz/display_compositor:display_compositor_sources", - "//components/viz/frame_sinks:frame_sinks_sources", - ] -}
diff --git a/components/viz/display_compositor/BUILD.gn b/components/viz/display_compositor/BUILD.gn deleted file mode 100644 index 60c529d..0000000 --- a/components/viz/display_compositor/BUILD.gn +++ /dev/null
@@ -1,195 +0,0 @@ -# Copyright 2016 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//build/config/ui.gni") -import("//testing/test.gni") - -group("display_compositor") { - if (is_component_build) { - public_deps = [ - "//components/viz", - ] - } else { - public_deps = [ - ":display_compositor_sources", - ] - } -} - -source_set("display_compositor_sources") { - sources = [ - "buffer_queue.cc", - "buffer_queue.h", - "compositor_overlay_candidate_validator.h", - "display_output_surface.cc", - "display_output_surface.h", - "gl_helper.cc", - "gl_helper.h", - "gl_helper_readback_support.cc", - "gl_helper_readback_support.h", - "gl_helper_scaling.cc", - "gl_helper_scaling.h", - "gpu_display_provider.cc", - "gpu_display_provider.h", - "host_shared_bitmap_manager.cc", - "host_shared_bitmap_manager.h", - ] - - configs += [ - "//build/config/compiler:no_size_t_to_int_warning", - "//components/viz:viz_implementation", - ] - - deps = [ - "//base", - "//cc", - "//cc/ipc:interfaces", - "//cc/surfaces", - "//gpu/command_buffer/client", - "//gpu/command_buffer/client:gles2_interface", - "//gpu/command_buffer/common", - "//gpu/ipc:command_buffer", - "//gpu/ipc/common:surface_handle_type", - "//skia", - "//ui/display/types", - "//ui/gfx", - ] - - if (is_mac) { - sources += [ - "compositor_overlay_candidate_validator_mac.h", - "compositor_overlay_candidate_validator_mac.mm", - ] - } - - if (is_android) { - sources += [ - "compositor_overlay_candidate_validator_android.cc", - "compositor_overlay_candidate_validator_android.h", - ] - } - - if (use_ozone) { - sources += [ - "compositor_overlay_candidate_validator_ozone.cc", - "compositor_overlay_candidate_validator_ozone.h", - "display_output_surface_ozone.cc", - "display_output_surface_ozone.h", - ] - - deps += [ "//ui/ozone" ] - } - - if (is_win) { - sources += [ - "compositor_overlay_candidate_validator_win.cc", - "compositor_overlay_candidate_validator_win.h", - ] - } -} - -# These are part of the components_unittests build target. -source_set("unit_tests") { - testonly = true - sources = [ - "buffer_queue_unittest.cc", - "host_shared_bitmap_manager_unittest.cc", - ] - - if (!use_aura && !is_mac) { - sources -= [ "buffer_queue_unittest.cc" ] - } - - configs += [ - "//build/config/compiler:no_size_t_to_int_warning", - "//third_party/khronos:khronos_headers", - ] - - deps = [ - ":display_compositor", - "//base", - "//base/test:test_support", - "//cc:test_support", - "//gpu/command_buffer/client", - "//gpu/command_buffer/client:gles2_implementation", - "//gpu/ipc:gl_in_process_context", - "//media", - "//skia", - "//testing/gmock", - "//testing/gtest", - "//ui/display/types", - "//ui/gl:test_support", - ] - - data_deps = [ - "//third_party/mesa:osmesa", - ] -} - -test("display_compositor_gl_tests") { - sources = [ - "display_compositor_test_suite.cc", - "display_compositor_test_suite.h", - "gl_helper_unittest.cc", - "run_all_unittests.cc", - "yuv_readback_unittest.cc", - ] - - configs += [ - "//build/config/compiler:no_size_t_to_int_warning", - "//third_party/khronos:khronos_headers", - ] - - deps = [ - ":display_compositor", - "//base", - "//base/test:test_support", - "//cc:test_support", - "//gpu/command_buffer/client", - "//gpu/command_buffer/client:gles2_implementation", - "//gpu/ipc:gl_in_process_context", - "//media", - "//skia", - "//testing/gmock", - "//testing/gtest", - "//ui/gl:test_support", - ] - - data_deps = [ - "//third_party/mesa:osmesa", - ] -} - -test("display_compositor_benchmark") { - sources = [ - "display_compositor_test_suite.cc", - "display_compositor_test_suite.h", - "gl_helper_benchmark.cc", - "run_all_unittests.cc", - ] - - configs += [ - "//build/config/compiler:no_size_t_to_int_warning", - "//third_party/khronos:khronos_headers", - ] - - deps = [ - ":display_compositor", - "//base", - "//base/test:test_support", - "//cc:test_support", - "//gpu/command_buffer/client", - "//gpu/command_buffer/client:gles2_implementation", - "//gpu/ipc:gl_in_process_context", - "//media", - "//skia", - "//testing/gmock", - "//testing/gtest", - "//ui/gl:test_support", - ] - - data_deps = [ - "//third_party/mesa:osmesa", - ] -}
diff --git a/components/viz/display_compositor/compositor_overlay_candidate_validator.h b/components/viz/display_compositor/compositor_overlay_candidate_validator.h deleted file mode 100644 index 62eae19..0000000 --- a/components/viz/display_compositor/compositor_overlay_candidate_validator.h +++ /dev/null
@@ -1,28 +0,0 @@ -// Copyright 2015 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_VIZ_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_H_ -#define COMPONENTS_VIZ_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_H_ - -#include "base/macros.h" -#include "cc/output/overlay_candidate_validator.h" -#include "components/viz/viz_export.h" - -namespace viz { - -class VIZ_EXPORT CompositorOverlayCandidateValidator - : public cc::OverlayCandidateValidator { - public: - CompositorOverlayCandidateValidator() {} - ~CompositorOverlayCandidateValidator() override {} - - virtual void SetSoftwareMirrorMode(bool enabled) = 0; - - private: - DISALLOW_COPY_AND_ASSIGN(CompositorOverlayCandidateValidator); -}; - -} // namespace viz - -#endif // COMPONENTS_VIZ_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_H_
diff --git a/components/viz/frame_sinks/BUILD.gn b/components/viz/frame_sinks/BUILD.gn deleted file mode 100644 index 1f3f190f..0000000 --- a/components/viz/frame_sinks/BUILD.gn +++ /dev/null
@@ -1,46 +0,0 @@ -# Copyright 2017 The Chromium Authors. All rights reserved. -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -group("frame_sinks") { - if (is_component_build) { - public_deps = [ - "//components/viz", - ] - } else { - public_deps = [ - ":frame_sinks_sources", - ] - } -} - -source_set("frame_sinks_sources") { - sources = [ - "frame_eviction_manager.cc", - "frame_eviction_manager.h", - "frame_evictor.cc", - "frame_evictor.h", - "gpu_compositor_frame_sink.cc", - "gpu_compositor_frame_sink.h", - "gpu_compositor_frame_sink_delegate.h", - "gpu_root_compositor_frame_sink.cc", - "gpu_root_compositor_frame_sink.h", - "mojo_frame_sink_manager.cc", - "mojo_frame_sink_manager.h", - ] - - public_deps = [ - "//base", - "//cc", - "//cc/ipc:interfaces", - "//cc/surfaces", - "//components/viz/display_compositor:display_compositor_sources", - "//gpu/ipc:command_buffer", - ] - - configs += [ "//components/viz:viz_implementation" ] - - if (is_win) { - cflags = [ "/wd4267" ] # conversion from 'size_t' to 'int' on x64 (crbug.com/633312) - } -}
diff --git a/components/viz/host/BUILD.gn b/components/viz/host/BUILD.gn index 4cf26cc..06d7982e 100644 --- a/components/viz/host/BUILD.gn +++ b/components/viz/host/BUILD.gn
@@ -16,6 +16,5 @@ "//base", "//cc/ipc:interfaces", "//cc/surfaces", - "//components/viz/frame_sinks", ] }
diff --git a/components/viz/host/frame_sink_manager_host.cc b/components/viz/host/frame_sink_manager_host.cc index 1a9cb0e..9887460 100644 --- a/components/viz/host/frame_sink_manager_host.cc +++ b/components/viz/host/frame_sink_manager_host.cc
@@ -8,7 +8,6 @@ #include "cc/surfaces/surface_info.h" #include "cc/surfaces/surface_manager.h" -#include "components/viz/frame_sinks/mojo_frame_sink_manager.h" namespace viz { @@ -65,27 +64,4 @@ observer.OnSurfaceCreated(surface_info); } -// static -void FrameSinkManagerHost::ConnectWithInProcessFrameSinkManager( - FrameSinkManagerHost* host, - MojoFrameSinkManager* manager) { - // A mojo pointer to |host| which is the FrameSinkManager's client. - cc::mojom::FrameSinkManagerClientPtr host_mojo; - // A mojo pointer to |manager|. - cc::mojom::FrameSinkManagerPtr manager_mojo; - - // A request to bind to each of the above interfaces. - cc::mojom::FrameSinkManagerClientRequest host_mojo_request = - mojo::MakeRequest(&host_mojo); - cc::mojom::FrameSinkManagerRequest manager_mojo_request = - mojo::MakeRequest(&manager_mojo); - - // Sets |manager_mojo| which is given to the |host|. - manager->BindPtrAndSetClient(std::move(manager_mojo_request), - std::move(host_mojo)); - // Sets |host_mojo| which was given to the |manager|. - host->BindManagerClientAndSetManagerPtr(std::move(host_mojo_request), - std::move(manager_mojo)); -} - } // namespace viz
diff --git a/components/viz/host/frame_sink_manager_host.h b/components/viz/host/frame_sink_manager_host.h index dd3f80d..d7b37f0 100644 --- a/components/viz/host/frame_sink_manager_host.h +++ b/components/viz/host/frame_sink_manager_host.h
@@ -20,7 +20,6 @@ } namespace viz { -class MojoFrameSinkManager; // Browser side implementation of mojom::FrameSinkManager, to be used from the // UI thread. Manages frame sinks and is intended to replace SurfaceManager. @@ -50,10 +49,6 @@ void UnregisterFrameSinkHierarchy(const cc::FrameSinkId& parent_frame_sink_id, const cc::FrameSinkId& child_frame_sink_id); - static void ConnectWithInProcessFrameSinkManager( - FrameSinkManagerHost* host, - MojoFrameSinkManager* manager); - private: // cc::mojom::FrameSinkManagerClient: void OnSurfaceCreated(const cc::SurfaceInfo& surface_info) override;
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn new file mode 100644 index 0000000..ecb8291d --- /dev/null +++ b/components/viz/service/BUILD.gn
@@ -0,0 +1,198 @@ +# Copyright 2017 The Chromium Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/config/ui.gni") +import("//testing/test.gni") + +config("viz_service_implementation") { +} + +component("service") { + sources = [ + "display_compositor/buffer_queue.cc", + "display_compositor/buffer_queue.h", + "display_compositor/compositor_overlay_candidate_validator.h", + "display_compositor/display_output_surface.cc", + "display_compositor/display_output_surface.h", + "display_compositor/display_provider.h", + "display_compositor/gl_helper.cc", + "display_compositor/gl_helper.h", + "display_compositor/gl_helper_readback_support.cc", + "display_compositor/gl_helper_readback_support.h", + "display_compositor/gl_helper_scaling.cc", + "display_compositor/gl_helper_scaling.h", + "display_compositor/gpu_display_provider.cc", + "display_compositor/gpu_display_provider.h", + "display_compositor/host_shared_bitmap_manager.cc", + "display_compositor/host_shared_bitmap_manager.h", + "frame_sinks/frame_eviction_manager.cc", + "frame_sinks/frame_eviction_manager.h", + "frame_sinks/frame_evictor.cc", + "frame_sinks/frame_evictor.h", + "frame_sinks/gpu_compositor_frame_sink.cc", + "frame_sinks/gpu_compositor_frame_sink.h", + "frame_sinks/gpu_compositor_frame_sink_delegate.h", + "frame_sinks/gpu_root_compositor_frame_sink.cc", + "frame_sinks/gpu_root_compositor_frame_sink.h", + "frame_sinks/mojo_frame_sink_manager.cc", + "frame_sinks/mojo_frame_sink_manager.h", + "viz_service_export.h", + ] + + defines = [ "VIZ_SERVICE_IMPLEMENTATION" ] + + configs += [ "//build/config/compiler:no_size_t_to_int_warning" ] + + public_deps = [ + "//base", + "//cc", + "//cc/ipc:interfaces", + "//cc/surfaces", + "//gpu/command_buffer/client", + "//gpu/command_buffer/client:gles2_interface", + "//gpu/command_buffer/common", + "//gpu/ipc:command_buffer", + "//gpu/ipc/common:surface_handle_type", + "//skia", + "//ui/display/types", + "//ui/gfx", + ] + + if (is_mac) { + sources += [ + "display_compositor/compositor_overlay_candidate_validator_mac.h", + "display_compositor/compositor_overlay_candidate_validator_mac.mm", + ] + } + + if (is_android) { + sources += [ + "display_compositor/compositor_overlay_candidate_validator_android.cc", + "display_compositor/compositor_overlay_candidate_validator_android.h", + ] + } + + if (use_ozone) { + sources += [ + "display_compositor/compositor_overlay_candidate_validator_ozone.cc", + "display_compositor/compositor_overlay_candidate_validator_ozone.h", + "display_compositor/display_output_surface_ozone.cc", + "display_compositor/display_output_surface_ozone.h", + ] + + public_deps += [ "//ui/ozone" ] + } + + if (is_win) { + sources += [ + "display_compositor/compositor_overlay_candidate_validator_win.cc", + "display_compositor/compositor_overlay_candidate_validator_win.h", + ] + } +} + +# These are part of the components_unittests build target. +source_set("unit_tests") { + testonly = true + sources = [ + "display_compositor/buffer_queue_unittest.cc", + "display_compositor/host_shared_bitmap_manager_unittest.cc", + ] + + if (!use_aura && !is_mac) { + sources -= [ "display_compositor/buffer_queue_unittest.cc" ] + } + + configs += [ + "//build/config/compiler:no_size_t_to_int_warning", + "//third_party/khronos:khronos_headers", + ] + + deps = [ + ":service", + "//base", + "//base/test:test_support", + "//cc:test_support", + "//gpu/command_buffer/client", + "//gpu/command_buffer/client:gles2_implementation", + "//gpu/ipc:gl_in_process_context", + "//media", + "//skia", + "//testing/gmock", + "//testing/gtest", + "//ui/display/types", + "//ui/gl:test_support", + ] + + data_deps = [ + "//third_party/mesa:osmesa", + ] +} + +test("display_compositor_gl_tests") { + sources = [ + "display_compositor/display_compositor_test_suite.cc", + "display_compositor/display_compositor_test_suite.h", + "display_compositor/gl_helper_unittest.cc", + "display_compositor/run_all_unittests.cc", + "display_compositor/yuv_readback_unittest.cc", + ] + + configs += [ + "//build/config/compiler:no_size_t_to_int_warning", + "//third_party/khronos:khronos_headers", + ] + + deps = [ + ":service", + "//base", + "//base/test:test_support", + "//cc:test_support", + "//gpu/command_buffer/client", + "//gpu/command_buffer/client:gles2_implementation", + "//gpu/ipc:gl_in_process_context", + "//media", + "//skia", + "//testing/gmock", + "//testing/gtest", + "//ui/gl:test_support", + ] + + data_deps = [ + "//third_party/mesa:osmesa", + ] +} + +test("display_compositor_benchmark") { + sources = [ + "display_compositor/display_compositor_test_suite.cc", + "display_compositor/display_compositor_test_suite.h", + "display_compositor/gl_helper_benchmark.cc", + "display_compositor/run_all_unittests.cc", + ] + + configs += [ + "//build/config/compiler:no_size_t_to_int_warning", + "//third_party/khronos:khronos_headers", + ] + + deps = [ + ":service", + "//base", + "//base/test:test_support", + "//cc:test_support", + "//gpu/command_buffer/client", + "//gpu/command_buffer/client:gles2_implementation", + "//gpu/ipc:gl_in_process_context", + "//media", + "//skia", + "//testing/gmock", + "//testing/gtest", + "//ui/gl:test_support", + ] + + data_deps = [ + "//third_party/mesa:osmesa", + ] +}
diff --git a/components/viz/display_compositor/DEPS b/components/viz/service/display_compositor/DEPS similarity index 100% rename from components/viz/display_compositor/DEPS rename to components/viz/service/display_compositor/DEPS
diff --git a/components/viz/display_compositor/OWNERS b/components/viz/service/display_compositor/OWNERS similarity index 100% rename from components/viz/display_compositor/OWNERS rename to components/viz/service/display_compositor/OWNERS
diff --git a/components/viz/display_compositor/buffer_queue.cc b/components/viz/service/display_compositor/buffer_queue.cc similarity index 98% rename from components/viz/display_compositor/buffer_queue.cc rename to components/viz/service/display_compositor/buffer_queue.cc index baa5a38..f4542f9 100644 --- a/components/viz/display_compositor/buffer_queue.cc +++ b/components/viz/service/display_compositor/buffer_queue.cc
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/display_compositor/buffer_queue.h" +#include "components/viz/service/display_compositor/buffer_queue.h" #include "base/containers/adapters.h" #include "base/memory/ptr_util.h" #include "build/build_config.h" -#include "components/viz/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/gl_helper.h" #include "gpu/GLES2/gl2extchromium.h" #include "gpu/command_buffer/client/gles2_interface.h" #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h"
diff --git a/components/viz/display_compositor/buffer_queue.h b/components/viz/service/display_compositor/buffer_queue.h similarity index 92% rename from components/viz/display_compositor/buffer_queue.h rename to components/viz/service/display_compositor/buffer_queue.h index a0e9144..bac1b85e 100644 --- a/components/viz/display_compositor/buffer_queue.h +++ b/components/viz/service/display_compositor/buffer_queue.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_DISPLAY_COMPOSITOR_BUFFER_QUEUE_H_ -#define COMPONENTS_VIZ_DISPLAY_COMPOSITOR_BUFFER_QUEUE_H_ +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_BUFFER_QUEUE_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_BUFFER_QUEUE_H_ #include <stddef.h> @@ -13,7 +13,7 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" -#include "components/viz/viz_export.h" +#include "components/viz/service/viz_service_export.h" #include "gpu/ipc/common/surface_handle.h" #include "ui/gfx/buffer_types.h" #include "ui/gfx/color_space.h" @@ -40,7 +40,7 @@ // created using CHROMIUM_image. Double/triple buffering is implemented // internally. Doublebuffering occurs if PageFlipComplete is called before the // next BindFramebuffer call, otherwise it creates extra buffers. -class VIZ_EXPORT BufferQueue { +class VIZ_SERVICE_EXPORT BufferQueue { public: BufferQueue(gpu::gles2::GLES2Interface* gl, uint32_t texture_target, @@ -70,7 +70,7 @@ friend class BufferQueueTest; friend class AllocatedSurface; - struct VIZ_EXPORT AllocatedSurface { + struct VIZ_SERVICE_EXPORT AllocatedSurface { AllocatedSurface(BufferQueue* buffer_queue, std::unique_ptr<gfx::GpuMemoryBuffer> buffer, uint32_t texture, @@ -133,4 +133,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_DISPLAY_COMPOSITOR_BUFFER_QUEUE_H_ +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_BUFFER_QUEUE_H_
diff --git a/components/viz/display_compositor/buffer_queue_unittest.cc b/components/viz/service/display_compositor/buffer_queue_unittest.cc similarity index 99% rename from components/viz/display_compositor/buffer_queue_unittest.cc rename to components/viz/service/display_compositor/buffer_queue_unittest.cc index 44c36aa..afa9da5 100644 --- a/components/viz/display_compositor/buffer_queue_unittest.cc +++ b/components/viz/service/display_compositor/buffer_queue_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/display_compositor/buffer_queue.h" +#include "components/viz/service/display_compositor/buffer_queue.h" #include <stddef.h> #include <stdint.h> @@ -14,7 +14,7 @@ #include "cc/test/test_context_provider.h" #include "cc/test/test_gpu_memory_buffer_manager.h" #include "cc/test/test_web_graphics_context_3d.h" -#include "components/viz/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/gl_helper.h" #include "gpu/GLES2/gl2extchromium.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/components/viz/service/display_compositor/compositor_overlay_candidate_validator.h b/components/viz/service/display_compositor/compositor_overlay_candidate_validator.h new file mode 100644 index 0000000..7101bd2 --- /dev/null +++ b/components/viz/service/display_compositor/compositor_overlay_candidate_validator.h
@@ -0,0 +1,28 @@ +// Copyright 2015 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_H_ + +#include "base/macros.h" +#include "cc/output/overlay_candidate_validator.h" +#include "components/viz/service/viz_service_export.h" + +namespace viz { + +class VIZ_SERVICE_EXPORT CompositorOverlayCandidateValidator + : public cc::OverlayCandidateValidator { + public: + CompositorOverlayCandidateValidator() {} + ~CompositorOverlayCandidateValidator() override {} + + virtual void SetSoftwareMirrorMode(bool enabled) = 0; + + private: + DISALLOW_COPY_AND_ASSIGN(CompositorOverlayCandidateValidator); +}; + +} // namespace viz + +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_H_
diff --git a/components/viz/display_compositor/compositor_overlay_candidate_validator_android.cc b/components/viz/service/display_compositor/compositor_overlay_candidate_validator_android.cc similarity index 95% rename from components/viz/display_compositor/compositor_overlay_candidate_validator_android.cc rename to components/viz/service/display_compositor/compositor_overlay_candidate_validator_android.cc index e183ee1..0c68b39 100644 --- a/components/viz/display_compositor/compositor_overlay_candidate_validator_android.cc +++ b/components/viz/service/display_compositor/compositor_overlay_candidate_validator_android.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/display_compositor/compositor_overlay_candidate_validator_android.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator_android.h" #include <memory>
diff --git a/components/viz/display_compositor/compositor_overlay_candidate_validator_android.h b/components/viz/service/display_compositor/compositor_overlay_candidate_validator_android.h similarity index 71% rename from components/viz/display_compositor/compositor_overlay_candidate_validator_android.h rename to components/viz/service/display_compositor/compositor_overlay_candidate_validator_android.h index 9f6e75c9..4a78513d 100644 --- a/components/viz/display_compositor/compositor_overlay_candidate_validator_android.h +++ b/components/viz/service/display_compositor/compositor_overlay_candidate_validator_android.h
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_ANDROID_H_ -#define COMPONENTS_VIZ_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_ANDROID_H_ +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_ANDROID_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_ANDROID_H_ #include "base/macros.h" -#include "components/viz/display_compositor/compositor_overlay_candidate_validator.h" -#include "components/viz/viz_export.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator.h" +#include "components/viz/service/viz_service_export.h" namespace viz { @@ -19,7 +19,7 @@ // the reasons that only fullscreen is supported: we have to be sure that // nothing will cause the overlay to be rejected, because there's no fallback to // gl compositing. -class VIZ_EXPORT CompositorOverlayCandidateValidatorAndroid +class VIZ_SERVICE_EXPORT CompositorOverlayCandidateValidatorAndroid : public CompositorOverlayCandidateValidator { public: CompositorOverlayCandidateValidatorAndroid(); @@ -38,4 +38,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_ANDROID_H_ +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_ANDROID_H_
diff --git a/components/viz/display_compositor/compositor_overlay_candidate_validator_mac.h b/components/viz/service/display_compositor/compositor_overlay_candidate_validator_mac.h similarity index 66% rename from components/viz/display_compositor/compositor_overlay_candidate_validator_mac.h rename to components/viz/service/display_compositor/compositor_overlay_candidate_validator_mac.h index 774c22c..bee638b 100644 --- a/components/viz/display_compositor/compositor_overlay_candidate_validator_mac.h +++ b/components/viz/service/display_compositor/compositor_overlay_candidate_validator_mac.h
@@ -2,18 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_MAC_H_ -#define COMPONENTS_VIZ_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_MAC_H_ +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_MAC_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_MAC_H_ #include <memory> #include "base/macros.h" -#include "components/viz/display_compositor/compositor_overlay_candidate_validator.h" -#include "components/viz/viz_export.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator.h" +#include "components/viz/service/viz_service_export.h" namespace viz { -class VIZ_EXPORT CompositorOverlayCandidateValidatorMac +class VIZ_SERVICE_EXPORT CompositorOverlayCandidateValidatorMac : public CompositorOverlayCandidateValidator { public: explicit CompositorOverlayCandidateValidatorMac(bool ca_layer_disabled); @@ -37,4 +37,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_MAC_H_ +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_MAC_H_
diff --git a/components/viz/display_compositor/compositor_overlay_candidate_validator_mac.mm b/components/viz/service/display_compositor/compositor_overlay_candidate_validator_mac.mm similarity index 91% rename from components/viz/display_compositor/compositor_overlay_candidate_validator_mac.mm rename to components/viz/service/display_compositor/compositor_overlay_candidate_validator_mac.mm index 1fe6d35..3175f1f 100644 --- a/components/viz/display_compositor/compositor_overlay_candidate_validator_mac.mm +++ b/components/viz/service/display_compositor/compositor_overlay_candidate_validator_mac.mm
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/display_compositor/compositor_overlay_candidate_validator_mac.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator_mac.h" #include <stddef.h>
diff --git a/components/viz/display_compositor/compositor_overlay_candidate_validator_ozone.cc b/components/viz/service/display_compositor/compositor_overlay_candidate_validator_ozone.cc similarity index 97% rename from components/viz/display_compositor/compositor_overlay_candidate_validator_ozone.cc rename to components/viz/service/display_compositor/compositor_overlay_candidate_validator_ozone.cc index c21d8c7..ed1a7d8 100644 --- a/components/viz/display_compositor/compositor_overlay_candidate_validator_ozone.cc +++ b/components/viz/service/display_compositor/compositor_overlay_candidate_validator_ozone.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/display_compositor/compositor_overlay_candidate_validator_ozone.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator_ozone.h" #include <stddef.h>
diff --git a/components/viz/display_compositor/compositor_overlay_candidate_validator_ozone.h b/components/viz/service/display_compositor/compositor_overlay_candidate_validator_ozone.h similarity index 76% rename from components/viz/display_compositor/compositor_overlay_candidate_validator_ozone.h rename to components/viz/service/display_compositor/compositor_overlay_candidate_validator_ozone.h index 3e95825c..c9862cc 100644 --- a/components/viz/display_compositor/compositor_overlay_candidate_validator_ozone.h +++ b/components/viz/service/display_compositor/compositor_overlay_candidate_validator_ozone.h
@@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_OZONE_H_ -#define COMPONENTS_VIZ_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_OZONE_H_ +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_OZONE_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_OZONE_H_ #include <memory> #include "base/callback.h" #include "base/macros.h" -#include "components/viz/display_compositor/compositor_overlay_candidate_validator.h" -#include "components/viz/viz_export.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator.h" +#include "components/viz/service/viz_service_export.h" #include "ui/gfx/native_widget_types.h" namespace ui { @@ -19,7 +19,7 @@ namespace viz { -class VIZ_EXPORT CompositorOverlayCandidateValidatorOzone +class VIZ_SERVICE_EXPORT CompositorOverlayCandidateValidatorOzone : public CompositorOverlayCandidateValidator { public: CompositorOverlayCandidateValidatorOzone( @@ -52,4 +52,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_OZONE_H_ +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_OZONE_H_
diff --git a/components/viz/display_compositor/compositor_overlay_candidate_validator_win.cc b/components/viz/service/display_compositor/compositor_overlay_candidate_validator_win.cc similarity index 90% rename from components/viz/display_compositor/compositor_overlay_candidate_validator_win.cc rename to components/viz/service/display_compositor/compositor_overlay_candidate_validator_win.cc index 0a4e0f9..88037edb 100644 --- a/components/viz/display_compositor/compositor_overlay_candidate_validator_win.cc +++ b/components/viz/service/display_compositor/compositor_overlay_candidate_validator_win.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/display_compositor/compositor_overlay_candidate_validator_win.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator_win.h" #include "cc/output/overlay_processor.h"
diff --git a/components/viz/display_compositor/compositor_overlay_candidate_validator_win.h b/components/viz/service/display_compositor/compositor_overlay_candidate_validator_win.h similarity index 63% rename from components/viz/display_compositor/compositor_overlay_candidate_validator_win.h rename to components/viz/service/display_compositor/compositor_overlay_candidate_validator_win.h index 9cd9446..18eaf301 100644 --- a/components/viz/display_compositor/compositor_overlay_candidate_validator_win.h +++ b/components/viz/service/display_compositor/compositor_overlay_candidate_validator_win.h
@@ -2,18 +2,18 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_WIN_H_ -#define COMPONENTS_VIZ_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_WIN_H_ +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_WIN_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_WIN_H_ #include "base/macros.h" -#include "components/viz/display_compositor/compositor_overlay_candidate_validator.h" -#include "components/viz/viz_export.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator.h" +#include "components/viz/service/viz_service_export.h" namespace viz { // This is a simple overlay candidate validator that promotes everything // possible to an overlay. -class VIZ_EXPORT CompositorOverlayCandidateValidatorWin +class VIZ_SERVICE_EXPORT CompositorOverlayCandidateValidatorWin : public CompositorOverlayCandidateValidator { public: CompositorOverlayCandidateValidatorWin(); @@ -32,4 +32,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_WIN_H_ +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_COMPOSITOR_OVERLAY_CANDIDATE_VALIDATOR_WIN_H_
diff --git a/components/viz/display_compositor/display_compositor_test_suite.cc b/components/viz/service/display_compositor/display_compositor_test_suite.cc similarity index 92% rename from components/viz/display_compositor/display_compositor_test_suite.cc rename to components/viz/service/display_compositor/display_compositor_test_suite.cc index 8744ff8..b3ddb3df 100644 --- a/components/viz/display_compositor/display_compositor_test_suite.cc +++ b/components/viz/service/display_compositor/display_compositor_test_suite.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/display_compositor/display_compositor_test_suite.h" +#include "components/viz/service/display_compositor/display_compositor_test_suite.h" #include "base/message_loop/message_loop.h" #include "base/threading/thread_id_name_manager.h"
diff --git a/components/viz/display_compositor/display_compositor_test_suite.h b/components/viz/service/display_compositor/display_compositor_test_suite.h similarity index 76% rename from components/viz/display_compositor/display_compositor_test_suite.h rename to components/viz/service/display_compositor/display_compositor_test_suite.h index e2a755b2..e3bdb08 100644 --- a/components/viz/display_compositor/display_compositor_test_suite.h +++ b/components/viz/service/display_compositor/display_compositor_test_suite.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_DISPLAY_COMPOSITOR_DISPLAY_COMPOSITOR_TEST_SUITE_H_ -#define COMPONENTS_VIZ_DISPLAY_COMPOSITOR_DISPLAY_COMPOSITOR_TEST_SUITE_H_ +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_DISPLAY_COMPOSITOR_TEST_SUITE_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_DISPLAY_COMPOSITOR_TEST_SUITE_H_ #include <memory> @@ -36,4 +36,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_DISPLAY_COMPOSITOR_DISPLAY_COMPOSITOR_TEST_SUITE_H_ +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_DISPLAY_COMPOSITOR_TEST_SUITE_H_
diff --git a/components/viz/display_compositor/display_output_surface.cc b/components/viz/service/display_compositor/display_output_surface.cc similarity index 98% rename from components/viz/display_compositor/display_output_surface.cc rename to components/viz/service/display_compositor/display_output_surface.cc index 1c5b7d4..28e026b 100644 --- a/components/viz/display_compositor/display_output_surface.cc +++ b/components/viz/service/display_compositor/display_output_surface.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/display_compositor/display_output_surface.h" +#include "components/viz/service/display_compositor/display_output_surface.h" #include <stdint.h>
diff --git a/components/viz/display_compositor/display_output_surface.h b/components/viz/service/display_compositor/display_output_surface.h similarity index 91% rename from components/viz/display_compositor/display_output_surface.h rename to components/viz/service/display_compositor/display_output_surface.h index 2f1b0c8..c2ce94a 100644 --- a/components/viz/display_compositor/display_output_surface.h +++ b/components/viz/service/display_compositor/display_output_surface.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_DISPLAY_COMPOSITOR_DISPLAY_OUTPUT_SURFACE_H_ -#define COMPONENTS_VIZ_DISPLAY_COMPOSITOR_DISPLAY_OUTPUT_SURFACE_H_ +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_DISPLAY_OUTPUT_SURFACE_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_DISPLAY_OUTPUT_SURFACE_H_ #include <memory> @@ -75,4 +75,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_DISPLAY_COMPOSITOR_DISPLAY_OUTPUT_SURFACE_H_ +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_DISPLAY_OUTPUT_SURFACE_H_
diff --git a/components/viz/display_compositor/display_output_surface_ozone.cc b/components/viz/service/display_compositor/display_output_surface_ozone.cc similarity index 96% rename from components/viz/display_compositor/display_output_surface_ozone.cc rename to components/viz/service/display_compositor/display_output_surface_ozone.cc index fdd87114..8f9bc01ea 100644 --- a/components/viz/display_compositor/display_output_surface_ozone.cc +++ b/components/viz/service/display_compositor/display_output_surface_ozone.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/display_compositor/display_output_surface_ozone.h" +#include "components/viz/service/display_compositor/display_output_surface_ozone.h" #include <utility> @@ -12,7 +12,7 @@ #include "cc/output/output_surface_client.h" #include "cc/output/output_surface_frame.h" #include "cc/scheduler/begin_frame_source.h" -#include "components/viz/display_compositor/buffer_queue.h" +#include "components/viz/service/display_compositor/buffer_queue.h" #include "gpu/command_buffer/client/context_support.h" #include "gpu/command_buffer/client/gles2_interface.h" #include "ui/display/types/display_snapshot.h"
diff --git a/components/viz/display_compositor/display_output_surface_ozone.h b/components/viz/service/display_compositor/display_output_surface_ozone.h similarity index 84% rename from components/viz/display_compositor/display_output_surface_ozone.h rename to components/viz/service/display_compositor/display_output_surface_ozone.h index c6fdf41..64cfa926 100644 --- a/components/viz/display_compositor/display_output_surface_ozone.h +++ b/components/viz/service/display_compositor/display_output_surface_ozone.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_DISPLAY_COMPOSITOR_DISPLAY_OUTPUT_SURFACE_OZONE_H_ -#define COMPONENTS_VIZ_DISPLAY_COMPOSITOR_DISPLAY_OUTPUT_SURFACE_OZONE_H_ +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_DISPLAY_OUTPUT_SURFACE_OZONE_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_DISPLAY_OUTPUT_SURFACE_OZONE_H_ #include <memory> @@ -11,8 +11,8 @@ #include "cc/output/context_provider.h" #include "cc/output/in_process_context_provider.h" #include "cc/output/output_surface.h" -#include "components/viz/display_compositor/display_output_surface.h" -#include "components/viz/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/display_output_surface.h" +#include "components/viz/service/display_compositor/gl_helper.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/native_widget_types.h" #include "ui/gfx/swap_result.h" @@ -75,4 +75,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_DISPLAY_COMPOSITOR_DISPLAY_OUTPUT_SURFACE_OZONE_H_ +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_DISPLAY_OUTPUT_SURFACE_OZONE_H_
diff --git a/components/viz/display_compositor/display_provider.h b/components/viz/service/display_compositor/display_provider.h similarity index 80% rename from components/viz/display_compositor/display_provider.h rename to components/viz/service/display_compositor/display_provider.h index 00c0875..2b26b2fb 100644 --- a/components/viz/display_compositor/display_provider.h +++ b/components/viz/service/display_compositor/display_provider.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_DISPLAY_COMPOSITOR_DISPLAY_PROVIDER_H_ -#define COMPONENTS_VIZ_DISPLAY_COMPOSITOR_DISPLAY_PROVIDER_H_ +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_DISPLAY_PROVIDER_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_DISPLAY_PROVIDER_H_ #include <memory> @@ -33,4 +33,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_DISPLAY_COMPOSITOR_DISPLAY_PROVIDER_H_ +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_DISPLAY_PROVIDER_H_
diff --git a/components/viz/display_compositor/gl_helper.cc b/components/viz/service/display_compositor/gl_helper.cc similarity index 99% rename from components/viz/display_compositor/gl_helper.cc rename to components/viz/service/display_compositor/gl_helper.cc index 0d374552..ad178fa 100644 --- a/components/viz/display_compositor/gl_helper.cc +++ b/components/viz/service/display_compositor/gl_helper.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/gl_helper.h" #include <stddef.h> #include <stdint.h> @@ -19,8 +19,8 @@ #include "base/strings/string_util.h" #include "base/time/time.h" #include "base/trace_event/trace_event.h" -#include "components/viz/display_compositor/gl_helper_readback_support.h" -#include "components/viz/display_compositor/gl_helper_scaling.h" +#include "components/viz/service/display_compositor/gl_helper_readback_support.h" +#include "components/viz/service/display_compositor/gl_helper_scaling.h" #include "gpu/GLES2/gl2extchromium.h" #include "gpu/command_buffer/client/context_support.h" #include "gpu/command_buffer/common/mailbox.h"
diff --git a/components/viz/display_compositor/gl_helper.h b/components/viz/service/display_compositor/gl_helper.h similarity index 96% rename from components/viz/display_compositor/gl_helper.h rename to components/viz/service/display_compositor/gl_helper.h index 430c72f..bdab5da 100644 --- a/components/viz/display_compositor/gl_helper.h +++ b/components/viz/service/display_compositor/gl_helper.h
@@ -2,15 +2,15 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_DISPLAY_COMPOSITOR_GL_HELPER_H_ -#define COMPONENTS_VIZ_DISPLAY_COMPOSITOR_GL_HELPER_H_ +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_GL_HELPER_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_GL_HELPER_H_ #include <memory> #include "base/atomicops.h" #include "base/callback.h" #include "base/macros.h" -#include "components/viz/viz_export.h" +#include "components/viz/service/viz_service_export.h" #include "gpu/command_buffer/client/gles2_interface.h" #include "gpu/command_buffer/common/mailbox_holder.h" #include "third_party/skia/include/core/SkBitmap.h" @@ -32,7 +32,7 @@ class GLHelperScaling; -class VIZ_EXPORT ScopedGLuint { +class VIZ_SERVICE_EXPORT ScopedGLuint { public: typedef void (gpu::gles2::GLES2Interface::*GenFunc)(GLsizei n, GLuint* ids); typedef void (gpu::gles2::GLES2Interface::*DeleteFunc)(GLsizei n, @@ -134,7 +134,7 @@ // Provides higher level operations on top of the gpu::gles2::GLES2Interface // interfaces. -class VIZ_EXPORT GLHelper { +class VIZ_SERVICE_EXPORT GLHelper { public: GLHelper(gpu::gles2::GLES2Interface* gl, gpu::ContextSupport* context_support); @@ -280,7 +280,7 @@ // needed to scale from a specified size to a destination size. // If the source or destination sizes changes, you must create // a new scaler. - class VIZ_EXPORT ScalerInterface { + class VIZ_SERVICE_EXPORT ScalerInterface { public: ScalerInterface() {} virtual ~ScalerInterface() {} @@ -354,7 +354,7 @@ // can handle multiple outstanding readbacks at the same time, but // if the source or destination sizes change, you'll need to create // a new readback pipeline. -class VIZ_EXPORT ReadbackYUVInterface { +class VIZ_SERVICE_EXPORT ReadbackYUVInterface { public: ReadbackYUVInterface() {} virtual ~ReadbackYUVInterface() {} @@ -380,4 +380,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_DISPLAY_COMPOSITOR_GL_HELPER_H_ +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_GL_HELPER_H_
diff --git a/components/viz/display_compositor/gl_helper_benchmark.cc b/components/viz/service/display_compositor/gl_helper_benchmark.cc similarity index 98% rename from components/viz/display_compositor/gl_helper_benchmark.cc rename to components/viz/service/display_compositor/gl_helper_benchmark.cc index e390e03..c9d83341 100644 --- a/components/viz/display_compositor/gl_helper_benchmark.cc +++ b/components/viz/service/display_compositor/gl_helper_benchmark.cc
@@ -25,8 +25,8 @@ #include "base/strings/stringprintf.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" -#include "components/viz/display_compositor/gl_helper.h" -#include "components/viz/display_compositor/gl_helper_scaling.h" +#include "components/viz/service/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/gl_helper_scaling.h" #include "gpu/command_buffer/client/gles2_implementation.h" #include "gpu/command_buffer/client/shared_memory_limits.h" #include "gpu/ipc/gl_in_process_context.h"
diff --git a/components/viz/display_compositor/gl_helper_readback_support.cc b/components/viz/service/display_compositor/gl_helper_readback_support.cc similarity index 98% rename from components/viz/display_compositor/gl_helper_readback_support.cc rename to components/viz/service/display_compositor/gl_helper_readback_support.cc index 5fd12924..ae70d19 100644 --- a/components/viz/display_compositor/gl_helper_readback_support.cc +++ b/components/viz/service/display_compositor/gl_helper_readback_support.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/display_compositor/gl_helper_readback_support.h" +#include "components/viz/service/display_compositor/gl_helper_readback_support.h" #include "base/logging.h" #include "gpu/GLES2/gl2extchromium.h" #include "third_party/skia/include/core/SkImageInfo.h"
diff --git a/components/viz/display_compositor/gl_helper_readback_support.h b/components/viz/service/display_compositor/gl_helper_readback_support.h similarity index 85% rename from components/viz/display_compositor/gl_helper_readback_support.h rename to components/viz/service/display_compositor/gl_helper_readback_support.h index b68f4dd5..2e1505e 100644 --- a/components/viz/display_compositor/gl_helper_readback_support.h +++ b/components/viz/service/display_compositor/gl_helper_readback_support.h
@@ -2,19 +2,19 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_DISPLAY_COMPOSITOR_GL_HELPER_READBACK_SUPPORT_H_ -#define COMPONENTS_VIZ_DISPLAY_COMPOSITOR_GL_HELPER_READBACK_SUPPORT_H_ +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_GL_HELPER_READBACK_SUPPORT_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_GL_HELPER_READBACK_SUPPORT_H_ #include <stddef.h> #include <vector> -#include "components/viz/display_compositor/gl_helper.h" -#include "components/viz/viz_export.h" +#include "components/viz/service/display_compositor/gl_helper.h" +#include "components/viz/service/viz_service_export.h" namespace viz { -class VIZ_EXPORT GLHelperReadbackSupport { +class VIZ_SERVICE_EXPORT GLHelperReadbackSupport { public: enum FormatSupport { SUPPORTED, SWIZZLE, NOT_SUPPORTED }; @@ -73,4 +73,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_DISPLAY_COMPOSITOR_GL_HELPER_READBACK_SUPPORT_H_ +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_GL_HELPER_READBACK_SUPPORT_H_
diff --git a/components/viz/display_compositor/gl_helper_scaling.cc b/components/viz/service/display_compositor/gl_helper_scaling.cc similarity index 99% rename from components/viz/display_compositor/gl_helper_scaling.cc rename to components/viz/service/display_compositor/gl_helper_scaling.cc index 9f29c36..0a7ed56 100644 --- a/components/viz/display_compositor/gl_helper_scaling.cc +++ b/components/viz/service/display_compositor/gl_helper_scaling.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/display_compositor/gl_helper_scaling.h" +#include "components/viz/service/display_compositor/gl_helper_scaling.h" #include <stddef.h>
diff --git a/components/viz/display_compositor/gl_helper_scaling.h b/components/viz/service/display_compositor/gl_helper_scaling.h similarity index 94% rename from components/viz/display_compositor/gl_helper_scaling.h rename to components/viz/service/display_compositor/gl_helper_scaling.h index cc90617..bbc0b21b 100644 --- a/components/viz/display_compositor/gl_helper_scaling.h +++ b/components/viz/service/display_compositor/gl_helper_scaling.h
@@ -2,16 +2,16 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_DISPLAY_COMPOSITOR_GL_HELPER_SCALING_H_ -#define COMPONENTS_VIZ_DISPLAY_COMPOSITOR_GL_HELPER_SCALING_H_ +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_GL_HELPER_SCALING_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_GL_HELPER_SCALING_H_ #include <deque> #include <map> #include <vector> #include "base/macros.h" -#include "components/viz/display_compositor/gl_helper.h" -#include "components/viz/viz_export.h" +#include "components/viz/service/display_compositor/gl_helper.h" +#include "components/viz/service/viz_service_export.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/size.h" @@ -24,7 +24,7 @@ // Implements GPU texture scaling methods. // Note that you should probably not use this class directly. // See gl_helper.cc::CreateScaler instead. -class VIZ_EXPORT GLHelperScaling { +class VIZ_SERVICE_EXPORT GLHelperScaling { public: enum ShaderType { SHADER_BILINEAR, @@ -41,7 +41,7 @@ // Similar to ScalerInterface, but can generate multiple outputs. // Used for YUV conversion in gl_helper.c - class VIZ_EXPORT ShaderInterface { + class VIZ_SERVICE_EXPORT ShaderInterface { public: ShaderInterface() {} virtual ~ShaderInterface() {} @@ -205,4 +205,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_DISPLAY_COMPOSITOR_GL_HELPER_SCALING_H_ +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_GL_HELPER_SCALING_H_
diff --git a/components/viz/display_compositor/gl_helper_unittest.cc b/components/viz/service/display_compositor/gl_helper_unittest.cc similarity index 99% rename from components/viz/display_compositor/gl_helper_unittest.cc rename to components/viz/service/display_compositor/gl_helper_unittest.cc index 6f5383f3..41831db 100644 --- a/components/viz/display_compositor/gl_helper_unittest.cc +++ b/components/viz/service/display_compositor/gl_helper_unittest.cc
@@ -30,9 +30,9 @@ #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" #include "base/trace_event/trace_event.h" -#include "components/viz/display_compositor/gl_helper.h" -#include "components/viz/display_compositor/gl_helper_readback_support.h" -#include "components/viz/display_compositor/gl_helper_scaling.h" +#include "components/viz/service/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/gl_helper_readback_support.h" +#include "components/viz/service/display_compositor/gl_helper_scaling.h" #include "gpu/command_buffer/client/gles2_implementation.h" #include "gpu/command_buffer/client/shared_memory_limits.h" #include "gpu/ipc/gl_in_process_context.h"
diff --git a/components/viz/display_compositor/gpu_display_provider.cc b/components/viz/service/display_compositor/gpu_display_provider.cc similarity index 91% rename from components/viz/display_compositor/gpu_display_provider.cc rename to components/viz/service/display_compositor/gpu_display_provider.cc index 483eaaa8..8526c010 100644 --- a/components/viz/display_compositor/gpu_display_provider.cc +++ b/components/viz/service/display_compositor/gpu_display_provider.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/display_compositor/gpu_display_provider.h" +#include "components/viz/service/display_compositor/gpu_display_provider.h" #include <utility> @@ -15,13 +15,13 @@ #include "cc/scheduler/begin_frame_source.h" #include "cc/surfaces/display.h" #include "cc/surfaces/display_scheduler.h" -#include "components/viz/display_compositor/display_output_surface.h" -#include "components/viz/display_compositor/host_shared_bitmap_manager.h" +#include "components/viz/service/display_compositor/display_output_surface.h" +#include "components/viz/service/display_compositor/host_shared_bitmap_manager.h" #include "gpu/command_buffer/client/shared_memory_limits.h" #include "gpu/command_buffer/service/image_factory.h" #if defined(USE_OZONE) -#include "components/viz/display_compositor/display_output_surface_ozone.h" +#include "components/viz/service/display_compositor/display_output_surface_ozone.h" #include "gpu/command_buffer/client/gles2_interface.h" #endif
diff --git a/components/viz/display_compositor/gpu_display_provider.h b/components/viz/service/display_compositor/gpu_display_provider.h similarity index 78% rename from components/viz/display_compositor/gpu_display_provider.h rename to components/viz/service/display_compositor/gpu_display_provider.h index ea62e7c..1afb34a 100644 --- a/components/viz/display_compositor/gpu_display_provider.h +++ b/components/viz/service/display_compositor/gpu_display_provider.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_DISPLAY_COMPOSITOR_GPU_DISPLAY_PROVIDER_H_ -#define COMPONENTS_VIZ_DISPLAY_COMPOSITOR_GPU_DISPLAY_PROVIDER_H_ +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_GPU_DISPLAY_PROVIDER_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_GPU_DISPLAY_PROVIDER_H_ #include <memory> @@ -11,8 +11,8 @@ #include "base/macros.h" #include "base/memory/ref_counted.h" #include "cc/surfaces/frame_sink_id.h" -#include "components/viz/display_compositor/display_provider.h" -#include "components/viz/viz_export.h" +#include "components/viz/service/display_compositor/display_provider.h" +#include "components/viz/service/viz_service_export.h" #include "gpu/command_buffer/client/gpu_memory_buffer_manager.h" #include "gpu/ipc/common/surface_handle.h" #include "gpu/ipc/in_process_command_buffer.h" @@ -24,7 +24,7 @@ namespace viz { // In-process implementation of DisplayProvider. -class VIZ_EXPORT GpuDisplayProvider +class VIZ_SERVICE_EXPORT GpuDisplayProvider : public NON_EXPORTED_BASE(DisplayProvider) { public: GpuDisplayProvider( @@ -51,4 +51,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_DISPLAY_COMPOSITOR_GPU_DISPLAY_PROVIDER_H_ +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_GPU_DISPLAY_PROVIDER_H_
diff --git a/components/viz/display_compositor/host_shared_bitmap_manager.cc b/components/viz/service/display_compositor/host_shared_bitmap_manager.cc similarity index 98% rename from components/viz/display_compositor/host_shared_bitmap_manager.cc rename to components/viz/service/display_compositor/host_shared_bitmap_manager.cc index 40406fb1..1d30cbb 100644 --- a/components/viz/display_compositor/host_shared_bitmap_manager.cc +++ b/components/viz/service/display_compositor/host_shared_bitmap_manager.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/display_compositor/host_shared_bitmap_manager.h" +#include "components/viz/service/display_compositor/host_shared_bitmap_manager.h" #include <stdint.h>
diff --git a/components/viz/display_compositor/host_shared_bitmap_manager.h b/components/viz/service/display_compositor/host_shared_bitmap_manager.h similarity index 89% rename from components/viz/display_compositor/host_shared_bitmap_manager.h rename to components/viz/service/display_compositor/host_shared_bitmap_manager.h index b64b89b..3ac53791 100644 --- a/components/viz/display_compositor/host_shared_bitmap_manager.h +++ b/components/viz/service/display_compositor/host_shared_bitmap_manager.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_DISPLAY_COMPOSITOR_HOST_SHARED_BITMAP_MANAGER_H_ -#define COMPONENTS_VIZ_DISPLAY_COMPOSITOR_HOST_SHARED_BITMAP_MANAGER_H_ +#ifndef COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_HOST_SHARED_BITMAP_MANAGER_H_ +#define COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_HOST_SHARED_BITMAP_MANAGER_H_ #include <stddef.h> @@ -20,7 +20,7 @@ #include "base/trace_event/memory_dump_provider.h" #include "cc/ipc/shared_bitmap_manager.mojom.h" #include "cc/resources/shared_bitmap_manager.h" -#include "components/viz/viz_export.h" +#include "components/viz/service/viz_service_export.h" #include "mojo/public/cpp/bindings/associated_binding.h" namespace BASE_HASH_NAMESPACE { @@ -36,7 +36,7 @@ class BitmapData; class HostSharedBitmapManager; -class VIZ_EXPORT HostSharedBitmapManagerClient +class VIZ_SERVICE_EXPORT HostSharedBitmapManagerClient : NON_EXPORTED_BASE(public cc::mojom::SharedBitmapManager) { public: explicit HostSharedBitmapManagerClient(HostSharedBitmapManager* manager); @@ -65,7 +65,7 @@ DISALLOW_COPY_AND_ASSIGN(HostSharedBitmapManagerClient); }; -class VIZ_EXPORT HostSharedBitmapManager +class VIZ_SERVICE_EXPORT HostSharedBitmapManager : public cc::SharedBitmapManager, public base::trace_event::MemoryDumpProvider { public: @@ -108,4 +108,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_DISPLAY_COMPOSITOR_HOST_SHARED_BITMAP_MANAGER_H_ +#endif // COMPONENTS_VIZ_SERVICE_DISPLAY_COMPOSITOR_HOST_SHARED_BITMAP_MANAGER_H_
diff --git a/components/viz/display_compositor/host_shared_bitmap_manager_unittest.cc b/components/viz/service/display_compositor/host_shared_bitmap_manager_unittest.cc similarity index 98% rename from components/viz/display_compositor/host_shared_bitmap_manager_unittest.cc rename to components/viz/service/display_compositor/host_shared_bitmap_manager_unittest.cc index c129e1d..12d91b6 100644 --- a/components/viz/display_compositor/host_shared_bitmap_manager_unittest.cc +++ b/components/viz/service/display_compositor/host_shared_bitmap_manager_unittest.cc
@@ -5,7 +5,7 @@ #include <stddef.h> #include <string.h> -#include "components/viz/display_compositor/host_shared_bitmap_manager.h" +#include "components/viz/service/display_compositor/host_shared_bitmap_manager.h" #include "testing/gtest/include/gtest/gtest.h" namespace viz {
diff --git a/components/viz/display_compositor/run_all_unittests.cc b/components/viz/service/display_compositor/run_all_unittests.cc similarity index 86% rename from components/viz/display_compositor/run_all_unittests.cc rename to components/viz/service/display_compositor/run_all_unittests.cc index 80336af2..ef3886dc 100644 --- a/components/viz/display_compositor/run_all_unittests.cc +++ b/components/viz/service/display_compositor/run_all_unittests.cc
@@ -4,7 +4,7 @@ #include "base/bind.h" #include "base/test/launcher/unit_test_launcher.h" -#include "components/viz/display_compositor/display_compositor_test_suite.h" +#include "components/viz/service/display_compositor/display_compositor_test_suite.h" int main(int argc, char** argv) { viz::DisplayCompositorTestSuite test_suite(argc, argv);
diff --git a/components/viz/display_compositor/yuv_readback_unittest.cc b/components/viz/service/display_compositor/yuv_readback_unittest.cc similarity index 99% rename from components/viz/display_compositor/yuv_readback_unittest.cc rename to components/viz/service/display_compositor/yuv_readback_unittest.cc index ef6d83b..4306c03 100644 --- a/components/viz/display_compositor/yuv_readback_unittest.cc +++ b/components/viz/service/display_compositor/yuv_readback_unittest.cc
@@ -11,7 +11,7 @@ #include "base/test/test_suite.h" #include "base/threading/thread_task_runner_handle.h" #include "base/trace_event/trace_event.h" -#include "components/viz/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/gl_helper.h" #include "gpu/command_buffer/client/gles2_implementation.h" #include "gpu/command_buffer/client/shared_memory_limits.h" #include "gpu/ipc/common/surface_handle.h"
diff --git a/components/viz/frame_sinks/DEPS b/components/viz/service/frame_sinks/DEPS similarity index 100% rename from components/viz/frame_sinks/DEPS rename to components/viz/service/frame_sinks/DEPS
diff --git a/components/viz/frame_sinks/frame_eviction_manager.cc b/components/viz/service/frame_sinks/frame_eviction_manager.cc similarity index 97% rename from components/viz/frame_sinks/frame_eviction_manager.cc rename to components/viz/service/frame_sinks/frame_eviction_manager.cc index be419fd3..bd6dc87 100644 --- a/components/viz/frame_sinks/frame_eviction_manager.cc +++ b/components/viz/service/frame_sinks/frame_eviction_manager.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/frame_sinks/frame_eviction_manager.h" +#include "components/viz/service/frame_sinks/frame_eviction_manager.h" #include <algorithm> @@ -15,7 +15,7 @@ #include "base/memory/shared_memory.h" #include "base/sys_info.h" #include "build/build_config.h" -#include "components/viz/display_compositor/host_shared_bitmap_manager.h" +#include "components/viz/service/display_compositor/host_shared_bitmap_manager.h" namespace viz { namespace {
diff --git a/components/viz/frame_sinks/frame_eviction_manager.h b/components/viz/service/frame_sinks/frame_eviction_manager.h similarity index 85% rename from components/viz/frame_sinks/frame_eviction_manager.h rename to components/viz/service/frame_sinks/frame_eviction_manager.h index 15a2909..6e78277 100644 --- a/components/viz/frame_sinks/frame_eviction_manager.h +++ b/components/viz/service/frame_sinks/frame_eviction_manager.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_FRAME_SINKS_FRAME_EVICTION_MANAGER_H_ -#define COMPONENTS_VIZ_FRAME_SINKS_FRAME_EVICTION_MANAGER_H_ +#ifndef COMPONENTS_VIZ_SERVICE_FRAME_SINKS_FRAME_EVICTION_MANAGER_H_ +#define COMPONENTS_VIZ_SERVICE_FRAME_SINKS_FRAME_EVICTION_MANAGER_H_ #include <stddef.h> @@ -14,11 +14,11 @@ #include "base/memory/memory_coordinator_client.h" #include "base/memory/memory_pressure_listener.h" #include "base/memory/singleton.h" -#include "components/viz/viz_export.h" +#include "components/viz/service/viz_service_export.h" namespace viz { -class VIZ_EXPORT FrameEvictionManagerClient { +class VIZ_SERVICE_EXPORT FrameEvictionManagerClient { public: virtual ~FrameEvictionManagerClient() {} virtual void EvictCurrentFrame() = 0; @@ -30,7 +30,8 @@ // between a small set of tabs faster. The limit is a soft limit, because // clients can lock their frame to prevent it from being discarded, e.g. if the // tab is visible, or while capturing a screenshot. -class VIZ_EXPORT FrameEvictionManager : public base::MemoryCoordinatorClient { +class VIZ_SERVICE_EXPORT FrameEvictionManager + : public base::MemoryCoordinatorClient { public: static FrameEvictionManager* GetInstance(); @@ -79,4 +80,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_FRAME_SINKS_FRAME_EVICTION_MANAGER_H_ +#endif // COMPONENTS_VIZ_SERVICE_FRAME_SINKS_FRAME_EVICTION_MANAGER_H_
diff --git a/components/viz/frame_sinks/frame_evictor.cc b/components/viz/service/frame_sinks/frame_evictor.cc similarity index 94% rename from components/viz/frame_sinks/frame_evictor.cc rename to components/viz/service/frame_sinks/frame_evictor.cc index 0207423..086f9fc 100644 --- a/components/viz/frame_sinks/frame_evictor.cc +++ b/components/viz/service/frame_sinks/frame_evictor.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/frame_sinks/frame_evictor.h" +#include "components/viz/service/frame_sinks/frame_evictor.h" #include "base/logging.h"
diff --git a/components/viz/frame_sinks/frame_evictor.h b/components/viz/service/frame_sinks/frame_evictor.h similarity index 65% rename from components/viz/frame_sinks/frame_evictor.h rename to components/viz/service/frame_sinks/frame_evictor.h index f7e5b0d..be6ef5d 100644 --- a/components/viz/frame_sinks/frame_evictor.h +++ b/components/viz/service/frame_sinks/frame_evictor.h
@@ -2,22 +2,22 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_FRAME_SINKS_FRAME_EVICTOR_H_ -#define COMPONENTS_VIZ_FRAME_SINKS_FRAME_EVICTOR_H_ +#ifndef COMPONENTS_VIZ_SERVICE_FRAME_SINKS_FRAME_EVICTOR_H_ +#define COMPONENTS_VIZ_SERVICE_FRAME_SINKS_FRAME_EVICTOR_H_ #include "base/macros.h" -#include "components/viz/frame_sinks/frame_eviction_manager.h" -#include "components/viz/viz_export.h" +#include "components/viz/service/frame_sinks/frame_eviction_manager.h" +#include "components/viz/service/viz_service_export.h" namespace viz { -class VIZ_EXPORT FrameEvictorClient { +class VIZ_SERVICE_EXPORT FrameEvictorClient { public: virtual ~FrameEvictorClient() {} virtual void EvictDelegatedFrame() = 0; }; -class VIZ_EXPORT FrameEvictor : public FrameEvictionManagerClient { +class VIZ_SERVICE_EXPORT FrameEvictor : public FrameEvictionManagerClient { public: // |client| must outlive |this|. explicit FrameEvictor(FrameEvictorClient* client); @@ -43,4 +43,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_FRAME_SINKS_FRAME_EVICTOR_H_ +#endif // COMPONENTS_VIZ_SERVICE_FRAME_SINKS_FRAME_EVICTOR_H_
diff --git a/components/viz/frame_sinks/gpu_compositor_frame_sink.cc b/components/viz/service/frame_sinks/gpu_compositor_frame_sink.cc similarity index 97% rename from components/viz/frame_sinks/gpu_compositor_frame_sink.cc rename to components/viz/service/frame_sinks/gpu_compositor_frame_sink.cc index 8bc8039..045cba6 100644 --- a/components/viz/frame_sinks/gpu_compositor_frame_sink.cc +++ b/components/viz/service/frame_sinks/gpu_compositor_frame_sink.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/frame_sinks/gpu_compositor_frame_sink.h" +#include "components/viz/service/frame_sinks/gpu_compositor_frame_sink.h" namespace viz {
diff --git a/components/viz/frame_sinks/gpu_compositor_frame_sink.h b/components/viz/service/frame_sinks/gpu_compositor_frame_sink.h similarity index 90% rename from components/viz/frame_sinks/gpu_compositor_frame_sink.h rename to components/viz/service/frame_sinks/gpu_compositor_frame_sink.h index 962425c..89cb6246 100644 --- a/components/viz/frame_sinks/gpu_compositor_frame_sink.h +++ b/components/viz/service/frame_sinks/gpu_compositor_frame_sink.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_FRAME_SINKS_GPU_COMPOSITOR_FRAME_SINK_H_ -#define COMPONENTS_VIZ_FRAME_SINKS_GPU_COMPOSITOR_FRAME_SINK_H_ +#ifndef COMPONENTS_VIZ_SERVICE_FRAME_SINKS_GPU_COMPOSITOR_FRAME_SINK_H_ +#define COMPONENTS_VIZ_SERVICE_FRAME_SINKS_GPU_COMPOSITOR_FRAME_SINK_H_ #include <memory> #include <vector> @@ -15,7 +15,7 @@ #include "cc/surfaces/compositor_frame_sink_support_client.h" #include "cc/surfaces/local_surface_id.h" #include "cc/surfaces/surface_id.h" -#include "components/viz/frame_sinks/gpu_compositor_frame_sink_delegate.h" +#include "components/viz/service/frame_sinks/gpu_compositor_frame_sink_delegate.h" #include "mojo/public/cpp/bindings/binding.h" namespace viz { @@ -76,4 +76,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_FRAME_SINKS_GPU_COMPOSITOR_FRAME_SINK_H_ +#endif // COMPONENTS_VIZ_SERVICE_FRAME_SINKS_GPU_COMPOSITOR_FRAME_SINK_H_
diff --git a/components/viz/frame_sinks/gpu_compositor_frame_sink_delegate.h b/components/viz/service/frame_sinks/gpu_compositor_frame_sink_delegate.h similarity index 78% rename from components/viz/frame_sinks/gpu_compositor_frame_sink_delegate.h rename to components/viz/service/frame_sinks/gpu_compositor_frame_sink_delegate.h index d9d45ae2..b1543e6 100644 --- a/components/viz/frame_sinks/gpu_compositor_frame_sink_delegate.h +++ b/components/viz/service/frame_sinks/gpu_compositor_frame_sink_delegate.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_FRAME_SINKS_GPU_COMPOSITOR_FRAME_SINK_DELEGATE_H_ -#define COMPONENTS_VIZ_FRAME_SINKS_GPU_COMPOSITOR_FRAME_SINK_DELEGATE_H_ +#ifndef COMPONENTS_VIZ_SERVICE_FRAME_SINKS_GPU_COMPOSITOR_FRAME_SINK_DELEGATE_H_ +#define COMPONENTS_VIZ_SERVICE_FRAME_SINKS_GPU_COMPOSITOR_FRAME_SINK_DELEGATE_H_ namespace cc { class FrameSinkId; @@ -27,4 +27,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_FRAME_SINKS_GPU_COMPOSITOR_FRAME_SINK_DELEGATE_H_ +#endif // COMPONENTS_VIZ_SERVICE_FRAME_SINKS_GPU_COMPOSITOR_FRAME_SINK_DELEGATE_H_
diff --git a/components/viz/frame_sinks/gpu_root_compositor_frame_sink.cc b/components/viz/service/frame_sinks/gpu_root_compositor_frame_sink.cc similarity index 98% rename from components/viz/frame_sinks/gpu_root_compositor_frame_sink.cc rename to components/viz/service/frame_sinks/gpu_root_compositor_frame_sink.cc index 2804a0f..2da7aa1e 100644 --- a/components/viz/frame_sinks/gpu_root_compositor_frame_sink.cc +++ b/components/viz/service/frame_sinks/gpu_root_compositor_frame_sink.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/frame_sinks/gpu_root_compositor_frame_sink.h" +#include "components/viz/service/frame_sinks/gpu_root_compositor_frame_sink.h" #include "cc/surfaces/compositor_frame_sink_support.h" #include "cc/surfaces/display.h"
diff --git a/components/viz/frame_sinks/gpu_root_compositor_frame_sink.h b/components/viz/service/frame_sinks/gpu_root_compositor_frame_sink.h similarity index 92% rename from components/viz/frame_sinks/gpu_root_compositor_frame_sink.h rename to components/viz/service/frame_sinks/gpu_root_compositor_frame_sink.h index 8d566abb..112e2443 100644 --- a/components/viz/frame_sinks/gpu_root_compositor_frame_sink.h +++ b/components/viz/service/frame_sinks/gpu_root_compositor_frame_sink.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_FRAME_SINKS_GPU_ROOT_COMPOSITOR_FRAME_SINK_H_ -#define COMPONENTS_VIZ_FRAME_SINKS_GPU_ROOT_COMPOSITOR_FRAME_SINK_H_ +#ifndef COMPONENTS_VIZ_SERVICE_FRAME_SINKS_GPU_ROOT_COMPOSITOR_FRAME_SINK_H_ +#define COMPONENTS_VIZ_SERVICE_FRAME_SINKS_GPU_ROOT_COMPOSITOR_FRAME_SINK_H_ #include "cc/ipc/frame_sink_manager.mojom.h" #include "cc/ipc/mojo_compositor_frame_sink.mojom.h" @@ -11,7 +11,7 @@ #include "cc/surfaces/display_client.h" #include "cc/surfaces/local_surface_id.h" #include "cc/surfaces/surface_id.h" -#include "components/viz/frame_sinks/gpu_compositor_frame_sink_delegate.h" +#include "components/viz/service/frame_sinks/gpu_compositor_frame_sink_delegate.h" #include "mojo/public/cpp/bindings/associated_binding.h" #include "mojo/public/cpp/bindings/binding.h" @@ -106,4 +106,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_FRAME_SINKS_GPU_ROOT_COMPOSITOR_FRAME_SINK_H_ +#endif // COMPONENTS_VIZ_SERVICE_FRAME_SINKS_GPU_ROOT_COMPOSITOR_FRAME_SINK_H_
diff --git a/components/viz/frame_sinks/mojo_frame_sink_manager.cc b/components/viz/service/frame_sinks/mojo_frame_sink_manager.cc similarity index 90% rename from components/viz/frame_sinks/mojo_frame_sink_manager.cc rename to components/viz/service/frame_sinks/mojo_frame_sink_manager.cc index f3fcac09..e92b9a3 100644 --- a/components/viz/frame_sinks/mojo_frame_sink_manager.cc +++ b/components/viz/service/frame_sinks/mojo_frame_sink_manager.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "components/viz/frame_sinks/mojo_frame_sink_manager.h" +#include "components/viz/service/frame_sinks/mojo_frame_sink_manager.h" #include <utility> @@ -12,9 +12,9 @@ #include "cc/scheduler/begin_frame_source.h" #include "cc/surfaces/display.h" #include "cc/surfaces/surface_dependency_tracker.h" -#include "components/viz/display_compositor/display_provider.h" -#include "components/viz/frame_sinks/gpu_compositor_frame_sink.h" -#include "components/viz/frame_sinks/gpu_root_compositor_frame_sink.h" +#include "components/viz/service/display_compositor/display_provider.h" +#include "components/viz/service/frame_sinks/gpu_compositor_frame_sink.h" +#include "components/viz/service/frame_sinks/gpu_root_compositor_frame_sink.h" namespace viz { @@ -32,7 +32,7 @@ } MojoFrameSinkManager::~MojoFrameSinkManager() { - DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); manager_.SetDependencyTracker(nullptr); dependency_tracker_.reset(); manager_.RemoveObserver(this); @@ -53,7 +53,7 @@ cc::mojom::MojoCompositorFrameSinkPrivateRequest private_request, cc::mojom::MojoCompositorFrameSinkClientPtr client, cc::mojom::DisplayPrivateAssociatedRequest display_private_request) { - DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_NE(surface_handle, gpu::kNullSurfaceHandle); DCHECK_EQ(0u, compositor_frame_sinks_.count(frame_sink_id)); DCHECK(display_provider_); @@ -75,7 +75,7 @@ cc::mojom::MojoCompositorFrameSinkRequest request, cc::mojom::MojoCompositorFrameSinkPrivateRequest private_request, cc::mojom::MojoCompositorFrameSinkClientPtr client) { - DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_EQ(0u, compositor_frame_sinks_.count(frame_sink_id)); compositor_frame_sinks_[frame_sink_id] = @@ -109,7 +109,7 @@ void MojoFrameSinkManager::OnSurfaceCreated( const cc::SurfaceInfo& surface_info) { - DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); DCHECK_GT(surface_info.device_scale_factor(), 0.0f); // TODO(kylechar): |client_| will try to find an owner for the temporary @@ -139,7 +139,7 @@ void MojoFrameSinkManager::OnClientConnectionLost( const cc::FrameSinkId& frame_sink_id, bool destroy_compositor_frame_sink) { - DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); if (destroy_compositor_frame_sink) DestroyCompositorFrameSink(frame_sink_id); // TODO(fsamuel): Tell the frame sink manager host that the client connection @@ -150,7 +150,7 @@ void MojoFrameSinkManager::OnPrivateConnectionLost( const cc::FrameSinkId& frame_sink_id, bool destroy_compositor_frame_sink) { - DCHECK(thread_checker_.CalledOnValidThread()); + DCHECK_CALLED_ON_VALID_THREAD(thread_checker_); if (destroy_compositor_frame_sink) DestroyCompositorFrameSink(frame_sink_id); }
diff --git a/components/viz/frame_sinks/mojo_frame_sink_manager.h b/components/viz/service/frame_sinks/mojo_frame_sink_manager.h similarity index 91% rename from components/viz/frame_sinks/mojo_frame_sink_manager.h rename to components/viz/service/frame_sinks/mojo_frame_sink_manager.h index f0f4f893..5f70ecf 100644 --- a/components/viz/frame_sinks/mojo_frame_sink_manager.h +++ b/components/viz/service/frame_sinks/mojo_frame_sink_manager.h
@@ -2,8 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_VIZ_FRAME_SINKS_MOJO_FRAME_SINK_MANAGER_H_ -#define COMPONENTS_VIZ_FRAME_SINKS_MOJO_FRAME_SINK_MANAGER_H_ +#ifndef COMPONENTS_VIZ_SERVICE_FRAME_SINKS_MOJO_FRAME_SINK_MANAGER_H_ +#define COMPONENTS_VIZ_SERVICE_FRAME_SINKS_MOJO_FRAME_SINK_MANAGER_H_ #include <stdint.h> @@ -16,8 +16,8 @@ #include "cc/surfaces/frame_sink_id.h" #include "cc/surfaces/surface_manager.h" #include "cc/surfaces/surface_observer.h" -#include "components/viz/frame_sinks/gpu_compositor_frame_sink_delegate.h" -#include "components/viz/viz_export.h" +#include "components/viz/service/frame_sinks/gpu_compositor_frame_sink_delegate.h" +#include "components/viz/service/viz_service_export.h" #include "gpu/ipc/common/surface_handle.h" #include "mojo/public/cpp/bindings/binding.h" @@ -33,7 +33,7 @@ // will be true after the mus process split. For non-mus Chrome this will be // created in the browser process, at least until GPU implementations can be // unified. -class VIZ_EXPORT MojoFrameSinkManager +class VIZ_SERVICE_EXPORT MojoFrameSinkManager : public cc::SurfaceObserver, public NON_EXPORTED_BASE(GpuCompositorFrameSinkDelegate), public NON_EXPORTED_BASE(cc::mojom::FrameSinkManager) { @@ -109,7 +109,7 @@ cc::FrameSinkIdHash> compositor_frame_sinks_; - base::ThreadChecker thread_checker_; + THREAD_CHECKER(thread_checker_); cc::mojom::FrameSinkManagerClientPtr client_; mojo::Binding<cc::mojom::FrameSinkManager> binding_; @@ -119,4 +119,4 @@ } // namespace viz -#endif // COMPONENTS_VIZ_FRAME_SINKS_MOJO_FRAME_SINK_MANAGER_H_ +#endif // COMPONENTS_VIZ_SERVICE_FRAME_SINKS_MOJO_FRAME_SINK_MANAGER_H_
diff --git a/components/viz/service/viz_service_export.h b/components/viz/service/viz_service_export.h new file mode 100644 index 0000000..e2d6a9e --- /dev/null +++ b/components/viz/service/viz_service_export.h
@@ -0,0 +1,29 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_VIZ_SERVICE_VIZ_SERVICE_EXPORT_H_ +#define COMPONENTS_VIZ_SERVICE_VIZ_SERVICE_EXPORT_H_ + +#if defined(COMPONENT_BUILD) +#if defined(WIN32) + +#if defined(VIZ_SERVICE_IMPLEMENTATION) +#define VIZ_SERVICE_EXPORT __declspec(dllexport) +#else +#define VIZ_SERVICE_EXPORT __declspec(dllimport) +#endif // defined(VIZ_SERVICE_IMPLEMENTATION) + +#else // defined(WIN32) +#if defined(VIZ_SERVICE_IMPLEMENTATION) +#define VIZ_SERVICE_EXPORT __attribute__((visibility("default"))) +#else +#define VIZ_SERVICE_EXPORT +#endif +#endif + +#else // defined(COMPONENT_BUILD) +#define VIZ_SERVICE_EXPORT +#endif + +#endif // COMPONENTS_VIZ_SERVICE_VIZ_SERVICE_EXPORT_H_
diff --git a/components/viz/viz_export.h b/components/viz/viz_export.h deleted file mode 100644 index 4948f15..0000000 --- a/components/viz/viz_export.h +++ /dev/null
@@ -1,29 +0,0 @@ -// Copyright (c) 2017 The Chromium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef COMPONENTS_VIZ_VIZ_EXPORT_H_ -#define COMPONENTS_VIZ_VIZ_EXPORT_H_ - -#if defined(COMPONENT_BUILD) -#if defined(WIN32) - -#if defined(VIZ_IMPLEMENTATION) -#define VIZ_EXPORT __declspec(dllexport) -#else -#define VIZ_EXPORT __declspec(dllimport) -#endif // defined(VIZ_IMPLEMENTATION) - -#else // defined(WIN32) -#if defined(VIZ_IMPLEMENTATION) -#define VIZ_EXPORT __attribute__((visibility("default"))) -#else -#define VIZ_EXPORT -#endif -#endif - -#else // defined(COMPONENT_BUILD) -#define VIZ_EXPORT -#endif - -#endif // COMPONENTS_VIZ_VIZ_EXPORT_H_
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 3f9be0a..76c3837a 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -52,9 +52,8 @@ "//components/ukm/public", "//components/url_formatter", "//components/variations", - "//components/viz/display_compositor", - "//components/viz/frame_sinks", "//components/viz/host", + "//components/viz/service", "//content:resources", "//content/app/resources", "//content/app/strings",
diff --git a/content/browser/browser_main_loop.cc b/content/browser/browser_main_loop.cc index 63fa3bb..710b3be 100644 --- a/content/browser/browser_main_loop.cc +++ b/content/browser/browser_main_loop.cc
@@ -52,11 +52,12 @@ #include "components/tracing/common/trace_config_file.h" #include "components/tracing/common/trace_to_console.h" #include "components/tracing/common/tracing_switches.h" -#include "components/viz/display_compositor/host_shared_bitmap_manager.h" -#include "components/viz/frame_sinks/mojo_frame_sink_manager.h" #include "components/viz/host/frame_sink_manager_host.h" +#include "components/viz/service/display_compositor/host_shared_bitmap_manager.h" +#include "components/viz/service/frame_sinks/mojo_frame_sink_manager.h" #include "content/browser/browser_thread_impl.h" #include "content/browser/child_process_security_policy_impl.h" +#include "content/browser/compositor/surface_utils.h" #include "content/browser/dom_storage/dom_storage_area.h" #include "content/browser/download/download_resource_handler.h" #include "content/browser/download/save_file_manager.h" @@ -1435,7 +1436,7 @@ // Gpu process, instead get the mojo pointer from the Gpu process. frame_sink_manager_ = base::MakeUnique<viz::MojoFrameSinkManager>(false, nullptr); - viz::FrameSinkManagerHost::ConnectWithInProcessFrameSinkManager( + surface_utils::ConnectWithInProcessFrameSinkManager( frame_sink_manager_host_.get(), frame_sink_manager_.get()); } #endif
diff --git a/content/browser/compositor/browser_compositor_output_surface.cc b/content/browser/compositor/browser_compositor_output_surface.cc index 8a10115..dcf0887 100644 --- a/content/browser/compositor/browser_compositor_output_surface.cc +++ b/content/browser/compositor/browser_compositor_output_surface.cc
@@ -13,7 +13,7 @@ #include "base/strings/string_number_conversions.h" #include "cc/output/output_surface_client.h" #include "cc/scheduler/begin_frame_source.h" -#include "components/viz/display_compositor/compositor_overlay_candidate_validator.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator.h" #include "content/browser/compositor/reflector_impl.h" #include "services/ui/public/cpp/gpu/context_provider_command_buffer.h"
diff --git a/content/browser/compositor/gpu_browser_compositor_output_surface.cc b/content/browser/compositor/gpu_browser_compositor_output_surface.cc index 69ef43a..3a881fa5 100644 --- a/content/browser/compositor/gpu_browser_compositor_output_surface.cc +++ b/content/browser/compositor/gpu_browser_compositor_output_surface.cc
@@ -9,7 +9,7 @@ #include "build/build_config.h" #include "cc/output/output_surface_client.h" #include "cc/output/output_surface_frame.h" -#include "components/viz/display_compositor/compositor_overlay_candidate_validator.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator.h" #include "content/browser/compositor/reflector_impl.h" #include "content/browser/compositor/reflector_texture.h" #include "content/browser/renderer_host/render_widget_host_impl.h"
diff --git a/content/browser/compositor/gpu_output_surface_mac.mm b/content/browser/compositor/gpu_output_surface_mac.mm index 45ee5a4..2502586 100644 --- a/content/browser/compositor/gpu_output_surface_mac.mm +++ b/content/browser/compositor/gpu_output_surface_mac.mm
@@ -6,7 +6,7 @@ #include "cc/output/output_surface_client.h" #include "cc/output/output_surface_frame.h" -#include "components/viz/display_compositor/compositor_overlay_candidate_validator.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator.h" #include "gpu/GLES2/gl2extchromium.h" #include "gpu/ipc/client/gpu_process_hosted_ca_layer_tree_params.h" #include "services/ui/public/cpp/gpu/context_provider_command_buffer.h"
diff --git a/content/browser/compositor/gpu_process_transport_factory.cc b/content/browser/compositor/gpu_process_transport_factory.cc index f3fedcc..bef5b54 100644 --- a/content/browser/compositor/gpu_process_transport_factory.cc +++ b/content/browser/compositor/gpu_process_transport_factory.cc
@@ -30,10 +30,10 @@ #include "cc/surfaces/display.h" #include "cc/surfaces/display_scheduler.h" #include "cc/surfaces/surface_manager.h" -#include "components/viz/display_compositor/compositor_overlay_candidate_validator.h" -#include "components/viz/display_compositor/gl_helper.h" -#include "components/viz/display_compositor/host_shared_bitmap_manager.h" #include "components/viz/host/frame_sink_manager_host.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator.h" +#include "components/viz/service/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/host_shared_bitmap_manager.h" #include "content/browser/browser_main_loop.h" #include "content/browser/compositor/browser_compositor_output_surface.h" #include "content/browser/compositor/gpu_browser_compositor_output_surface.h" @@ -74,11 +74,11 @@ #if defined(OS_WIN) #include "base/win/windows_version.h" -#include "components/viz/display_compositor/compositor_overlay_candidate_validator_win.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator_win.h" #include "content/browser/compositor/software_output_device_win.h" #include "ui/gfx/win/rendering_window_manager.h" #elif defined(USE_OZONE) -#include "components/viz/display_compositor/compositor_overlay_candidate_validator_ozone.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator_ozone.h" #include "content/browser/compositor/software_output_device_ozone.h" #include "ui/ozone/public/overlay_candidates_ozone.h" #include "ui/ozone/public/overlay_manager_ozone.h" @@ -87,7 +87,7 @@ #elif defined(USE_X11) #include "content/browser/compositor/software_output_device_x11.h" #elif defined(OS_MACOSX) -#include "components/viz/display_compositor/compositor_overlay_candidate_validator_mac.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator_mac.h" #include "content/browser/compositor/gpu_output_surface_mac.h" #include "content/browser/compositor/software_output_device_mac.h" #include "gpu/config/gpu_driver_bug_workaround_type.h" @@ -95,7 +95,7 @@ #include "ui/base/cocoa/remote_layer_api.h" #include "ui/base/ui_base_switches.h" #elif defined(OS_ANDROID) -#include "components/viz/display_compositor/compositor_overlay_candidate_validator_android.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator_android.h" #endif #if !defined(GPU_SURFACE_HANDLE_IS_ACCELERATED_WINDOW) #include "gpu/ipc/common/gpu_surface_tracker.h"
diff --git a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc index 31c4366..aebe6cb 100644 --- a/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc +++ b/content/browser/compositor/gpu_surfaceless_browser_compositor_output_surface.cc
@@ -8,9 +8,9 @@ #include "cc/output/output_surface_client.h" #include "cc/output/output_surface_frame.h" -#include "components/viz/display_compositor/buffer_queue.h" -#include "components/viz/display_compositor/compositor_overlay_candidate_validator.h" -#include "components/viz/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/buffer_queue.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator.h" +#include "components/viz/service/display_compositor/gl_helper.h" #include "content/browser/compositor/reflector_impl.h" #include "gpu/GLES2/gl2extchromium.h" #include "gpu/command_buffer/client/gles2_interface.h"
diff --git a/content/browser/compositor/offscreen_browser_compositor_output_surface.cc b/content/browser/compositor/offscreen_browser_compositor_output_surface.cc index c4aa08c..76c9ca1 100644 --- a/content/browser/compositor/offscreen_browser_compositor_output_surface.cc +++ b/content/browser/compositor/offscreen_browser_compositor_output_surface.cc
@@ -11,7 +11,7 @@ #include "cc/output/output_surface_client.h" #include "cc/output/output_surface_frame.h" #include "cc/resources/resource_provider.h" -#include "components/viz/display_compositor/compositor_overlay_candidate_validator.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator.h" #include "content/browser/compositor/reflector_impl.h" #include "content/browser/compositor/reflector_texture.h" #include "content/browser/renderer_host/render_widget_host_impl.h"
diff --git a/content/browser/compositor/owned_mailbox.cc b/content/browser/compositor/owned_mailbox.cc index 29999383..1f6f261b 100644 --- a/content/browser/compositor/owned_mailbox.cc +++ b/content/browser/compositor/owned_mailbox.cc
@@ -5,7 +5,7 @@ #include "content/browser/compositor/owned_mailbox.h" #include "base/logging.h" -#include "components/viz/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/gl_helper.h" #include "content/browser/compositor/image_transport_factory.h" namespace content {
diff --git a/content/browser/compositor/reflector_impl_unittest.cc b/content/browser/compositor/reflector_impl_unittest.cc index 98ff7a7..d693c23a9 100644 --- a/content/browser/compositor/reflector_impl_unittest.cc +++ b/content/browser/compositor/reflector_impl_unittest.cc
@@ -15,7 +15,7 @@ #include "cc/scheduler/delay_based_time_source.h" #include "cc/test/test_context_provider.h" #include "cc/test/test_web_graphics_context_3d.h" -#include "components/viz/display_compositor/compositor_overlay_candidate_validator.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator.h" #include "content/browser/compositor/browser_compositor_output_surface.h" #include "content/browser/compositor/reflector_texture.h" #include "content/browser/compositor/test/no_transport_image_transport_factory.h" @@ -25,7 +25,7 @@ #include "ui/compositor/test/context_factories_for_test.h" #if defined(USE_OZONE) -#include "components/viz/display_compositor/compositor_overlay_candidate_validator_ozone.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator_ozone.h" #include "ui/ozone/public/overlay_candidates_ozone.h" #endif // defined(USE_OZONE)
diff --git a/content/browser/compositor/reflector_texture.cc b/content/browser/compositor/reflector_texture.cc index f70c7b7..f7f7a9bc 100644 --- a/content/browser/compositor/reflector_texture.cc +++ b/content/browser/compositor/reflector_texture.cc
@@ -4,7 +4,7 @@ #include "content/browser/compositor/reflector_texture.h" -#include "components/viz/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/gl_helper.h" #include "content/browser/compositor/owned_mailbox.h" #include "gpu/command_buffer/client/context_support.h" #include "gpu/command_buffer/client/gles2_interface.h"
diff --git a/content/browser/compositor/surface_utils.cc b/content/browser/compositor/surface_utils.cc index 42934aed..18a0f9e 100644 --- a/content/browser/compositor/surface_utils.cc +++ b/content/browser/compositor/surface_utils.cc
@@ -10,8 +10,9 @@ #include "build/build_config.h" #include "cc/output/copy_output_result.h" #include "cc/resources/single_release_callback.h" -#include "components/viz/display_compositor/gl_helper.h" #include "components/viz/host/frame_sink_manager_host.h" +#include "components/viz/service/display_compositor/gl_helper.h" +#include "components/viz/service/frame_sinks/mojo_frame_sink_manager.h" #include "content/browser/browser_main_loop.h" #include "skia/ext/image_operations.h" #include "third_party/skia/include/core/SkCanvas.h" @@ -211,4 +212,29 @@ std::move(result)); } +namespace surface_utils { + +void ConnectWithInProcessFrameSinkManager(viz::FrameSinkManagerHost* host, + viz::MojoFrameSinkManager* manager) { + // A mojo pointer to |host| which is the FrameSinkManager's client. + cc::mojom::FrameSinkManagerClientPtr host_mojo; + // A mojo pointer to |manager|. + cc::mojom::FrameSinkManagerPtr manager_mojo; + + // A request to bind to each of the above interfaces. + cc::mojom::FrameSinkManagerClientRequest host_mojo_request = + mojo::MakeRequest(&host_mojo); + cc::mojom::FrameSinkManagerRequest manager_mojo_request = + mojo::MakeRequest(&manager_mojo); + + // Sets |manager_mojo| which is given to the |host|. + manager->BindPtrAndSetClient(std::move(manager_mojo_request), + std::move(host_mojo)); + // Sets |host_mojo| which was given to the |manager|. + host->BindManagerClientAndSetManagerPtr(std::move(host_mojo_request), + std::move(manager_mojo)); +} + +} // namespace surface_utils + } // namespace content
diff --git a/content/browser/compositor/surface_utils.h b/content/browser/compositor/surface_utils.h index dee84d8..29e2e78 100644 --- a/content/browser/compositor/surface_utils.h +++ b/content/browser/compositor/surface_utils.h
@@ -20,6 +20,7 @@ namespace viz { class FrameSinkManagerHost; +class MojoFrameSinkManager; } namespace content { @@ -36,6 +37,14 @@ const ReadbackRequestCallback& callback, std::unique_ptr<cc::CopyOutputResult> result); +namespace surface_utils { + +CONTENT_EXPORT void ConnectWithInProcessFrameSinkManager( + viz::FrameSinkManagerHost* host, + viz::MojoFrameSinkManager* manager); + +} // namespace surface_utils + } // namespace content #endif // CONTENT_BROWSER_COMPOSITOR_SURFACE_UTILS_H_
diff --git a/content/browser/compositor/test/no_transport_image_transport_factory.cc b/content/browser/compositor/test/no_transport_image_transport_factory.cc index fba94b0..01118da 100644 --- a/content/browser/compositor/test/no_transport_image_transport_factory.cc +++ b/content/browser/compositor/test/no_transport_image_transport_factory.cc
@@ -10,7 +10,8 @@ #include "build/build_config.h" #include "cc/output/context_provider.h" #include "cc/surfaces/surface_manager.h" -#include "components/viz/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/gl_helper.h" +#include "content/browser/compositor/surface_utils.h" #include "gpu/command_buffer/client/gles2_interface.h" #include "ui/compositor/compositor.h" @@ -20,8 +21,8 @@ : frame_sink_manager_(false /* use surface references */, nullptr), context_factory_(&frame_sink_manager_host_, frame_sink_manager_.surface_manager()) { - viz::FrameSinkManagerHost::ConnectWithInProcessFrameSinkManager( - &frame_sink_manager_host_, &frame_sink_manager_); + surface_utils::ConnectWithInProcessFrameSinkManager(&frame_sink_manager_host_, + &frame_sink_manager_); // The context factory created here is for unit tests, thus using a higher // refresh rate to spend less time waiting for BeginFrames.
diff --git a/content/browser/compositor/test/no_transport_image_transport_factory.h b/content/browser/compositor/test/no_transport_image_transport_factory.h index a238287..93f7c05 100644 --- a/content/browser/compositor/test/no_transport_image_transport_factory.h +++ b/content/browser/compositor/test/no_transport_image_transport_factory.h
@@ -10,8 +10,8 @@ #include "base/macros.h" #include "build/build_config.h" #include "cc/surfaces/surface_manager.h" -#include "components/viz/frame_sinks/mojo_frame_sink_manager.h" #include "components/viz/host/frame_sink_manager_host.h" +#include "components/viz/service/frame_sinks/mojo_frame_sink_manager.h" #include "content/browser/compositor/image_transport_factory.h" #include "ui/compositor/test/in_process_context_factory.h"
diff --git a/content/browser/gpu/browser_gpu_memory_buffer_manager.cc b/content/browser/gpu/browser_gpu_memory_buffer_manager.cc index d109d5d..9db43c7 100644 --- a/content/browser/gpu/browser_gpu_memory_buffer_manager.cc +++ b/content/browser/gpu/browser_gpu_memory_buffer_manager.cc
@@ -130,8 +130,10 @@ return; } - callback.Run(gpu::GpuMemoryBufferImplSharedMemory::CreateGpuMemoryBuffer( - id, size, format)); + auto handle = gpu::GpuMemoryBufferImplSharedMemory::CreateGpuMemoryBuffer( + id, size, format); + buffers.find(id)->second.shared_memory_guid = handle.handle.GetGUID(); + callback.Run(handle); } void BrowserGpuMemoryBufferManager::SetDestructionSyncToken(
diff --git a/content/browser/media/capture/aura_window_capture_machine.cc b/content/browser/media/capture/aura_window_capture_machine.cc index b58f6f4..0334577c 100644 --- a/content/browser/media/capture/aura_window_capture_machine.cc +++ b/content/browser/media/capture/aura_window_capture_machine.cc
@@ -11,7 +11,7 @@ #include "base/metrics/histogram_macros.h" #include "cc/output/copy_output_request.h" #include "cc/output/copy_output_result.h" -#include "components/viz/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/gl_helper.h" #include "content/browser/compositor/image_transport_factory.h" #include "content/browser/media/capture/desktop_capture_device_uma_types.h" #include "content/public/browser/browser_thread.h"
diff --git a/content/browser/renderer_host/compositor_impl_android.cc b/content/browser/renderer_host/compositor_impl_android.cc index 006a51dc..0a2276fb 100644 --- a/content/browser/renderer_host/compositor_impl_android.cc +++ b/content/browser/renderer_host/compositor_impl_android.cc
@@ -46,11 +46,12 @@ #include "cc/surfaces/frame_sink_id_allocator.h" #include "cc/trees/layer_tree_host.h" #include "cc/trees/layer_tree_settings.h" -#include "components/viz/display_compositor/compositor_overlay_candidate_validator_android.h" -#include "components/viz/display_compositor/gl_helper.h" -#include "components/viz/display_compositor/host_shared_bitmap_manager.h" -#include "components/viz/frame_sinks/mojo_frame_sink_manager.h" #include "components/viz/host/frame_sink_manager_host.h" +#include "components/viz/service/display_compositor/compositor_overlay_candidate_validator_android.h" +#include "components/viz/service/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/host_shared_bitmap_manager.h" +#include "components/viz/service/frame_sinks/mojo_frame_sink_manager.h" +#include "content/browser/compositor/surface_utils.h" #include "content/browser/gpu/browser_gpu_channel_host_factory.h" #include "content/browser/gpu/browser_gpu_memory_buffer_manager.h" #include "content/browser/gpu/compositor_util.h" @@ -102,7 +103,7 @@ // Gpu process, instead get the mojo pointer from the Gpu process. frame_sink_manager = base::MakeUnique<viz::MojoFrameSinkManager>(false, nullptr); - viz::FrameSinkManagerHost::ConnectWithInProcessFrameSinkManager( + surface_utils::ConnectWithInProcessFrameSinkManager( &frame_sink_manager_host, frame_sink_manager.get()); }
diff --git a/content/browser/renderer_host/delegated_frame_host.cc b/content/browser/renderer_host/delegated_frame_host.cc index c921fbe..820ec29 100644 --- a/content/browser/renderer_host/delegated_frame_host.cc +++ b/content/browser/renderer_host/delegated_frame_host.cc
@@ -22,7 +22,7 @@ #include "cc/surfaces/surface.h" #include "cc/surfaces/surface_hittest.h" #include "cc/surfaces/surface_manager.h" -#include "components/viz/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/gl_helper.h" #include "content/browser/compositor/surface_utils.h" #include "content/browser/gpu/compositor_util.h" #include "content/browser/renderer_host/compositor_resize_lock.h"
diff --git a/content/browser/renderer_host/delegated_frame_host.h b/content/browser/renderer_host/delegated_frame_host.h index a3723d1..08f8b950 100644 --- a/content/browser/renderer_host/delegated_frame_host.h +++ b/content/browser/renderer_host/delegated_frame_host.h
@@ -14,7 +14,7 @@ #include "cc/output/copy_output_result.h" #include "cc/scheduler/begin_frame_source.h" #include "cc/surfaces/compositor_frame_sink_support_client.h" -#include "components/viz/frame_sinks/frame_evictor.h" +#include "components/viz/service/frame_sinks/frame_evictor.h" #include "content/browser/compositor/image_transport_factory.h" #include "content/browser/compositor/owned_mailbox.h" #include "content/browser/renderer_host/dip_util.h"
diff --git a/content/browser/renderer_host/media/video_capture_buffer_pool_unittest.cc b/content/browser/renderer_host/media/video_capture_buffer_pool_unittest.cc index b29d0f4..c982e896 100644 --- a/content/browser/renderer_host/media/video_capture_buffer_pool_unittest.cc +++ b/content/browser/renderer_host/media/video_capture_buffer_pool_unittest.cc
@@ -22,7 +22,7 @@ #include "build/build_config.h" #include "cc/test/test_context_provider.h" #include "cc/test/test_web_graphics_context_3d.h" -#include "components/viz/display_compositor/buffer_queue.h" +#include "components/viz/service/display_compositor/buffer_queue.h" #include "content/browser/renderer_host/media/video_capture_controller.h" #include "media/base/video_frame.h" #include "media/capture/video/video_capture_buffer_pool_impl.h"
diff --git a/content/browser/renderer_host/media/video_capture_controller.cc b/content/browser/renderer_host/media/video_capture_controller.cc index 797e437..a60a96c 100644 --- a/content/browser/renderer_host/media/video_capture_controller.cc +++ b/content/browser/renderer_host/media/video_capture_controller.cc
@@ -16,7 +16,7 @@ #include "base/metrics/histogram_macros.h" #include "base/metrics/sparse_histogram.h" #include "build/build_config.h" -#include "components/viz/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/gl_helper.h" #include "content/browser/renderer_host/media/media_stream_manager.h" #include "content/browser/renderer_host/media/video_capture_manager.h" #include "content/common/video_capture.mojom.h"
diff --git a/content/browser/renderer_host/offscreen_canvas_provider_impl_unittest.cc b/content/browser/renderer_host/offscreen_canvas_provider_impl_unittest.cc index fc515d4..680a2cb 100644 --- a/content/browser/renderer_host/offscreen_canvas_provider_impl_unittest.cc +++ b/content/browser/renderer_host/offscreen_canvas_provider_impl_unittest.cc
@@ -13,6 +13,7 @@ #include "base/run_loop.h" #include "cc/ipc/mojo_compositor_frame_sink.mojom.h" #include "cc/output/compositor_frame.h" +#include "content/browser/compositor/surface_utils.h" #include "content/browser/compositor/test/no_transport_image_transport_factory.h" #include "content/browser/renderer_host/offscreen_canvas_surface_impl.h" #include "testing/gmock/include/gmock/gmock.h" @@ -152,7 +153,7 @@ // The FrameSinkManager implementation is in-process here for tests. frame_sink_manager_ = base::MakeUnique<viz::MojoFrameSinkManager>(false, nullptr); - viz::FrameSinkManagerHost::ConnectWithInProcessFrameSinkManager( + surface_utils::ConnectWithInProcessFrameSinkManager( frame_sink_manager_host_.get(), frame_sink_manager_.get()); provider_ = base::MakeUnique<OffscreenCanvasProviderImpl>(
diff --git a/content/browser/renderer_host/render_message_filter.h b/content/browser/renderer_host/render_message_filter.h index 7b80db27..c99f6b84 100644 --- a/content/browser/renderer_host/render_message_filter.h +++ b/content/browser/renderer_host/render_message_filter.h
@@ -20,7 +20,7 @@ #include "base/strings/string16.h" #include "build/build_config.h" #include "cc/resources/shared_bitmap_manager.h" -#include "components/viz/display_compositor/host_shared_bitmap_manager.h" +#include "components/viz/service/display_compositor/host_shared_bitmap_manager.h" #include "content/common/cache_storage/cache_storage_types.h" #include "content/common/render_message_filter.mojom.h" #include "content/public/browser/browser_associated_interface.h"
diff --git a/content/browser/renderer_host/render_widget_host_impl.cc b/content/browser/renderer_host/render_widget_host_impl.cc index e89dec5..9ca4cf6 100644 --- a/content/browser/renderer_host/render_widget_host_impl.cc +++ b/content/browser/renderer_host/render_widget_host_impl.cc
@@ -31,7 +31,7 @@ #include "build/build_config.h" #include "cc/base/switches.h" #include "cc/output/compositor_frame.h" -#include "components/viz/display_compositor/host_shared_bitmap_manager.h" +#include "components/viz/service/display_compositor/host_shared_bitmap_manager.h" #include "content/browser/accessibility/browser_accessibility_state_impl.h" #include "content/browser/bad_message.h" #include "content/browser/browser_plugin/browser_plugin_guest.h"
diff --git a/content/browser/renderer_host/render_widget_host_view_android.cc b/content/browser/renderer_host/render_widget_host_view_android.cc index ae7ec8a..d3c0879 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.cc +++ b/content/browser/renderer_host/render_widget_host_view_android.cc
@@ -34,7 +34,7 @@ #include "cc/surfaces/surface_hittest.h" #include "cc/surfaces/surface_manager.h" #include "cc/trees/layer_tree_host.h" -#include "components/viz/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/gl_helper.h" #include "content/browser/accessibility/browser_accessibility_manager_android.h" #include "content/browser/accessibility/web_contents_accessibility_android.h" #include "content/browser/android/composited_touch_handle_drawable.h"
diff --git a/content/browser/renderer_host/render_widget_host_view_android.h b/content/browser/renderer_host/render_widget_host_view_android.h index 2d66062..7dd93bb1 100644 --- a/content/browser/renderer_host/render_widget_host_view_android.h +++ b/content/browser/renderer_host/render_widget_host_view_android.h
@@ -21,7 +21,7 @@ #include "cc/input/selection.h" #include "cc/output/begin_frame_args.h" #include "cc/scheduler/begin_frame_source.h" -#include "components/viz/frame_sinks/frame_evictor.h" +#include "components/viz/service/frame_sinks/frame_evictor.h" #include "content/browser/android/content_view_core_impl_observer.h" #include "content/browser/renderer_host/input/mouse_wheel_phase_handler.h" #include "content/browser/renderer_host/input/stylus_text_selector.h"
diff --git a/content/browser/renderer_host/render_widget_host_view_aura.cc b/content/browser/renderer_host/render_widget_host_view_aura.cc index d47e76d..55fe541 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura.cc
@@ -23,7 +23,7 @@ #include "cc/output/copy_output_result.h" #include "cc/resources/texture_mailbox.h" #include "cc/trees/layer_tree_settings.h" -#include "components/viz/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/gl_helper.h" #include "content/browser/accessibility/browser_accessibility_manager.h" #include "content/browser/accessibility/browser_accessibility_state_impl.h" #include "content/browser/bad_message.h"
diff --git a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc index 6866b14..bbb3fe7 100644 --- a/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc +++ b/content/browser/renderer_host/render_widget_host_view_aura_unittest.cc
@@ -33,8 +33,8 @@ #include "cc/test/begin_frame_args_test.h" #include "cc/test/fake_external_begin_frame_source.h" #include "cc/test/fake_surface_observer.h" -#include "components/viz/display_compositor/gl_helper.h" -#include "components/viz/display_compositor/host_shared_bitmap_manager.h" +#include "components/viz/service/display_compositor/gl_helper.h" +#include "components/viz/service/display_compositor/host_shared_bitmap_manager.h" #include "content/browser/browser_thread_impl.h" #include "content/browser/compositor/test/no_transport_image_transport_factory.h" #include "content/browser/frame_host/render_widget_host_view_guest.h"
diff --git a/content/browser/service_worker/service_worker_context_wrapper.cc b/content/browser/service_worker/service_worker_context_wrapper.cc index 329bd9b..fbb00d4fc 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.cc +++ b/content/browser/service_worker/service_worker_context_wrapper.cc
@@ -21,8 +21,6 @@ #include "base/threading/sequenced_worker_pool.h" #include "base/threading/thread_task_runner_handle.h" #include "content/browser/service_worker/embedded_worker_status.h" -#include "content/browser/service_worker/service_worker_context_core.h" -#include "content/browser/service_worker/service_worker_context_core_observer.h" #include "content/browser/service_worker/service_worker_process_manager.h" #include "content/browser/service_worker/service_worker_quota_client.h" #include "content/browser/service_worker/service_worker_version.h" @@ -31,6 +29,7 @@ #include "content/common/service_worker/service_worker_utils.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/browser_thread.h" +#include "content/public/browser/service_worker_context_observer.h" #include "net/base/url_util.h" #include "storage/browser/quota/quota_manager_proxy.h" #include "storage/browser/quota/special_storage_policy.h" @@ -103,6 +102,26 @@ g_excluded_header_name_set.Get().end(); } +bool ServiceWorkerContext::ScopeMatches(const GURL& scope, const GURL& url) { + return ServiceWorkerUtils::ScopeMatches(scope, url); +} + +void ServiceWorkerContextWrapper::OnRegistrationStored(int64_t registration_id, + const GURL& pattern) { + for (auto& observer : observer_list_) + observer.OnRegistrationStored(pattern); +} + +void ServiceWorkerContextWrapper::AddObserver( + ServiceWorkerContextObserver* observer) { + observer_list_.AddObserver(observer); +} + +void ServiceWorkerContextWrapper::RemoveObserver( + ServiceWorkerContextObserver* observer) { + observer_list_.RemoveObserver(observer); +} + ServiceWorkerContextWrapper::ServiceWorkerContextWrapper( BrowserContext* browser_context) : core_observer_list_( @@ -112,9 +131,17 @@ storage_partition_(nullptr), resource_context_(nullptr) { DCHECK_CURRENTLY_ON(BrowserThread::UI); + + // Add this object as an observer of the wrapped |context_core_|. This lets us + // forward observer methods to observers outside of content. + core_observer_list_->AddObserver(this); } ServiceWorkerContextWrapper::~ServiceWorkerContextWrapper() { + // Explicitly remove this object as an observer to avoid use-after-frees in + // tests where this object is not guaranteed to outlive the + // ServiceWorkerContextCore it wraps. + core_observer_list_->RemoveObserver(this); DCHECK(!resource_context_); }
diff --git a/content/browser/service_worker/service_worker_context_wrapper.h b/content/browser/service_worker/service_worker_context_wrapper.h index 55a20ec..a41d245 100644 --- a/content/browser/service_worker/service_worker_context_wrapper.h +++ b/content/browser/service_worker/service_worker_context_wrapper.h
@@ -11,10 +11,12 @@ #include <string> #include <vector> -#include "base/files/file_path.h" #include "base/macros.h" #include "base/memory/ref_counted.h" +#include "base/observer_list.h" +#include "base/observer_list_threadsafe.h" #include "content/browser/service_worker/service_worker_context_core.h" +#include "content/browser/service_worker/service_worker_context_core_observer.h" #include "content/common/content_export.h" #include "content/common/worker_url_loader_factory_provider.mojom.h" #include "content/public/browser/service_worker_context.h" @@ -33,8 +35,7 @@ class BrowserContext; class ResourceContext; -class ServiceWorkerContextCore; -class ServiceWorkerContextCoreObserver; +class ServiceWorkerContextObserver; class StoragePartitionImpl; // A refcounted wrapper class for our core object. Higher level content lib @@ -43,6 +44,7 @@ // is what is used internally in the service worker lib. class CONTENT_EXPORT ServiceWorkerContextWrapper : NON_EXPORTED_BASE(public ServiceWorkerContext), + public ServiceWorkerContextCoreObserver, public base::RefCountedThreadSafe<ServiceWorkerContextWrapper> { public: using StatusCallback = base::Callback<void(ServiceWorkerStatusCode)>; @@ -88,7 +90,13 @@ return process_manager_.get(); } + // ServiceWorkerContextCoreObserver implementation: + void OnRegistrationStored(int64_t registration_id, + const GURL& pattern) override; + // ServiceWorkerContext implementation: + void AddObserver(ServiceWorkerContextObserver* observer) override; + void RemoveObserver(ServiceWorkerContextObserver* observer) override; void RegisterServiceWorker(const GURL& pattern, const GURL& script_url, const ResultCallback& continuation) override; @@ -301,9 +309,16 @@ // DeleteAndStartOver fails. ServiceWorkerContextCore* context(); + // Observers of |context_core_| which live within content's implementation + // boundary. Shared with |context_core_|. const scoped_refptr< base::ObserverListThreadSafe<ServiceWorkerContextCoreObserver>> core_observer_list_; + + // Observers which live outside content's implementation boundary. Observer + // methods will always be dispatched on the UI thread. + base::ObserverList<ServiceWorkerContextObserver> observer_list_; + const std::unique_ptr<ServiceWorkerProcessManager> process_manager_; // Cleared in ShutdownOnIO(): std::unique_ptr<ServiceWorkerContextCore> context_core_;
diff --git a/content/browser/service_worker/service_worker_metrics.cc b/content/browser/service_worker/service_worker_metrics.cc index 418e9748..e77a33a 100644 --- a/content/browser/service_worker/service_worker_metrics.cc +++ b/content/browser/service_worker/service_worker_metrics.cc
@@ -718,10 +718,6 @@ mode, FETCH_REQUEST_MODE_LAST + 1); } -void ServiceWorkerMetrics::RecordTimeBetweenEvents(base::TimeDelta time) { - UMA_HISTOGRAM_MEDIUM_TIMES("ServiceWorker.TimeBetweenEvents", time); -} - void ServiceWorkerMetrics::RecordProcessCreated(bool is_new_process) { UMA_HISTOGRAM_BOOLEAN("EmbeddedWorkerInstance.ProcessCreated", is_new_process);
diff --git a/content/browser/service_worker/service_worker_version.cc b/content/browser/service_worker/service_worker_version.cc index 50adf19..306710a 100644 --- a/content/browser/service_worker/service_worker_version.cc +++ b/content/browser/service_worker/service_worker_version.cc
@@ -539,7 +539,6 @@ const StatusCallback& error_callback, const base::TimeDelta& timeout, TimeoutBehavior timeout_behavior) { - OnBeginEvent(); DCHECK_EQ(EmbeddedWorkerStatus::RUNNING, running_status()) << "Can only start a request with a running worker."; DCHECK(event_type == ServiceWorkerMetrics::EventType::INSTALL || @@ -1842,17 +1841,6 @@ } } -void ServiceWorkerVersion::OnBeginEvent() { - if (running_status() != EmbeddedWorkerStatus::RUNNING || - idle_time_.is_null()) { - return; - } - if (ServiceWorkerMetrics::ShouldExcludeSiteFromHistogram(site_for_uma_)) - return; - ServiceWorkerMetrics::RecordTimeBetweenEvents(tick_clock_->NowTicks() - - idle_time_); -} - void ServiceWorkerVersion::FinishStartWorker(ServiceWorkerStatusCode status) { RunCallbacks(this, &start_callbacks_, status); }
diff --git a/content/browser/service_worker/service_worker_version.h b/content/browser/service_worker/service_worker_version.h index ef267112..39130015 100644 --- a/content/browser/service_worker/service_worker_version.h +++ b/content/browser/service_worker/service_worker_version.h
@@ -687,11 +687,6 @@ void OnStoppedInternal(EmbeddedWorkerStatus old_status); - // Called at the beginning of each Dispatch*Event function: records - // the time elapsed since idle (generally the time since the previous - // event ended). - void OnBeginEvent(); - // Fires and clears all start callbacks. void FinishStartWorker(ServiceWorkerStatusCode status);
diff --git a/content/gpu/BUILD.gn b/content/gpu/BUILD.gn index 7724934..71ce502 100644 --- a/content/gpu/BUILD.gn +++ b/content/gpu/BUILD.gn
@@ -50,6 +50,7 @@ "//base", "//base/third_party/dynamic_annotations", "//components/tracing", + "//components/viz/service", "//content:export", "//content/child", "//content/common", @@ -72,6 +73,7 @@ "//services/service_manager/public/interfaces", "//services/shape_detection:lib", "//services/shape_detection/public/interfaces", + "//services/ui/common:server_gpu", "//services/ui/gpu", "//services/ui/gpu/interfaces", "//skia",
diff --git a/content/gpu/DEPS b/content/gpu/DEPS index ffaa6bf2..754efb4 100644 --- a/content/gpu/DEPS +++ b/content/gpu/DEPS
@@ -1,11 +1,13 @@ include_rules = [ "+components/tracing", + "+components/viz", "+content/child", "+content/public/gpu", "+libEGL", "+libGLESv2", "+services/service_manager", "+services/shape_detection", + "+services/ui/common", "+services/ui/gpu", "+sandbox", "+skia",
diff --git a/content/public/browser/BUILD.gn b/content/public/browser/BUILD.gn index 353dfa9..ebb1dfe 100644 --- a/content/public/browser/BUILD.gn +++ b/content/public/browser/BUILD.gn
@@ -228,6 +228,7 @@ "security_style_explanations.cc", "security_style_explanations.h", "service_worker_context.h", + "service_worker_context_observer.h", "service_worker_usage_info.cc", "service_worker_usage_info.h", "session_storage_namespace.h",
diff --git a/content/public/browser/service_worker_context.h b/content/public/browser/service_worker_context.h index 89a97d2..9a9aa0a 100644 --- a/content/public/browser/service_worker_context.h +++ b/content/public/browser/service_worker_context.h
@@ -14,6 +14,8 @@ namespace content { +class ServiceWorkerContextObserver; + enum class ServiceWorkerCapability { NO_SERVICE_WORKER, SERVICE_WORKER_NO_FETCH_HANDLER, @@ -65,6 +67,13 @@ // Must be called from the IO thread. static bool IsExcludedHeaderNameForFetchEvent(const std::string& header_name); + // Returns true if |url| is within the service worker |scope|. + CONTENT_EXPORT static bool ScopeMatches(const GURL& scope, const GURL& url); + + // Observer methods are always dispatched on the UI thread. + virtual void AddObserver(ServiceWorkerContextObserver* observer) = 0; + virtual void RemoveObserver(ServiceWorkerContextObserver* observer) = 0; + // Equivalent to calling navigator.serviceWorker.register(script_url, {scope: // pattern}) from a renderer, except that |pattern| is an absolute URL instead // of relative to some current origin. |callback| is passed true when the JS
diff --git a/content/public/browser/service_worker_context_observer.h b/content/public/browser/service_worker_context_observer.h new file mode 100644 index 0000000..2fc757d6 --- /dev/null +++ b/content/public/browser/service_worker_context_observer.h
@@ -0,0 +1,23 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_PUBLIC_BROWSER_SERVICE_WORKER_CONTEXT_OBSERVER_H_ +#define CONTENT_PUBLIC_BROWSER_SERVICE_WORKER_CONTEXT_OBSERVER_H_ + +#include "url/gurl.h" + +namespace content { + +class ServiceWorkerContextObserver { + public: + // Called when a service worker has been registered with scope |pattern|. + virtual void OnRegistrationStored(const GURL& pattern) {} + + protected: + virtual ~ServiceWorkerContextObserver() {} +}; + +} // namespace content + +#endif // CONTENT_PUBLIC_BROWSER_SERVICE_WORKER_CONTEXT_OBSERVER_H_
diff --git a/content/public/test/web_contents_tester.h b/content/public/test/web_contents_tester.h index ec12cecf..9918445 100644 --- a/content/public/test/web_contents_tester.h +++ b/content/public/test/web_contents_tester.h
@@ -18,6 +18,10 @@ class Size; } +namespace net { +class HttpResponseHeaders; +} + namespace content { class BrowserContext; @@ -127,6 +131,11 @@ NavigationHandle* navigation_handle, std::unique_ptr<NavigationData> navigation_data) = 0; + // Sets HttpResponseData on |navigation_handle|. + virtual void SetHttpResponseHeaders( + NavigationHandle* navigation_handle, + scoped_refptr<net::HttpResponseHeaders> response_headers) = 0; + // Returns headers that were passed in the previous SaveFrameWithHeaders(...) // call. virtual const std::string& GetSaveFrameHeaders() = 0;
diff --git a/content/renderer/media/android/stream_texture_factory.cc b/content/renderer/media/android/stream_texture_factory.cc index b875954..fd8521e0 100644 --- a/content/renderer/media/android/stream_texture_factory.cc +++ b/content/renderer/media/android/stream_texture_factory.cc
@@ -22,11 +22,9 @@ StreamTextureProxy::~StreamTextureProxy() {} void StreamTextureProxy::Release() { - { - // Cannot call |received_frame_cb_| after returning from here. - base::AutoLock lock(lock_); - received_frame_cb_.Reset(); - } + // Cannot call |received_frame_cb_| after returning from here. + ClearReceivedFrameCB(); + // Release is analogous to the destructor, so there should be no more external // calls to this object in Release. Therefore there is no need to acquire the // lock to access |task_runner_|. @@ -36,6 +34,11 @@ } } +void StreamTextureProxy::ClearReceivedFrameCB() { + base::AutoLock lock(lock_); + received_frame_cb_.Reset(); +} + void StreamTextureProxy::BindToTaskRunner( const base::Closure& received_frame_cb, scoped_refptr<base::SingleThreadTaskRunner> task_runner) {
diff --git a/content/renderer/media/android/stream_texture_factory.h b/content/renderer/media/android/stream_texture_factory.h index 41870332..ef0c724 100644 --- a/content/renderer/media/android/stream_texture_factory.h +++ b/content/renderer/media/android/stream_texture_factory.h
@@ -59,6 +59,9 @@ void ForwardStreamTextureForSurfaceRequest( const base::UnguessableToken& request_token); + // Clears |received_frame_cb_| in a thread safe way. + void ClearReceivedFrameCB(); + struct Deleter { inline void operator()(StreamTextureProxy* ptr) const { ptr->Release(); } };
diff --git a/content/renderer/media/android/stream_texture_wrapper_impl.cc b/content/renderer/media/android/stream_texture_wrapper_impl.cc index 036612f..0b81a19a 100644 --- a/content/renderer/media/android/stream_texture_wrapper_impl.cc +++ b/content/renderer/media/android/stream_texture_wrapper_impl.cc
@@ -180,9 +180,11 @@ } void StreamTextureWrapperImpl::Destroy() { - // Note: StreamTextureProxy stop calling back the provided frame received - // callback immediately, and delete itself on the right thread. - stream_texture_proxy_.reset(); + // Safely stop StreamTextureProxy from signaling the arrival of new frames. + // |stream_texture_proxy_| will be cleared on the main task runner, and its + // deleter will destroy the underlying object on the right task runner. + if (stream_texture_proxy_) + stream_texture_proxy_->ClearReceivedFrameCB(); if (!main_task_runner_->BelongsToCurrentThread()) { // base::Unretained is safe here because this function is the only one that
diff --git a/content/renderer/service_worker/embedded_worker_instance_client_impl.cc b/content/renderer/service_worker/embedded_worker_instance_client_impl.cc index 4240771..cf4ab1b 100644 --- a/content/renderer/service_worker/embedded_worker_instance_client_impl.cc +++ b/content/renderer/service_worker/embedded_worker_instance_client_impl.cc
@@ -7,7 +7,6 @@ #include <memory> #include "base/memory/ptr_util.h" -#include "base/metrics/histogram_macros.h" #include "base/strings/utf_string_conversions.h" #include "content/child/scoped_child_process_reference.h" #include "content/common/service_worker/embedded_worker_messages.h" @@ -42,12 +41,6 @@ TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstanceClientImpl::WorkerContextDestroyed"); - if (stop_worker_time_) { - UMA_HISTOGRAM_MEDIUM_TIMES( - "ServiceWorker.TerminateThread.Time", - base::TimeTicks::Now() - stop_worker_time_.value()); - stop_worker_time_.reset(); - } wrapper_.reset(); } @@ -57,7 +50,6 @@ mojom::EmbeddedWorkerInstanceHostAssociatedPtrInfo instance_host) { DCHECK(ChildThreadImpl::current()); DCHECK(!wrapper_); - DCHECK(!stop_worker_time_.has_value()); TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstanceClientImpl::StartWorker"); @@ -73,10 +65,8 @@ // StopWorker must be called after StartWorker is called. DCHECK(ChildThreadImpl::current()); DCHECK(wrapper_); - DCHECK(!stop_worker_time_.has_value()); TRACE_EVENT0("ServiceWorker", "EmbeddedWorkerInstanceClientImpl::StopWorker"); - stop_worker_time_ = base::TimeTicks::Now(); wrapper_->worker()->TerminateWorkerContext(); }
diff --git a/content/renderer/service_worker/embedded_worker_instance_client_impl.h b/content/renderer/service_worker/embedded_worker_instance_client_impl.h index 097f32f..fbef235 100644 --- a/content/renderer/service_worker/embedded_worker_instance_client_impl.h +++ b/content/renderer/service_worker/embedded_worker_instance_client_impl.h
@@ -8,8 +8,6 @@ #include <memory> #include "base/id_map.h" -#include "base/optional.h" -#include "base/time/time.h" #include "content/child/child_thread_impl.h" #include "content/child/scoped_child_process_reference.h" #include "content/common/service_worker/embedded_worker.mojom.h" @@ -96,8 +94,6 @@ // nullptr means the worker is not running. std::unique_ptr<WorkerWrapper> wrapper_; - base::Optional<base::TimeTicks> stop_worker_time_; - DISALLOW_COPY_AND_ASSIGN(EmbeddedWorkerInstanceClientImpl); };
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 62016ee..afb2eac6 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -248,9 +248,8 @@ "//cc/ipc:interfaces", "//cc/surfaces", "//components/leveldb/public/interfaces", - "//components/viz/display_compositor", - "//components/viz/frame_sinks", "//components/viz/host", + "//components/viz/service", "//content/app:both_for_content_tests", "//content/browser:for_content_tests", "//content/browser/speech/proto", @@ -1499,9 +1498,8 @@ "//components/rappor:test_support", "//components/ukm:test_support", "//components/ukm/public/interfaces", - "//components/viz/display_compositor", - "//components/viz/frame_sinks", "//components/viz/host", + "//components/viz/service", "//content:resources", "//content/app:both_for_content_tests", "//content/browser:for_content_tests",
diff --git a/content/test/test_web_contents.cc b/content/test/test_web_contents.cc index b3d88a72..c106590 100644 --- a/content/test/test_web_contents.cc +++ b/content/test/test_web_contents.cc
@@ -370,6 +370,13 @@ ->set_navigation_data(std::move(navigation_data)); } +void TestWebContents::SetHttpResponseHeaders( + NavigationHandle* navigation_handle, + scoped_refptr<net::HttpResponseHeaders> response_headers) { + static_cast<NavigationHandleImpl*>(navigation_handle) + ->set_response_headers_for_testing(response_headers); +} + void TestWebContents::CreateNewWindow( RenderFrameHost* opener, int32_t route_id,
diff --git a/content/test/test_web_contents.h b/content/test/test_web_contents.h index 45b6dc19..2d2844e3 100644 --- a/content/test/test_web_contents.h +++ b/content/test/test_web_contents.h
@@ -25,6 +25,10 @@ class Size; } +namespace net { +class HttpResponseHeaders; +} + namespace content { class NavigationData; @@ -136,6 +140,10 @@ NavigationHandle* navigation_handle, std::unique_ptr<NavigationData> navigation_data) override; + void SetHttpResponseHeaders( + NavigationHandle* navigation_handle, + scoped_refptr<net::HttpResponseHeaders> response_headers) override; + protected: // The deprecated WebContentsTester still needs to subclass this. explicit TestWebContents(BrowserContext* browser_context);
diff --git a/net/spdy/core/spdy_framer.cc b/net/spdy/core/spdy_framer.cc index 7d81e907..47482b2 100644 --- a/net/spdy/core/spdy_framer.cc +++ b/net/spdy/core/spdy_framer.cc
@@ -2182,6 +2182,16 @@ return builder.take(); } +SpdySerializedFrame SpdyFramer::SerializeUnknown( + const SpdyUnknownIR& unknown) const { + const size_t total_size = kFrameHeaderSize + unknown.payload().size(); + SpdyFrameBuilder builder(total_size); + builder.BeginNewExtensionFrame(*this, unknown.type(), unknown.flags(), + unknown.stream_id(), unknown.payload().size()); + builder.WriteBytes(unknown.payload().data(), unknown.payload().size()); + return builder.take(); +} + namespace { class FrameSerializationVisitor : public SpdyFrameVisitor { @@ -2225,6 +2235,9 @@ void VisitPriority(const SpdyPriorityIR& priority) override { frame_ = framer_->SerializePriority(priority); } + void VisitUnknown(const SpdyUnknownIR& unknown) override { + frame_ = framer_->SerializeUnknown(unknown); + } private: SpdyFramer* framer_; @@ -2628,6 +2641,18 @@ return ok; } +bool SpdyFramer::SerializeUnknown(const SpdyUnknownIR& unknown, + ZeroCopyOutputBuffer* output) const { + const size_t total_size = kFrameHeaderSize + unknown.payload().size(); + SpdyFrameBuilder builder(total_size, output); + bool ok = builder.BeginNewExtensionFrame(*this, unknown.type(), + unknown.flags(), unknown.stream_id(), + unknown.payload().size()); + ok = ok && + builder.WriteBytes(unknown.payload().data(), unknown.payload().size()); + return ok; +} + namespace { class FrameSerializationVisitorWithOutput : public SpdyFrameVisitor { @@ -2672,6 +2697,9 @@ void VisitPriority(const SpdyPriorityIR& priority) override { result_ = framer_->SerializePriority(priority, output_); } + void VisitUnknown(const SpdyUnknownIR& unknown) override { + result_ = framer_->SerializeUnknown(unknown, output_); + } private: SpdyFramer* framer_;
diff --git a/net/spdy/core/spdy_framer.h b/net/spdy/core/spdy_framer.h index 334bb266..ae827fa 100644 --- a/net/spdy/core/spdy_framer.h +++ b/net/spdy/core/spdy_framer.h
@@ -447,6 +447,9 @@ // the relative priority of the given stream. SpdySerializedFrame SerializePriority(const SpdyPriorityIR& priority) const; + // Serializes an unknown frame given a frame header and payload. + SpdySerializedFrame SerializeUnknown(const SpdyUnknownIR& unknown) const; + // Serialize a frame of unknown type. SpdySerializedFrame SerializeFrame(const SpdyFrameIR& frame); @@ -512,6 +515,10 @@ bool SerializePriority(const SpdyPriorityIR& priority, ZeroCopyOutputBuffer* output) const; + // Serializes an unknown frame given a frame header and payload. + bool SerializeUnknown(const SpdyUnknownIR& unknown, + ZeroCopyOutputBuffer* output) const; + // Serialize a frame of unknown type. size_t SerializeFrame(const SpdyFrameIR& frame, ZeroCopyOutputBuffer* output);
diff --git a/net/spdy/core/spdy_framer_test.cc b/net/spdy/core/spdy_framer_test.cc index a318bcfc..afcbc64 100644 --- a/net/spdy/core/spdy_framer_test.cc +++ b/net/spdy/core/spdy_framer_test.cc
@@ -2681,6 +2681,35 @@ CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); } +TEST_P(SpdyFramerTest, CreateUnknown) { + SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); + + const char kDescription[] = "Unknown frame"; + const uint8_t kType = 0xaf; + const uint8_t kFlags = 0x11; + const uint8_t kLength = strlen(kDescription); + const unsigned char kFrameData[] = { + 0x00, 0x00, kLength, // Length: 13 + kType, // Type: undefined + kFlags, // Flags: arbitrary, undefined + 0x00, 0x00, 0x00, 0x02, // Stream: 2 + 0x55, 0x6e, 0x6b, 0x6e, // "Unkn" + 0x6f, 0x77, 0x6e, 0x20, // "own " + 0x66, 0x72, 0x61, 0x6d, // "fram" + 0x65, // "e" + }; + SpdyUnknownIR unknown_ir(/* stream_id = */ 2, + /* type = */ kType, + /* flags = */ kFlags, + /* payload = */ kDescription); + SpdySerializedFrame frame(framer.SerializeFrame(unknown_ir)); + if (use_output_) { + EXPECT_EQ(framer.SerializeFrame(unknown_ir, &output_), frame.size()); + frame = SpdySerializedFrame(output_.Begin(), output_.Size(), false); + } + CompareFrame(kDescription, frame, kFrameData, arraysize(kFrameData)); +} + TEST_P(SpdyFramerTest, ReadCompressedHeadersHeaderBlock) { SpdyFramer framer(SpdyFramer::ENABLE_COMPRESSION); SpdyHeadersIR headers_ir(/* stream_id = */ 1);
diff --git a/net/spdy/core/spdy_protocol.cc b/net/spdy/core/spdy_protocol.cc index 92df79c4..f12b6371 100644 --- a/net/spdy/core/spdy_protocol.cc +++ b/net/spdy/core/spdy_protocol.cc
@@ -381,4 +381,14 @@ return SpdyFrameType::PRIORITY; } +void SpdyUnknownIR::Visit(SpdyFrameVisitor* visitor) const { + return visitor->VisitUnknown(*this); +} + +SpdyFrameType SpdyUnknownIR::frame_type() const { + // TODO(birenroy): Remove the fake EXTENSION value from the SpdyFrameType + // enum. + return SpdyFrameType::EXTENSION; +} + } // namespace net
diff --git a/net/spdy/core/spdy_protocol.h b/net/spdy/core/spdy_protocol.h index eaf3841..c4111a8 100644 --- a/net/spdy/core/spdy_protocol.h +++ b/net/spdy/core/spdy_protocol.h
@@ -791,6 +791,33 @@ DISALLOW_COPY_AND_ASSIGN(SpdyPriorityIR); }; +// Represents a frame of unrecognized type. +class SPDY_EXPORT_PRIVATE SpdyUnknownIR : public SpdyFrameIR { + public: + SpdyUnknownIR(SpdyStreamId stream_id, + uint8_t type, + uint8_t flags, + SpdyString payload) + : SpdyFrameIR(stream_id), + type_(type), + flags_(flags), + payload_(std::move(payload)) {} + uint8_t type() const { return type_; } + uint8_t flags() const { return flags_; } + const SpdyString& payload() const { return payload_; } + + void Visit(SpdyFrameVisitor* visitor) const override; + + SpdyFrameType frame_type() const override; + + private: + uint8_t type_; + uint8_t flags_; + const SpdyString payload_; + + DISALLOW_COPY_AND_ASSIGN(SpdyUnknownIR); +}; + class SpdySerializedFrame { public: SpdySerializedFrame() @@ -886,6 +913,9 @@ virtual void VisitAltSvc(const SpdyAltSvcIR& altsvc) = 0; virtual void VisitPriority(const SpdyPriorityIR& priority) = 0; virtual void VisitData(const SpdyDataIR& data) = 0; + virtual void VisitUnknown(const SpdyUnknownIR& unknown) { + // TODO(birenroy): make abstract. + } protected: SpdyFrameVisitor() {}
diff --git a/services/ui/BUILD.gn b/services/ui/BUILD.gn index 4dded45c..6a4aaae 100644 --- a/services/ui/BUILD.gn +++ b/services/ui/BUILD.gn
@@ -55,7 +55,7 @@ "//cc/surfaces", "//components/discardable_memory/public/interfaces", "//components/discardable_memory/service", - "//components/viz/display_compositor", + "//components/viz/service", "//mojo/common:common_base", "//services/catalog/public/cpp", "//services/catalog/public/interfaces:constants",
diff --git a/services/ui/gpu/BUILD.gn b/services/ui/gpu/BUILD.gn index 18a7837f..e5f1c2f68 100644 --- a/services/ui/gpu/BUILD.gn +++ b/services/ui/gpu/BUILD.gn
@@ -21,7 +21,7 @@ deps = [ "//cc", - "//components/viz", + "//components/viz/service", "//gpu/ipc:command_buffer", "//gpu/ipc/common", "//gpu/ipc/service",
diff --git a/services/ui/gpu/gpu_main.cc b/services/ui/gpu/gpu_main.cc index 1acc72a..9291f4b 100644 --- a/services/ui/gpu/gpu_main.cc +++ b/services/ui/gpu/gpu_main.cc
@@ -9,8 +9,8 @@ #include "base/message_loop/message_loop.h" #include "base/power_monitor/power_monitor_device_source.h" #include "base/single_thread_task_runner.h" -#include "components/viz/display_compositor/gpu_display_provider.h" -#include "components/viz/frame_sinks/mojo_frame_sink_manager.h" +#include "components/viz/service/display_compositor/gpu_display_provider.h" +#include "components/viz/service/frame_sinks/mojo_frame_sink_manager.h" #include "gpu/command_buffer/common/activity_flags.h" #include "gpu/ipc/common/gpu_memory_buffer_support.h" #include "gpu/ipc/gpu_in_process_thread_service.h"
diff --git a/testing/buildbot/chromium.perf.fyi.json b/testing/buildbot/chromium.perf.fyi.json index c08e95e..a6dc3e2 100644 --- a/testing/buildbot/chromium.perf.fyi.json +++ b/testing/buildbot/chromium.perf.fyi.json
@@ -22,7 +22,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device7", + "id": "build243-m4--device7", "os": "Android", "pool": "Chrome-perf" } @@ -52,7 +52,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device5", + "id": "build243-m4--device5", "os": "Android", "pool": "Chrome-perf" } @@ -82,7 +82,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device4", + "id": "build243-m4--device4", "os": "Android", "pool": "Chrome-perf" } @@ -112,7 +112,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device5", + "id": "build243-m4--device5", "os": "Android", "pool": "Chrome-perf" } @@ -142,7 +142,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device4", + "id": "build243-m4--device4", "os": "Android", "pool": "Chrome-perf" } @@ -172,7 +172,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device3", + "id": "build243-m4--device3", "os": "Android", "pool": "Chrome-perf" } @@ -202,7 +202,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device6", + "id": "build243-m4--device6", "os": "Android", "pool": "Chrome-perf" } @@ -232,7 +232,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device5", + "id": "build243-m4--device5", "os": "Android", "pool": "Chrome-perf" } @@ -262,7 +262,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device5", + "id": "build243-m4--device5", "os": "Android", "pool": "Chrome-perf" } @@ -292,7 +292,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device6", + "id": "build243-m4--device6", "os": "Android", "pool": "Chrome-perf" } @@ -322,7 +322,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device3", + "id": "build243-m4--device3", "os": "Android", "pool": "Chrome-perf" } @@ -352,7 +352,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device3", + "id": "build243-m4--device3", "os": "Android", "pool": "Chrome-perf" } @@ -382,7 +382,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device6", + "id": "build243-m4--device6", "os": "Android", "pool": "Chrome-perf" } @@ -412,7 +412,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device4", + "id": "build243-m4--device4", "os": "Android", "pool": "Chrome-perf" } @@ -442,7 +442,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device4", + "id": "build243-m4--device4", "os": "Android", "pool": "Chrome-perf" } @@ -472,7 +472,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device5", + "id": "build243-m4--device5", "os": "Android", "pool": "Chrome-perf" } @@ -502,7 +502,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device4", + "id": "build243-m4--device4", "os": "Android", "pool": "Chrome-perf" } @@ -532,7 +532,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device7", + "id": "build243-m4--device7", "os": "Android", "pool": "Chrome-perf" } @@ -562,7 +562,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device6", + "id": "build243-m4--device6", "os": "Android", "pool": "Chrome-perf" } @@ -592,7 +592,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device3", + "id": "build243-m4--device3", "os": "Android", "pool": "Chrome-perf" } @@ -622,7 +622,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device4", + "id": "build243-m4--device4", "os": "Android", "pool": "Chrome-perf" } @@ -652,7 +652,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device5", + "id": "build243-m4--device5", "os": "Android", "pool": "Chrome-perf" } @@ -682,7 +682,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device5", + "id": "build243-m4--device5", "os": "Android", "pool": "Chrome-perf" } @@ -712,7 +712,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device7", + "id": "build243-m4--device7", "os": "Android", "pool": "Chrome-perf" } @@ -742,7 +742,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device7", + "id": "build243-m4--device7", "os": "Android", "pool": "Chrome-perf" } @@ -772,7 +772,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device3", + "id": "build243-m4--device3", "os": "Android", "pool": "Chrome-perf" } @@ -802,7 +802,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device3", + "id": "build243-m4--device3", "os": "Android", "pool": "Chrome-perf" } @@ -832,7 +832,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device7", + "id": "build243-m4--device7", "os": "Android", "pool": "Chrome-perf" } @@ -862,7 +862,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device7", + "id": "build243-m4--device7", "os": "Android", "pool": "Chrome-perf" } @@ -892,7 +892,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device3", + "id": "build243-m4--device3", "os": "Android", "pool": "Chrome-perf" } @@ -922,7 +922,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device4", + "id": "build243-m4--device4", "os": "Android", "pool": "Chrome-perf" } @@ -952,7 +952,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device5", + "id": "build243-m4--device5", "os": "Android", "pool": "Chrome-perf" } @@ -982,7 +982,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device5", + "id": "build243-m4--device5", "os": "Android", "pool": "Chrome-perf" } @@ -1012,7 +1012,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device6", + "id": "build243-m4--device6", "os": "Android", "pool": "Chrome-perf" } @@ -1042,7 +1042,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device4", + "id": "build243-m4--device4", "os": "Android", "pool": "Chrome-perf" } @@ -1072,7 +1072,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device4", + "id": "build243-m4--device4", "os": "Android", "pool": "Chrome-perf" } @@ -1102,7 +1102,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device6", + "id": "build243-m4--device6", "os": "Android", "pool": "Chrome-perf" } @@ -1132,7 +1132,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device4", + "id": "build243-m4--device4", "os": "Android", "pool": "Chrome-perf" } @@ -1162,7 +1162,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device7", + "id": "build243-m4--device7", "os": "Android", "pool": "Chrome-perf" } @@ -1192,7 +1192,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device7", + "id": "build243-m4--device7", "os": "Android", "pool": "Chrome-perf" } @@ -1222,7 +1222,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device2", + "id": "build243-m4--device2", "os": "Android", "pool": "Chrome-perf" } @@ -1252,7 +1252,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device6", + "id": "build243-m4--device6", "os": "Android", "pool": "Chrome-perf" } @@ -1282,7 +1282,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device3", + "id": "build243-m4--device3", "os": "Android", "pool": "Chrome-perf" } @@ -1312,7 +1312,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device2", + "id": "build243-m4--device2", "os": "Android", "pool": "Chrome-perf" } @@ -1342,7 +1342,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device5", + "id": "build243-m4--device5", "os": "Android", "pool": "Chrome-perf" } @@ -1372,7 +1372,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device7", + "id": "build243-m4--device7", "os": "Android", "pool": "Chrome-perf" } @@ -1402,7 +1402,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device7", + "id": "build243-m4--device7", "os": "Android", "pool": "Chrome-perf" } @@ -1432,7 +1432,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device3", + "id": "build243-m4--device3", "os": "Android", "pool": "Chrome-perf" } @@ -1462,7 +1462,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device3", + "id": "build243-m4--device3", "os": "Android", "pool": "Chrome-perf" } @@ -1492,7 +1492,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device3", + "id": "build243-m4--device3", "os": "Android", "pool": "Chrome-perf" } @@ -1522,7 +1522,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device6", + "id": "build243-m4--device6", "os": "Android", "pool": "Chrome-perf" } @@ -1552,7 +1552,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device3", + "id": "build243-m4--device3", "os": "Android", "pool": "Chrome-perf" } @@ -1582,7 +1582,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device6", + "id": "build243-m4--device6", "os": "Android", "pool": "Chrome-perf" } @@ -1612,7 +1612,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device3", + "id": "build243-m4--device3", "os": "Android", "pool": "Chrome-perf" } @@ -1642,7 +1642,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device7", + "id": "build243-m4--device7", "os": "Android", "pool": "Chrome-perf" } @@ -1672,7 +1672,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device4", + "id": "build243-m4--device4", "os": "Android", "pool": "Chrome-perf" } @@ -1702,7 +1702,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device4", + "id": "build243-m4--device4", "os": "Android", "pool": "Chrome-perf" } @@ -1732,7 +1732,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device3", + "id": "build243-m4--device3", "os": "Android", "pool": "Chrome-perf" } @@ -1762,7 +1762,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device3", + "id": "build243-m4--device3", "os": "Android", "pool": "Chrome-perf" } @@ -1792,7 +1792,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device5", + "id": "build243-m4--device5", "os": "Android", "pool": "Chrome-perf" } @@ -1822,7 +1822,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device3", + "id": "build243-m4--device3", "os": "Android", "pool": "Chrome-perf" } @@ -1852,7 +1852,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device3", + "id": "build243-m4--device3", "os": "Android", "pool": "Chrome-perf" } @@ -1882,7 +1882,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device4", + "id": "build243-m4--device4", "os": "Android", "pool": "Chrome-perf" } @@ -1912,7 +1912,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device1", + "id": "build243-m4--device1", "os": "Android", "pool": "Chrome-perf" } @@ -1942,7 +1942,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device6", + "id": "build243-m4--device6", "os": "Android", "pool": "Chrome-perf" } @@ -1972,7 +1972,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device7", + "id": "build243-m4--device7", "os": "Android", "pool": "Chrome-perf" } @@ -2002,7 +2002,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device5", + "id": "build243-m4--device5", "os": "Android", "pool": "Chrome-perf" } @@ -2032,7 +2032,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device7", + "id": "build243-m4--device7", "os": "Android", "pool": "Chrome-perf" } @@ -2062,7 +2062,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device2", + "id": "build243-m4--device2", "os": "Android", "pool": "Chrome-perf" } @@ -2092,7 +2092,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device3", + "id": "build243-m4--device3", "os": "Android", "pool": "Chrome-perf" } @@ -2122,7 +2122,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device2", + "id": "build243-m4--device2", "os": "Android", "pool": "Chrome-perf" } @@ -2152,7 +2152,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device1", + "id": "build243-m4--device1", "os": "Android", "pool": "Chrome-perf" } @@ -2182,7 +2182,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device5", + "id": "build243-m4--device5", "os": "Android", "pool": "Chrome-perf" } @@ -2212,7 +2212,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device5", + "id": "build243-m4--device5", "os": "Android", "pool": "Chrome-perf" } @@ -2242,7 +2242,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device5", + "id": "build243-m4--device5", "os": "Android", "pool": "Chrome-perf" } @@ -2272,7 +2272,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device4", + "id": "build243-m4--device4", "os": "Android", "pool": "Chrome-perf" } @@ -2302,7 +2302,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device5", + "id": "build243-m4--device5", "os": "Android", "pool": "Chrome-perf" } @@ -2332,7 +2332,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device2", + "id": "build243-m4--device2", "os": "Android", "pool": "Chrome-perf" } @@ -2362,7 +2362,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device6", + "id": "build243-m4--device6", "os": "Android", "pool": "Chrome-perf" } @@ -2392,7 +2392,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device1", + "id": "build243-m4--device1", "os": "Android", "pool": "Chrome-perf" } @@ -2422,7 +2422,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device1", + "id": "build243-m4--device1", "os": "Android", "pool": "Chrome-perf" } @@ -2452,7 +2452,7 @@ "dimension_sets": [ { "android_devices": "1", - "id": "build243-m1--device7", + "id": "build243-m4--device7", "os": "Android", "pool": "Chrome-perf" }
diff --git a/testing/buildbot/chromium.webkit.json b/testing/buildbot/chromium.webkit.json index e7ff49b..a2ab64a3 100644 --- a/testing/buildbot/chromium.webkit.json +++ b/testing/buildbot/chromium.webkit.json
@@ -124,7 +124,8 @@ { "os": "Ubuntu-14.04" } - ] + ], + "shards": 6 } } ],
diff --git a/third_party/WebKit/LayoutTests/TestExpectations b/third_party/WebKit/LayoutTests/TestExpectations index fb0de28..037f3c69 100644 --- a/third_party/WebKit/LayoutTests/TestExpectations +++ b/third_party/WebKit/LayoutTests/TestExpectations
@@ -2863,3 +2863,5 @@ # Sheriff failures 2017-06-14 crbug.com/733357 [ Win Mac ] inspector/elements/styles-4/styles-history.html [ Failure Pass ] +crbug.com/733448 [ Win Mac ] http/tests/inspector/extensions/extensions-network.html [ Failure Pass ] +crbug.com/733448 [ Win Mac ] virtual/mojo-loading/http/tests/inspector/extensions/extensions-network.html [ Failure Pass ]
diff --git a/third_party/WebKit/Source/bindings/core/v8/WindowProxy.cpp b/third_party/WebKit/Source/bindings/core/v8/WindowProxy.cpp index aa5b1a12..bda519f 100644 --- a/third_party/WebKit/Source/bindings/core/v8/WindowProxy.cpp +++ b/third_party/WebKit/Source/bindings/core/v8/WindowProxy.cpp
@@ -38,6 +38,7 @@ #include "core/frame/Frame.h" #include "platform/bindings/V8DOMWrapper.h" #include "platform/wtf/Assertions.h" +#include "platform/wtf/debug/Alias.h" #include "v8/include/v8.h" namespace blink { @@ -95,6 +96,8 @@ void WindowProxy::SetGlobalProxy(v8::Local<v8::Object> global_proxy) { DCHECK_EQ(lifecycle_, Lifecycle::kContextIsUninitialized); + WTF::debug::StackTrace initialization_stack = initialization_stack_; + WTF::debug::Alias(&initialization_stack); CHECK(global_proxy_.IsEmpty()); global_proxy_.Set(isolate_, global_proxy); @@ -146,6 +149,7 @@ if (lifecycle_ == Lifecycle::kContextIsUninitialized || lifecycle_ == Lifecycle::kGlobalObjectIsDetached) { Initialize(); + initialization_stack_ = WTF::debug::StackTrace(); } }
diff --git a/third_party/WebKit/Source/bindings/core/v8/WindowProxy.h b/third_party/WebKit/Source/bindings/core/v8/WindowProxy.h index 6c79724..f42a069 100644 --- a/third_party/WebKit/Source/bindings/core/v8/WindowProxy.h +++ b/third_party/WebKit/Source/bindings/core/v8/WindowProxy.h
@@ -36,6 +36,7 @@ #include "platform/bindings/ScopedPersistent.h" #include "platform/heap/Handle.h" #include "platform/wtf/RefPtr.h" +#include "platform/wtf/debug/StackTrace.h" #include "v8/include/v8.h" namespace blink { @@ -257,6 +258,10 @@ // to be destroyed. ScopedPersistent<v8::Object> global_proxy_; Lifecycle lifecycle_; + + // TODO(dcheng): Remove this temporary code for debugging + // https://crbug.com/728693. + WTF::debug::StackTrace initialization_stack_; }; } // namespace blink
diff --git a/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h b/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h index 218e868..757b731 100644 --- a/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h +++ b/third_party/WebKit/Source/core/css/CSSPrimitiveValueMappings.h
@@ -1348,47 +1348,6 @@ } template <> -inline CSSIdentifierValue::CSSIdentifierValue(ObjectFit fit) - : CSSValue(kIdentifierClass) { - switch (fit) { - case kObjectFitFill: - value_id_ = CSSValueFill; - break; - case kObjectFitContain: - value_id_ = CSSValueContain; - break; - case kObjectFitCover: - value_id_ = CSSValueCover; - break; - case kObjectFitNone: - value_id_ = CSSValueNone; - break; - case kObjectFitScaleDown: - value_id_ = CSSValueScaleDown; - break; - } -} - -template <> -inline ObjectFit CSSIdentifierValue::ConvertTo() const { - switch (value_id_) { - case CSSValueFill: - return kObjectFitFill; - case CSSValueContain: - return kObjectFitContain; - case CSSValueCover: - return kObjectFitCover; - case CSSValueNone: - return kObjectFitNone; - case CSSValueScaleDown: - return kObjectFitScaleDown; - default: - NOTREACHED(); - return kObjectFitFill; - } -} - -template <> inline CSSIdentifierValue::CSSIdentifierValue(EFillSizeType fill_size) : CSSValue(kIdentifierClass) { switch (fill_size) {
diff --git a/third_party/WebKit/Source/core/css/CSSProperties.json5 b/third_party/WebKit/Source/core/css/CSSProperties.json5 index 7e1621c..fe87d1b2 100644 --- a/third_party/WebKit/Source/core/css/CSSProperties.json5 +++ b/third_party/WebKit/Source/core/css/CSSProperties.json5
@@ -1639,18 +1639,20 @@ }, { name: "object-fit", - type_name: "ObjectFit", - field_template: "storage_only", + field_template: "keyword", + keywords: ["fill", "contain", "cover", "none", "scale-down"], field_group: "rare-non-inherited", field_size: 3, - default_value: "kObjectFitFill", + getter: "GetObjectFit", + default_value: "fill", }, { name: "object-position", converter: "ConvertPosition", interpolable: true, - field_template: "storage_only", + field_template: "external", type_name: "LengthPoint", + include_paths: ["platform/LengthPoint.h"], field_group: "rare-non-inherited", default_value: "LengthPoint(Length(50.0, kPercent), Length(50.0, kPercent))", },
diff --git a/third_party/WebKit/Source/core/layout/LayoutImage.cpp b/third_party/WebKit/Source/core/layout/LayoutImage.cpp index 7a2c66f..0f9627c3 100644 --- a/third_party/WebKit/Source/core/layout/LayoutImage.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutImage.cpp
@@ -239,8 +239,8 @@ if (Style()->ObjectPosition() != ComputedStyle::InitialObjectPosition()) return false; // Object-fit may leave parts of the content box empty. - ObjectFit object_fit = Style()->GetObjectFit(); - if (object_fit != kObjectFitFill && object_fit != kObjectFitCover) + EObjectFit object_fit = Style()->GetObjectFit(); + if (object_fit != EObjectFit::kFill && object_fit != EObjectFit::kCover) return false; // Check for image with alpha. TRACE_EVENT1(
diff --git a/third_party/WebKit/Source/core/layout/LayoutReplaced.cpp b/third_party/WebKit/Source/core/layout/LayoutReplaced.cpp index ee4d514..1d90c33 100644 --- a/third_party/WebKit/Source/core/layout/LayoutReplaced.cpp +++ b/third_party/WebKit/Source/core/layout/LayoutReplaced.cpp
@@ -583,9 +583,9 @@ LayoutRect LayoutReplaced::ComputeObjectFit( const LayoutSize* overridden_intrinsic_size) const { LayoutRect content_rect = ContentBoxRect(); - ObjectFit object_fit = Style()->GetObjectFit(); + EObjectFit object_fit = Style()->GetObjectFit(); - if (object_fit == kObjectFitFill && + if (object_fit == EObjectFit::kFill && Style()->ObjectPosition() == ComputedStyle::InitialObjectPosition()) { return content_rect; } @@ -603,21 +603,21 @@ LayoutRect final_rect = content_rect; switch (object_fit) { - case kObjectFitContain: - case kObjectFitScaleDown: - case kObjectFitCover: + case EObjectFit::kContain: + case EObjectFit::kScaleDown: + case EObjectFit::kCover: final_rect.SetSize(final_rect.Size().FitToAspectRatio( - intrinsic_size, object_fit == kObjectFitCover + intrinsic_size, object_fit == EObjectFit::kCover ? kAspectRatioFitGrow : kAspectRatioFitShrink)); - if (object_fit != kObjectFitScaleDown || + if (object_fit != EObjectFit::kScaleDown || final_rect.Width() <= intrinsic_size.Width()) break; // fall through - case kObjectFitNone: + case EObjectFit::kNone: final_rect.SetSize(intrinsic_size); break; - case kObjectFitFill: + case EObjectFit::kFill: break; default: NOTREACHED();
diff --git a/third_party/WebKit/Source/core/style/ComputedStyle.h b/third_party/WebKit/Source/core/style/ComputedStyle.h index 7d1e1ae..22e8b89 100644 --- a/third_party/WebKit/Source/core/style/ComputedStyle.h +++ b/third_party/WebKit/Source/core/style/ComputedStyle.h
@@ -1055,26 +1055,6 @@ rare_non_inherited_data_.Access()->effective_blend_mode_ = v; } - // object-fit - static ObjectFit InitialObjectFit() { return kObjectFitFill; } - ObjectFit GetObjectFit() const { - return static_cast<ObjectFit>(rare_non_inherited_data_->object_fit_); - } - void SetObjectFit(ObjectFit f) { - SET_VAR(rare_non_inherited_data_, object_fit_, f); - } - - // object-position - static LengthPoint InitialObjectPosition() { - return LengthPoint(Length(50.0, kPercent), Length(50.0, kPercent)); - } - LengthPoint ObjectPosition() const { - return rare_non_inherited_data_->object_position_; - } - void SetObjectPosition(LengthPoint position) { - SET_VAR(rare_non_inherited_data_, object_position_, position); - } - // offset-anchor static LengthPoint InitialOffsetAnchor() { return LengthPoint(Length(kAuto), Length(kAuto));
diff --git a/third_party/WebKit/Source/core/style/ComputedStyleConstants.h b/third_party/WebKit/Source/core/style/ComputedStyleConstants.h index a02b9b20..a3069ba0e 100644 --- a/third_party/WebKit/Source/core/style/ComputedStyleConstants.h +++ b/third_party/WebKit/Source/core/style/ComputedStyleConstants.h
@@ -172,14 +172,6 @@ enum EUserDrag { DRAG_AUTO, DRAG_NONE, DRAG_ELEMENT }; // CSS3 Image Values -enum ObjectFit { - kObjectFitFill, - kObjectFitContain, - kObjectFitCover, - kObjectFitNone, - kObjectFitScaleDown -}; - enum EResize { RESIZE_NONE, RESIZE_BOTH, RESIZE_HORIZONTAL, RESIZE_VERTICAL }; enum QuoteType { OPEN_QUOTE, CLOSE_QUOTE, NO_OPEN_QUOTE, NO_CLOSE_QUOTE };
diff --git a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/AUTHORS b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/AUTHORS deleted file mode 100644 index 0f1d6c31..0000000 --- a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/AUTHORS +++ /dev/null
@@ -1,23 +0,0 @@ -List of xterm.js contributors. Updated before every release. - -Alessandro Nadalin <alessandro.nadalin@gmail.com> -Alexander Olsson <noseglid@gmail.com> -Antonis Kalipetis <akalipetis@sourcelair.com> -Anton Skshidlevsky <meefik@gmail.com> -Austin Robertson <austinrobertson@gmail.com> -ayapi <colors.aya@gmail.com> -Benjamin Fischer <benjamin.fischer@rwth-aachen.de> -Carson Anderson <carson@betterservers.com> -Christopher Jeffrey <chjjeffrey@gmail.com> -Daniel Imms <daimms@microsoft.com> -Daniel Risacher <drisacher@gmail.com> -Dan Kaplun <dbkaplun@twitch.tv> -Darin Morrison <freebroccolo@users.noreply.github.com> -Jean Bruenn <himself@jeanbruenn.info> -Jörg Breitbart <jerch@rockborn.de> -Paris Kasidiaris <pariskasidiaris@gmail.com> -Paris Kasidiaris <paris@sourcelair.com> -runarberg <runar@greenqloud.com> -Steven Silvester <steven.silvester@ieee.org> -Thanasis Daglis <thanasis@sourcelair.com> -Tine Jozelj <tine.jozelj@outlook.com>
diff --git a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/CONTRIBUTING.md b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/CONTRIBUTING.md deleted file mode 100644 index 8b33d18..0000000 --- a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/CONTRIBUTING.md +++ /dev/null
@@ -1,52 +0,0 @@ -# How to contribute to xterm.js - -- [Opening issues for bug reports or feature requests](#opening-issues) -- [Contributing code](#contributing-code) - -## Opening issues - -The preferred way to report bugs or request features is to use -[GitHub issues](http://github.com/sourcelair/xterm.js/issues). Before -opening an issue, read these pointers. - -### Opening issues effectively - -- Include information about **the browser in which the problem occurred**. Even - if you tested several browsers, and the problem occurred in all of them, - mention this fact in the bug report. Also include browser version numbers and - the operating system that you're on. - -- Mention which release of xterm.js you're using. Preferably, try also with - the current HEAD of the master branch, to ensure the problem has not already been - fixed. - -- Mention precisely what went wrong. What did you expect to happen? What happened instead? Describe the - exact steps a maintainer has to take to make the problem occur. - -- If the problem can not be reproduced in the [demo of xterm.js](README.md#demo), please provide an HTML document that demonstrates the problem. - -- Be polite. Issues with an indignant or belligerent tone tend to be moved to the - bottom of the pile. - -## Contributing code - -- Make sure you have a [GitHub account](https://github.com/join) -- Fork [xterm.js](https://github.com/sourcelair/xterm.js/) - ([how to fork a repo](https://help.github.com/articles/fork-a-repo)) -- Make your changes -- If your changes are easy to test or likely to regress, add tests. Tests go into `test`, directory. -- Follow the general code style of the rest of the project (see below). -- Submit a pull request -([how to create a pull request](https://help.github.com/articles/fork-a-repo)). - Don't put more than one feature/fix in a single pull request. - -By contributing code to xterm.js you - - - agree to license the contributed code under xterm.js' [MIT - license](LICENSE). - - - confirm that you have the right to contribute and license the code - in question. (Either you hold all rights on the code, or the rights - holder has explicitly granted the right to use it like this, - through a compatible open source license or through a direct - agreement with you.)
diff --git a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/Dockerfile b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/Dockerfile deleted file mode 100644 index 105e997..0000000 --- a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/Dockerfile +++ /dev/null
@@ -1,4 +0,0 @@ -FROM node:4-onbuild -MAINTAINER Paris Kasidiaris <paris@sourcelair.com> - -EXPOSE 3000
diff --git a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/Procfile.dev b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/Procfile.dev deleted file mode 100644 index 063b78f4..0000000 --- a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/Procfile.dev +++ /dev/null
@@ -1 +0,0 @@ -web: npm start
diff --git a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/README.md b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/README.md deleted file mode 100644 index e45dd1d..0000000 --- a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/README.md +++ /dev/null
@@ -1,101 +0,0 @@ -# xterm.js - - [](https://gitter.im/sourcelair/xterm.js?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) - -Xterm.js is a terminal front-end component written in JavaScript that works in the browser. - -It enables applications to provide fully featured terminals to their users and create great development experiences. - -## Features -- **Text-based application support**: Use xterm.js to work with applications like `bash`, `git` etc. -- **Curses-based application support**: Use xterm.js to work with applications like `vim`, `tmux` etc. -- **Mouse events support**: Xterm.js captures mouse events like click and scroll and passes them to the terminal's back-end controlling process -- **CJK (Chinese, Japanese, Korean) character support**: Xterm.js renders CJK characters seamlessly -- **IME support**: Insert international (including CJK) characters using IME input with your keyboard -- **Self-contained library**: Xterm.js works on its own. It does not require any external libraries like jQuery or React to work -- **Modular, event-based API**: Lets you build addons and themes with ease - -## What xterm.js is not -- Xterm.js is not a terminal application that you can download and use on your computer -- Xterm.js is not `bash`. Xterm.js can be connected to processes like `bash` and let you interact with them (provide input, receive output) - -## Real-world uses -Xterm.js is used in several world-class applications to provide great terminal experiences. - -- [**SourceLair**](https://www.sourcelair.com/): In-browser IDE that provides its users with fully-featured Linux terminals based on xterm.js -- [**Microsoft Visual Studio Code**](http://code.visualstudio.com/): Modern, versatile and powerful open source code editor that provides an integrated terminal based on xterm.js - -Do you use xterm.js in your application as well? Please [open a Pull Request](https://github.com/sourcelair/xterm.js/pulls) to include it here. We would love to have it in our list. - -## Browser Support - -Since xterm.js is typically implemented as a developer tool, only modern browsers are supported officially. Here is a list of the versions we aim to support: - -- Chrome 48+ -- Edge 13+ -- Firefox 44+ -- Internet Explorer 11+ -- Opera 35+ -- Safari 8+ - -Xterm.js works seamlessly in Electron apps and may even work on earlier versions of the browsers but these are the browsers we strive to keep working. - -## Demo - -To launch the demo simply run: - -``` -npm install -npm start -``` - -Then open http://0.0.0.0:3000 in a web browser (use http://127.0.0.1:3000 if running under Windows). - -## Addons - -Addons are JavaScript modules that attach functions to the `Terminal` prototype to extend its functionality. There are a handful available in the main repository in the `addons` directory, you can even write your own (though they may break when the internals of xterm.js change across versions). - -To use an addon, just include the JavaScript file after xterm.js and before the `Terminal` object has been instantiated. The function should then be exposed on the `Terminal` object: - -```html -<script src="node_modules/dist/xterm.js"></script> -<script src="node_modules/addons/fit/fit.js"></script> -``` - -```js -var xterm = new Terminal(); -// init code... -xterm.fit(); -``` - -## Releases - -Xterm.js follows a monthly release cycle roughly. - -The existing releases are available at this GitHub repo's [Releases](https://github.com/sourcelair/xterm.js/releases), while the roadmap is available as [Milestones](https://github.com/sourcelair/xterm.js/milestones). - -## Development and Contribution - -Xterm.js is maintained by [SourceLair](https://www.sourcelair.com/) and a few external contributors, but we would love to receive contributions from everyone! - -To contribute either code, documentation or issues to xterm.js please read the [Contributing document](CONTRIBUTING.md) before. - -The development of xterm.js does not require any special tool. All you need is an editor that supports JavaScript and a browser (if you would like to run the demo you will need Node.js to get all features). - -It is recommended though to use a development tool that uses xterm.js internally, to develop for xterm.js. [Eating our own dogfood](https://en.wikipedia.org/wiki/Eating_your_own_dog_food) has been proved extremely beneficial for this project. Known tools that use xterm.js internally are: - -#### [SourceLair](https://www.sourcelair.com) - -Visit https://lair.io/sourcelair/xterm and follow the instructions. All development will happen in your browser. - -#### [Visual Studio Code](http://code.visualstudio.com/) - -[Download Visual Studio Code](http://code.visualstudio.com/Download), clone xterm.js and you are all set. - -## License Agreement - -If you contribute code to this project, you are implicitly allowing your code to be distributed under the MIT license. You are also implicitly verifying that all code is your original work. - -Copyright (c) 2014-2016, SourceLair, Private Company ([www.sourcelair.com](https://www.sourcelair.com/home)) (MIT License) - -Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
diff --git a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/addons/fit/fit.js b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/addons/fit/fit.js index 209e059..46b79e9b 100644 --- a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/addons/fit/fit.js +++ b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/addons/fit/fit.js
@@ -1,27 +1,27 @@ -/* - * Fit terminal columns and rows to the dimensions of its - * DOM element. +/** + * Fit terminal columns and rows to the dimensions of its DOM element. * - * Approach: - * - Rows: Truncate the division of the terminal parent element height - * by the terminal row height + * ## Approach + * - Rows: Truncate the division of the terminal parent element height by the terminal row height. * - * - Columns: Truncate the division of the terminal parent element width by - * the terminal character width (apply display: inline at the - * terminal row and truncate its width with the current number - * of columns) + * - Columns: Truncate the division of the terminal parent element width by the terminal character + * width (apply display: inline at the terminal row and truncate its width with the current + * number of columns). + * @module xterm/addons/fit/fit + * @license MIT */ + (function (fit) { if (typeof exports === 'object' && typeof module === 'object') { /* * CommonJS environment */ - module.exports = fit(require('../../src/xterm')); + module.exports = fit(require('../../xterm')); } else if (typeof define == 'function') { /* * Require.js is available */ - define(['../../src/xterm'], fit); + define(['../../xterm'], fit); } else { /* * Plain browser environment @@ -29,17 +29,15 @@ fit(window.Terminal); } })(function (Xterm) { - /** - * This module provides methods for fitting a terminal's size to a parent container. - * - * @module xterm/addons/fit/fit - */ var exports = {}; exports.proposeGeometry = function (term) { + if (!term.element.parentElement) { + return null; + } var parentElementStyle = window.getComputedStyle(term.element.parentElement), parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height')), - parentElementWidth = parseInt(parentElementStyle.getPropertyValue('width')), + parentElementWidth = Math.max(0, parseInt(parentElementStyle.getPropertyValue('width')) - 17), elementStyle = window.getComputedStyle(term.element), elementPaddingVer = parseInt(elementStyle.getPropertyValue('padding-top')) + parseInt(elementStyle.getPropertyValue('padding-bottom')), elementPaddingHor = parseInt(elementStyle.getPropertyValue('padding-right')) + parseInt(elementStyle.getPropertyValue('padding-left')), @@ -58,11 +56,11 @@ subjectRow.innerHTML = 'W'; // Common character for measuring width, although on monospace characterWidth = subjectRow.getBoundingClientRect().width; subjectRow.style.display = ''; // Revert style before calculating height, since they differ. - characterHeight = parseInt(subjectRow.offsetHeight); + characterHeight = subjectRow.getBoundingClientRect().height; subjectRow.innerHTML = contentBuffer; rows = parseInt(availableHeight / characterHeight); - cols = parseInt(availableWidth / characterWidth) - 1; + cols = parseInt(availableWidth / characterWidth); geometry = {cols: cols, rows: rows}; return geometry; @@ -71,7 +69,9 @@ exports.fit = function (term) { var geometry = exports.proposeGeometry(term); - term.resize(geometry.cols, geometry.rows); + if (geometry) { + term.resize(geometry.cols, geometry.rows); + } }; Xterm.prototype.proposeGeometry = function () {
diff --git a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/bower.json b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/bower.json deleted file mode 100644 index 9572135..0000000 --- a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/bower.json +++ /dev/null
@@ -1,5 +0,0 @@ -{ - "name": "xterm.js", - "version": "1.1.3", - "ignore": ["demo", "test", ".gitignore"] -}
diff --git a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/build/xterm.css b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/build/xterm.css index 8295eb65..efdc016 100644 --- a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/build/xterm.css +++ b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/build/xterm.css
@@ -1,6 +1,6 @@ /** * xterm.js: xterm, in the browser - * Copyright (c) 2014, sourceLair Limited (www.sourcelair.com (MIT License) + * Copyright (c) 2014-2016, SourceLair Private Company (www.sourcelair.com (MIT License) * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) * https://github.com/chjj/term.js * @@ -54,19 +54,39 @@ } .terminal .xterm-helper-textarea { - position: absolute; /* * HACK: to fix IE's blinking cursor * Move textarea out of the screen to the far left, so that the cursor is not visible. */ - left: -9999em; + position: absolute; opacity: 0; + left: -9999em; + top: 0; width: 0; height: 0; z-index: -10; + /** Prevent wrapping so the IME appears against the textarea at the correct position */ + white-space: nowrap; + overflow: hidden; + resize: none; } -.terminal .terminal-cursor { +.terminal a { + color: inherit; + text-decoration: none; +} + +.terminal a:hover { + cursor: pointer; + text-decoration: underline; +} + +.terminal a.xterm-invalid-link:hover { + cursor: text; + text-decoration: none; +} + +.terminal.focus:not(.xterm-cursor-style-underline):not(.xterm-cursor-style-bar) .terminal-cursor { background-color: #fff; color: #000; } @@ -77,19 +97,41 @@ background-color: transparent; } -.terminal.focus .terminal-cursor.blinking { - animation: blink-cursor 1.2s infinite step-end; +.terminal:not(.xterm-cursor-style-underline):not(.xterm-cursor-style-bar).focus.xterm-cursor-blink-on .terminal-cursor { + background-color: transparent; + color: inherit; } -@keyframes blink-cursor { - 0% { - background-color: #fff; - color: #000; - } - 50% { - background-color: transparent; - color: #FFF; - } +.terminal.xterm-cursor-style-bar .terminal-cursor, +.terminal.xterm-cursor-style-underline .terminal-cursor { + position: relative; +} +.terminal.xterm-cursor-style-bar .terminal-cursor::before, +.terminal.xterm-cursor-style-underline .terminal-cursor::before { + content: ""; + display: block; + position: absolute; + background-color: #fff; +} +.terminal.xterm-cursor-style-bar .terminal-cursor::before { + top: 0; + bottom: 0; + left: 0; + width: 1px; +} +.terminal.xterm-cursor-style-underline .terminal-cursor::before { + bottom: 0; + left: 0; + right: 0; + height: 1px; +} +.terminal.xterm-cursor-style-bar.focus.xterm-cursor-blink.xterm-cursor-blink-on .terminal-cursor::before, +.terminal.xterm-cursor-style-underline.focus.xterm-cursor-blink.xterm-cursor-blink-on .terminal-cursor::before { + background-color: transparent; +} +.terminal.xterm-cursor-style-bar.focus.xterm-cursor-blink .terminal-cursor::before, +.terminal.xterm-cursor-style-underline.focus.xterm-cursor-blink .terminal-cursor::before { + background-color: #fff; } .terminal .composition-view { @@ -111,12 +153,22 @@ overflow-y: scroll; } +.terminal .xterm-wide-char, +.terminal .xterm-normal-char { + display: inline-block; +} + .terminal .xterm-rows { position: absolute; left: 0; top: 0; } +.terminal .xterm-rows > div { + /* Lines containing spans and text nodes ocassionally wrap despite being the same width (#327) */ + white-space: nowrap; +} + .terminal .xterm-scroll-area { visibility: hidden; }
diff --git a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/build/xterm.js b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/build/xterm.js index 21abf82..7dfaab5 100644 --- a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/build/xterm.js +++ b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/build/xterm.js
@@ -1,2020 +1,4318 @@ -(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Terminal = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){ -'use strict'; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -/** - * xterm.js: xterm, in the browser - * Copyright (c) 2016, SourceLair Limited <www.sourcelair.com> (MIT License) - */ - -/** - * Encapsulates the logic for handling compositionstart, compositionupdate and compositionend - * events, displaying the in-progress composition to the UI and forwarding the final composition - * to the handler. - * @param {HTMLTextAreaElement} textarea The textarea that xterm uses for input. - * @param {HTMLElement} compositionView The element to display the in-progress composition in. - * @param {Terminal} terminal The Terminal to forward the finished composition to. - */ -function CompositionHelper(textarea, compositionView, terminal) { - this.textarea = textarea; - this.compositionView = compositionView; - this.terminal = terminal; - - // Whether input composition is currently happening, eg. via a mobile keyboard, speech input - // or IME. This variable determines whether the compositionText should be displayed on the UI. - this.isComposing = false; - - // The input currently being composed, eg. via a mobile keyboard, speech input or IME. - this.compositionText = null; - - // The position within the input textarea's value of the current composition. - this.compositionPosition = { start: null, end: null }; - - // Whether a composition is in the process of being sent, setting this to false will cancel - // any in-progress composition. - this.isSendingComposition = false; -} - -/** - * Handles the compositionstart event, activating the composition view. - */ -CompositionHelper.prototype.compositionstart = function () { - this.isComposing = true; - this.compositionPosition.start = this.textarea.value.length; - this.compositionView.textContent = ''; - this.compositionView.classList.add('active'); +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Terminal = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.CHARSETS = {}; +exports.DEFAULT_CHARSET = exports.CHARSETS['B']; +exports.CHARSETS['0'] = { + '`': '\u25c6', + 'a': '\u2592', + 'b': '\u0009', + 'c': '\u000c', + 'd': '\u000d', + 'e': '\u000a', + 'f': '\u00b0', + 'g': '\u00b1', + 'h': '\u2424', + 'i': '\u000b', + 'j': '\u2518', + 'k': '\u2510', + 'l': '\u250c', + 'm': '\u2514', + 'n': '\u253c', + 'o': '\u23ba', + 'p': '\u23bb', + 'q': '\u2500', + 'r': '\u23bc', + 's': '\u23bd', + 't': '\u251c', + 'u': '\u2524', + 'v': '\u2534', + 'w': '\u252c', + 'x': '\u2502', + 'y': '\u2264', + 'z': '\u2265', + '{': '\u03c0', + '|': '\u2260', + '}': '\u00a3', + '~': '\u00b7' }; - -/** - * Handles the compositionupdate event, updating the composition view. - * @param {CompositionEvent} ev The event. - */ -CompositionHelper.prototype.compositionupdate = function (ev) { - this.compositionView.textContent = ev.data; - this.updateCompositionElements(); - var self = this; - setTimeout(function () { - self.compositionPosition.end = self.textarea.value.length; - }, 0); +exports.CHARSETS['A'] = { + '#': '£' }; - -/** - * Handles the compositionend event, hiding the composition view and sending the composition to - * the handler. - */ -CompositionHelper.prototype.compositionend = function () { - this.finalizeComposition(true); +exports.CHARSETS['B'] = null; +exports.CHARSETS['4'] = { + '#': '£', + '@': '¾', + '[': 'ij', + '\\': '½', + ']': '|', + '{': '¨', + '|': 'f', + '}': '¼', + '~': '´' }; - -/** - * Handles the keydown event, routing any necessary events to the CompositionHelper functions. - * @return Whether the Terminal should continue processing the keydown event. - */ -CompositionHelper.prototype.keydown = function (ev) { - if (this.isComposing || this.isSendingComposition) { - if (ev.keyCode === 229) { - // Continue composing if the keyCode is the "composition character" - return false; - } else if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) { - // Continue composing if the keyCode is a modifier key - return false; - } else { - // Finish composition immediately. This is mainly here for the case where enter is - // pressed and the handler needs to be triggered before the command is executed. - this.finalizeComposition(false); - } - } - - if (ev.keyCode === 229) { - // If the "composition character" is used but gets to this point it means a non-composition - // character (eg. numbers and punctuation) was pressed when the IME was active. - this.handleAnyTextareaChanges(); - return false; - } - - return true; -}; - -/** - * Finalizes the composition, resuming regular input actions. This is called when a composition - * is ending. - * @param {boolean} waitForPropogation Whether to wait for events to propogate before sending - * the input. This should be false if a non-composition keystroke is entered before the - * compositionend event is triggered, such as enter, so that the composition is send before - * the command is executed. - */ -CompositionHelper.prototype.finalizeComposition = function (waitForPropogation) { - this.compositionView.classList.remove('active'); - this.isComposing = false; - this.clearTextareaPosition(); - - if (!waitForPropogation) { - // Cancel any delayed composition send requests and send the input immediately. - this.isSendingComposition = false; - var input = this.textarea.value.substring(this.compositionPosition.start, this.compositionPosition.end); - this.terminal.handler(input); - } else { - // Make a deep copy of the composition position here as a new compositionstart event may - // fire before the setTimeout executes. - var currentCompositionPosition = { - start: this.compositionPosition.start, - end: this.compositionPosition.end +exports.CHARSETS['C'] = + exports.CHARSETS['5'] = { + '[': 'Ä', + '\\': 'Ö', + ']': 'Å', + '^': 'Ü', + '`': 'é', + '{': 'ä', + '|': 'ö', + '}': 'å', + '~': 'ü' }; - - // Since composition* events happen before the changes take place in the textarea on most - // browsers, use a setTimeout with 0ms time to allow the native compositionend event to - // complete. This ensures the correct character is retrieved, this solution was used - // because: - // - The compositionend event's data property is unreliable, at least on Chromium - // - The last compositionupdate event's data property does not always accurately describe - // the character, a counter example being Korean where an ending consonsant can move to - // the following character if the following input is a vowel. - var self = this; - this.isSendingComposition = true; - setTimeout(function () { - // Ensure that the input has not already been sent - if (self.isSendingComposition) { - self.isSendingComposition = false; - var input; - if (self.isComposing) { - // Use the end position to get the string if a new composition has started. - input = self.textarea.value.substring(currentCompositionPosition.start, currentCompositionPosition.end); - } else { - // Don't use the end position here in order to pick up any characters after the - // composition has finished, for example when typing a non-composition character - // (eg. 2) after a composition character. - input = self.textarea.value.substring(currentCompositionPosition.start); - } - self.terminal.handler(input); - } - }, 0); - } +exports.CHARSETS['R'] = { + '#': '£', + '@': 'à', + '[': '°', + '\\': 'ç', + ']': '§', + '{': 'é', + '|': 'ù', + '}': 'è', + '~': '¨' +}; +exports.CHARSETS['Q'] = { + '@': 'à', + '[': 'â', + '\\': 'ç', + ']': 'ê', + '^': 'î', + '`': 'ô', + '{': 'é', + '|': 'ù', + '}': 'è', + '~': 'û' +}; +exports.CHARSETS['K'] = { + '@': '§', + '[': 'Ä', + '\\': 'Ö', + ']': 'Ü', + '{': 'ä', + '|': 'ö', + '}': 'ü', + '~': 'ß' +}; +exports.CHARSETS['Y'] = { + '#': '£', + '@': '§', + '[': '°', + '\\': 'ç', + ']': 'é', + '`': 'ù', + '{': 'à', + '|': 'ò', + '}': 'è', + '~': 'ì' +}; +exports.CHARSETS['E'] = + exports.CHARSETS['6'] = { + '@': 'Ä', + '[': 'Æ', + '\\': 'Ø', + ']': 'Å', + '^': 'Ü', + '`': 'ä', + '{': 'æ', + '|': 'ø', + '}': 'å', + '~': 'ü' + }; +exports.CHARSETS['Z'] = { + '#': '£', + '@': '§', + '[': '¡', + '\\': 'Ñ', + ']': '¿', + '{': '°', + '|': 'ñ', + '}': 'ç' +}; +exports.CHARSETS['H'] = + exports.CHARSETS['7'] = { + '@': 'É', + '[': 'Ä', + '\\': 'Ö', + ']': 'Å', + '^': 'Ü', + '`': 'é', + '{': 'ä', + '|': 'ö', + '}': 'å', + '~': 'ü' + }; +exports.CHARSETS['='] = { + '#': 'ù', + '@': 'à', + '[': 'é', + '\\': 'ç', + ']': 'ê', + '^': 'î', + '_': 'è', + '`': 'ô', + '{': 'ä', + '|': 'ö', + '}': 'ü', + '~': 'û' }; -/** - * Apply any changes made to the textarea after the current event chain is allowed to complete. - * This should be called when not currently composing but a keydown event with the "composition - * character" (229) is triggered, in order to allow non-composition text to be entered when an - * IME is active. - */ -CompositionHelper.prototype.handleAnyTextareaChanges = function () { - var oldValue = this.textarea.value; - var self = this; - setTimeout(function () { - // Ignore if a composition has started since the timeout - if (!self.isComposing) { - var newValue = self.textarea.value; - var diff = newValue.replace(oldValue, ''); - if (diff.length > 0) { - self.terminal.handler(diff); - } + + +},{}],2:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var CompositionHelper = (function () { + function CompositionHelper(textarea, compositionView, terminal) { + this.textarea = textarea; + this.compositionView = compositionView; + this.terminal = terminal; + this.isComposing = false; + this.isSendingComposition = false; + this.compositionPosition = { start: null, end: null }; } - }, 0); -}; - -/** - * Positions the composition view on top of the cursor and the textarea just below it (so the - * IME helper dialog is positioned correctly). - */ -CompositionHelper.prototype.updateCompositionElements = function (dontRecurse) { - if (!this.isComposing) { - return; - } - var cursor = this.terminal.element.querySelector('.terminal-cursor'); - if (cursor) { - this.compositionView.style.left = cursor.offsetLeft + 'px'; - this.compositionView.style.top = cursor.offsetTop + 'px'; - var compositionViewBounds = this.compositionView.getBoundingClientRect(); - this.textarea.style.left = cursor.offsetLeft + compositionViewBounds.width + 'px'; - this.textarea.style.top = cursor.offsetTop + cursor.offsetHeight + 'px'; - } - if (!dontRecurse) { - setTimeout(this.updateCompositionElements.bind(this, true), 0); - } -}; - -/** - * Clears the textarea's position so that the cursor does not blink on IE. - * @private - */ -CompositionHelper.prototype.clearTextareaPosition = function () { - this.textarea.style.left = ''; - this.textarea.style.top = ''; -}; - + CompositionHelper.prototype.compositionstart = function () { + this.isComposing = true; + this.compositionPosition.start = this.textarea.value.length; + this.compositionView.textContent = ''; + this.compositionView.classList.add('active'); + }; + CompositionHelper.prototype.compositionupdate = function (ev) { + var _this = this; + this.compositionView.textContent = ev.data; + this.updateCompositionElements(); + setTimeout(function () { + _this.compositionPosition.end = _this.textarea.value.length; + }, 0); + }; + CompositionHelper.prototype.compositionend = function () { + this.finalizeComposition(true); + }; + CompositionHelper.prototype.keydown = function (ev) { + if (this.isComposing || this.isSendingComposition) { + if (ev.keyCode === 229) { + return false; + } + else if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) { + return false; + } + else { + this.finalizeComposition(false); + } + } + if (ev.keyCode === 229) { + this.handleAnyTextareaChanges(); + return false; + } + return true; + }; + CompositionHelper.prototype.finalizeComposition = function (waitForPropogation) { + var _this = this; + this.compositionView.classList.remove('active'); + this.isComposing = false; + this.clearTextareaPosition(); + if (!waitForPropogation) { + this.isSendingComposition = false; + var input = this.textarea.value.substring(this.compositionPosition.start, this.compositionPosition.end); + this.terminal.handler(input); + } + else { + var currentCompositionPosition_1 = { + start: this.compositionPosition.start, + end: this.compositionPosition.end, + }; + this.isSendingComposition = true; + setTimeout(function () { + if (_this.isSendingComposition) { + _this.isSendingComposition = false; + var input = void 0; + if (_this.isComposing) { + input = _this.textarea.value.substring(currentCompositionPosition_1.start, currentCompositionPosition_1.end); + } + else { + input = _this.textarea.value.substring(currentCompositionPosition_1.start); + } + _this.terminal.handler(input); + } + }, 0); + } + }; + CompositionHelper.prototype.handleAnyTextareaChanges = function () { + var _this = this; + var oldValue = this.textarea.value; + setTimeout(function () { + if (!_this.isComposing) { + var newValue = _this.textarea.value; + var diff = newValue.replace(oldValue, ''); + if (diff.length > 0) { + _this.terminal.handler(diff); + } + } + }, 0); + }; + CompositionHelper.prototype.updateCompositionElements = function (dontRecurse) { + var _this = this; + if (!this.isComposing) { + return; + } + var cursor = this.terminal.element.querySelector('.terminal-cursor'); + if (cursor) { + var xtermRows = this.terminal.element.querySelector('.xterm-rows'); + var cursorTop = xtermRows.offsetTop + cursor.offsetTop; + this.compositionView.style.left = cursor.offsetLeft + 'px'; + this.compositionView.style.top = cursorTop + 'px'; + this.compositionView.style.height = cursor.offsetHeight + 'px'; + this.compositionView.style.lineHeight = cursor.offsetHeight + 'px'; + var compositionViewBounds = this.compositionView.getBoundingClientRect(); + this.textarea.style.left = cursor.offsetLeft + 'px'; + this.textarea.style.top = cursorTop + 'px'; + this.textarea.style.width = compositionViewBounds.width + 'px'; + this.textarea.style.height = compositionViewBounds.height + 'px'; + this.textarea.style.lineHeight = compositionViewBounds.height + 'px'; + } + if (!dontRecurse) { + setTimeout(function () { return _this.updateCompositionElements(true); }, 0); + } + }; + ; + CompositionHelper.prototype.clearTextareaPosition = function () { + this.textarea.style.left = ''; + this.textarea.style.top = ''; + }; + ; + return CompositionHelper; +}()); exports.CompositionHelper = CompositionHelper; -},{}],2:[function(_dereq_,module,exports){ + + +},{}],3:[function(require,module,exports){ "use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var C0; +(function (C0) { + C0.NUL = '\x00'; + C0.SOH = '\x01'; + C0.STX = '\x02'; + C0.ETX = '\x03'; + C0.EOT = '\x04'; + C0.ENQ = '\x05'; + C0.ACK = '\x06'; + C0.BEL = '\x07'; + C0.BS = '\x08'; + C0.HT = '\x09'; + C0.LF = '\x0a'; + C0.VT = '\x0b'; + C0.FF = '\x0c'; + C0.CR = '\x0d'; + C0.SO = '\x0e'; + C0.SI = '\x0f'; + C0.DLE = '\x10'; + C0.DC1 = '\x11'; + C0.DC2 = '\x12'; + C0.DC3 = '\x13'; + C0.DC4 = '\x14'; + C0.NAK = '\x15'; + C0.SYN = '\x16'; + C0.ETB = '\x17'; + C0.CAN = '\x18'; + C0.EM = '\x19'; + C0.SUB = '\x1a'; + C0.ESC = '\x1b'; + C0.FS = '\x1c'; + C0.GS = '\x1d'; + C0.RS = '\x1e'; + C0.US = '\x1f'; + C0.SP = '\x20'; + C0.DEL = '\x7f'; +})(C0 = exports.C0 || (exports.C0 = {})); +; -Object.defineProperty(exports, "__esModule", { - value: true -}); -/** - * EventEmitter - */ -function EventEmitter() { - this._events = this._events || {}; -} -EventEmitter.prototype.addListener = function (type, listener) { - this._events[type] = this._events[type] || []; - this._events[type].push(listener); -}; - -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.removeListener = function (type, listener) { - if (!this._events[type]) return; - - var obj = this._events[type], - i = obj.length; - - while (i--) { - if (obj[i] === listener || obj[i].listener === listener) { - obj.splice(i, 1); - return; +},{}],4:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +; +var EventEmitter = (function () { + function EventEmitter() { + this._events = this._events || {}; } - } -}; - -EventEmitter.prototype.off = EventEmitter.prototype.removeListener; - -EventEmitter.prototype.removeAllListeners = function (type) { - if (this._events[type]) delete this._events[type]; -}; - -EventEmitter.prototype.once = function (type, listener) { - var self = this; - function on() { - var args = Array.prototype.slice.call(arguments); - this.removeListener(type, on); - return listener.apply(this, args); - } - on.listener = listener; - return this.on(type, on); -}; - -EventEmitter.prototype.emit = function (type) { - if (!this._events[type]) return; - - var args = Array.prototype.slice.call(arguments, 1), - obj = this._events[type], - l = obj.length, - i = 0; - - for (; i < l; i++) { - obj[i].apply(this, args); - } -}; - -EventEmitter.prototype.listeners = function (type) { - return this._events[type] = this._events[type] || []; -}; - + EventEmitter.prototype.on = function (type, listener) { + this._events[type] = this._events[type] || []; + this._events[type].push(listener); + }; + EventEmitter.prototype.off = function (type, listener) { + if (!this._events[type]) { + return; + } + var obj = this._events[type]; + var i = obj.length; + while (i--) { + if (obj[i] === listener || obj[i].listener === listener) { + obj.splice(i, 1); + return; + } + } + }; + EventEmitter.prototype.removeAllListeners = function (type) { + if (this._events[type]) { + delete this._events[type]; + } + }; + EventEmitter.prototype.once = function (type, listener) { + function on() { + var args = Array.prototype.slice.call(arguments); + this.off(type, on); + return listener.apply(this, args); + } + on.listener = listener; + return this.on(type, on); + }; + EventEmitter.prototype.emit = function (type) { + var args = []; + for (var _i = 1; _i < arguments.length; _i++) { + args[_i - 1] = arguments[_i]; + } + if (!this._events[type]) { + return; + } + var obj = this._events[type]; + for (var i = 0; i < obj.length; i++) { + obj[i].apply(this, args); + } + }; + EventEmitter.prototype.listeners = function (type) { + return this._events[type] || []; + }; + return EventEmitter; +}()); exports.EventEmitter = EventEmitter; -},{}],3:[function(_dereq_,module,exports){ -'use strict'; -Object.defineProperty(exports, "__esModule", { - value: true -}); -/** - * xterm.js: xterm, in the browser - * Copyright (c) 2016, SourceLair Limited <www.sourcelair.com> (MIT License) - */ -/** - * Represents the viewport of a terminal, the visible area within the larger buffer of output. - * Logic for the virtual scroll bar is included in this object. - * @param {Terminal} terminal The Terminal object. - * @param {HTMLElement} viewportElement The DOM element acting as the viewport - * @param {HTMLElement} charMeasureElement A DOM element used to measure the character size of - * the terminal. - */ -function Viewport(terminal, viewportElement, scrollArea, charMeasureElement) { - this.terminal = terminal; - this.viewportElement = viewportElement; - this.scrollArea = scrollArea; - this.charMeasureElement = charMeasureElement; - this.currentRowHeight = 0; - this.lastRecordedBufferLength = 0; - this.lastRecordedViewportHeight = 0; +},{}],5:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var EscapeSequences_1 = require("./EscapeSequences"); +var Charsets_1 = require("./Charsets"); +var InputHandler = (function () { + function InputHandler(_terminal) { + this._terminal = _terminal; + } + InputHandler.prototype.addChar = function (char, code) { + if (char >= ' ') { + var ch_width = wcwidth(code); + if (this._terminal.charset && this._terminal.charset[char]) { + char = this._terminal.charset[char]; + } + var row = this._terminal.y + this._terminal.ybase; + if (!ch_width && this._terminal.x) { + if (this._terminal.lines.get(row)[this._terminal.x - 1]) { + if (!this._terminal.lines.get(row)[this._terminal.x - 1][2]) { + if (this._terminal.lines.get(row)[this._terminal.x - 2]) + this._terminal.lines.get(row)[this._terminal.x - 2][1] += char; + } + else { + this._terminal.lines.get(row)[this._terminal.x - 1][1] += char; + } + this._terminal.updateRange(this._terminal.y); + } + return; + } + if (this._terminal.x + ch_width - 1 >= this._terminal.cols) { + if (this._terminal.wraparoundMode) { + this._terminal.x = 0; + this._terminal.y++; + if (this._terminal.y > this._terminal.scrollBottom) { + this._terminal.y--; + this._terminal.scroll(); + } + } + else { + if (ch_width === 2) + return; + } + } + row = this._terminal.y + this._terminal.ybase; + if (this._terminal.insertMode) { + for (var moves = 0; moves < ch_width; ++moves) { + var removed = this._terminal.lines.get(this._terminal.y + this._terminal.ybase).pop(); + if (removed[2] === 0 + && this._terminal.lines.get(row)[this._terminal.cols - 2] + && this._terminal.lines.get(row)[this._terminal.cols - 2][2] === 2) + this._terminal.lines.get(row)[this._terminal.cols - 2] = [this._terminal.curAttr, ' ', 1]; + this._terminal.lines.get(row).splice(this._terminal.x, 0, [this._terminal.curAttr, ' ', 1]); + } + } + this._terminal.lines.get(row)[this._terminal.x] = [this._terminal.curAttr, char, ch_width]; + this._terminal.x++; + this._terminal.updateRange(this._terminal.y); + if (ch_width === 2) { + this._terminal.lines.get(row)[this._terminal.x] = [this._terminal.curAttr, '', 0]; + this._terminal.x++; + } + } + }; + InputHandler.prototype.bell = function () { + var _this = this; + if (!this._terminal.visualBell) { + return; + } + this._terminal.element.style.borderColor = 'white'; + setTimeout(function () { return _this._terminal.element.style.borderColor = ''; }, 10); + if (this._terminal.popOnBell) { + this._terminal.focus(); + } + }; + InputHandler.prototype.lineFeed = function () { + if (this._terminal.convertEol) { + this._terminal.x = 0; + } + this._terminal.y++; + if (this._terminal.y > this._terminal.scrollBottom) { + this._terminal.y--; + this._terminal.scroll(); + } + if (this._terminal.x >= this._terminal.cols) { + this._terminal.x--; + } + }; + InputHandler.prototype.carriageReturn = function () { + this._terminal.x = 0; + }; + InputHandler.prototype.backspace = function () { + if (this._terminal.x > 0) { + this._terminal.x--; + } + }; + InputHandler.prototype.tab = function () { + this._terminal.x = this._terminal.nextStop(); + }; + InputHandler.prototype.shiftOut = function () { + this._terminal.setgLevel(1); + }; + InputHandler.prototype.shiftIn = function () { + this._terminal.setgLevel(0); + }; + InputHandler.prototype.insertChars = function (params) { + var param, row, j, ch; + param = params[0]; + if (param < 1) + param = 1; + row = this._terminal.y + this._terminal.ybase; + j = this._terminal.x; + ch = [this._terminal.eraseAttr(), ' ', 1]; + while (param-- && j < this._terminal.cols) { + this._terminal.lines.get(row).splice(j++, 0, ch); + this._terminal.lines.get(row).pop(); + } + }; + InputHandler.prototype.cursorUp = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.y -= param; + if (this._terminal.y < 0) { + this._terminal.y = 0; + } + }; + InputHandler.prototype.cursorDown = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.y += param; + if (this._terminal.y >= this._terminal.rows) { + this._terminal.y = this._terminal.rows - 1; + } + if (this._terminal.x >= this._terminal.cols) { + this._terminal.x--; + } + }; + InputHandler.prototype.cursorForward = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.x += param; + if (this._terminal.x >= this._terminal.cols) { + this._terminal.x = this._terminal.cols - 1; + } + }; + InputHandler.prototype.cursorBackward = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + if (this._terminal.x >= this._terminal.cols) { + this._terminal.x--; + } + this._terminal.x -= param; + if (this._terminal.x < 0) { + this._terminal.x = 0; + } + }; + InputHandler.prototype.cursorNextLine = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.y += param; + if (this._terminal.y >= this._terminal.rows) { + this._terminal.y = this._terminal.rows - 1; + } + this._terminal.x = 0; + }; + ; + InputHandler.prototype.cursorPrecedingLine = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.y -= param; + if (this._terminal.y < 0) { + this._terminal.y = 0; + } + this._terminal.x = 0; + }; + ; + InputHandler.prototype.cursorCharAbsolute = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.x = param - 1; + }; + InputHandler.prototype.cursorPosition = function (params) { + var row, col; + row = params[0] - 1; + if (params.length >= 2) { + col = params[1] - 1; + } + else { + col = 0; + } + if (row < 0) { + row = 0; + } + else if (row >= this._terminal.rows) { + row = this._terminal.rows - 1; + } + if (col < 0) { + col = 0; + } + else if (col >= this._terminal.cols) { + col = this._terminal.cols - 1; + } + this._terminal.x = col; + this._terminal.y = row; + }; + InputHandler.prototype.cursorForwardTab = function (params) { + var param = params[0] || 1; + while (param--) { + this._terminal.x = this._terminal.nextStop(); + } + }; + InputHandler.prototype.eraseInDisplay = function (params) { + var j; + switch (params[0]) { + case 0: + this._terminal.eraseRight(this._terminal.x, this._terminal.y); + j = this._terminal.y + 1; + for (; j < this._terminal.rows; j++) { + this._terminal.eraseLine(j); + } + break; + case 1: + this._terminal.eraseLeft(this._terminal.x, this._terminal.y); + j = this._terminal.y; + while (j--) { + this._terminal.eraseLine(j); + } + break; + case 2: + j = this._terminal.rows; + while (j--) + this._terminal.eraseLine(j); + break; + case 3: + var scrollBackSize = this._terminal.lines.length - this._terminal.rows; + if (scrollBackSize > 0) { + this._terminal.lines.trimStart(scrollBackSize); + this._terminal.ybase = Math.max(this._terminal.ybase - scrollBackSize, 0); + this._terminal.ydisp = Math.max(this._terminal.ydisp - scrollBackSize, 0); + } + break; + } + }; + InputHandler.prototype.eraseInLine = function (params) { + switch (params[0]) { + case 0: + this._terminal.eraseRight(this._terminal.x, this._terminal.y); + break; + case 1: + this._terminal.eraseLeft(this._terminal.x, this._terminal.y); + break; + case 2: + this._terminal.eraseLine(this._terminal.y); + break; + } + }; + InputHandler.prototype.insertLines = function (params) { + var param, row, j; + param = params[0]; + if (param < 1) { + param = 1; + } + row = this._terminal.y + this._terminal.ybase; + j = this._terminal.rows - 1 - this._terminal.scrollBottom; + j = this._terminal.rows - 1 + this._terminal.ybase - j + 1; + while (param--) { + if (this._terminal.lines.length === this._terminal.lines.maxLength) { + this._terminal.lines.trimStart(1); + this._terminal.ybase--; + this._terminal.ydisp--; + row--; + j--; + } + this._terminal.lines.splice(row, 0, this._terminal.blankLine(true)); + this._terminal.lines.splice(j, 1); + } + this._terminal.updateRange(this._terminal.y); + this._terminal.updateRange(this._terminal.scrollBottom); + }; + InputHandler.prototype.deleteLines = function (params) { + var param, row, j; + param = params[0]; + if (param < 1) { + param = 1; + } + row = this._terminal.y + this._terminal.ybase; + j = this._terminal.rows - 1 - this._terminal.scrollBottom; + j = this._terminal.rows - 1 + this._terminal.ybase - j; + while (param--) { + if (this._terminal.lines.length === this._terminal.lines.maxLength) { + this._terminal.lines.trimStart(1); + this._terminal.ybase -= 1; + this._terminal.ydisp -= 1; + } + this._terminal.lines.splice(j + 1, 0, this._terminal.blankLine(true)); + this._terminal.lines.splice(row, 1); + } + this._terminal.updateRange(this._terminal.y); + this._terminal.updateRange(this._terminal.scrollBottom); + }; + InputHandler.prototype.deleteChars = function (params) { + var param, row, ch; + param = params[0]; + if (param < 1) { + param = 1; + } + row = this._terminal.y + this._terminal.ybase; + ch = [this._terminal.eraseAttr(), ' ', 1]; + while (param--) { + this._terminal.lines.get(row).splice(this._terminal.x, 1); + this._terminal.lines.get(row).push(ch); + } + }; + InputHandler.prototype.scrollUp = function (params) { + var param = params[0] || 1; + while (param--) { + this._terminal.lines.splice(this._terminal.ybase + this._terminal.scrollTop, 1); + this._terminal.lines.splice(this._terminal.ybase + this._terminal.scrollBottom, 0, this._terminal.blankLine()); + } + this._terminal.updateRange(this._terminal.scrollTop); + this._terminal.updateRange(this._terminal.scrollBottom); + }; + InputHandler.prototype.scrollDown = function (params) { + var param = params[0] || 1; + while (param--) { + this._terminal.lines.splice(this._terminal.ybase + this._terminal.scrollBottom, 1); + this._terminal.lines.splice(this._terminal.ybase + this._terminal.scrollTop, 0, this._terminal.blankLine()); + } + this._terminal.updateRange(this._terminal.scrollTop); + this._terminal.updateRange(this._terminal.scrollBottom); + }; + InputHandler.prototype.eraseChars = function (params) { + var param, row, j, ch; + param = params[0]; + if (param < 1) { + param = 1; + } + row = this._terminal.y + this._terminal.ybase; + j = this._terminal.x; + ch = [this._terminal.eraseAttr(), ' ', 1]; + while (param-- && j < this._terminal.cols) { + this._terminal.lines.get(row)[j++] = ch; + } + }; + InputHandler.prototype.cursorBackwardTab = function (params) { + var param = params[0] || 1; + while (param--) { + this._terminal.x = this._terminal.prevStop(); + } + }; + InputHandler.prototype.charPosAbsolute = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.x = param - 1; + if (this._terminal.x >= this._terminal.cols) { + this._terminal.x = this._terminal.cols - 1; + } + }; + InputHandler.prototype.HPositionRelative = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.x += param; + if (this._terminal.x >= this._terminal.cols) { + this._terminal.x = this._terminal.cols - 1; + } + }; + InputHandler.prototype.repeatPrecedingCharacter = function (params) { + var param = params[0] || 1, line = this._terminal.lines.get(this._terminal.ybase + this._terminal.y), ch = line[this._terminal.x - 1] || [this._terminal.defAttr, ' ', 1]; + while (param--) { + line[this._terminal.x++] = ch; + } + }; + InputHandler.prototype.sendDeviceAttributes = function (params) { + if (params[0] > 0) { + return; + } + if (!this._terminal.prefix) { + if (this._terminal.is('xterm') || this._terminal.is('rxvt-unicode') || this._terminal.is('screen')) { + this._terminal.send(EscapeSequences_1.C0.ESC + '[?1;2c'); + } + else if (this._terminal.is('linux')) { + this._terminal.send(EscapeSequences_1.C0.ESC + '[?6c'); + } + } + else if (this._terminal.prefix === '>') { + if (this._terminal.is('xterm')) { + this._terminal.send(EscapeSequences_1.C0.ESC + '[>0;276;0c'); + } + else if (this._terminal.is('rxvt-unicode')) { + this._terminal.send(EscapeSequences_1.C0.ESC + '[>85;95;0c'); + } + else if (this._terminal.is('linux')) { + this._terminal.send(params[0] + 'c'); + } + else if (this._terminal.is('screen')) { + this._terminal.send(EscapeSequences_1.C0.ESC + '[>83;40003;0c'); + } + } + }; + InputHandler.prototype.linePosAbsolute = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.y = param - 1; + if (this._terminal.y >= this._terminal.rows) { + this._terminal.y = this._terminal.rows - 1; + } + }; + InputHandler.prototype.VPositionRelative = function (params) { + var param = params[0]; + if (param < 1) { + param = 1; + } + this._terminal.y += param; + if (this._terminal.y >= this._terminal.rows) { + this._terminal.y = this._terminal.rows - 1; + } + if (this._terminal.x >= this._terminal.cols) { + this._terminal.x--; + } + }; + InputHandler.prototype.HVPosition = function (params) { + if (params[0] < 1) + params[0] = 1; + if (params[1] < 1) + params[1] = 1; + this._terminal.y = params[0] - 1; + if (this._terminal.y >= this._terminal.rows) { + this._terminal.y = this._terminal.rows - 1; + } + this._terminal.x = params[1] - 1; + if (this._terminal.x >= this._terminal.cols) { + this._terminal.x = this._terminal.cols - 1; + } + }; + InputHandler.prototype.tabClear = function (params) { + var param = params[0]; + if (param <= 0) { + delete this._terminal.tabs[this._terminal.x]; + } + else if (param === 3) { + this._terminal.tabs = {}; + } + }; + InputHandler.prototype.setMode = function (params) { + if (params.length > 1) { + for (var i = 0; i < params.length; i++) { + this.setMode([params[i]]); + } + return; + } + if (!this._terminal.prefix) { + switch (params[0]) { + case 4: + this._terminal.insertMode = true; + break; + case 20: + break; + } + } + else if (this._terminal.prefix === '?') { + switch (params[0]) { + case 1: + this._terminal.applicationCursor = true; + break; + case 2: + this._terminal.setgCharset(0, Charsets_1.DEFAULT_CHARSET); + this._terminal.setgCharset(1, Charsets_1.DEFAULT_CHARSET); + this._terminal.setgCharset(2, Charsets_1.DEFAULT_CHARSET); + this._terminal.setgCharset(3, Charsets_1.DEFAULT_CHARSET); + break; + case 3: + this._terminal.savedCols = this._terminal.cols; + this._terminal.resize(132, this._terminal.rows); + break; + case 6: + this._terminal.originMode = true; + break; + case 7: + this._terminal.wraparoundMode = true; + break; + case 12: + break; + case 66: + this._terminal.log('Serial port requested application keypad.'); + this._terminal.applicationKeypad = true; + this._terminal.viewport.syncScrollArea(); + break; + case 9: + case 1000: + case 1002: + case 1003: + this._terminal.x10Mouse = params[0] === 9; + this._terminal.vt200Mouse = params[0] === 1000; + this._terminal.normalMouse = params[0] > 1000; + this._terminal.mouseEvents = true; + this._terminal.element.style.cursor = 'default'; + this._terminal.log('Binding to mouse events.'); + break; + case 1004: + this._terminal.sendFocus = true; + break; + case 1005: + this._terminal.utfMouse = true; + break; + case 1006: + this._terminal.sgrMouse = true; + break; + case 1015: + this._terminal.urxvtMouse = true; + break; + case 25: + this._terminal.cursorHidden = false; + break; + case 1049: + ; + case 47: + case 1047: + if (!this._terminal.normal) { + var normal = { + lines: this._terminal.lines, + ybase: this._terminal.ybase, + ydisp: this._terminal.ydisp, + x: this._terminal.x, + y: this._terminal.y, + scrollTop: this._terminal.scrollTop, + scrollBottom: this._terminal.scrollBottom, + tabs: this._terminal.tabs + }; + this._terminal.reset(); + this._terminal.viewport.syncScrollArea(); + this._terminal.normal = normal; + this._terminal.showCursor(); + } + break; + } + } + }; + InputHandler.prototype.resetMode = function (params) { + if (params.length > 1) { + for (var i = 0; i < params.length; i++) { + this.resetMode([params[i]]); + } + return; + } + if (!this._terminal.prefix) { + switch (params[0]) { + case 4: + this._terminal.insertMode = false; + break; + case 20: + break; + } + } + else if (this._terminal.prefix === '?') { + switch (params[0]) { + case 1: + this._terminal.applicationCursor = false; + break; + case 3: + if (this._terminal.cols === 132 && this._terminal.savedCols) { + this._terminal.resize(this._terminal.savedCols, this._terminal.rows); + } + delete this._terminal.savedCols; + break; + case 6: + this._terminal.originMode = false; + break; + case 7: + this._terminal.wraparoundMode = false; + break; + case 12: + break; + case 66: + this._terminal.log('Switching back to normal keypad.'); + this._terminal.applicationKeypad = false; + this._terminal.viewport.syncScrollArea(); + break; + case 9: + case 1000: + case 1002: + case 1003: + this._terminal.x10Mouse = false; + this._terminal.vt200Mouse = false; + this._terminal.normalMouse = false; + this._terminal.mouseEvents = false; + this._terminal.element.style.cursor = ''; + break; + case 1004: + this._terminal.sendFocus = false; + break; + case 1005: + this._terminal.utfMouse = false; + break; + case 1006: + this._terminal.sgrMouse = false; + break; + case 1015: + this._terminal.urxvtMouse = false; + break; + case 25: + this._terminal.cursorHidden = true; + break; + case 1049: + ; + case 47: + case 1047: + if (this._terminal.normal) { + this._terminal.lines = this._terminal.normal.lines; + this._terminal.ybase = this._terminal.normal.ybase; + this._terminal.ydisp = this._terminal.normal.ydisp; + this._terminal.x = this._terminal.normal.x; + this._terminal.y = this._terminal.normal.y; + this._terminal.scrollTop = this._terminal.normal.scrollTop; + this._terminal.scrollBottom = this._terminal.normal.scrollBottom; + this._terminal.tabs = this._terminal.normal.tabs; + this._terminal.normal = null; + this._terminal.refresh(0, this._terminal.rows - 1); + this._terminal.viewport.syncScrollArea(); + this._terminal.showCursor(); + } + break; + } + } + }; + InputHandler.prototype.charAttributes = function (params) { + if (params.length === 1 && params[0] === 0) { + this._terminal.curAttr = this._terminal.defAttr; + return; + } + var l = params.length, i = 0, flags = this._terminal.curAttr >> 18, fg = (this._terminal.curAttr >> 9) & 0x1ff, bg = this._terminal.curAttr & 0x1ff, p; + for (; i < l; i++) { + p = params[i]; + if (p >= 30 && p <= 37) { + fg = p - 30; + } + else if (p >= 40 && p <= 47) { + bg = p - 40; + } + else if (p >= 90 && p <= 97) { + p += 8; + fg = p - 90; + } + else if (p >= 100 && p <= 107) { + p += 8; + bg = p - 100; + } + else if (p === 0) { + flags = this._terminal.defAttr >> 18; + fg = (this._terminal.defAttr >> 9) & 0x1ff; + bg = this._terminal.defAttr & 0x1ff; + } + else if (p === 1) { + flags |= 1; + } + else if (p === 4) { + flags |= 2; + } + else if (p === 5) { + flags |= 4; + } + else if (p === 7) { + flags |= 8; + } + else if (p === 8) { + flags |= 16; + } + else if (p === 22) { + flags &= ~1; + } + else if (p === 24) { + flags &= ~2; + } + else if (p === 25) { + flags &= ~4; + } + else if (p === 27) { + flags &= ~8; + } + else if (p === 28) { + flags &= ~16; + } + else if (p === 39) { + fg = (this._terminal.defAttr >> 9) & 0x1ff; + } + else if (p === 49) { + bg = this._terminal.defAttr & 0x1ff; + } + else if (p === 38) { + if (params[i + 1] === 2) { + i += 2; + fg = this._terminal.matchColor(params[i] & 0xff, params[i + 1] & 0xff, params[i + 2] & 0xff); + if (fg === -1) + fg = 0x1ff; + i += 2; + } + else if (params[i + 1] === 5) { + i += 2; + p = params[i] & 0xff; + fg = p; + } + } + else if (p === 48) { + if (params[i + 1] === 2) { + i += 2; + bg = this._terminal.matchColor(params[i] & 0xff, params[i + 1] & 0xff, params[i + 2] & 0xff); + if (bg === -1) + bg = 0x1ff; + i += 2; + } + else if (params[i + 1] === 5) { + i += 2; + p = params[i] & 0xff; + bg = p; + } + } + else if (p === 100) { + fg = (this._terminal.defAttr >> 9) & 0x1ff; + bg = this._terminal.defAttr & 0x1ff; + } + else { + this._terminal.error('Unknown SGR attribute: %d.', p); + } + } + this._terminal.curAttr = (flags << 18) | (fg << 9) | bg; + }; + InputHandler.prototype.deviceStatus = function (params) { + if (!this._terminal.prefix) { + switch (params[0]) { + case 5: + this._terminal.send(EscapeSequences_1.C0.ESC + '[0n'); + break; + case 6: + this._terminal.send(EscapeSequences_1.C0.ESC + '[' + + (this._terminal.y + 1) + + ';' + + (this._terminal.x + 1) + + 'R'); + break; + } + } + else if (this._terminal.prefix === '?') { + switch (params[0]) { + case 6: + this._terminal.send(EscapeSequences_1.C0.ESC + '[?' + + (this._terminal.y + 1) + + ';' + + (this._terminal.x + 1) + + 'R'); + break; + case 15: + break; + case 25: + break; + case 26: + break; + case 53: + break; + } + } + }; + InputHandler.prototype.softReset = function (params) { + this._terminal.cursorHidden = false; + this._terminal.insertMode = false; + this._terminal.originMode = false; + this._terminal.wraparoundMode = true; + this._terminal.applicationKeypad = false; + this._terminal.viewport.syncScrollArea(); + this._terminal.applicationCursor = false; + this._terminal.scrollTop = 0; + this._terminal.scrollBottom = this._terminal.rows - 1; + this._terminal.curAttr = this._terminal.defAttr; + this._terminal.x = this._terminal.y = 0; + this._terminal.charset = null; + this._terminal.glevel = 0; + this._terminal.charsets = [null]; + }; + InputHandler.prototype.setCursorStyle = function (params) { + var param = params[0] < 1 ? 1 : params[0]; + switch (param) { + case 1: + case 2: + this._terminal.setOption('cursorStyle', 'block'); + break; + case 3: + case 4: + this._terminal.setOption('cursorStyle', 'underline'); + break; + case 5: + case 6: + this._terminal.setOption('cursorStyle', 'bar'); + break; + } + var isBlinking = param % 2 === 1; + this._terminal.setOption('cursorBlink', isBlinking); + }; + InputHandler.prototype.setScrollRegion = function (params) { + if (this._terminal.prefix) + return; + this._terminal.scrollTop = (params[0] || 1) - 1; + this._terminal.scrollBottom = (params[1] && params[1] <= this._terminal.rows ? params[1] : this._terminal.rows) - 1; + this._terminal.x = 0; + this._terminal.y = 0; + }; + InputHandler.prototype.saveCursor = function (params) { + this._terminal.savedX = this._terminal.x; + this._terminal.savedY = this._terminal.y; + }; + InputHandler.prototype.restoreCursor = function (params) { + this._terminal.x = this._terminal.savedX || 0; + this._terminal.y = this._terminal.savedY || 0; + }; + return InputHandler; +}()); +exports.InputHandler = InputHandler; +var wcwidth = (function (opts) { + var COMBINING = [ + [0x0300, 0x036F], [0x0483, 0x0486], [0x0488, 0x0489], + [0x0591, 0x05BD], [0x05BF, 0x05BF], [0x05C1, 0x05C2], + [0x05C4, 0x05C5], [0x05C7, 0x05C7], [0x0600, 0x0603], + [0x0610, 0x0615], [0x064B, 0x065E], [0x0670, 0x0670], + [0x06D6, 0x06E4], [0x06E7, 0x06E8], [0x06EA, 0x06ED], + [0x070F, 0x070F], [0x0711, 0x0711], [0x0730, 0x074A], + [0x07A6, 0x07B0], [0x07EB, 0x07F3], [0x0901, 0x0902], + [0x093C, 0x093C], [0x0941, 0x0948], [0x094D, 0x094D], + [0x0951, 0x0954], [0x0962, 0x0963], [0x0981, 0x0981], + [0x09BC, 0x09BC], [0x09C1, 0x09C4], [0x09CD, 0x09CD], + [0x09E2, 0x09E3], [0x0A01, 0x0A02], [0x0A3C, 0x0A3C], + [0x0A41, 0x0A42], [0x0A47, 0x0A48], [0x0A4B, 0x0A4D], + [0x0A70, 0x0A71], [0x0A81, 0x0A82], [0x0ABC, 0x0ABC], + [0x0AC1, 0x0AC5], [0x0AC7, 0x0AC8], [0x0ACD, 0x0ACD], + [0x0AE2, 0x0AE3], [0x0B01, 0x0B01], [0x0B3C, 0x0B3C], + [0x0B3F, 0x0B3F], [0x0B41, 0x0B43], [0x0B4D, 0x0B4D], + [0x0B56, 0x0B56], [0x0B82, 0x0B82], [0x0BC0, 0x0BC0], + [0x0BCD, 0x0BCD], [0x0C3E, 0x0C40], [0x0C46, 0x0C48], + [0x0C4A, 0x0C4D], [0x0C55, 0x0C56], [0x0CBC, 0x0CBC], + [0x0CBF, 0x0CBF], [0x0CC6, 0x0CC6], [0x0CCC, 0x0CCD], + [0x0CE2, 0x0CE3], [0x0D41, 0x0D43], [0x0D4D, 0x0D4D], + [0x0DCA, 0x0DCA], [0x0DD2, 0x0DD4], [0x0DD6, 0x0DD6], + [0x0E31, 0x0E31], [0x0E34, 0x0E3A], [0x0E47, 0x0E4E], + [0x0EB1, 0x0EB1], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC], + [0x0EC8, 0x0ECD], [0x0F18, 0x0F19], [0x0F35, 0x0F35], + [0x0F37, 0x0F37], [0x0F39, 0x0F39], [0x0F71, 0x0F7E], + [0x0F80, 0x0F84], [0x0F86, 0x0F87], [0x0F90, 0x0F97], + [0x0F99, 0x0FBC], [0x0FC6, 0x0FC6], [0x102D, 0x1030], + [0x1032, 0x1032], [0x1036, 0x1037], [0x1039, 0x1039], + [0x1058, 0x1059], [0x1160, 0x11FF], [0x135F, 0x135F], + [0x1712, 0x1714], [0x1732, 0x1734], [0x1752, 0x1753], + [0x1772, 0x1773], [0x17B4, 0x17B5], [0x17B7, 0x17BD], + [0x17C6, 0x17C6], [0x17C9, 0x17D3], [0x17DD, 0x17DD], + [0x180B, 0x180D], [0x18A9, 0x18A9], [0x1920, 0x1922], + [0x1927, 0x1928], [0x1932, 0x1932], [0x1939, 0x193B], + [0x1A17, 0x1A18], [0x1B00, 0x1B03], [0x1B34, 0x1B34], + [0x1B36, 0x1B3A], [0x1B3C, 0x1B3C], [0x1B42, 0x1B42], + [0x1B6B, 0x1B73], [0x1DC0, 0x1DCA], [0x1DFE, 0x1DFF], + [0x200B, 0x200F], [0x202A, 0x202E], [0x2060, 0x2063], + [0x206A, 0x206F], [0x20D0, 0x20EF], [0x302A, 0x302F], + [0x3099, 0x309A], [0xA806, 0xA806], [0xA80B, 0xA80B], + [0xA825, 0xA826], [0xFB1E, 0xFB1E], [0xFE00, 0xFE0F], + [0xFE20, 0xFE23], [0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB], + [0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F], + [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x1D167, 0x1D169], + [0x1D173, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD], + [0x1D242, 0x1D244], [0xE0001, 0xE0001], [0xE0020, 0xE007F], + [0xE0100, 0xE01EF] + ]; + function bisearch(ucs) { + var min = 0; + var max = COMBINING.length - 1; + var mid; + if (ucs < COMBINING[0][0] || ucs > COMBINING[max][1]) + return false; + while (max >= min) { + mid = Math.floor((min + max) / 2); + if (ucs > COMBINING[mid][1]) + min = mid + 1; + else if (ucs < COMBINING[mid][0]) + max = mid - 1; + else + return true; + } + return false; + } + function wcwidth(ucs) { + if (ucs === 0) + return opts.nul; + if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0)) + return opts.control; + if (bisearch(ucs)) + return 0; + if (isWide(ucs)) { + return 2; + } + return 1; + } + function isWide(ucs) { + return (ucs >= 0x1100 && (ucs <= 0x115f || + ucs === 0x2329 || + ucs === 0x232a || + (ucs >= 0x2e80 && ucs <= 0xa4cf && ucs !== 0x303f) || + (ucs >= 0xac00 && ucs <= 0xd7a3) || + (ucs >= 0xf900 && ucs <= 0xfaff) || + (ucs >= 0xfe10 && ucs <= 0xfe19) || + (ucs >= 0xfe30 && ucs <= 0xfe6f) || + (ucs >= 0xff00 && ucs <= 0xff60) || + (ucs >= 0xffe0 && ucs <= 0xffe6) || + (ucs >= 0x20000 && ucs <= 0x2fffd) || + (ucs >= 0x30000 && ucs <= 0x3fffd))); + } + return wcwidth; +})({ nul: 0, control: 0 }); - this.terminal.on('scroll', this.syncScrollArea.bind(this)); - this.terminal.on('resize', this.syncScrollArea.bind(this)); - this.viewportElement.addEventListener('scroll', this.onScroll.bind(this)); - this.syncScrollArea(); + +},{"./Charsets":1,"./EscapeSequences":3}],6:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var INVALID_LINK_CLASS = 'xterm-invalid-link'; +var protocolClause = '(https?:\\/\\/)'; +var domainCharacterSet = '[\\da-z\\.-]+'; +var negatedDomainCharacterSet = '[^\\da-z\\.-]+'; +var domainBodyClause = '(' + domainCharacterSet + ')'; +var tldClause = '([a-z\\.]{2,6})'; +var ipClause = '((\\d{1,3}\\.){3}\\d{1,3})'; +var localHostClause = '(localhost)'; +var portClause = '(:\\d{1,5})'; +var hostClause = '((' + domainBodyClause + '\\.' + tldClause + ')|' + ipClause + '|' + localHostClause + ')' + portClause + '?'; +var pathClause = '(\\/[\\/\\w\\.\\-%~]*)*'; +var queryStringHashFragmentCharacterSet = '[0-9\\w\\[\\]\\(\\)\\/\\?\\!#@$%&\'*+,:;~\\=\\.\\-]*'; +var queryStringClause = '(\\?' + queryStringHashFragmentCharacterSet + ')?'; +var hashFragmentClause = '(#' + queryStringHashFragmentCharacterSet + ')?'; +var negatedPathCharacterSet = '[^\\/\\w\\.\\-%]+'; +var bodyClause = hostClause + pathClause + queryStringClause + hashFragmentClause; +var start = '(?:^|' + negatedDomainCharacterSet + ')('; +var end = ')($|' + negatedPathCharacterSet + ')'; +var strictUrlRegex = new RegExp(start + protocolClause + bodyClause + end); +var HYPERTEXT_LINK_MATCHER_ID = 0; +var Linkifier = (function () { + function Linkifier() { + this._nextLinkMatcherId = HYPERTEXT_LINK_MATCHER_ID; + this._rowTimeoutIds = []; + this._linkMatchers = []; + this.registerLinkMatcher(strictUrlRegex, null, { matchIndex: 1 }); + } + Linkifier.prototype.attachToDom = function (document, rows) { + this._document = document; + this._rows = rows; + }; + Linkifier.prototype.linkifyRow = function (rowIndex) { + if (!this._document) { + return; + } + var timeoutId = this._rowTimeoutIds[rowIndex]; + if (timeoutId) { + clearTimeout(timeoutId); + } + this._rowTimeoutIds[rowIndex] = setTimeout(this._linkifyRow.bind(this, rowIndex), Linkifier.TIME_BEFORE_LINKIFY); + }; + Linkifier.prototype.setHypertextLinkHandler = function (handler) { + this._linkMatchers[HYPERTEXT_LINK_MATCHER_ID].handler = handler; + }; + Linkifier.prototype.setHypertextValidationCallback = function (callback) { + this._linkMatchers[HYPERTEXT_LINK_MATCHER_ID].validationCallback = callback; + }; + Linkifier.prototype.registerLinkMatcher = function (regex, handler, options) { + if (options === void 0) { options = {}; } + if (this._nextLinkMatcherId !== HYPERTEXT_LINK_MATCHER_ID && !handler) { + throw new Error('handler must be defined'); + } + var matcher = { + id: this._nextLinkMatcherId++, + regex: regex, + handler: handler, + matchIndex: options.matchIndex, + validationCallback: options.validationCallback, + priority: options.priority || 0 + }; + this._addLinkMatcherToList(matcher); + return matcher.id; + }; + Linkifier.prototype._addLinkMatcherToList = function (matcher) { + if (this._linkMatchers.length === 0) { + this._linkMatchers.push(matcher); + return; + } + for (var i = this._linkMatchers.length - 1; i >= 0; i--) { + if (matcher.priority <= this._linkMatchers[i].priority) { + this._linkMatchers.splice(i + 1, 0, matcher); + return; + } + } + this._linkMatchers.splice(0, 0, matcher); + }; + Linkifier.prototype.deregisterLinkMatcher = function (matcherId) { + for (var i = 1; i < this._linkMatchers.length; i++) { + if (this._linkMatchers[i].id === matcherId) { + this._linkMatchers.splice(i, 1); + return true; + } + } + return false; + }; + Linkifier.prototype._linkifyRow = function (rowIndex) { + var row = this._rows[rowIndex]; + if (!row) { + return; + } + var text = row.textContent; + for (var i = 0; i < this._linkMatchers.length; i++) { + var matcher = this._linkMatchers[i]; + var linkElements = this._doLinkifyRow(row, matcher); + if (linkElements.length > 0) { + if (matcher.validationCallback) { + var _loop_1 = function (j) { + var element = linkElements[j]; + matcher.validationCallback(element.textContent, element, function (isValid) { + if (!isValid) { + element.classList.add(INVALID_LINK_CLASS); + } + }); + }; + for (var j = 0; j < linkElements.length; j++) { + _loop_1(j); + } + } + return; + } + } + }; + Linkifier.prototype._doLinkifyRow = function (row, matcher) { + var result = []; + var isHttpLinkMatcher = matcher.id === HYPERTEXT_LINK_MATCHER_ID; + var nodes = row.childNodes; + var match = row.textContent.match(matcher.regex); + if (!match || match.length === 0) { + return result; + } + var uri = match[typeof matcher.matchIndex !== 'number' ? 0 : matcher.matchIndex]; + var rowStartIndex = match.index + uri.length; + for (var i = 0; i < nodes.length; i++) { + var node = nodes[i]; + var searchIndex = node.textContent.indexOf(uri); + if (searchIndex >= 0) { + var linkElement = this._createAnchorElement(uri, matcher.handler, isHttpLinkMatcher); + if (node.textContent.length === uri.length) { + if (node.nodeType === 3) { + this._replaceNode(node, linkElement); + } + else { + var element = node; + if (element.nodeName === 'A') { + return result; + } + element.innerHTML = ''; + element.appendChild(linkElement); + } + } + else { + var nodesAdded = this._replaceNodeSubstringWithNode(node, linkElement, uri, searchIndex); + i += nodesAdded; + } + result.push(linkElement); + match = row.textContent.substring(rowStartIndex).match(matcher.regex); + if (!match || match.length === 0) { + return result; + } + uri = match[typeof matcher.matchIndex !== 'number' ? 0 : matcher.matchIndex]; + rowStartIndex += match.index + uri.length; + } + } + return result; + }; + Linkifier.prototype._createAnchorElement = function (uri, handler, isHypertextLinkHandler) { + var element = this._document.createElement('a'); + element.textContent = uri; + element.draggable = false; + if (isHypertextLinkHandler) { + element.href = uri; + element.target = '_blank'; + element.addEventListener('click', function (event) { + if (handler) { + return handler(event, uri); + } + }); + } + else { + element.addEventListener('click', function (event) { + if (element.classList.contains(INVALID_LINK_CLASS)) { + return; + } + return handler(event, uri); + }); + } + return element; + }; + Linkifier.prototype._replaceNode = function (oldNode) { + var newNodes = []; + for (var _i = 1; _i < arguments.length; _i++) { + newNodes[_i - 1] = arguments[_i]; + } + var parent = oldNode.parentNode; + for (var i = 0; i < newNodes.length; i++) { + parent.insertBefore(newNodes[i], oldNode); + } + parent.removeChild(oldNode); + }; + Linkifier.prototype._replaceNodeSubstringWithNode = function (targetNode, newNode, substring, substringIndex) { + var node = targetNode; + if (node.nodeType !== 3) { + node = node.childNodes[0]; + } + if (node.childNodes.length === 0 && node.nodeType !== 3) { + throw new Error('targetNode must be a text node or only contain a single text node'); + } + var fullText = node.textContent; + if (substringIndex === 0) { + var rightText_1 = fullText.substring(substring.length); + var rightTextNode_1 = this._document.createTextNode(rightText_1); + this._replaceNode(node, newNode, rightTextNode_1); + return 0; + } + if (substringIndex === targetNode.textContent.length - substring.length) { + var leftText_1 = fullText.substring(0, substringIndex); + var leftTextNode_1 = this._document.createTextNode(leftText_1); + this._replaceNode(node, leftTextNode_1, newNode); + return 0; + } + var leftText = fullText.substring(0, substringIndex); + var leftTextNode = this._document.createTextNode(leftText); + var rightText = fullText.substring(substringIndex + substring.length); + var rightTextNode = this._document.createTextNode(rightText); + this._replaceNode(node, leftTextNode, newNode, rightTextNode); + return 1; + }; + return Linkifier; +}()); +Linkifier.TIME_BEFORE_LINKIFY = 200; +exports.Linkifier = Linkifier; + + + +},{}],7:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var EscapeSequences_1 = require("./EscapeSequences"); +var Charsets_1 = require("./Charsets"); +var normalStateHandler = {}; +normalStateHandler[EscapeSequences_1.C0.BEL] = function (parser, handler) { return handler.bell(); }; +normalStateHandler[EscapeSequences_1.C0.LF] = function (parser, handler) { return handler.lineFeed(); }; +normalStateHandler[EscapeSequences_1.C0.VT] = normalStateHandler[EscapeSequences_1.C0.LF]; +normalStateHandler[EscapeSequences_1.C0.FF] = normalStateHandler[EscapeSequences_1.C0.LF]; +normalStateHandler[EscapeSequences_1.C0.CR] = function (parser, handler) { return handler.carriageReturn(); }; +normalStateHandler[EscapeSequences_1.C0.BS] = function (parser, handler) { return handler.backspace(); }; +normalStateHandler[EscapeSequences_1.C0.HT] = function (parser, handler) { return handler.tab(); }; +normalStateHandler[EscapeSequences_1.C0.SO] = function (parser, handler) { return handler.shiftOut(); }; +normalStateHandler[EscapeSequences_1.C0.SI] = function (parser, handler) { return handler.shiftIn(); }; +normalStateHandler[EscapeSequences_1.C0.ESC] = function (parser, handler) { return parser.setState(ParserState.ESCAPED); }; +var escapedStateHandler = {}; +escapedStateHandler['['] = function (parser, terminal) { + terminal.params = []; + terminal.currentParam = 0; + parser.setState(ParserState.CSI_PARAM); +}; +escapedStateHandler[']'] = function (parser, terminal) { + terminal.params = []; + terminal.currentParam = 0; + parser.setState(ParserState.OSC); +}; +escapedStateHandler['P'] = function (parser, terminal) { + terminal.params = []; + terminal.currentParam = 0; + parser.setState(ParserState.DCS); +}; +escapedStateHandler['_'] = function (parser, terminal) { + parser.setState(ParserState.IGNORE); +}; +escapedStateHandler['^'] = function (parser, terminal) { + parser.setState(ParserState.IGNORE); +}; +escapedStateHandler['c'] = function (parser, terminal) { + terminal.reset(); +}; +escapedStateHandler['E'] = function (parser, terminal) { + terminal.x = 0; + terminal.index(); + parser.setState(ParserState.NORMAL); +}; +escapedStateHandler['D'] = function (parser, terminal) { + terminal.index(); + parser.setState(ParserState.NORMAL); +}; +escapedStateHandler['M'] = function (parser, terminal) { + terminal.reverseIndex(); + parser.setState(ParserState.NORMAL); +}; +escapedStateHandler['%'] = function (parser, terminal) { + terminal.setgLevel(0); + terminal.setgCharset(0, Charsets_1.DEFAULT_CHARSET); + parser.setState(ParserState.NORMAL); + parser.skipNextChar(); +}; +escapedStateHandler[EscapeSequences_1.C0.CAN] = function (parser) { return parser.setState(ParserState.NORMAL); }; +var csiParamStateHandler = {}; +csiParamStateHandler['?'] = function (parser) { return parser.setPrefix('?'); }; +csiParamStateHandler['>'] = function (parser) { return parser.setPrefix('>'); }; +csiParamStateHandler['!'] = function (parser) { return parser.setPrefix('!'); }; +csiParamStateHandler['0'] = function (parser) { return parser.setParam(parser.getParam() * 10); }; +csiParamStateHandler['1'] = function (parser) { return parser.setParam(parser.getParam() * 10 + 1); }; +csiParamStateHandler['2'] = function (parser) { return parser.setParam(parser.getParam() * 10 + 2); }; +csiParamStateHandler['3'] = function (parser) { return parser.setParam(parser.getParam() * 10 + 3); }; +csiParamStateHandler['4'] = function (parser) { return parser.setParam(parser.getParam() * 10 + 4); }; +csiParamStateHandler['5'] = function (parser) { return parser.setParam(parser.getParam() * 10 + 5); }; +csiParamStateHandler['6'] = function (parser) { return parser.setParam(parser.getParam() * 10 + 6); }; +csiParamStateHandler['7'] = function (parser) { return parser.setParam(parser.getParam() * 10 + 7); }; +csiParamStateHandler['8'] = function (parser) { return parser.setParam(parser.getParam() * 10 + 8); }; +csiParamStateHandler['9'] = function (parser) { return parser.setParam(parser.getParam() * 10 + 9); }; +csiParamStateHandler['$'] = function (parser) { return parser.setPostfix('$'); }; +csiParamStateHandler['"'] = function (parser) { return parser.setPostfix('"'); }; +csiParamStateHandler[' '] = function (parser) { return parser.setPostfix(' '); }; +csiParamStateHandler['\''] = function (parser) { return parser.setPostfix('\''); }; +csiParamStateHandler[';'] = function (parser) { return parser.finalizeParam(); }; +csiParamStateHandler[EscapeSequences_1.C0.CAN] = function (parser) { return parser.setState(ParserState.NORMAL); }; +var csiStateHandler = {}; +csiStateHandler['@'] = function (handler, params, prefix) { return handler.insertChars(params); }; +csiStateHandler['A'] = function (handler, params, prefix) { return handler.cursorUp(params); }; +csiStateHandler['B'] = function (handler, params, prefix) { return handler.cursorDown(params); }; +csiStateHandler['C'] = function (handler, params, prefix) { return handler.cursorForward(params); }; +csiStateHandler['D'] = function (handler, params, prefix) { return handler.cursorBackward(params); }; +csiStateHandler['E'] = function (handler, params, prefix) { return handler.cursorNextLine(params); }; +csiStateHandler['F'] = function (handler, params, prefix) { return handler.cursorPrecedingLine(params); }; +csiStateHandler['G'] = function (handler, params, prefix) { return handler.cursorCharAbsolute(params); }; +csiStateHandler['H'] = function (handler, params, prefix) { return handler.cursorPosition(params); }; +csiStateHandler['I'] = function (handler, params, prefix) { return handler.cursorForwardTab(params); }; +csiStateHandler['J'] = function (handler, params, prefix) { return handler.eraseInDisplay(params); }; +csiStateHandler['K'] = function (handler, params, prefix) { return handler.eraseInLine(params); }; +csiStateHandler['L'] = function (handler, params, prefix) { return handler.insertLines(params); }; +csiStateHandler['M'] = function (handler, params, prefix) { return handler.deleteLines(params); }; +csiStateHandler['P'] = function (handler, params, prefix) { return handler.deleteChars(params); }; +csiStateHandler['S'] = function (handler, params, prefix) { return handler.scrollUp(params); }; +csiStateHandler['T'] = function (handler, params, prefix) { + if (params.length < 2 && !prefix) { + handler.scrollDown(params); + } +}; +csiStateHandler['X'] = function (handler, params, prefix) { return handler.eraseChars(params); }; +csiStateHandler['Z'] = function (handler, params, prefix) { return handler.cursorBackwardTab(params); }; +csiStateHandler['`'] = function (handler, params, prefix) { return handler.charPosAbsolute(params); }; +csiStateHandler['a'] = function (handler, params, prefix) { return handler.HPositionRelative(params); }; +csiStateHandler['b'] = function (handler, params, prefix) { return handler.repeatPrecedingCharacter(params); }; +csiStateHandler['c'] = function (handler, params, prefix) { return handler.sendDeviceAttributes(params); }; +csiStateHandler['d'] = function (handler, params, prefix) { return handler.linePosAbsolute(params); }; +csiStateHandler['e'] = function (handler, params, prefix) { return handler.VPositionRelative(params); }; +csiStateHandler['f'] = function (handler, params, prefix) { return handler.HVPosition(params); }; +csiStateHandler['g'] = function (handler, params, prefix) { return handler.tabClear(params); }; +csiStateHandler['h'] = function (handler, params, prefix) { return handler.setMode(params); }; +csiStateHandler['l'] = function (handler, params, prefix) { return handler.resetMode(params); }; +csiStateHandler['m'] = function (handler, params, prefix) { return handler.charAttributes(params); }; +csiStateHandler['n'] = function (handler, params, prefix) { return handler.deviceStatus(params); }; +csiStateHandler['p'] = function (handler, params, prefix) { + switch (prefix) { + case '!': + handler.softReset(params); + break; + } +}; +csiStateHandler['q'] = function (handler, params, prefix, postfix) { + if (postfix === ' ') { + handler.setCursorStyle(params); + } +}; +csiStateHandler['r'] = function (handler, params) { return handler.setScrollRegion(params); }; +csiStateHandler['s'] = function (handler, params) { return handler.saveCursor(params); }; +csiStateHandler['u'] = function (handler, params) { return handler.restoreCursor(params); }; +csiStateHandler[EscapeSequences_1.C0.CAN] = function (handler, params, prefix, postfix, parser) { return parser.setState(ParserState.NORMAL); }; +var ParserState; +(function (ParserState) { + ParserState[ParserState["NORMAL"] = 0] = "NORMAL"; + ParserState[ParserState["ESCAPED"] = 1] = "ESCAPED"; + ParserState[ParserState["CSI_PARAM"] = 2] = "CSI_PARAM"; + ParserState[ParserState["CSI"] = 3] = "CSI"; + ParserState[ParserState["OSC"] = 4] = "OSC"; + ParserState[ParserState["CHARSET"] = 5] = "CHARSET"; + ParserState[ParserState["DCS"] = 6] = "DCS"; + ParserState[ParserState["IGNORE"] = 7] = "IGNORE"; +})(ParserState || (ParserState = {})); +var Parser = (function () { + function Parser(_inputHandler, _terminal) { + this._inputHandler = _inputHandler; + this._terminal = _terminal; + this._state = ParserState.NORMAL; + } + Parser.prototype.parse = function (data) { + var l = data.length, j, cs, ch, code, low; + this._position = 0; + if (this._terminal.surrogate_high) { + data = this._terminal.surrogate_high + data; + this._terminal.surrogate_high = ''; + } + for (; this._position < l; this._position++) { + ch = data[this._position]; + code = data.charCodeAt(this._position); + if (0xD800 <= code && code <= 0xDBFF) { + low = data.charCodeAt(this._position + 1); + if (isNaN(low)) { + this._terminal.surrogate_high = ch; + continue; + } + code = ((code - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000; + ch += data.charAt(this._position + 1); + } + if (0xDC00 <= code && code <= 0xDFFF) + continue; + switch (this._state) { + case ParserState.NORMAL: + if (ch in normalStateHandler) { + normalStateHandler[ch](this, this._inputHandler); + } + else { + this._inputHandler.addChar(ch, code); + } + break; + case ParserState.ESCAPED: + if (ch in escapedStateHandler) { + escapedStateHandler[ch](this, this._terminal); + break; + } + switch (ch) { + case '(': + case ')': + case '*': + case '+': + case '-': + case '.': + switch (ch) { + case '(': + this._terminal.gcharset = 0; + break; + case ')': + this._terminal.gcharset = 1; + break; + case '*': + this._terminal.gcharset = 2; + break; + case '+': + this._terminal.gcharset = 3; + break; + case '-': + this._terminal.gcharset = 1; + break; + case '.': + this._terminal.gcharset = 2; + break; + } + this._state = ParserState.CHARSET; + break; + case '/': + this._terminal.gcharset = 3; + this._state = ParserState.CHARSET; + this._position--; + break; + case 'N': + break; + case 'O': + break; + case 'n': + this._terminal.setgLevel(2); + break; + case 'o': + this._terminal.setgLevel(3); + break; + case '|': + this._terminal.setgLevel(3); + break; + case '}': + this._terminal.setgLevel(2); + break; + case '~': + this._terminal.setgLevel(1); + break; + case '7': + this._inputHandler.saveCursor(); + this._state = ParserState.NORMAL; + break; + case '8': + this._inputHandler.restoreCursor(); + this._state = ParserState.NORMAL; + break; + case '#': + this._state = ParserState.NORMAL; + this._position++; + break; + case 'H': + this._terminal.tabSet(); + this._state = ParserState.NORMAL; + break; + case '=': + this._terminal.log('Serial port requested application keypad.'); + this._terminal.applicationKeypad = true; + this._terminal.viewport.syncScrollArea(); + this._state = ParserState.NORMAL; + break; + case '>': + this._terminal.log('Switching back to normal keypad.'); + this._terminal.applicationKeypad = false; + this._terminal.viewport.syncScrollArea(); + this._state = ParserState.NORMAL; + break; + default: + this._state = ParserState.NORMAL; + this._terminal.error('Unknown ESC control: %s.', ch); + break; + } + break; + case ParserState.CHARSET: + if (ch in Charsets_1.CHARSETS) { + cs = Charsets_1.CHARSETS[ch]; + if (ch === '/') { + this.skipNextChar(); + } + } + else { + cs = Charsets_1.DEFAULT_CHARSET; + } + this._terminal.setgCharset(this._terminal.gcharset, cs); + this._terminal.gcharset = null; + this._state = ParserState.NORMAL; + break; + case ParserState.OSC: + if (ch === EscapeSequences_1.C0.ESC || ch === EscapeSequences_1.C0.BEL) { + if (ch === EscapeSequences_1.C0.ESC) + this._position++; + this._terminal.params.push(this._terminal.currentParam); + switch (this._terminal.params[0]) { + case 0: + case 1: + case 2: + if (this._terminal.params[1]) { + this._terminal.title = this._terminal.params[1]; + this._terminal.handleTitle(this._terminal.title); + } + break; + case 3: + break; + case 4: + case 5: + break; + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + break; + case 46: + break; + case 50: + break; + case 51: + break; + case 52: + break; + case 104: + case 105: + case 110: + case 111: + case 112: + case 113: + case 114: + case 115: + case 116: + case 117: + case 118: + break; + } + this._terminal.params = []; + this._terminal.currentParam = 0; + this._state = ParserState.NORMAL; + } + else { + if (!this._terminal.params.length) { + if (ch >= '0' && ch <= '9') { + this._terminal.currentParam = + this._terminal.currentParam * 10 + ch.charCodeAt(0) - 48; + } + else if (ch === ';') { + this._terminal.params.push(this._terminal.currentParam); + this._terminal.currentParam = ''; + } + } + else { + this._terminal.currentParam += ch; + } + } + break; + case ParserState.CSI_PARAM: + if (ch in csiParamStateHandler) { + csiParamStateHandler[ch](this); + break; + } + this.finalizeParam(); + this._state = ParserState.CSI; + case ParserState.CSI: + if (ch in csiStateHandler) { + csiStateHandler[ch](this._inputHandler, this._terminal.params, this._terminal.prefix, this._terminal.postfix, this); + } + else { + this._terminal.error('Unknown CSI code: %s.', ch); + } + this._state = ParserState.NORMAL; + this._terminal.prefix = ''; + this._terminal.postfix = ''; + break; + case ParserState.DCS: + if (ch === EscapeSequences_1.C0.ESC || ch === EscapeSequences_1.C0.BEL) { + if (ch === EscapeSequences_1.C0.ESC) + this._position++; + var pt = void 0; + var valid = void 0; + switch (this._terminal.prefix) { + case '': + break; + case '$q': + pt = this._terminal.currentParam; + valid = false; + switch (pt) { + case '"q': + pt = '0"q'; + break; + case '"p': + pt = '61"p'; + break; + case 'r': + pt = '' + + (this._terminal.scrollTop + 1) + + ';' + + (this._terminal.scrollBottom + 1) + + 'r'; + break; + case 'm': + pt = '0m'; + break; + default: + this._terminal.error('Unknown DCS Pt: %s.', pt); + pt = ''; + break; + } + this._terminal.send(EscapeSequences_1.C0.ESC + 'P' + +valid + '$r' + pt + EscapeSequences_1.C0.ESC + '\\'); + break; + case '+p': + break; + case '+q': + pt = this._terminal.currentParam; + valid = false; + this._terminal.send(EscapeSequences_1.C0.ESC + 'P' + +valid + '+r' + pt + EscapeSequences_1.C0.ESC + '\\'); + break; + default: + this._terminal.error('Unknown DCS prefix: %s.', this._terminal.prefix); + break; + } + this._terminal.currentParam = 0; + this._terminal.prefix = ''; + this._state = ParserState.NORMAL; + } + else if (!this._terminal.currentParam) { + if (!this._terminal.prefix && ch !== '$' && ch !== '+') { + this._terminal.currentParam = ch; + } + else if (this._terminal.prefix.length === 2) { + this._terminal.currentParam = ch; + } + else { + this._terminal.prefix += ch; + } + } + else { + this._terminal.currentParam += ch; + } + break; + case ParserState.IGNORE: + if (ch === EscapeSequences_1.C0.ESC || ch === EscapeSequences_1.C0.BEL) { + if (ch === EscapeSequences_1.C0.ESC) + this._position++; + this._state = ParserState.NORMAL; + } + break; + } + } + return this._state; + }; + Parser.prototype.setState = function (state) { + this._state = state; + }; + Parser.prototype.setPrefix = function (prefix) { + this._terminal.prefix = prefix; + }; + Parser.prototype.setPostfix = function (postfix) { + this._terminal.postfix = postfix; + }; + Parser.prototype.setParam = function (param) { + this._terminal.currentParam = param; + }; + Parser.prototype.getParam = function () { + return this._terminal.currentParam; + }; + Parser.prototype.finalizeParam = function () { + this._terminal.params.push(this._terminal.currentParam); + this._terminal.currentParam = 0; + }; + Parser.prototype.skipNextChar = function () { + this._position++; + }; + return Parser; +}()); +exports.Parser = Parser; + + + +},{"./Charsets":1,"./EscapeSequences":3}],8:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var DomElementObjectPool_1 = require("./utils/DomElementObjectPool"); +var MAX_REFRESH_FRAME_SKIP = 5; +var FLAGS; +(function (FLAGS) { + FLAGS[FLAGS["BOLD"] = 1] = "BOLD"; + FLAGS[FLAGS["UNDERLINE"] = 2] = "UNDERLINE"; + FLAGS[FLAGS["BLINK"] = 4] = "BLINK"; + FLAGS[FLAGS["INVERSE"] = 8] = "INVERSE"; + FLAGS[FLAGS["INVISIBLE"] = 16] = "INVISIBLE"; +})(FLAGS || (FLAGS = {})); +; +var brokenBold = null; +var Renderer = (function () { + function Renderer(_terminal) { + this._terminal = _terminal; + this._refreshRowsQueue = []; + this._refreshFramesSkipped = 0; + this._refreshAnimationFrame = null; + this._spanElementObjectPool = new DomElementObjectPool_1.DomElementObjectPool('span'); + if (brokenBold === null) { + brokenBold = checkBoldBroken(this._terminal.element); + } + this._spanElementObjectPool = new DomElementObjectPool_1.DomElementObjectPool('span'); + } + Renderer.prototype.queueRefresh = function (start, end) { + this._refreshRowsQueue.push({ start: start, end: end }); + if (!this._refreshAnimationFrame) { + this._refreshAnimationFrame = window.requestAnimationFrame(this._refreshLoop.bind(this)); + } + }; + Renderer.prototype._refreshLoop = function () { + var skipFrame = this._terminal.writeBuffer.length > 0 && this._refreshFramesSkipped++ <= MAX_REFRESH_FRAME_SKIP; + if (skipFrame) { + this._refreshAnimationFrame = window.requestAnimationFrame(this._refreshLoop.bind(this)); + return; + } + this._refreshFramesSkipped = 0; + var start; + var end; + if (this._refreshRowsQueue.length > 4) { + start = 0; + end = this._terminal.rows - 1; + } + else { + start = this._refreshRowsQueue[0].start; + end = this._refreshRowsQueue[0].end; + for (var i = 1; i < this._refreshRowsQueue.length; i++) { + if (this._refreshRowsQueue[i].start < start) { + start = this._refreshRowsQueue[i].start; + } + if (this._refreshRowsQueue[i].end > end) { + end = this._refreshRowsQueue[i].end; + } + } + } + this._refreshRowsQueue = []; + this._refreshAnimationFrame = null; + this._refresh(start, end); + }; + Renderer.prototype._refresh = function (start, end) { + var parent; + if (end - start >= this._terminal.rows / 2) { + parent = this._terminal.element.parentNode; + if (parent) { + this._terminal.element.removeChild(this._terminal.rowContainer); + } + } + var width = this._terminal.cols; + var y = start; + if (end >= this._terminal.rows) { + this._terminal.log('`end` is too large. Most likely a bad CSR.'); + end = this._terminal.rows - 1; + } + for (; y <= end; y++) { + var row = y + this._terminal.ydisp; + var line = this._terminal.lines.get(row); + var x = void 0; + if (this._terminal.y === y - (this._terminal.ybase - this._terminal.ydisp) && + this._terminal.cursorState && + !this._terminal.cursorHidden) { + x = this._terminal.x; + } + else { + x = -1; + } + var attr = this._terminal.defAttr; + var documentFragment = document.createDocumentFragment(); + var innerHTML = ''; + var currentElement = void 0; + while (this._terminal.children[y].children.length) { + var child = this._terminal.children[y].children[0]; + this._terminal.children[y].removeChild(child); + this._spanElementObjectPool.release(child); + } + for (var i = 0; i < width; i++) { + var data = line[i][0]; + var ch = line[i][1]; + var ch_width = line[i][2]; + if (!ch_width) { + continue; + } + if (i === x) { + data = -1; + } + if (data !== attr) { + if (attr !== this._terminal.defAttr) { + if (innerHTML) { + currentElement.innerHTML = innerHTML; + innerHTML = ''; + } + documentFragment.appendChild(currentElement); + currentElement = null; + } + if (data !== this._terminal.defAttr) { + if (innerHTML && !currentElement) { + currentElement = this._spanElementObjectPool.acquire(); + } + if (currentElement) { + if (innerHTML) { + currentElement.innerHTML = innerHTML; + innerHTML = ''; + } + documentFragment.appendChild(currentElement); + } + currentElement = this._spanElementObjectPool.acquire(); + if (data === -1) { + currentElement.classList.add('reverse-video', 'terminal-cursor'); + } + else { + var bg = data & 0x1ff; + var fg = (data >> 9) & 0x1ff; + var flags = data >> 18; + if (flags & FLAGS.BOLD) { + if (!brokenBold) { + currentElement.classList.add('xterm-bold'); + } + if (fg < 8) { + fg += 8; + } + } + if (flags & FLAGS.UNDERLINE) { + currentElement.classList.add('xterm-underline'); + } + if (flags & FLAGS.BLINK) { + currentElement.classList.add('xterm-blink'); + } + if (flags & FLAGS.INVERSE) { + var temp = bg; + bg = fg; + fg = temp; + if ((flags & 1) && fg < 8) { + fg += 8; + } + } + if (flags & FLAGS.INVISIBLE) { + currentElement.classList.add('xterm-hidden'); + } + if (flags & FLAGS.INVERSE) { + if (bg === 257) { + bg = 15; + } + if (fg === 256) { + fg = 0; + } + } + if (bg < 256) { + currentElement.classList.add("xterm-bg-color-" + bg); + } + if (fg < 256) { + currentElement.classList.add("xterm-color-" + fg); + } + } + } + } + if (ch_width === 2) { + innerHTML += "<span class=\"xterm-wide-char\">" + ch + "</span>"; + } + else if (ch.charCodeAt(0) > 255) { + innerHTML += "<span class=\"xterm-normal-char\">" + ch + "</span>"; + } + else { + switch (ch) { + case '&': + innerHTML += '&'; + break; + case '<': + innerHTML += '<'; + break; + case '>': + innerHTML += '>'; + break; + default: + if (ch <= ' ') { + innerHTML += ' '; + } + else { + innerHTML += ch; + } + break; + } + } + attr = data; + } + if (innerHTML && !currentElement) { + currentElement = this._spanElementObjectPool.acquire(); + } + if (currentElement) { + if (innerHTML) { + currentElement.innerHTML = innerHTML; + innerHTML = ''; + } + documentFragment.appendChild(currentElement); + currentElement = null; + } + this._terminal.children[y].appendChild(documentFragment); + } + if (parent) { + this._terminal.element.appendChild(this._terminal.rowContainer); + } + this._terminal.emit('refresh', { element: this._terminal.element, start: start, end: end }); + }; + ; + return Renderer; +}()); +exports.Renderer = Renderer; +function checkBoldBroken(terminal) { + var document = terminal.ownerDocument; + var el = document.createElement('span'); + el.innerHTML = 'hello world'; + terminal.appendChild(el); + var w1 = el.offsetWidth; + var h1 = el.offsetHeight; + el.style.fontWeight = 'bold'; + var w2 = el.offsetWidth; + var h2 = el.offsetHeight; + terminal.removeChild(el); + return w1 !== w2 || h1 !== h2; } -/** - * Refreshes row height, setting line-height, viewport height and scroll area height if - * necessary. - * @param {number|undefined} charSize A character size measurement bounding rect object, if it - * doesn't exist it will be created. - */ -Viewport.prototype.refresh = function (charSize) { - var size = charSize || this.charMeasureElement.getBoundingClientRect(); - if (size.height > 0) { - var rowHeightChanged = size.height !== this.currentRowHeight; - if (rowHeightChanged) { - this.currentRowHeight = size.height; - this.viewportElement.style.lineHeight = size.height + 'px'; - this.terminal.rowContainer.style.lineHeight = size.height + 'px'; + + +},{"./utils/DomElementObjectPool":14}],9:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Viewport = (function () { + function Viewport(terminal, viewportElement, scrollArea, charMeasure) { + var _this = this; + this.terminal = terminal; + this.viewportElement = viewportElement; + this.scrollArea = scrollArea; + this.charMeasure = charMeasure; + this.currentRowHeight = 0; + this.lastRecordedBufferLength = 0; + this.lastRecordedViewportHeight = 0; + this.terminal.on('scroll', this.syncScrollArea.bind(this)); + this.terminal.on('resize', this.syncScrollArea.bind(this)); + this.viewportElement.addEventListener('scroll', this.onScroll.bind(this)); + setTimeout(function () { return _this.syncScrollArea(); }, 0); } - var viewportHeightChanged = this.lastRecordedViewportHeight !== this.terminal.rows; - if (rowHeightChanged || viewportHeightChanged) { - this.lastRecordedViewportHeight = this.terminal.rows; - this.viewportElement.style.height = size.height * this.terminal.rows + 'px'; - } - this.scrollArea.style.height = size.height * this.lastRecordedBufferLength + 'px'; - } -}; - -/** - * Updates dimensions and synchronizes the scroll area if necessary. - */ -Viewport.prototype.syncScrollArea = function () { - if (this.lastRecordedBufferLength !== this.terminal.lines.length) { - // If buffer height changed - this.lastRecordedBufferLength = this.terminal.lines.length; - this.refresh(); - } else if (this.lastRecordedViewportHeight !== this.terminal.rows) { - // If viewport height changed - this.refresh(); - } else { - // If size has changed, refresh viewport - var size = this.charMeasureElement.getBoundingClientRect(); - if (size.height !== this.currentRowHeight) { - this.refresh(size); - } - } - - // Sync scrollTop - var scrollTop = this.terminal.ydisp * this.currentRowHeight; - if (this.viewportElement.scrollTop !== scrollTop) { - this.viewportElement.scrollTop = scrollTop; - } -}; - -/** - * Handles scroll events on the viewport, calculating the new viewport and requesting the - * terminal to scroll to it. - * @param {Event} ev The scroll event. - */ -Viewport.prototype.onScroll = function (ev) { - var newRow = Math.round(this.viewportElement.scrollTop / this.currentRowHeight); - var diff = newRow - this.terminal.ydisp; - this.terminal.scrollDisp(diff, true); -}; - -/** - * Handles mouse wheel events by adjusting the viewport's scrollTop and delegating the actual - * scrolling to `onScroll`, this event needs to be attached manually by the consumer of - * `Viewport`. - * @param {WheelEvent} ev The mouse wheel event. - */ -Viewport.prototype.onWheel = function (ev) { - if (ev.deltaY === 0) { - // Do nothing if it's not a vertical scroll event - return; - } - // Fallback to WheelEvent.DOM_DELTA_PIXEL - var multiplier = 1; - if (ev.deltaMode === WheelEvent.DOM_DELTA_LINE) { - multiplier = this.currentRowHeight; - } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) { - multiplier = this.currentRowHeight * this.terminal.rows; - } - this.viewportElement.scrollTop += ev.deltaY * multiplier; - // Prevent the page from scrolling when the terminal scrolls - ev.preventDefault(); -}; - + Viewport.prototype.refresh = function () { + if (this.charMeasure.height > 0) { + var rowHeightChanged = this.charMeasure.height !== this.currentRowHeight; + if (rowHeightChanged) { + this.currentRowHeight = this.charMeasure.height; + this.viewportElement.style.lineHeight = this.charMeasure.height + 'px'; + this.terminal.rowContainer.style.lineHeight = this.charMeasure.height + 'px'; + } + var viewportHeightChanged = this.lastRecordedViewportHeight !== this.terminal.rows; + if (rowHeightChanged || viewportHeightChanged) { + this.lastRecordedViewportHeight = this.terminal.rows; + this.viewportElement.style.height = this.charMeasure.height * this.terminal.rows + 'px'; + } + this.scrollArea.style.height = (this.charMeasure.height * this.lastRecordedBufferLength) + 'px'; + } + }; + Viewport.prototype.syncScrollArea = function () { + if (this.lastRecordedBufferLength !== this.terminal.lines.length) { + this.lastRecordedBufferLength = this.terminal.lines.length; + this.refresh(); + } + else if (this.lastRecordedViewportHeight !== this.terminal.rows) { + this.refresh(); + } + else { + if (this.charMeasure.height !== this.currentRowHeight) { + this.refresh(); + } + } + var scrollTop = this.terminal.ydisp * this.currentRowHeight; + if (this.viewportElement.scrollTop !== scrollTop) { + this.viewportElement.scrollTop = scrollTop; + } + }; + Viewport.prototype.onScroll = function (ev) { + var newRow = Math.round(this.viewportElement.scrollTop / this.currentRowHeight); + var diff = newRow - this.terminal.ydisp; + this.terminal.scrollDisp(diff, true); + }; + Viewport.prototype.onWheel = function (ev) { + if (ev.deltaY === 0) { + return; + } + var multiplier = 1; + if (ev.deltaMode === WheelEvent.DOM_DELTA_LINE) { + multiplier = this.currentRowHeight; + } + else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) { + multiplier = this.currentRowHeight * this.terminal.rows; + } + this.viewportElement.scrollTop += ev.deltaY * multiplier; + ev.preventDefault(); + }; + ; + return Viewport; +}()); exports.Viewport = Viewport; -},{}],4:[function(_dereq_,module,exports){ -(function (__dirname){ -'use strict';var _typeof=typeof Symbol==="function"&&typeof Symbol.iterator==="symbol"?function(obj){return typeof obj;}:function(obj){return obj&&typeof Symbol==="function"&&obj.constructor===Symbol?"symbol":typeof obj;};/** - * xterm.js: xterm, in the browser - * Copyright (c) 2014, SourceLair Limited <www.sourcelair.com> (MIT License) - * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) - * https://github.com/chjj/term.js - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * Originally forked from (with the author's permission): - * Fabrice Bellard's javascript vt100 for jslinux: - * http://bellard.org/jslinux/ - * Copyright (c) 2011 Fabrice Bellard - * The original design remains. The terminal itself - * has been extended to include xterm CSI codes, among - * other features. - */var _CompositionHelper=_dereq_('./CompositionHelper.js');var _EventEmitter=_dereq_('./EventEmitter.js');var _Viewport=_dereq_('./Viewport.js');/** - * Terminal Emulation References: - * http://vt100.net/ - * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt - * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html - * http://invisible-island.net/vttest/ - * http://www.inwap.com/pdp10/ansicode.txt - * http://linux.die.net/man/4/console_codes - * http://linux.die.net/man/7/urxvt - */// Let it work inside Node.js for automated testing purposes. -var document=typeof window!='undefined'?window.document:null;/** - * States - */var normal=0,escaped=1,csi=2,osc=3,charset=4,dcs=5,ignore=6;/** - * Terminal - *//** - * Creates a new `Terminal` object. - * - * @param {object} options An object containing a set of options, the available options are: - * - cursorBlink (boolean): Whether the terminal cursor blinks - * - * @public - * @class Xterm Xterm - * @alias module:xterm/src/xterm - */function Terminal(options){var self=this;if(!(this instanceof Terminal)){return new Terminal(arguments[0],arguments[1],arguments[2]);}self.cancel=Terminal.cancel;_EventEmitter.EventEmitter.call(this);if(typeof options==='number'){options={cols:arguments[0],rows:arguments[1],handler:arguments[2]};}options=options||{};Object.keys(Terminal.defaults).forEach(function(key){if(options[key]==null){options[key]=Terminal.options[key];if(Terminal[key]!==Terminal.defaults[key]){options[key]=Terminal[key];}}self[key]=options[key];});if(options.colors.length===8){options.colors=options.colors.concat(Terminal._colors.slice(8));}else if(options.colors.length===16){options.colors=options.colors.concat(Terminal._colors.slice(16));}else if(options.colors.length===10){options.colors=options.colors.slice(0,-2).concat(Terminal._colors.slice(8,-2),options.colors.slice(-2));}else if(options.colors.length===18){options.colors=options.colors.concat(Terminal._colors.slice(16,-2),options.colors.slice(-2));}this.colors=options.colors;this.options=options;// this.context = options.context || window; -// this.document = options.document || document; -this.parent=options.body||options.parent||(document?document.getElementsByTagName('body')[0]:null);this.cols=options.cols||options.geometry[0];this.rows=options.rows||options.geometry[1];if(options.handler){this.on('data',options.handler);}/** - * The scroll position of the y cursor, ie. ybase + y = the y position within the entire - * buffer - */this.ybase=0;/** - * The scroll position of the viewport - */this.ydisp=0;/** - * The cursor's x position after ybase - */this.x=0;/** - * The cursor's y position after ybase - */this.y=0;/** - * Used to debounce the refresh function - */this.isRefreshing=false;/** - * Whether there is a full terminal refresh queued - */this.cursorState=0;this.cursorHidden=false;this.convertEol;this.state=0;this.queue='';this.scrollTop=0;this.scrollBottom=this.rows-1;this.customKeydownHandler=null;// modes -this.applicationKeypad=false;this.applicationCursor=false;this.originMode=false;this.insertMode=false;this.wraparoundMode=true;// defaults: xterm - true, vt100 - false -this.normal=null;// charset -this.charset=null;this.gcharset=null;this.glevel=0;this.charsets=[null];// mouse properties -this.decLocator;this.x10Mouse;this.vt200Mouse;this.vt300Mouse;this.normalMouse;this.mouseEvents;this.sendFocus;this.utfMouse;this.sgrMouse;this.urxvtMouse;// misc -this.element;this.children;this.refreshStart;this.refreshEnd;this.savedX;this.savedY;this.savedCols;// stream -this.readable=true;this.writable=true;this.defAttr=0<<18|257<<9|256<<0;this.curAttr=this.defAttr;this.params=[];this.currentParam=0;this.prefix='';this.postfix='';// leftover surrogate high from previous write invocation -this.surrogate_high='';/** - * An array of all lines in the entire buffer, including the prompt. The lines are array of - * characters which are 2-length arrays where [0] is an attribute and [1] is the character. - */this.lines=[];var i=this.rows;while(i--){this.lines.push(this.blankLine());}this.tabs;this.setupStops();}inherits(Terminal,_EventEmitter.EventEmitter);/** - * back_color_erase feature for xterm. - */Terminal.prototype.eraseAttr=function(){// if (this.is('screen')) return this.defAttr; -return this.defAttr&~0x1ff|this.curAttr&0x1ff;};/** - * Colors - */// Colors 0-15 -Terminal.tangoColors=[// dark: -'#2e3436','#cc0000','#4e9a06','#c4a000','#3465a4','#75507b','#06989a','#d3d7cf',// bright: -'#555753','#ef2929','#8ae234','#fce94f','#729fcf','#ad7fa8','#34e2e2','#eeeeec'];// Colors 0-15 + 16-255 -// Much thanks to TooTallNate for writing this. -Terminal.colors=function(){var colors=Terminal.tangoColors.slice(),r=[0x00,0x5f,0x87,0xaf,0xd7,0xff],i;// 16-231 -i=0;for(;i<216;i++){out(r[i/36%6|0],r[i/6%6|0],r[i%6]);}// 232-255 (grey) -i=0;for(;i<24;i++){r=8+i*10;out(r,r,r);}function out(r,g,b){colors.push('#'+hex(r)+hex(g)+hex(b));}function hex(c){c=c.toString(16);return c.length<2?'0'+c:c;}return colors;}();Terminal._colors=Terminal.colors.slice();Terminal.vcolors=function(){var out=[],colors=Terminal.colors,i=0,color;for(;i<256;i++){color=parseInt(colors[i].substring(1),16);out.push([color>>16&0xff,color>>8&0xff,color&0xff]);}return out;}();/** - * Options - */Terminal.defaults={colors:Terminal.colors,theme:'default',convertEol:false,termName:'xterm',geometry:[80,24],cursorBlink:false,visualBell:false,popOnBell:false,scrollback:1000,screenKeys:false,debug:false,cancelEvents:false// programFeatures: false, -// focusKeys: false, -};Terminal.options={};Terminal.focus=null;each(keys(Terminal.defaults),function(key){Terminal[key]=Terminal.defaults[key];Terminal.options[key]=Terminal.defaults[key];});/** - * Focus the terminal. Delegates focus handling to the terminal's DOM element. - */Terminal.prototype.focus=function(){return this.textarea.focus();};/** - * Retrieves an option's value from the terminal. - * @param {string} key The option key. - */Terminal.prototype.getOption=function(key,value){if(!(key in Terminal.defaults)){throw new Error('No option with key "'+key+'"');}if(typeof this.options[key]!=='undefined'){return this.options[key];}return this[key];};/** - * Sets an option on the terminal. - * @param {string} key The option key. - * @param {string} value The option value. - */Terminal.prototype.setOption=function(key,value){if(!(key in Terminal.defaults)){throw new Error('No option with key "'+key+'"');}this[key]=value;this.options[key]=value;};/** - * Binds the desired focus behavior on a given terminal object. - * - * @static - */Terminal.bindFocus=function(term){on(term.textarea,'focus',function(ev){if(term.sendFocus){term.send('\x1b[I');}term.element.classList.add('focus');term.showCursor();Terminal.focus=term;term.emit('focus',{terminal:term});});};/** - * Blur the terminal. Delegates blur handling to the terminal's DOM element. - */Terminal.prototype.blur=function(){return this.textarea.blur();};/** - * Binds the desired blur behavior on a given terminal object. - * - * @static - */Terminal.bindBlur=function(term){on(term.textarea,'blur',function(ev){term.refresh(term.y,term.y);if(term.sendFocus){term.send('\x1b[O');}term.element.classList.remove('focus');Terminal.focus=null;term.emit('blur',{terminal:term});});};/** - * Initialize default behavior - */Terminal.prototype.initGlobal=function(){Terminal.bindPaste(this);Terminal.bindKeys(this);Terminal.bindCopy(this);Terminal.bindFocus(this);Terminal.bindBlur(this);};/** - * Bind to paste event and allow both keyboard and right-click pasting, without having the - * contentEditable value set to true. - */Terminal.bindPaste=function(term){on([term.textarea,term.element],'paste',function(ev){ev.stopPropagation();if(ev.clipboardData){var text=ev.clipboardData.getData('text/plain');term.handler(text);term.textarea.value='';return term.cancel(ev);}});};/** - * Prepares text copied from terminal selection, to be saved in the clipboard by: - * 1. stripping all trailing white spaces - * 2. converting all non-breaking spaces to regular spaces - * @param {string} text The copied text that needs processing for storing in clipboard - * @returns {string} - * @static - */Terminal.prepareCopiedTextForClipboard=function(text){var space=String.fromCharCode(32),nonBreakingSpace=String.fromCharCode(160),allNonBreakingSpaces=new RegExp(nonBreakingSpace,'g'),processedText=text.split('\n').map(function(line){/** - * Strip all trailing white spaces and convert all non-breaking spaces to regular - * spaces. - */var processedLine=line.replace(/\s+$/g,'').replace(allNonBreakingSpaces,space);return processedLine;}).join('\n');return processedText;};/** - * Apply key handling to the terminal - */Terminal.bindKeys=function(term){on(term.element,'keydown',function(ev){if(document.activeElement!=this){return;}term.keyDown(ev);},true);on(term.element,'keypress',function(ev){if(document.activeElement!=this){return;}term.keyPress(ev);},true);on(term.element,'keyup',term.focus.bind(term));on(term.textarea,'keydown',function(ev){term.keyDown(ev);},true);on(term.textarea,'keypress',function(ev){term.keyPress(ev);// Truncate the textarea's value, since it is not needed -this.value='';},true);on(term.textarea,'compositionstart',term.compositionHelper.compositionstart.bind(term.compositionHelper));on(term.textarea,'compositionupdate',term.compositionHelper.compositionupdate.bind(term.compositionHelper));on(term.textarea,'compositionend',term.compositionHelper.compositionend.bind(term.compositionHelper));term.on('refresh',term.compositionHelper.updateCompositionElements.bind(term.compositionHelper));};/** - * Binds copy functionality to the given terminal. - * @static - */Terminal.bindCopy=function(term){on(term.element,'copy',function(ev){return;// temporary -});};/** - * Insert the given row to the terminal or produce a new one - * if no row argument is passed. Return the inserted row. - * @param {HTMLElement} row (optional) The row to append to the terminal. - */Terminal.prototype.insertRow=function(row){if((typeof row==='undefined'?'undefined':_typeof(row))!='object'){row=document.createElement('div');}this.rowContainer.appendChild(row);this.children.push(row);return row;};/** - * Opens the terminal within an element. - * - * @param {HTMLElement} parent The element to create the terminal within. - */Terminal.prototype.open=function(parent){var self=this,i=0,div;this.parent=parent||this.parent;if(!this.parent){throw new Error('Terminal requires a parent element.');}// Grab global elements -this.context=this.parent.ownerDocument.defaultView;this.document=this.parent.ownerDocument;this.body=this.document.getElementsByTagName('body')[0];// Parse User-Agent -if(this.context.navigator&&this.context.navigator.userAgent){this.isMSIE=!!~this.context.navigator.userAgent.indexOf('MSIE');}// Find the users platform. We use this to interpret the meta key -// and ISO third level shifts. -// http://stackoverflow.com/q/19877924/577598 -if(this.context.navigator&&this.context.navigator.platform){this.isMac=contains(this.context.navigator.platform,['Macintosh','MacIntel','MacPPC','Mac68K']);this.isIpad=this.context.navigator.platform==='iPad';this.isIphone=this.context.navigator.platform==='iPhone';this.isMSWindows=contains(this.context.navigator.platform,['Windows','Win16','Win32','WinCE']);}//Create main element container -this.element=this.document.createElement('div');this.element.classList.add('terminal');this.element.classList.add('xterm');this.element.classList.add('xterm-theme-'+this.theme);this.element.style.height;this.element.setAttribute('tabindex',0);this.viewportElement=document.createElement('div');this.viewportElement.classList.add('xterm-viewport');this.element.appendChild(this.viewportElement);this.viewportScrollArea=document.createElement('div');this.viewportScrollArea.classList.add('xterm-scroll-area');this.viewportElement.appendChild(this.viewportScrollArea);// Create the container that will hold the lines of the terminal and then -// produce the lines the lines. -this.rowContainer=document.createElement('div');this.rowContainer.classList.add('xterm-rows');this.element.appendChild(this.rowContainer);this.children=[];// Create the container that will hold helpers like the textarea for -// capturing DOM Events. Then produce the helpers. -this.helperContainer=document.createElement('div');this.helperContainer.classList.add('xterm-helpers');// TODO: This should probably be inserted once it's filled to prevent an additional layout -this.element.appendChild(this.helperContainer);this.textarea=document.createElement('textarea');this.textarea.classList.add('xterm-helper-textarea');this.textarea.setAttribute('autocorrect','off');this.textarea.setAttribute('autocapitalize','off');this.textarea.setAttribute('spellcheck','false');this.textarea.tabIndex=0;this.textarea.addEventListener('focus',function(){self.emit('focus',{terminal:self});});this.textarea.addEventListener('blur',function(){self.emit('blur',{terminal:self});});this.helperContainer.appendChild(this.textarea);this.compositionView=document.createElement('div');this.compositionView.classList.add('composition-view');this.compositionHelper=new _CompositionHelper.CompositionHelper(this.textarea,this.compositionView,this);this.helperContainer.appendChild(this.compositionView);this.charMeasureElement=document.createElement('div');this.charMeasureElement.classList.add('xterm-char-measure-element');this.charMeasureElement.innerHTML='W';this.helperContainer.appendChild(this.charMeasureElement);for(;i<this.rows;i++){this.insertRow();}this.parent.appendChild(this.element);this.viewport=new _Viewport.Viewport(this,this.viewportElement,this.viewportScrollArea,this.charMeasureElement);// Draw the screen. -this.refresh(0,this.rows-1);// Initialize global actions that -// need to be taken on the document. -this.initGlobal();// Ensure there is a Terminal.focus. -this.focus();on(this.element,'click',function(){var selection=document.getSelection(),collapsed=selection.isCollapsed,isRange=typeof collapsed=='boolean'?!collapsed:selection.type=='Range';if(!isRange){self.focus();}});// Listen for mouse events and translate -// them into terminal mouse protocols. -this.bindMouse();// Figure out whether boldness affects -// the character width of monospace fonts. -if(Terminal.brokenBold==null){Terminal.brokenBold=isBoldBroken(this.document);}this.emit('open');};/** - * Attempts to load an add-on using CommonJS or RequireJS (whichever is available). - * @param {string} addon The name of the addon to load - * @static - */Terminal.loadAddon=function(addon,callback){if((typeof exports==='undefined'?'undefined':_typeof(exports))==='object'&&(typeof module==='undefined'?'undefined':_typeof(module))==='object'){// CommonJS -return _dereq_(__dirname+'/../addons/'+addon);}else if(typeof define=='function'){// RequireJS -return _dereq_(['../addons/'+addon+'/'+addon],callback);}else{console.error('Cannot load a module without a CommonJS or RequireJS environment.');return false;}};/** - * XTerm mouse events - * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#Mouse%20Tracking - * To better understand these - * the xterm code is very helpful: - * Relevant files: - * button.c, charproc.c, misc.c - * Relevant functions in xterm/button.c: - * BtnCode, EmitButtonCode, EditorButton, SendMousePosition - */Terminal.prototype.bindMouse=function(){var el=this.element,self=this,pressed=32;// mouseup, mousedown, wheel -// left click: ^[[M 3<^[[M#3< -// wheel up: ^[[M`3> -function sendButton(ev){var button,pos;// get the xterm-style button -button=getButton(ev);// get mouse coordinates -pos=getCoords(ev);if(!pos)return;sendEvent(button,pos);switch(ev.overrideType||ev.type){case'mousedown':pressed=button;break;case'mouseup':// keep it at the left -// button, just in case. -pressed=32;break;case'wheel':// nothing. don't -// interfere with -// `pressed`. -break;}}// motion example of a left click: -// ^[[M 3<^[[M@4<^[[M@5<^[[M@6<^[[M@7<^[[M#7< -function sendMove(ev){var button=pressed,pos;pos=getCoords(ev);if(!pos)return;// buttons marked as motions -// are incremented by 32 -button+=32;sendEvent(button,pos);}// encode button and -// position to characters -function encode(data,ch){if(!self.utfMouse){if(ch===255)return data.push(0);if(ch>127)ch=127;data.push(ch);}else{if(ch===2047)return data.push(0);if(ch<127){data.push(ch);}else{if(ch>2047)ch=2047;data.push(0xC0|ch>>6);data.push(0x80|ch&0x3F);}}}// send a mouse event: -// regular/utf8: ^[[M Cb Cx Cy -// urxvt: ^[[ Cb ; Cx ; Cy M -// sgr: ^[[ Cb ; Cx ; Cy M/m -// vt300: ^[[ 24(1/3/5)~ [ Cx , Cy ] \r -// locator: CSI P e ; P b ; P r ; P c ; P p & w -function sendEvent(button,pos){// self.emit('mouse', { -// x: pos.x - 32, -// y: pos.x - 32, -// button: button -// }); -if(self.vt300Mouse){// NOTE: Unstable. -// http://www.vt100.net/docs/vt3xx-gp/chapter15.html -button&=3;pos.x-=32;pos.y-=32;var data='\x1b[24';if(button===0)data+='1';else if(button===1)data+='3';else if(button===2)data+='5';else if(button===3)return;else data+='0';data+='~['+pos.x+','+pos.y+']\r';self.send(data);return;}if(self.decLocator){// NOTE: Unstable. -button&=3;pos.x-=32;pos.y-=32;if(button===0)button=2;else if(button===1)button=4;else if(button===2)button=6;else if(button===3)button=3;self.send('\x1b['+button+';'+(button===3?4:0)+';'+pos.y+';'+pos.x+';'+(pos.page||0)+'&w');return;}if(self.urxvtMouse){pos.x-=32;pos.y-=32;pos.x++;pos.y++;self.send('\x1b['+button+';'+pos.x+';'+pos.y+'M');return;}if(self.sgrMouse){pos.x-=32;pos.y-=32;self.send('\x1b[<'+((button&3)===3?button&~3:button)+';'+pos.x+';'+pos.y+((button&3)===3?'m':'M'));return;}var data=[];encode(data,button);encode(data,pos.x);encode(data,pos.y);self.send('\x1b[M'+String.fromCharCode.apply(String,data));}function getButton(ev){var button,shift,meta,ctrl,mod;// two low bits: -// 0 = left -// 1 = middle -// 2 = right -// 3 = release -// wheel up/down: -// 1, and 2 - with 64 added -switch(ev.overrideType||ev.type){case'mousedown':button=ev.button!=null?+ev.button:ev.which!=null?ev.which-1:null;if(self.isMSIE){button=button===1?0:button===4?1:button;}break;case'mouseup':button=3;break;case'DOMMouseScroll':button=ev.detail<0?64:65;break;case'wheel':button=ev.wheelDeltaY>0?64:65;break;}// next three bits are the modifiers: -// 4 = shift, 8 = meta, 16 = control -shift=ev.shiftKey?4:0;meta=ev.metaKey?8:0;ctrl=ev.ctrlKey?16:0;mod=shift|meta|ctrl;// no mods -if(self.vt200Mouse){// ctrl only -mod&=ctrl;}else if(!self.normalMouse){mod=0;}// increment to SP -button=32+(mod<<2)+button;return button;}// mouse coordinates measured in cols/rows -function getCoords(ev){var x,y,w,h,el;// ignore browsers without pageX for now -if(ev.pageX==null)return;x=ev.pageX;y=ev.pageY;el=self.element;// should probably check offsetParent -// but this is more portable -while(el&&el!==self.document.documentElement){x-=el.offsetLeft;y-=el.offsetTop;el='offsetParent'in el?el.offsetParent:el.parentNode;}// convert to cols/rows -w=self.element.clientWidth;h=self.element.clientHeight;x=Math.ceil(x/w*self.cols);y=Math.ceil(y/h*self.rows);// be sure to avoid sending -// bad positions to the program -if(x<0)x=0;if(x>self.cols)x=self.cols;if(y<0)y=0;if(y>self.rows)y=self.rows;// xterm sends raw bytes and -// starts at 32 (SP) for each. -x+=32;y+=32;return{x:x,y:y,type:'wheel'};}on(el,'mousedown',function(ev){if(!self.mouseEvents)return;// send the button -sendButton(ev);// ensure focus -self.focus();// fix for odd bug -//if (self.vt200Mouse && !self.normalMouse) { -if(self.vt200Mouse){ev.overrideType='mouseup';sendButton(ev);return self.cancel(ev);}// bind events -if(self.normalMouse)on(self.document,'mousemove',sendMove);// x10 compatibility mode can't send button releases -if(!self.x10Mouse){on(self.document,'mouseup',function up(ev){sendButton(ev);if(self.normalMouse)off(self.document,'mousemove',sendMove);off(self.document,'mouseup',up);return self.cancel(ev);});}return self.cancel(ev);});//if (self.normalMouse) { -// on(self.document, 'mousemove', sendMove); -//} -on(el,'wheel',function(ev){if(!self.mouseEvents)return;if(self.x10Mouse||self.vt300Mouse||self.decLocator)return;sendButton(ev);return self.cancel(ev);});// allow wheel scrolling in -// the shell for example -on(el,'wheel',function(ev){if(self.mouseEvents)return;self.viewport.onWheel(ev);return self.cancel(ev);});};/** - * Destroys the terminal. - */Terminal.prototype.destroy=function(){this.readable=false;this.writable=false;this._events={};this.handler=function(){};this.write=function(){};if(this.element.parentNode){this.element.parentNode.removeChild(this.element);}//this.emit('close'); -};/** - * Flags used to render terminal text properly - */Terminal.flags={BOLD:1,UNDERLINE:2,BLINK:4,INVERSE:8,INVISIBLE:16};/** - * Refreshes (re-renders) terminal content within two rows (inclusive) - * - * Rendering Engine: - * - * In the screen buffer, each character is stored as a an array with a character - * and a 32-bit integer: - * - First value: a utf-16 character. - * - Second value: - * - Next 9 bits: background color (0-511). - * - Next 9 bits: foreground color (0-511). - * - Next 14 bits: a mask for misc. flags: - * - 1=bold - * - 2=underline - * - 4=blink - * - 8=inverse - * - 16=invisible - * - * @param {number} start The row to start from (between 0 and terminal's height terminal - 1) - * @param {number} end The row to end at (between fromRow and terminal's height terminal - 1) - * @param {boolean} queue Whether the refresh should ran right now or be queued - */Terminal.prototype.refresh=function(start,end,queue){var self=this;// queue defaults to true -queue=typeof queue=='undefined'?true:queue;/** - * The refresh queue allows refresh to execute only approximately 30 times a second. For - * commands that pass a significant amount of output to the write function, this prevents the - * terminal from maxing out the CPU and making the UI unresponsive. While commands can still - * run beyond what they do on the terminal, it is far better with a debounce in place as - * every single terminal manipulation does not need to be constructed in the DOM. - * - * A side-effect of this is that it makes ^C to interrupt a process seem more responsive. - */if(queue){// If refresh should be queued, order the refresh and return. -if(this._refreshIsQueued){// If a refresh has already been queued, just order a full refresh next -this._fullRefreshNext=true;}else{setTimeout(function(){self.refresh(start,end,false);},34);this._refreshIsQueued=true;}return;}// If refresh should be run right now (not be queued), release the lock -this._refreshIsQueued=false;// If multiple refreshes were requested, make a full refresh. -if(this._fullRefreshNext){start=0;end=this.rows-1;this._fullRefreshNext=false;// reset lock -}var x,y,i,line,out,ch,ch_width,width,data,attr,bg,fg,flags,row,parent,focused=document.activeElement;// If this is a big refresh, remove the terminal rows from the DOM for faster calculations -if(end-start>=this.rows/2){parent=this.element.parentNode;if(parent){this.element.removeChild(this.rowContainer);}}width=this.cols;y=start;if(end>=this.rows.length){this.log('`end` is too large. Most likely a bad CSR.');end=this.rows.length-1;}for(;y<=end;y++){row=y+this.ydisp;line=this.lines[row];out='';if(this.y===y-(this.ybase-this.ydisp)&&this.cursorState&&!this.cursorHidden){x=this.x;}else{x=-1;}attr=this.defAttr;i=0;for(;i<width;i++){data=line[i][0];ch=line[i][1];ch_width=line[i][2];if(!ch_width)continue;if(i===x)data=-1;if(data!==attr){if(attr!==this.defAttr){out+='</span>';}if(data!==this.defAttr){if(data===-1){out+='<span class="reverse-video terminal-cursor';if(this.cursorBlink){out+=' blinking';}out+='">';}else{var classNames=[];bg=data&0x1ff;fg=data>>9&0x1ff;flags=data>>18;if(flags&Terminal.flags.BOLD){if(!Terminal.brokenBold){classNames.push('xterm-bold');}// See: XTerm*boldColors -if(fg<8)fg+=8;}if(flags&Terminal.flags.UNDERLINE){classNames.push('xterm-underline');}if(flags&Terminal.flags.BLINK){classNames.push('xterm-blink');}// If inverse flag is on, then swap the foreground and background variables. -if(flags&Terminal.flags.INVERSE){/* One-line variable swap in JavaScript: http://stackoverflow.com/a/16201730 */bg=[fg,fg=bg][0];// Should inverse just be before the -// above boldColors effect instead? -if(flags&1&&fg<8)fg+=8;}if(flags&Terminal.flags.INVISIBLE){classNames.push('xterm-hidden');}/** - * Weird situation: Invert flag used black foreground and white background results - * in invalid background color, positioned at the 256 index of the 256 terminal - * color map. Pin the colors manually in such a case. - * - * Source: https://github.com/sourcelair/xterm.js/issues/57 - */if(flags&Terminal.flags.INVERSE){if(bg==257){bg=15;}if(fg==256){fg=0;}}if(bg<256){classNames.push('xterm-bg-color-'+bg);}if(fg<256){classNames.push('xterm-color-'+fg);}out+='<span';if(classNames.length){out+=' class="'+classNames.join(' ')+'"';}out+='>';}}}switch(ch){case'&':out+='&';break;case'<':out+='<';break;case'>':out+='>';break;default:if(ch<=' '){out+=' ';}else{out+=ch;}break;}attr=data;}if(attr!==this.defAttr){out+='</span>';}this.children[y].innerHTML=out;}if(parent){this.element.appendChild(this.rowContainer);}this.emit('refresh',{element:this.element,start:start,end:end});};/** - * Display the cursor element - */Terminal.prototype.showCursor=function(){if(!this.cursorState){this.cursorState=1;this.refresh(this.y,this.y);}};/** - * Scroll the terminal - */Terminal.prototype.scroll=function(){var row;if(++this.ybase===this.scrollback){this.ybase=this.ybase/2|0;this.lines=this.lines.slice(-(this.ybase+this.rows)+1);}this.ydisp=this.ybase;// last line -row=this.ybase+this.rows-1;// subtract the bottom scroll region -row-=this.rows-1-this.scrollBottom;if(row===this.lines.length){// potential optimization: -// pushing is faster than splicing -// when they amount to the same -// behavior. -this.lines.push(this.blankLine());}else{// add our new line -this.lines.splice(row,0,this.blankLine());}if(this.scrollTop!==0){if(this.ybase!==0){this.ybase--;this.ydisp=this.ybase;}this.lines.splice(this.ybase+this.scrollTop,1);}// this.maxRange(); -this.updateRange(this.scrollTop);this.updateRange(this.scrollBottom);this.emit('scroll',this.ydisp);};/** - * Scroll the display of the terminal - * @param {number} disp The number of lines to scroll down (negatives scroll up). - * @param {boolean} suppressScrollEvent Don't emit the scroll event as scrollDisp. This is used - * to avoid unwanted events being handled by the veiwport when the event was triggered from the - * viewport originally. - */Terminal.prototype.scrollDisp=function(disp,suppressScrollEvent){this.ydisp+=disp;if(this.ydisp>this.ybase){this.ydisp=this.ybase;}else if(this.ydisp<0){this.ydisp=0;}if(!suppressScrollEvent){this.emit('scroll',this.ydisp);}this.refresh(0,this.rows-1);};/** - * Writes text to the terminal. - * @param {string} text The text to write to the terminal. - */Terminal.prototype.write=function(data){var l=data.length,i=0,j,cs,ch,code,low,ch_width,row;this.refreshStart=this.y;this.refreshEnd=this.y;if(this.ybase!==this.ydisp){this.ydisp=this.ybase;this.emit('scroll',this.ydisp);this.maxRange();}// apply leftover surrogate high from last write -if(this.surrogate_high){data=this.surrogate_high+data;this.surrogate_high='';}for(;i<l;i++){ch=data[i];// FIXME: higher chars than 0xa0 are not allowed in escape sequences -// --> maybe move to default -code=data.charCodeAt(i);if(0xD800<=code&&code<=0xDBFF){// we got a surrogate high -// get surrogate low (next 2 bytes) -low=data.charCodeAt(i+1);if(isNaN(low)){// end of data stream, save surrogate high -this.surrogate_high=ch;continue;}code=(code-0xD800)*0x400+(low-0xDC00)+0x10000;ch+=data.charAt(i+1);}// surrogate low - already handled above -if(0xDC00<=code&&code<=0xDFFF)continue;switch(this.state){case normal:switch(ch){case'\x07':this.bell();break;// '\n', '\v', '\f' -case'\n':case'\x0b':case'\x0c':if(this.convertEol){this.x=0;}this.y++;if(this.y>this.scrollBottom){this.y--;this.scroll();}break;// '\r' -case'\r':this.x=0;break;// '\b' -case'\x08':if(this.x>0){this.x--;}break;// '\t' -case'\t':this.x=this.nextStop();break;// shift out -case'\x0e':this.setgLevel(1);break;// shift in -case'\x0f':this.setgLevel(0);break;// '\e' -case'\x1b':this.state=escaped;break;default:// ' ' -// calculate print space -// expensive call, therefore we save width in line buffer -ch_width=wcwidth(code);if(ch>=' '){if(this.charset&&this.charset[ch]){ch=this.charset[ch];}row=this.y+this.ybase;// insert combining char in last cell -// FIXME: needs handling after cursor jumps -if(!ch_width&&this.x){// dont overflow left -if(this.lines[row][this.x-1]){if(!this.lines[row][this.x-1][2]){// found empty cell after fullwidth, need to go 2 cells back -if(this.lines[row][this.x-2])this.lines[row][this.x-2][1]+=ch;}else{this.lines[row][this.x-1][1]+=ch;}this.updateRange(this.y);}break;}// goto next line if ch would overflow -// TODO: needs a global min terminal width of 2 -if(this.x+ch_width-1>=this.cols){// autowrap - DECAWM -if(this.wraparoundMode){this.x=0;this.y++;if(this.y>this.scrollBottom){this.y--;this.scroll();}}else{this.x=this.cols-1;if(ch_width===2)// FIXME: check for xterm behavior -continue;}}row=this.y+this.ybase;// insert mode: move characters to right -if(this.insertMode){// do this twice for a fullwidth char -for(var moves=0;moves<ch_width;++moves){// remove last cell, if it's width is 0 -// we have to adjust the second last cell as well -var removed=this.lines[this.y+this.ybase].pop();if(removed[2]===0&&this.lines[row][this.cols-2]&&this.lines[row][this.cols-2][2]===2)this.lines[row][this.cols-2]=[this.curAttr,' ',1];// insert empty cell at cursor -this.lines[row].splice(this.x,0,[this.curAttr,' ',1]);}}this.lines[row][this.x]=[this.curAttr,ch,ch_width];this.x++;this.updateRange(this.y);// fullwidth char - set next cell width to zero and advance cursor -if(ch_width===2){this.lines[row][this.x]=[this.curAttr,'',0];this.x++;}}break;}break;case escaped:switch(ch){// ESC [ Control Sequence Introducer ( CSI is 0x9b). -case'[':this.params=[];this.currentParam=0;this.state=csi;break;// ESC ] Operating System Command ( OSC is 0x9d). -case']':this.params=[];this.currentParam=0;this.state=osc;break;// ESC P Device Control String ( DCS is 0x90). -case'P':this.params=[];this.currentParam=0;this.state=dcs;break;// ESC _ Application Program Command ( APC is 0x9f). -case'_':this.state=ignore;break;// ESC ^ Privacy Message ( PM is 0x9e). -case'^':this.state=ignore;break;// ESC c Full Reset (RIS). -case'c':this.reset();break;// ESC E Next Line ( NEL is 0x85). -// ESC D Index ( IND is 0x84). -case'E':this.x=0;;case'D':this.index();break;// ESC M Reverse Index ( RI is 0x8d). -case'M':this.reverseIndex();break;// ESC % Select default/utf-8 character set. -// @ = default, G = utf-8 -case'%'://this.charset = null; -this.setgLevel(0);this.setgCharset(0,Terminal.charsets.US);this.state=normal;i++;break;// ESC (,),*,+,-,. Designate G0-G2 Character Set. -case'(':// <-- this seems to get all the attention -case')':case'*':case'+':case'-':case'.':switch(ch){case'(':this.gcharset=0;break;case')':this.gcharset=1;break;case'*':this.gcharset=2;break;case'+':this.gcharset=3;break;case'-':this.gcharset=1;break;case'.':this.gcharset=2;break;}this.state=charset;break;// Designate G3 Character Set (VT300). -// A = ISO Latin-1 Supplemental. -// Not implemented. -case'/':this.gcharset=3;this.state=charset;i--;break;// ESC N -// Single Shift Select of G2 Character Set -// ( SS2 is 0x8e). This affects next character only. -case'N':break;// ESC O -// Single Shift Select of G3 Character Set -// ( SS3 is 0x8f). This affects next character only. -case'O':break;// ESC n -// Invoke the G2 Character Set as GL (LS2). -case'n':this.setgLevel(2);break;// ESC o -// Invoke the G3 Character Set as GL (LS3). -case'o':this.setgLevel(3);break;// ESC | -// Invoke the G3 Character Set as GR (LS3R). -case'|':this.setgLevel(3);break;// ESC } -// Invoke the G2 Character Set as GR (LS2R). -case'}':this.setgLevel(2);break;// ESC ~ -// Invoke the G1 Character Set as GR (LS1R). -case'~':this.setgLevel(1);break;// ESC 7 Save Cursor (DECSC). -case'7':this.saveCursor();this.state=normal;break;// ESC 8 Restore Cursor (DECRC). -case'8':this.restoreCursor();this.state=normal;break;// ESC # 3 DEC line height/width -case'#':this.state=normal;i++;break;// ESC H Tab Set (HTS is 0x88). -case'H':this.tabSet();break;// ESC = Application Keypad (DECKPAM). -case'=':this.log('Serial port requested application keypad.');this.applicationKeypad=true;this.viewport.syncScrollArea();this.state=normal;break;// ESC > Normal Keypad (DECKPNM). -case'>':this.log('Switching back to normal keypad.');this.applicationKeypad=false;this.viewport.syncScrollArea();this.state=normal;break;default:this.state=normal;this.error('Unknown ESC control: %s.',ch);break;}break;case charset:switch(ch){case'0':// DEC Special Character and Line Drawing Set. -cs=Terminal.charsets.SCLD;break;case'A':// UK -cs=Terminal.charsets.UK;break;case'B':// United States (USASCII). -cs=Terminal.charsets.US;break;case'4':// Dutch -cs=Terminal.charsets.Dutch;break;case'C':// Finnish -case'5':cs=Terminal.charsets.Finnish;break;case'R':// French -cs=Terminal.charsets.French;break;case'Q':// FrenchCanadian -cs=Terminal.charsets.FrenchCanadian;break;case'K':// German -cs=Terminal.charsets.German;break;case'Y':// Italian -cs=Terminal.charsets.Italian;break;case'E':// NorwegianDanish -case'6':cs=Terminal.charsets.NorwegianDanish;break;case'Z':// Spanish -cs=Terminal.charsets.Spanish;break;case'H':// Swedish -case'7':cs=Terminal.charsets.Swedish;break;case'=':// Swiss -cs=Terminal.charsets.Swiss;break;case'/':// ISOLatin (actually /A) -cs=Terminal.charsets.ISOLatin;i++;break;default:// Default -cs=Terminal.charsets.US;break;}this.setgCharset(this.gcharset,cs);this.gcharset=null;this.state=normal;break;case osc:// OSC Ps ; Pt ST -// OSC Ps ; Pt BEL -// Set Text Parameters. -if(ch==='\x1b'||ch==='\x07'){if(ch==='\x1b')i++;this.params.push(this.currentParam);switch(this.params[0]){case 0:case 1:case 2:if(this.params[1]){this.title=this.params[1];this.handleTitle(this.title);}break;case 3:// set X property -break;case 4:case 5:// change dynamic colors -break;case 10:case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:// change dynamic ui colors -break;case 46:// change log file -break;case 50:// dynamic font -break;case 51:// emacs shell -break;case 52:// manipulate selection data -break;case 104:case 105:case 110:case 111:case 112:case 113:case 114:case 115:case 116:case 117:case 118:// reset colors -break;}this.params=[];this.currentParam=0;this.state=normal;}else{if(!this.params.length){if(ch>='0'&&ch<='9'){this.currentParam=this.currentParam*10+ch.charCodeAt(0)-48;}else if(ch===';'){this.params.push(this.currentParam);this.currentParam='';}}else{this.currentParam+=ch;}}break;case csi:// '?', '>', '!' -if(ch==='?'||ch==='>'||ch==='!'){this.prefix=ch;break;}// 0 - 9 -if(ch>='0'&&ch<='9'){this.currentParam=this.currentParam*10+ch.charCodeAt(0)-48;break;}// '$', '"', ' ', '\'' -if(ch==='$'||ch==='"'||ch===' '||ch==='\''){this.postfix=ch;break;}this.params.push(this.currentParam);this.currentParam=0;// ';' -if(ch===';')break;this.state=normal;switch(ch){// CSI Ps A -// Cursor Up Ps Times (default = 1) (CUU). -case'A':this.cursorUp(this.params);break;// CSI Ps B -// Cursor Down Ps Times (default = 1) (CUD). -case'B':this.cursorDown(this.params);break;// CSI Ps C -// Cursor Forward Ps Times (default = 1) (CUF). -case'C':this.cursorForward(this.params);break;// CSI Ps D -// Cursor Backward Ps Times (default = 1) (CUB). -case'D':this.cursorBackward(this.params);break;// CSI Ps ; Ps H -// Cursor Position [row;column] (default = [1,1]) (CUP). -case'H':this.cursorPos(this.params);break;// CSI Ps J Erase in Display (ED). -case'J':this.eraseInDisplay(this.params);break;// CSI Ps K Erase in Line (EL). -case'K':this.eraseInLine(this.params);break;// CSI Pm m Character Attributes (SGR). -case'm':if(!this.prefix){this.charAttributes(this.params);}break;// CSI Ps n Device Status Report (DSR). -case'n':if(!this.prefix){this.deviceStatus(this.params);}break;/** - * Additions - */// CSI Ps @ -// Insert Ps (Blank) Character(s) (default = 1) (ICH). -case'@':this.insertChars(this.params);break;// CSI Ps E -// Cursor Next Line Ps Times (default = 1) (CNL). -case'E':this.cursorNextLine(this.params);break;// CSI Ps F -// Cursor Preceding Line Ps Times (default = 1) (CNL). -case'F':this.cursorPrecedingLine(this.params);break;// CSI Ps G -// Cursor Character Absolute [column] (default = [row,1]) (CHA). -case'G':this.cursorCharAbsolute(this.params);break;// CSI Ps L -// Insert Ps Line(s) (default = 1) (IL). -case'L':this.insertLines(this.params);break;// CSI Ps M -// Delete Ps Line(s) (default = 1) (DL). -case'M':this.deleteLines(this.params);break;// CSI Ps P -// Delete Ps Character(s) (default = 1) (DCH). -case'P':this.deleteChars(this.params);break;// CSI Ps X -// Erase Ps Character(s) (default = 1) (ECH). -case'X':this.eraseChars(this.params);break;// CSI Pm ` Character Position Absolute -// [column] (default = [row,1]) (HPA). -case'`':this.charPosAbsolute(this.params);break;// 141 61 a * HPR - -// Horizontal Position Relative -case'a':this.HPositionRelative(this.params);break;// CSI P s c -// Send Device Attributes (Primary DA). -// CSI > P s c -// Send Device Attributes (Secondary DA) -case'c':this.sendDeviceAttributes(this.params);break;// CSI Pm d -// Line Position Absolute [row] (default = [1,column]) (VPA). -case'd':this.linePosAbsolute(this.params);break;// 145 65 e * VPR - Vertical Position Relative -case'e':this.VPositionRelative(this.params);break;// CSI Ps ; Ps f -// Horizontal and Vertical Position [row;column] (default = -// [1,1]) (HVP). -case'f':this.HVPosition(this.params);break;// CSI Pm h Set Mode (SM). -// CSI ? Pm h - mouse escape codes, cursor escape codes -case'h':this.setMode(this.params);break;// CSI Pm l Reset Mode (RM). -// CSI ? Pm l -case'l':this.resetMode(this.params);break;// CSI Ps ; Ps r -// Set Scrolling Region [top;bottom] (default = full size of win- -// dow) (DECSTBM). -// CSI ? Pm r -case'r':this.setScrollRegion(this.params);break;// CSI s -// Save cursor (ANSI.SYS). -case's':this.saveCursor(this.params);break;// CSI u -// Restore cursor (ANSI.SYS). -case'u':this.restoreCursor(this.params);break;/** - * Lesser Used - */// CSI Ps I -// Cursor Forward Tabulation Ps tab stops (default = 1) (CHT). -case'I':this.cursorForwardTab(this.params);break;// CSI Ps S Scroll up Ps lines (default = 1) (SU). -case'S':this.scrollUp(this.params);break;// CSI Ps T Scroll down Ps lines (default = 1) (SD). -// CSI Ps ; Ps ; Ps ; Ps ; Ps T -// CSI > Ps; Ps T -case'T':// if (this.prefix === '>') { -// this.resetTitleModes(this.params); -// break; -// } -// if (this.params.length > 2) { -// this.initMouseTracking(this.params); -// break; -// } -if(this.params.length<2&&!this.prefix){this.scrollDown(this.params);}break;// CSI Ps Z -// Cursor Backward Tabulation Ps tab stops (default = 1) (CBT). -case'Z':this.cursorBackwardTab(this.params);break;// CSI Ps b Repeat the preceding graphic character Ps times (REP). -case'b':this.repeatPrecedingCharacter(this.params);break;// CSI Ps g Tab Clear (TBC). -case'g':this.tabClear(this.params);break;// CSI Pm i Media Copy (MC). -// CSI ? Pm i -// case 'i': -// this.mediaCopy(this.params); -// break; -// CSI Pm m Character Attributes (SGR). -// CSI > Ps; Ps m -// case 'm': // duplicate -// if (this.prefix === '>') { -// this.setResources(this.params); -// } else { -// this.charAttributes(this.params); -// } -// break; -// CSI Ps n Device Status Report (DSR). -// CSI > Ps n -// case 'n': // duplicate -// if (this.prefix === '>') { -// this.disableModifiers(this.params); -// } else { -// this.deviceStatus(this.params); -// } -// break; -// CSI > Ps p Set pointer mode. -// CSI ! p Soft terminal reset (DECSTR). -// CSI Ps$ p -// Request ANSI mode (DECRQM). -// CSI ? Ps$ p -// Request DEC private mode (DECRQM). -// CSI Ps ; Ps " p -case'p':switch(this.prefix){// case '>': -// this.setPointerMode(this.params); -// break; -case'!':this.softReset(this.params);break;// case '?': -// if (this.postfix === '$') { -// this.requestPrivateMode(this.params); -// } -// break; -// default: -// if (this.postfix === '"') { -// this.setConformanceLevel(this.params); -// } else if (this.postfix === '$') { -// this.requestAnsiMode(this.params); -// } -// break; -}break;// CSI Ps q Load LEDs (DECLL). -// CSI Ps SP q -// CSI Ps " q -// case 'q': -// if (this.postfix === ' ') { -// this.setCursorStyle(this.params); -// break; -// } -// if (this.postfix === '"') { -// this.setCharProtectionAttr(this.params); -// break; -// } -// this.loadLEDs(this.params); -// break; -// CSI Ps ; Ps r -// Set Scrolling Region [top;bottom] (default = full size of win- -// dow) (DECSTBM). -// CSI ? Pm r -// CSI Pt; Pl; Pb; Pr; Ps$ r -// case 'r': // duplicate -// if (this.prefix === '?') { -// this.restorePrivateValues(this.params); -// } else if (this.postfix === '$') { -// this.setAttrInRectangle(this.params); -// } else { -// this.setScrollRegion(this.params); -// } -// break; -// CSI s Save cursor (ANSI.SYS). -// CSI ? Pm s -// case 's': // duplicate -// if (this.prefix === '?') { -// this.savePrivateValues(this.params); -// } else { -// this.saveCursor(this.params); -// } -// break; -// CSI Ps ; Ps ; Ps t -// CSI Pt; Pl; Pb; Pr; Ps$ t -// CSI > Ps; Ps t -// CSI Ps SP t -// case 't': -// if (this.postfix === '$') { -// this.reverseAttrInRectangle(this.params); -// } else if (this.postfix === ' ') { -// this.setWarningBellVolume(this.params); -// } else { -// if (this.prefix === '>') { -// this.setTitleModeFeature(this.params); -// } else { -// this.manipulateWindow(this.params); -// } -// } -// break; -// CSI u Restore cursor (ANSI.SYS). -// CSI Ps SP u -// case 'u': // duplicate -// if (this.postfix === ' ') { -// this.setMarginBellVolume(this.params); -// } else { -// this.restoreCursor(this.params); -// } -// break; -// CSI Pt; Pl; Pb; Pr; Pp; Pt; Pl; Pp$ v -// case 'v': -// if (this.postfix === '$') { -// this.copyRectagle(this.params); -// } -// break; -// CSI Pt ; Pl ; Pb ; Pr ' w -// case 'w': -// if (this.postfix === '\'') { -// this.enableFilterRectangle(this.params); -// } -// break; -// CSI Ps x Request Terminal Parameters (DECREQTPARM). -// CSI Ps x Select Attribute Change Extent (DECSACE). -// CSI Pc; Pt; Pl; Pb; Pr$ x -// case 'x': -// if (this.postfix === '$') { -// this.fillRectangle(this.params); -// } else { -// this.requestParameters(this.params); -// //this.__(this.params); -// } -// break; -// CSI Ps ; Pu ' z -// CSI Pt; Pl; Pb; Pr$ z -// case 'z': -// if (this.postfix === '\'') { -// this.enableLocatorReporting(this.params); -// } else if (this.postfix === '$') { -// this.eraseRectangle(this.params); -// } -// break; -// CSI Pm ' { -// CSI Pt; Pl; Pb; Pr$ { -// case '{': -// if (this.postfix === '\'') { -// this.setLocatorEvents(this.params); -// } else if (this.postfix === '$') { -// this.selectiveEraseRectangle(this.params); -// } -// break; -// CSI Ps ' | -// case '|': -// if (this.postfix === '\'') { -// this.requestLocatorPosition(this.params); -// } -// break; -// CSI P m SP } -// Insert P s Column(s) (default = 1) (DECIC), VT420 and up. -// case '}': -// if (this.postfix === ' ') { -// this.insertColumns(this.params); -// } -// break; -// CSI P m SP ~ -// Delete P s Column(s) (default = 1) (DECDC), VT420 and up -// case '~': -// if (this.postfix === ' ') { -// this.deleteColumns(this.params); -// } -// break; -default:this.error('Unknown CSI code: %s.',ch);break;}this.prefix='';this.postfix='';break;case dcs:if(ch==='\x1b'||ch==='\x07'){if(ch==='\x1b')i++;switch(this.prefix){// User-Defined Keys (DECUDK). -case'':break;// Request Status String (DECRQSS). -// test: echo -e '\eP$q"p\e\\' -case'$q':var pt=this.currentParam,valid=false;switch(pt){// DECSCA -case'"q':pt='0"q';break;// DECSCL -case'"p':pt='61"p';break;// DECSTBM -case'r':pt=''+(this.scrollTop+1)+';'+(this.scrollBottom+1)+'r';break;// SGR -case'm':pt='0m';break;default:this.error('Unknown DCS Pt: %s.',pt);pt='';break;}this.send('\x1bP'+ +valid+'$r'+pt+'\x1b\\');break;// Set Termcap/Terminfo Data (xterm, experimental). -case'+p':break;// Request Termcap/Terminfo String (xterm, experimental) -// Regular xterm does not even respond to this sequence. -// This can cause a small glitch in vim. -// test: echo -ne '\eP+q6b64\e\\' -case'+q':var pt=this.currentParam,valid=false;this.send('\x1bP'+ +valid+'+r'+pt+'\x1b\\');break;default:this.error('Unknown DCS prefix: %s.',this.prefix);break;}this.currentParam=0;this.prefix='';this.state=normal;}else if(!this.currentParam){if(!this.prefix&&ch!=='$'&&ch!=='+'){this.currentParam=ch;}else if(this.prefix.length===2){this.currentParam=ch;}else{this.prefix+=ch;}}else{this.currentParam+=ch;}break;case ignore:// For PM and APC. -if(ch==='\x1b'||ch==='\x07'){if(ch==='\x1b')i++;this.state=normal;}break;}}this.updateRange(this.y);this.refresh(this.refreshStart,this.refreshEnd);};/** - * Writes text to the terminal, followed by a break line character (\n). - * @param {string} text The text to write to the terminal. - */Terminal.prototype.writeln=function(data){this.write(data+'\r\n');};/** - * Attaches a custom keydown handler which is run before keys are processed, giving consumers of - * xterm.js ultimate control as to what keys should be processed by the terminal and what keys - * should not. - * @param {function} customKeydownHandler The custom KeyboardEvent handler to attach. This is a - * function that takes a KeyboardEvent, allowing consumers to stop propogation and/or prevent - * the default action. The function returns whether the event should be processed by xterm.js. - */Terminal.prototype.attachCustomKeydownHandler=function(customKeydownHandler){this.customKeydownHandler=customKeydownHandler;};/** - * Handle a keydown event - * Key Resources: - * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent - * @param {KeyboardEvent} ev The keydown event to be handled. - */Terminal.prototype.keyDown=function(ev){if(this.customKeydownHandler&&this.customKeydownHandler(ev)===false){return false;}if(!this.compositionHelper.keydown.bind(this.compositionHelper)(ev)){return false;}var self=this;var result=this.evaluateKeyEscapeSequence(ev);if(result.scrollDisp){this.scrollDisp(result.scrollDisp);return this.cancel(ev,true);}if(isThirdLevelShift(this,ev)){return true;}if(result.cancel){// The event is canceled at the end already, is this necessary? -this.cancel(ev,true);}if(!result.key){return true;}this.emit('keydown',ev);this.emit('key',result.key,ev);this.showCursor();this.handler(result.key);return this.cancel(ev,true);};/** - * Returns an object that determines how a KeyboardEvent should be handled. The key of the - * returned value is the new key code to pass to the PTY. - * - * Reference: http://invisible-island.net/xterm/ctlseqs/ctlseqs.html - * @param {KeyboardEvent} ev The keyboard event to be translated to key escape sequence. - */Terminal.prototype.evaluateKeyEscapeSequence=function(ev){var result={// Whether to cancel event propogation (NOTE: this may not be needed since the event is -// canceled at the end of keyDown -cancel:false,// The new key even to emit -key:undefined,// The number of characters to scroll, if this is defined it will cancel the event -scrollDisp:undefined};var modifiers=ev.shiftKey<<0|ev.altKey<<1|ev.ctrlKey<<2|ev.metaKey<<3;switch(ev.keyCode){case 8:// backspace -if(ev.shiftKey){result.key='\x08';// ^H -break;}result.key='\x7f';// ^? -break;case 9:// tab -if(ev.shiftKey){result.key='\x1b[Z';break;}result.key='\t';result.cancel=true;break;case 13:// return/enter -result.key='\r';result.cancel=true;break;case 27:// escape -result.key='\x1b';result.cancel=true;break;case 37:// left-arrow -if(modifiers){result.key='\x1b[1;'+(modifiers+1)+'D';// HACK: Make Alt + left-arrow behave like Ctrl + left-arrow: move one word backwards -// http://unix.stackexchange.com/a/108106 -if(result.key=='\x1b[1;3D'){result.key='\x1b[1;5D';}}else if(this.applicationCursor){result.key='\x1bOD';}else{result.key='\x1b[D';}break;case 39:// right-arrow -if(modifiers){result.key='\x1b[1;'+(modifiers+1)+'C';// HACK: Make Alt + right-arrow behave like Ctrl + right-arrow: move one word forward -// http://unix.stackexchange.com/a/108106 -if(result.key=='\x1b[1;3C'){result.key='\x1b[1;5C';}}else if(this.applicationCursor){result.key='\x1bOC';}else{result.key='\x1b[C';}break;case 38:// up-arrow -if(modifiers){result.key='\x1b[1;'+(modifiers+1)+'A';// HACK: Make Alt + up-arrow behave like Ctrl + up-arrow -// http://unix.stackexchange.com/a/108106 -if(result.key=='\x1b[1;3A'){result.key='\x1b[1;5A';}}else if(this.applicationCursor){result.key='\x1bOA';}else{result.key='\x1b[A';}break;case 40:// down-arrow -if(modifiers){result.key='\x1b[1;'+(modifiers+1)+'B';// HACK: Make Alt + down-arrow behave like Ctrl + down-arrow -// http://unix.stackexchange.com/a/108106 -if(result.key=='\x1b[1;3B'){result.key='\x1b[1;5B';}}else if(this.applicationCursor){result.key='\x1bOB';}else{result.key='\x1b[B';}break;case 45:// insert -if(!ev.shiftKey&&!ev.ctrlKey){// <Ctrl> or <Shift> + <Insert> are used to -// copy-paste on some systems. -result.key='\x1b[2~';}break;case 46:// delete -if(modifiers){result.key='\x1b[3;'+(modifiers+1)+'~';}else{result.key='\x1b[3~';}break;case 36:// home -if(modifiers)result.key='\x1b[1;'+(modifiers+1)+'H';else if(this.applicationCursor)result.key='\x1bOH';else result.key='\x1b[H';break;case 35:// end -if(modifiers)result.key='\x1b[1;'+(modifiers+1)+'F';else if(this.applicationCursor)result.key='\x1bOF';else result.key='\x1b[F';break;case 33:// page up -if(ev.shiftKey){result.scrollDisp=-(this.rows-1);}else{result.key='\x1b[5~';}break;case 34:// page down -if(ev.shiftKey){result.scrollDisp=this.rows-1;}else{result.key='\x1b[6~';}break;case 112:// F1-F12 -if(modifiers){result.key='\x1b[1;'+(modifiers+1)+'P';}else{result.key='\x1bOP';}break;case 113:if(modifiers){result.key='\x1b[1;'+(modifiers+1)+'Q';}else{result.key='\x1bOQ';}break;case 114:if(modifiers){result.key='\x1b[1;'+(modifiers+1)+'R';}else{result.key='\x1bOR';}break;case 115:if(modifiers){result.key='\x1b[1;'+(modifiers+1)+'S';}else{result.key='\x1bOS';}break;case 116:if(modifiers){result.key='\x1b[15;'+(modifiers+1)+'~';}else{result.key='\x1b[15~';}break;case 117:if(modifiers){result.key='\x1b[17;'+(modifiers+1)+'~';}else{result.key='\x1b[17~';}break;case 118:if(modifiers){result.key='\x1b[18;'+(modifiers+1)+'~';}else{result.key='\x1b[18~';}break;case 119:if(modifiers){result.key='\x1b[19;'+(modifiers+1)+'~';}else{result.key='\x1b[19~';}break;case 120:if(modifiers){result.key='\x1b[20;'+(modifiers+1)+'~';}else{result.key='\x1b[20~';}break;case 121:if(modifiers){result.key='\x1b[21;'+(modifiers+1)+'~';}else{result.key='\x1b[21~';}break;case 122:if(modifiers){result.key='\x1b[23;'+(modifiers+1)+'~';}else{result.key='\x1b[23~';}break;case 123:if(modifiers){result.key='\x1b[24;'+(modifiers+1)+'~';}else{result.key='\x1b[24~';}break;default:// a-z and space -if(ev.ctrlKey&&!ev.shiftKey&&!ev.altKey&&!ev.metaKey){if(ev.keyCode>=65&&ev.keyCode<=90){result.key=String.fromCharCode(ev.keyCode-64);}else if(ev.keyCode===32){// NUL -result.key=String.fromCharCode(0);}else if(ev.keyCode>=51&&ev.keyCode<=55){// escape, file sep, group sep, record sep, unit sep -result.key=String.fromCharCode(ev.keyCode-51+27);}else if(ev.keyCode===56){// delete -result.key=String.fromCharCode(127);}else if(ev.keyCode===219){// ^[ - escape -result.key=String.fromCharCode(27);}else if(ev.keyCode===221){// ^] - group sep -result.key=String.fromCharCode(29);}}else if(!this.isMac&&ev.altKey&&!ev.ctrlKey&&!ev.metaKey){// On Mac this is a third level shift. Use <Esc> instead. -if(ev.keyCode>=65&&ev.keyCode<=90){result.key='\x1b'+String.fromCharCode(ev.keyCode+32);}else if(ev.keyCode===192){result.key='\x1b`';}else if(ev.keyCode>=48&&ev.keyCode<=57){result.key='\x1b'+(ev.keyCode-48);}}break;}return result;};/** - * Set the G level of the terminal - * @param g - */Terminal.prototype.setgLevel=function(g){this.glevel=g;this.charset=this.charsets[g];};/** - * Set the charset for the given G level of the terminal - * @param g - * @param charset - */Terminal.prototype.setgCharset=function(g,charset){this.charsets[g]=charset;if(this.glevel===g){this.charset=charset;}};/** - * Handle a keypress event. - * Key Resources: - * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent - * @param {KeyboardEvent} ev The keypress event to be handled. - */Terminal.prototype.keyPress=function(ev){var key;this.cancel(ev);if(ev.charCode){key=ev.charCode;}else if(ev.which==null){key=ev.keyCode;}else if(ev.which!==0&&ev.charCode!==0){key=ev.which;}else{return false;}if(!key||(ev.altKey||ev.ctrlKey||ev.metaKey)&&!isThirdLevelShift(this,ev)){return false;}key=String.fromCharCode(key);this.emit('keypress',key,ev);this.emit('key',key,ev);this.showCursor();this.handler(key);return false;};/** - * Send data for handling to the terminal - * @param {string} data - */Terminal.prototype.send=function(data){var self=this;if(!this.queue){setTimeout(function(){self.handler(self.queue);self.queue='';},1);}this.queue+=data;};/** - * Ring the bell. - * Note: We could do sweet things with webaudio here - */Terminal.prototype.bell=function(){if(!this.visualBell)return;var self=this;this.element.style.borderColor='white';setTimeout(function(){self.element.style.borderColor='';},10);if(this.popOnBell)this.focus();};/** - * Log the current state to the console. - */Terminal.prototype.log=function(){if(!this.debug)return;if(!this.context.console||!this.context.console.log)return;var args=Array.prototype.slice.call(arguments);this.context.console.log.apply(this.context.console,args);};/** - * Log the current state as error to the console. - */Terminal.prototype.error=function(){if(!this.debug)return;if(!this.context.console||!this.context.console.error)return;var args=Array.prototype.slice.call(arguments);this.context.console.error.apply(this.context.console,args);};/** - * Resizes the terminal. - * - * @param {number} x The number of columns to resize to. - * @param {number} y The number of rows to resize to. - */Terminal.prototype.resize=function(x,y){var line,el,i,j,ch,addToY;if(x===this.cols&&y===this.rows){return;}if(x<1)x=1;if(y<1)y=1;// resize cols -j=this.cols;if(j<x){ch=[this.defAttr,' ',1];// does xterm use the default attr? -i=this.lines.length;while(i--){while(this.lines[i].length<x){this.lines[i].push(ch);}}}else{// (j > x) -i=this.lines.length;while(i--){while(this.lines[i].length>x){this.lines[i].pop();}}}this.setupStops(j);this.cols=x;// resize rows -j=this.rows;addToY=0;if(j<y){el=this.element;while(j++<y){// y is rows, not this.y -if(this.lines.length<y+this.ybase){if(this.ybase>0&&this.lines.length<=this.ybase+this.y+addToY+1){// There is room above the buffer and there are no empty elements below the line, -// scroll up -this.ybase--;addToY++;if(this.ydisp>0){// Viewport is at the top of the buffer, must increase downwards -this.ydisp--;}}else{// Add a blank line if there is no buffer left at the top to scroll to, or if there -// are blank lines after the cursor -this.lines.push(this.blankLine());}}if(this.children.length<y){this.insertRow();}}}else{// (j > y) -while(j-->y){if(this.lines.length>y+this.ybase){if(this.lines.length>this.ybase+this.y+1){// The line is a blank line below the cursor, remove it -this.lines.pop();}else{// The line is the cursor, scroll down -this.ybase++;this.ydisp++;}}if(this.children.length>y){el=this.children.shift();if(!el)continue;el.parentNode.removeChild(el);}}}this.rows=y;// Make sure that the cursor stays on screen -if(this.y>=y){this.y=y-1;}if(addToY){this.y+=addToY;}if(this.x>=x){this.x=x-1;}this.scrollTop=0;this.scrollBottom=y-1;this.refresh(0,this.rows-1);this.normal=null;this.emit('resize',{terminal:this,cols:x,rows:y});};/** - * Updates the range of rows to refresh - * @param {number} y The number of rows to refresh next. - */Terminal.prototype.updateRange=function(y){if(y<this.refreshStart)this.refreshStart=y;if(y>this.refreshEnd)this.refreshEnd=y;// if (y > this.refreshEnd) { -// this.refreshEnd = y; -// if (y > this.rows - 1) { -// this.refreshEnd = this.rows - 1; -// } -// } -};/** - * Set the range of refreshing to the maximyum value - */Terminal.prototype.maxRange=function(){this.refreshStart=0;this.refreshEnd=this.rows-1;};/** - * Setup the tab stops. - * @param {number} i - */Terminal.prototype.setupStops=function(i){if(i!=null){if(!this.tabs[i]){i=this.prevStop(i);}}else{this.tabs={};i=0;}for(;i<this.cols;i+=8){this.tabs[i]=true;}};/** - * Move the cursor to the previous tab stop from the given position (default is current). - * @param {number} x The position to move the cursor to the previous tab stop. - */Terminal.prototype.prevStop=function(x){if(x==null)x=this.x;while(!this.tabs[--x]&&x>0){}return x>=this.cols?this.cols-1:x<0?0:x;};/** - * Move the cursor one tab stop forward from the given position (default is current). - * @param {number} x The position to move the cursor one tab stop forward. - */Terminal.prototype.nextStop=function(x){if(x==null)x=this.x;while(!this.tabs[++x]&&x<this.cols){}return x>=this.cols?this.cols-1:x<0?0:x;};/** - * Erase in the identified line everything from "x" to the end of the line (right). - * @param {number} x The column from which to start erasing to the end of the line. - * @param {number} y The line in which to operate. - */Terminal.prototype.eraseRight=function(x,y){var line=this.lines[this.ybase+y],ch=[this.eraseAttr(),' ',1];// xterm -for(;x<this.cols;x++){line[x]=ch;}this.updateRange(y);};/** - * Erase in the identified line everything from "x" to the start of the line (left). - * @param {number} x The column from which to start erasing to the start of the line. - * @param {number} y The line in which to operate. - */Terminal.prototype.eraseLeft=function(x,y){var line=this.lines[this.ybase+y],ch=[this.eraseAttr(),' ',1];// xterm -x++;while(x--){line[x]=ch;}this.updateRange(y);};/** - * Clears the entire buffer, making the prompt line the new first line. - */Terminal.prototype.clear=function(){if(this.ybase===0&&this.y===0){// Don't clear if it's already clear -return;}this.lines=[this.lines[this.ybase+this.y]];this.ydisp=0;this.ybase=0;this.y=0;for(var i=1;i<this.rows;i++){this.lines.push(this.blankLine());}this.refresh(0,this.rows-1);this.emit('scroll',this.ydisp);};/** - * Erase all content in the given line - * @param {number} y The line to erase all of its contents. - */Terminal.prototype.eraseLine=function(y){this.eraseRight(0,y);};/** - * Return the data array of a blank line/ - * @param {number} cur First bunch of data for each "blank" character. - */Terminal.prototype.blankLine=function(cur){var attr=cur?this.eraseAttr():this.defAttr;var ch=[attr,' ',1]// width defaults to 1 halfwidth character -,line=[],i=0;for(;i<this.cols;i++){line[i]=ch;}return line;};/** - * If cur return the back color xterm feature attribute. Else return defAttr. - * @param {object} cur - */Terminal.prototype.ch=function(cur){return cur?[this.eraseAttr(),' ',1]:[this.defAttr,' ',1];};/** - * Evaluate if the current erminal is the given argument. - * @param {object} term The terminal to evaluate - */Terminal.prototype.is=function(term){var name=this.termName;return(name+'').indexOf(term)===0;};/** - * Emit the 'data' event and populate the given data. - * @param {string} data The data to populate in the event. - */Terminal.prototype.handler=function(data){this.emit('data',data);};/** - * Emit the 'title' event and populate the given title. - * @param {string} title The title to populate in the event. - */Terminal.prototype.handleTitle=function(title){this.emit('title',title);};/** - * ESC - *//** - * ESC D Index (IND is 0x84). - */Terminal.prototype.index=function(){this.y++;if(this.y>this.scrollBottom){this.y--;this.scroll();}this.state=normal;};/** - * ESC M Reverse Index (RI is 0x8d). - */Terminal.prototype.reverseIndex=function(){var j;this.y--;if(this.y<this.scrollTop){this.y++;// possibly move the code below to term.reverseScroll(); -// test: echo -ne '\e[1;1H\e[44m\eM\e[0m' -// blankLine(true) is xterm/linux behavior -this.lines.splice(this.y+this.ybase,0,this.blankLine(true));j=this.rows-1-this.scrollBottom;this.lines.splice(this.rows-1+this.ybase-j+1,1);// this.maxRange(); -this.updateRange(this.scrollTop);this.updateRange(this.scrollBottom);}this.state=normal;};/** - * ESC c Full Reset (RIS). - */Terminal.prototype.reset=function(){this.options.rows=this.rows;this.options.cols=this.cols;var customKeydownHandler=this.customKeydownHandler;Terminal.call(this,this.options);this.customKeydownHandler=customKeydownHandler;this.refresh(0,this.rows-1);this.viewport.syncScrollArea();};/** - * ESC H Tab Set (HTS is 0x88). - */Terminal.prototype.tabSet=function(){this.tabs[this.x]=true;this.state=normal;};/** - * CSI - *//** - * CSI Ps A - * Cursor Up Ps Times (default = 1) (CUU). - */Terminal.prototype.cursorUp=function(params){var param=params[0];if(param<1)param=1;this.y-=param;if(this.y<0)this.y=0;};/** - * CSI Ps B - * Cursor Down Ps Times (default = 1) (CUD). - */Terminal.prototype.cursorDown=function(params){var param=params[0];if(param<1)param=1;this.y+=param;if(this.y>=this.rows){this.y=this.rows-1;}};/** - * CSI Ps C - * Cursor Forward Ps Times (default = 1) (CUF). - */Terminal.prototype.cursorForward=function(params){var param=params[0];if(param<1)param=1;this.x+=param;if(this.x>=this.cols){this.x=this.cols-1;}};/** - * CSI Ps D - * Cursor Backward Ps Times (default = 1) (CUB). - */Terminal.prototype.cursorBackward=function(params){var param=params[0];if(param<1)param=1;this.x-=param;if(this.x<0)this.x=0;};/** - * CSI Ps ; Ps H - * Cursor Position [row;column] (default = [1,1]) (CUP). - */Terminal.prototype.cursorPos=function(params){var row,col;row=params[0]-1;if(params.length>=2){col=params[1]-1;}else{col=0;}if(row<0){row=0;}else if(row>=this.rows){row=this.rows-1;}if(col<0){col=0;}else if(col>=this.cols){col=this.cols-1;}this.x=col;this.y=row;};/** - * CSI Ps J Erase in Display (ED). - * Ps = 0 -> Erase Below (default). - * Ps = 1 -> Erase Above. - * Ps = 2 -> Erase All. - * Ps = 3 -> Erase Saved Lines (xterm). - * CSI ? Ps J - * Erase in Display (DECSED). - * Ps = 0 -> Selective Erase Below (default). - * Ps = 1 -> Selective Erase Above. - * Ps = 2 -> Selective Erase All. - */Terminal.prototype.eraseInDisplay=function(params){var j;switch(params[0]){case 0:this.eraseRight(this.x,this.y);j=this.y+1;for(;j<this.rows;j++){this.eraseLine(j);}break;case 1:this.eraseLeft(this.x,this.y);j=this.y;while(j--){this.eraseLine(j);}break;case 2:j=this.rows;while(j--){this.eraseLine(j);}break;case 3:;// no saved lines -break;}};/** - * CSI Ps K Erase in Line (EL). - * Ps = 0 -> Erase to Right (default). - * Ps = 1 -> Erase to Left. - * Ps = 2 -> Erase All. - * CSI ? Ps K - * Erase in Line (DECSEL). - * Ps = 0 -> Selective Erase to Right (default). - * Ps = 1 -> Selective Erase to Left. - * Ps = 2 -> Selective Erase All. - */Terminal.prototype.eraseInLine=function(params){switch(params[0]){case 0:this.eraseRight(this.x,this.y);break;case 1:this.eraseLeft(this.x,this.y);break;case 2:this.eraseLine(this.y);break;}};/** - * CSI Pm m Character Attributes (SGR). - * Ps = 0 -> Normal (default). - * Ps = 1 -> Bold. - * Ps = 4 -> Underlined. - * Ps = 5 -> Blink (appears as Bold). - * Ps = 7 -> Inverse. - * Ps = 8 -> Invisible, i.e., hidden (VT300). - * Ps = 2 2 -> Normal (neither bold nor faint). - * Ps = 2 4 -> Not underlined. - * Ps = 2 5 -> Steady (not blinking). - * Ps = 2 7 -> Positive (not inverse). - * Ps = 2 8 -> Visible, i.e., not hidden (VT300). - * Ps = 3 0 -> Set foreground color to Black. - * Ps = 3 1 -> Set foreground color to Red. - * Ps = 3 2 -> Set foreground color to Green. - * Ps = 3 3 -> Set foreground color to Yellow. - * Ps = 3 4 -> Set foreground color to Blue. - * Ps = 3 5 -> Set foreground color to Magenta. - * Ps = 3 6 -> Set foreground color to Cyan. - * Ps = 3 7 -> Set foreground color to White. - * Ps = 3 9 -> Set foreground color to default (original). - * Ps = 4 0 -> Set background color to Black. - * Ps = 4 1 -> Set background color to Red. - * Ps = 4 2 -> Set background color to Green. - * Ps = 4 3 -> Set background color to Yellow. - * Ps = 4 4 -> Set background color to Blue. - * Ps = 4 5 -> Set background color to Magenta. - * Ps = 4 6 -> Set background color to Cyan. - * Ps = 4 7 -> Set background color to White. - * Ps = 4 9 -> Set background color to default (original). - * - * If 16-color support is compiled, the following apply. Assume - * that xterm's resources are set so that the ISO color codes are - * the first 8 of a set of 16. Then the aixterm colors are the - * bright versions of the ISO colors: - * Ps = 9 0 -> Set foreground color to Black. - * Ps = 9 1 -> Set foreground color to Red. - * Ps = 9 2 -> Set foreground color to Green. - * Ps = 9 3 -> Set foreground color to Yellow. - * Ps = 9 4 -> Set foreground color to Blue. - * Ps = 9 5 -> Set foreground color to Magenta. - * Ps = 9 6 -> Set foreground color to Cyan. - * Ps = 9 7 -> Set foreground color to White. - * Ps = 1 0 0 -> Set background color to Black. - * Ps = 1 0 1 -> Set background color to Red. - * Ps = 1 0 2 -> Set background color to Green. - * Ps = 1 0 3 -> Set background color to Yellow. - * Ps = 1 0 4 -> Set background color to Blue. - * Ps = 1 0 5 -> Set background color to Magenta. - * Ps = 1 0 6 -> Set background color to Cyan. - * Ps = 1 0 7 -> Set background color to White. - * - * If xterm is compiled with the 16-color support disabled, it - * supports the following, from rxvt: - * Ps = 1 0 0 -> Set foreground and background color to - * default. - * - * If 88- or 256-color support is compiled, the following apply. - * Ps = 3 8 ; 5 ; Ps -> Set foreground color to the second - * Ps. - * Ps = 4 8 ; 5 ; Ps -> Set background color to the second - * Ps. - */Terminal.prototype.charAttributes=function(params){// Optimize a single SGR0. -if(params.length===1&¶ms[0]===0){this.curAttr=this.defAttr;return;}var l=params.length,i=0,flags=this.curAttr>>18,fg=this.curAttr>>9&0x1ff,bg=this.curAttr&0x1ff,p;for(;i<l;i++){p=params[i];if(p>=30&&p<=37){// fg color 8 -fg=p-30;}else if(p>=40&&p<=47){// bg color 8 -bg=p-40;}else if(p>=90&&p<=97){// fg color 16 -p+=8;fg=p-90;}else if(p>=100&&p<=107){// bg color 16 -p+=8;bg=p-100;}else if(p===0){// default -flags=this.defAttr>>18;fg=this.defAttr>>9&0x1ff;bg=this.defAttr&0x1ff;// flags = 0; -// fg = 0x1ff; -// bg = 0x1ff; -}else if(p===1){// bold text -flags|=1;}else if(p===4){// underlined text -flags|=2;}else if(p===5){// blink -flags|=4;}else if(p===7){// inverse and positive -// test with: echo -e '\e[31m\e[42mhello\e[7mworld\e[27mhi\e[m' -flags|=8;}else if(p===8){// invisible -flags|=16;}else if(p===22){// not bold -flags&=~1;}else if(p===24){// not underlined -flags&=~2;}else if(p===25){// not blink -flags&=~4;}else if(p===27){// not inverse -flags&=~8;}else if(p===28){// not invisible -flags&=~16;}else if(p===39){// reset fg -fg=this.defAttr>>9&0x1ff;}else if(p===49){// reset bg -bg=this.defAttr&0x1ff;}else if(p===38){// fg color 256 -if(params[i+1]===2){i+=2;fg=matchColor(params[i]&0xff,params[i+1]&0xff,params[i+2]&0xff);if(fg===-1)fg=0x1ff;i+=2;}else if(params[i+1]===5){i+=2;p=params[i]&0xff;fg=p;}}else if(p===48){// bg color 256 -if(params[i+1]===2){i+=2;bg=matchColor(params[i]&0xff,params[i+1]&0xff,params[i+2]&0xff);if(bg===-1)bg=0x1ff;i+=2;}else if(params[i+1]===5){i+=2;p=params[i]&0xff;bg=p;}}else if(p===100){// reset fg/bg -fg=this.defAttr>>9&0x1ff;bg=this.defAttr&0x1ff;}else{this.error('Unknown SGR attribute: %d.',p);}}this.curAttr=flags<<18|fg<<9|bg;};/** - * CSI Ps n Device Status Report (DSR). - * Ps = 5 -> Status Report. Result (``OK'') is - * CSI 0 n - * Ps = 6 -> Report Cursor Position (CPR) [row;column]. - * Result is - * CSI r ; c R - * CSI ? Ps n - * Device Status Report (DSR, DEC-specific). - * Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI - * ? r ; c R (assumes page is zero). - * Ps = 1 5 -> Report Printer status as CSI ? 1 0 n (ready). - * or CSI ? 1 1 n (not ready). - * Ps = 2 5 -> Report UDK status as CSI ? 2 0 n (unlocked) - * or CSI ? 2 1 n (locked). - * Ps = 2 6 -> Report Keyboard status as - * CSI ? 2 7 ; 1 ; 0 ; 0 n (North American). - * The last two parameters apply to VT400 & up, and denote key- - * board ready and LK01 respectively. - * Ps = 5 3 -> Report Locator status as - * CSI ? 5 3 n Locator available, if compiled-in, or - * CSI ? 5 0 n No Locator, if not. - */Terminal.prototype.deviceStatus=function(params){if(!this.prefix){switch(params[0]){case 5:// status report -this.send('\x1b[0n');break;case 6:// cursor position -this.send('\x1b['+(this.y+1)+';'+(this.x+1)+'R');break;}}else if(this.prefix==='?'){// modern xterm doesnt seem to -// respond to any of these except ?6, 6, and 5 -switch(params[0]){case 6:// cursor position -this.send('\x1b[?'+(this.y+1)+';'+(this.x+1)+'R');break;case 15:// no printer -// this.send('\x1b[?11n'); -break;case 25:// dont support user defined keys -// this.send('\x1b[?21n'); -break;case 26:// north american keyboard -// this.send('\x1b[?27;1;0;0n'); -break;case 53:// no dec locator/mouse -// this.send('\x1b[?50n'); -break;}}};/** - * Additions - *//** - * CSI Ps @ - * Insert Ps (Blank) Character(s) (default = 1) (ICH). - */Terminal.prototype.insertChars=function(params){var param,row,j,ch;param=params[0];if(param<1)param=1;row=this.y+this.ybase;j=this.x;ch=[this.eraseAttr(),' ',1];// xterm -while(param--&&j<this.cols){this.lines[row].splice(j++,0,ch);this.lines[row].pop();}};/** - * CSI Ps E - * Cursor Next Line Ps Times (default = 1) (CNL). - * same as CSI Ps B ? - */Terminal.prototype.cursorNextLine=function(params){var param=params[0];if(param<1)param=1;this.y+=param;if(this.y>=this.rows){this.y=this.rows-1;}this.x=0;};/** - * CSI Ps F - * Cursor Preceding Line Ps Times (default = 1) (CNL). - * reuse CSI Ps A ? - */Terminal.prototype.cursorPrecedingLine=function(params){var param=params[0];if(param<1)param=1;this.y-=param;if(this.y<0)this.y=0;this.x=0;};/** - * CSI Ps G - * Cursor Character Absolute [column] (default = [row,1]) (CHA). - */Terminal.prototype.cursorCharAbsolute=function(params){var param=params[0];if(param<1)param=1;this.x=param-1;};/** - * CSI Ps L - * Insert Ps Line(s) (default = 1) (IL). - */Terminal.prototype.insertLines=function(params){var param,row,j;param=params[0];if(param<1)param=1;row=this.y+this.ybase;j=this.rows-1-this.scrollBottom;j=this.rows-1+this.ybase-j+1;while(param--){// test: echo -e '\e[44m\e[1L\e[0m' -// blankLine(true) - xterm/linux behavior -this.lines.splice(row,0,this.blankLine(true));this.lines.splice(j,1);}// this.maxRange(); -this.updateRange(this.y);this.updateRange(this.scrollBottom);};/** - * CSI Ps M - * Delete Ps Line(s) (default = 1) (DL). - */Terminal.prototype.deleteLines=function(params){var param,row,j;param=params[0];if(param<1)param=1;row=this.y+this.ybase;j=this.rows-1-this.scrollBottom;j=this.rows-1+this.ybase-j;while(param--){// test: echo -e '\e[44m\e[1M\e[0m' -// blankLine(true) - xterm/linux behavior -this.lines.splice(j+1,0,this.blankLine(true));this.lines.splice(row,1);}// this.maxRange(); -this.updateRange(this.y);this.updateRange(this.scrollBottom);};/** - * CSI Ps P - * Delete Ps Character(s) (default = 1) (DCH). - */Terminal.prototype.deleteChars=function(params){var param,row,ch;param=params[0];if(param<1)param=1;row=this.y+this.ybase;ch=[this.eraseAttr(),' ',1];// xterm -while(param--){this.lines[row].splice(this.x,1);this.lines[row].push(ch);}};/** - * CSI Ps X - * Erase Ps Character(s) (default = 1) (ECH). - */Terminal.prototype.eraseChars=function(params){var param,row,j,ch;param=params[0];if(param<1)param=1;row=this.y+this.ybase;j=this.x;ch=[this.eraseAttr(),' ',1];// xterm -while(param--&&j<this.cols){this.lines[row][j++]=ch;}};/** - * CSI Pm ` Character Position Absolute - * [column] (default = [row,1]) (HPA). - */Terminal.prototype.charPosAbsolute=function(params){var param=params[0];if(param<1)param=1;this.x=param-1;if(this.x>=this.cols){this.x=this.cols-1;}};/** - * 141 61 a * HPR - - * Horizontal Position Relative - * reuse CSI Ps C ? - */Terminal.prototype.HPositionRelative=function(params){var param=params[0];if(param<1)param=1;this.x+=param;if(this.x>=this.cols){this.x=this.cols-1;}};/** - * CSI Ps c Send Device Attributes (Primary DA). - * Ps = 0 or omitted -> request attributes from terminal. The - * response depends on the decTerminalID resource setting. - * -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'') - * -> CSI ? 1 ; 0 c (``VT101 with No Options'') - * -> CSI ? 6 c (``VT102'') - * -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c (``VT220'') - * The VT100-style response parameters do not mean anything by - * themselves. VT220 parameters do, telling the host what fea- - * tures the terminal supports: - * Ps = 1 -> 132-columns. - * Ps = 2 -> Printer. - * Ps = 6 -> Selective erase. - * Ps = 8 -> User-defined keys. - * Ps = 9 -> National replacement character sets. - * Ps = 1 5 -> Technical characters. - * Ps = 2 2 -> ANSI color, e.g., VT525. - * Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode). - * CSI > Ps c - * Send Device Attributes (Secondary DA). - * Ps = 0 or omitted -> request the terminal's identification - * code. The response depends on the decTerminalID resource set- - * ting. It should apply only to VT220 and up, but xterm extends - * this to VT100. - * -> CSI > Pp ; Pv ; Pc c - * where Pp denotes the terminal type - * Pp = 0 -> ``VT100''. - * Pp = 1 -> ``VT220''. - * and Pv is the firmware version (for xterm, this was originally - * the XFree86 patch number, starting with 95). In a DEC termi- - * nal, Pc indicates the ROM cartridge registration number and is - * always zero. - * More information: - * xterm/charproc.c - line 2012, for more information. - * vim responds with ^[[?0c or ^[[?1c after the terminal's response (?) - */Terminal.prototype.sendDeviceAttributes=function(params){if(params[0]>0)return;if(!this.prefix){if(this.is('xterm')||this.is('rxvt-unicode')||this.is('screen')){this.send('\x1b[?1;2c');}else if(this.is('linux')){this.send('\x1b[?6c');}}else if(this.prefix==='>'){// xterm and urxvt -// seem to spit this -// out around ~370 times (?). -if(this.is('xterm')){this.send('\x1b[>0;276;0c');}else if(this.is('rxvt-unicode')){this.send('\x1b[>85;95;0c');}else if(this.is('linux')){// not supported by linux console. -// linux console echoes parameters. -this.send(params[0]+'c');}else if(this.is('screen')){this.send('\x1b[>83;40003;0c');}}};/** - * CSI Pm d - * Line Position Absolute [row] (default = [1,column]) (VPA). - */Terminal.prototype.linePosAbsolute=function(params){var param=params[0];if(param<1)param=1;this.y=param-1;if(this.y>=this.rows){this.y=this.rows-1;}};/** - * 145 65 e * VPR - Vertical Position Relative - * reuse CSI Ps B ? - */Terminal.prototype.VPositionRelative=function(params){var param=params[0];if(param<1)param=1;this.y+=param;if(this.y>=this.rows){this.y=this.rows-1;}};/** - * CSI Ps ; Ps f - * Horizontal and Vertical Position [row;column] (default = - * [1,1]) (HVP). - */Terminal.prototype.HVPosition=function(params){if(params[0]<1)params[0]=1;if(params[1]<1)params[1]=1;this.y=params[0]-1;if(this.y>=this.rows){this.y=this.rows-1;}this.x=params[1]-1;if(this.x>=this.cols){this.x=this.cols-1;}};/** - * CSI Pm h Set Mode (SM). - * Ps = 2 -> Keyboard Action Mode (AM). - * Ps = 4 -> Insert Mode (IRM). - * Ps = 1 2 -> Send/receive (SRM). - * Ps = 2 0 -> Automatic Newline (LNM). - * CSI ? Pm h - * DEC Private Mode Set (DECSET). - * Ps = 1 -> Application Cursor Keys (DECCKM). - * Ps = 2 -> Designate USASCII for character sets G0-G3 - * (DECANM), and set VT100 mode. - * Ps = 3 -> 132 Column Mode (DECCOLM). - * Ps = 4 -> Smooth (Slow) Scroll (DECSCLM). - * Ps = 5 -> Reverse Video (DECSCNM). - * Ps = 6 -> Origin Mode (DECOM). - * Ps = 7 -> Wraparound Mode (DECAWM). - * Ps = 8 -> Auto-repeat Keys (DECARM). - * Ps = 9 -> Send Mouse X & Y on button press. See the sec- - * tion Mouse Tracking. - * Ps = 1 0 -> Show toolbar (rxvt). - * Ps = 1 2 -> Start Blinking Cursor (att610). - * Ps = 1 8 -> Print form feed (DECPFF). - * Ps = 1 9 -> Set print extent to full screen (DECPEX). - * Ps = 2 5 -> Show Cursor (DECTCEM). - * Ps = 3 0 -> Show scrollbar (rxvt). - * Ps = 3 5 -> Enable font-shifting functions (rxvt). - * Ps = 3 8 -> Enter Tektronix Mode (DECTEK). - * Ps = 4 0 -> Allow 80 -> 132 Mode. - * Ps = 4 1 -> more(1) fix (see curses resource). - * Ps = 4 2 -> Enable Nation Replacement Character sets (DECN- - * RCM). - * Ps = 4 4 -> Turn On Margin Bell. - * Ps = 4 5 -> Reverse-wraparound Mode. - * Ps = 4 6 -> Start Logging. This is normally disabled by a - * compile-time option. - * Ps = 4 7 -> Use Alternate Screen Buffer. (This may be dis- - * abled by the titeInhibit resource). - * Ps = 6 6 -> Application keypad (DECNKM). - * Ps = 6 7 -> Backarrow key sends backspace (DECBKM). - * Ps = 1 0 0 0 -> Send Mouse X & Y on button press and - * release. See the section Mouse Tracking. - * Ps = 1 0 0 1 -> Use Hilite Mouse Tracking. - * Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking. - * Ps = 1 0 0 3 -> Use All Motion Mouse Tracking. - * Ps = 1 0 0 4 -> Send FocusIn/FocusOut events. - * Ps = 1 0 0 5 -> Enable Extended Mouse Mode. - * Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt). - * Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt). - * Ps = 1 0 3 4 -> Interpret "meta" key, sets eighth bit. - * (enables the eightBitInput resource). - * Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num- - * Lock keys. (This enables the numLock resource). - * Ps = 1 0 3 6 -> Send ESC when Meta modifies a key. (This - * enables the metaSendsEscape resource). - * Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete - * key. - * Ps = 1 0 3 9 -> Send ESC when Alt modifies a key. (This - * enables the altSendsEscape resource). - * Ps = 1 0 4 0 -> Keep selection even if not highlighted. - * (This enables the keepSelection resource). - * Ps = 1 0 4 1 -> Use the CLIPBOARD selection. (This enables - * the selectToClipboard resource). - * Ps = 1 0 4 2 -> Enable Urgency window manager hint when - * Control-G is received. (This enables the bellIsUrgent - * resource). - * Ps = 1 0 4 3 -> Enable raising of the window when Control-G - * is received. (enables the popOnBell resource). - * Ps = 1 0 4 7 -> Use Alternate Screen Buffer. (This may be - * disabled by the titeInhibit resource). - * Ps = 1 0 4 8 -> Save cursor as in DECSC. (This may be dis- - * abled by the titeInhibit resource). - * Ps = 1 0 4 9 -> Save cursor as in DECSC and use Alternate - * Screen Buffer, clearing it first. (This may be disabled by - * the titeInhibit resource). This combines the effects of the 1 - * 0 4 7 and 1 0 4 8 modes. Use this with terminfo-based - * applications rather than the 4 7 mode. - * Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode. - * Ps = 1 0 5 1 -> Set Sun function-key mode. - * Ps = 1 0 5 2 -> Set HP function-key mode. - * Ps = 1 0 5 3 -> Set SCO function-key mode. - * Ps = 1 0 6 0 -> Set legacy keyboard emulation (X11R6). - * Ps = 1 0 6 1 -> Set VT220 keyboard emulation. - * Ps = 2 0 0 4 -> Set bracketed paste mode. - * Modes: - * http: *vt100.net/docs/vt220-rm/chapter4.html - */Terminal.prototype.setMode=function(params){if((typeof params==='undefined'?'undefined':_typeof(params))==='object'){var l=params.length,i=0;for(;i<l;i++){this.setMode(params[i]);}return;}if(!this.prefix){switch(params){case 4:this.insertMode=true;break;case 20://this.convertEol = true; -break;}}else if(this.prefix==='?'){switch(params){case 1:this.applicationCursor=true;break;case 2:this.setgCharset(0,Terminal.charsets.US);this.setgCharset(1,Terminal.charsets.US);this.setgCharset(2,Terminal.charsets.US);this.setgCharset(3,Terminal.charsets.US);// set VT100 mode here -break;case 3:// 132 col mode -this.savedCols=this.cols;this.resize(132,this.rows);break;case 6:this.originMode=true;break;case 7:this.wraparoundMode=true;break;case 12:// this.cursorBlink = true; -break;case 66:this.log('Serial port requested application keypad.');this.applicationKeypad=true;this.viewport.syncScrollArea();break;case 9:// X10 Mouse -// no release, no motion, no wheel, no modifiers. -case 1000:// vt200 mouse -// no motion. -// no modifiers, except control on the wheel. -case 1002:// button event mouse -case 1003:// any event mouse -// any event - sends motion events, -// even if there is no button held down. -this.x10Mouse=params===9;this.vt200Mouse=params===1000;this.normalMouse=params>1000;this.mouseEvents=true;this.element.style.cursor='default';this.log('Binding to mouse events.');break;case 1004:// send focusin/focusout events -// focusin: ^[[I -// focusout: ^[[O -this.sendFocus=true;break;case 1005:// utf8 ext mode mouse -this.utfMouse=true;// for wide terminals -// simply encodes large values as utf8 characters -break;case 1006:// sgr ext mode mouse -this.sgrMouse=true;// for wide terminals -// does not add 32 to fields -// press: ^[[<b;x;yM -// release: ^[[<b;x;ym -break;case 1015:// urxvt ext mode mouse -this.urxvtMouse=true;// for wide terminals -// numbers for fields -// press: ^[[b;x;yM -// motion: ^[[b;x;yT -break;case 25:// show cursor -this.cursorHidden=false;break;case 1049:// alt screen buffer cursor -//this.saveCursor(); -;// FALL-THROUGH -case 47:// alt screen buffer -case 1047:// alt screen buffer -if(!this.normal){var normal={lines:this.lines,ybase:this.ybase,ydisp:this.ydisp,x:this.x,y:this.y,scrollTop:this.scrollTop,scrollBottom:this.scrollBottom,tabs:this.tabs// XXX save charset(s) here? -// charset: this.charset, -// glevel: this.glevel, -// charsets: this.charsets -};this.reset();this.normal=normal;this.showCursor();}break;}}};/** - * CSI Pm l Reset Mode (RM). - * Ps = 2 -> Keyboard Action Mode (AM). - * Ps = 4 -> Replace Mode (IRM). - * Ps = 1 2 -> Send/receive (SRM). - * Ps = 2 0 -> Normal Linefeed (LNM). - * CSI ? Pm l - * DEC Private Mode Reset (DECRST). - * Ps = 1 -> Normal Cursor Keys (DECCKM). - * Ps = 2 -> Designate VT52 mode (DECANM). - * Ps = 3 -> 80 Column Mode (DECCOLM). - * Ps = 4 -> Jump (Fast) Scroll (DECSCLM). - * Ps = 5 -> Normal Video (DECSCNM). - * Ps = 6 -> Normal Cursor Mode (DECOM). - * Ps = 7 -> No Wraparound Mode (DECAWM). - * Ps = 8 -> No Auto-repeat Keys (DECARM). - * Ps = 9 -> Don't send Mouse X & Y on button press. - * Ps = 1 0 -> Hide toolbar (rxvt). - * Ps = 1 2 -> Stop Blinking Cursor (att610). - * Ps = 1 8 -> Don't print form feed (DECPFF). - * Ps = 1 9 -> Limit print to scrolling region (DECPEX). - * Ps = 2 5 -> Hide Cursor (DECTCEM). - * Ps = 3 0 -> Don't show scrollbar (rxvt). - * Ps = 3 5 -> Disable font-shifting functions (rxvt). - * Ps = 4 0 -> Disallow 80 -> 132 Mode. - * Ps = 4 1 -> No more(1) fix (see curses resource). - * Ps = 4 2 -> Disable Nation Replacement Character sets (DEC- - * NRCM). - * Ps = 4 4 -> Turn Off Margin Bell. - * Ps = 4 5 -> No Reverse-wraparound Mode. - * Ps = 4 6 -> Stop Logging. (This is normally disabled by a - * compile-time option). - * Ps = 4 7 -> Use Normal Screen Buffer. - * Ps = 6 6 -> Numeric keypad (DECNKM). - * Ps = 6 7 -> Backarrow key sends delete (DECBKM). - * Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and - * release. See the section Mouse Tracking. - * Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking. - * Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking. - * Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking. - * Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events. - * Ps = 1 0 0 5 -> Disable Extended Mouse Mode. - * Ps = 1 0 1 0 -> Don't scroll to bottom on tty output - * (rxvt). - * Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt). - * Ps = 1 0 3 4 -> Don't interpret "meta" key. (This disables - * the eightBitInput resource). - * Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num- - * Lock keys. (This disables the numLock resource). - * Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key. - * (This disables the metaSendsEscape resource). - * Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad - * Delete key. - * Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key. - * (This disables the altSendsEscape resource). - * Ps = 1 0 4 0 -> Do not keep selection when not highlighted. - * (This disables the keepSelection resource). - * Ps = 1 0 4 1 -> Use the PRIMARY selection. (This disables - * the selectToClipboard resource). - * Ps = 1 0 4 2 -> Disable Urgency window manager hint when - * Control-G is received. (This disables the bellIsUrgent - * resource). - * Ps = 1 0 4 3 -> Disable raising of the window when Control- - * G is received. (This disables the popOnBell resource). - * Ps = 1 0 4 7 -> Use Normal Screen Buffer, clearing screen - * first if in the Alternate Screen. (This may be disabled by - * the titeInhibit resource). - * Ps = 1 0 4 8 -> Restore cursor as in DECRC. (This may be - * disabled by the titeInhibit resource). - * Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor - * as in DECRC. (This may be disabled by the titeInhibit - * resource). This combines the effects of the 1 0 4 7 and 1 0 - * 4 8 modes. Use this with terminfo-based applications rather - * than the 4 7 mode. - * Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode. - * Ps = 1 0 5 1 -> Reset Sun function-key mode. - * Ps = 1 0 5 2 -> Reset HP function-key mode. - * Ps = 1 0 5 3 -> Reset SCO function-key mode. - * Ps = 1 0 6 0 -> Reset legacy keyboard emulation (X11R6). - * Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style. - * Ps = 2 0 0 4 -> Reset bracketed paste mode. - */Terminal.prototype.resetMode=function(params){if((typeof params==='undefined'?'undefined':_typeof(params))==='object'){var l=params.length,i=0;for(;i<l;i++){this.resetMode(params[i]);}return;}if(!this.prefix){switch(params){case 4:this.insertMode=false;break;case 20://this.convertEol = false; -break;}}else if(this.prefix==='?'){switch(params){case 1:this.applicationCursor=false;break;case 3:if(this.cols===132&&this.savedCols){this.resize(this.savedCols,this.rows);}delete this.savedCols;break;case 6:this.originMode=false;break;case 7:this.wraparoundMode=false;break;case 12:// this.cursorBlink = false; -break;case 66:this.log('Switching back to normal keypad.');this.applicationKeypad=false;this.viewport.syncScrollArea();break;case 9:// X10 Mouse -case 1000:// vt200 mouse -case 1002:// button event mouse -case 1003:// any event mouse -this.x10Mouse=false;this.vt200Mouse=false;this.normalMouse=false;this.mouseEvents=false;this.element.style.cursor='';break;case 1004:// send focusin/focusout events -this.sendFocus=false;break;case 1005:// utf8 ext mode mouse -this.utfMouse=false;break;case 1006:// sgr ext mode mouse -this.sgrMouse=false;break;case 1015:// urxvt ext mode mouse -this.urxvtMouse=false;break;case 25:// hide cursor -this.cursorHidden=true;break;case 1049:// alt screen buffer cursor -;// FALL-THROUGH -case 47:// normal screen buffer -case 1047:// normal screen buffer - clearing it first -if(this.normal){this.lines=this.normal.lines;this.ybase=this.normal.ybase;this.ydisp=this.normal.ydisp;this.x=this.normal.x;this.y=this.normal.y;this.scrollTop=this.normal.scrollTop;this.scrollBottom=this.normal.scrollBottom;this.tabs=this.normal.tabs;this.normal=null;// if (params === 1049) { -// this.x = this.savedX; -// this.y = this.savedY; -// } -this.refresh(0,this.rows-1);this.showCursor();}break;}}};/** - * CSI Ps ; Ps r - * Set Scrolling Region [top;bottom] (default = full size of win- - * dow) (DECSTBM). - * CSI ? Pm r - */Terminal.prototype.setScrollRegion=function(params){if(this.prefix)return;this.scrollTop=(params[0]||1)-1;this.scrollBottom=(params[1]||this.rows)-1;this.x=0;this.y=0;};/** - * CSI s - * Save cursor (ANSI.SYS). - */Terminal.prototype.saveCursor=function(params){this.savedX=this.x;this.savedY=this.y;};/** - * CSI u - * Restore cursor (ANSI.SYS). - */Terminal.prototype.restoreCursor=function(params){this.x=this.savedX||0;this.y=this.savedY||0;};/** - * Lesser Used - *//** - * CSI Ps I - * Cursor Forward Tabulation Ps tab stops (default = 1) (CHT). - */Terminal.prototype.cursorForwardTab=function(params){var param=params[0]||1;while(param--){this.x=this.nextStop();}};/** - * CSI Ps S Scroll up Ps lines (default = 1) (SU). - */Terminal.prototype.scrollUp=function(params){var param=params[0]||1;while(param--){this.lines.splice(this.ybase+this.scrollTop,1);this.lines.splice(this.ybase+this.scrollBottom,0,this.blankLine());}// this.maxRange(); -this.updateRange(this.scrollTop);this.updateRange(this.scrollBottom);};/** - * CSI Ps T Scroll down Ps lines (default = 1) (SD). - */Terminal.prototype.scrollDown=function(params){var param=params[0]||1;while(param--){this.lines.splice(this.ybase+this.scrollBottom,1);this.lines.splice(this.ybase+this.scrollTop,0,this.blankLine());}// this.maxRange(); -this.updateRange(this.scrollTop);this.updateRange(this.scrollBottom);};/** - * CSI Ps ; Ps ; Ps ; Ps ; Ps T - * Initiate highlight mouse tracking. Parameters are - * [func;startx;starty;firstrow;lastrow]. See the section Mouse - * Tracking. - */Terminal.prototype.initMouseTracking=function(params){// Relevant: DECSET 1001 -};/** - * CSI > Ps; Ps T - * Reset one or more features of the title modes to the default - * value. Normally, "reset" disables the feature. It is possi- - * ble to disable the ability to reset features by compiling a - * different default for the title modes into xterm. - * Ps = 0 -> Do not set window/icon labels using hexadecimal. - * Ps = 1 -> Do not query window/icon labels using hexadeci- - * mal. - * Ps = 2 -> Do not set window/icon labels using UTF-8. - * Ps = 3 -> Do not query window/icon labels using UTF-8. - * (See discussion of "Title Modes"). - */Terminal.prototype.resetTitleModes=function(params){;};/** - * CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT). - */Terminal.prototype.cursorBackwardTab=function(params){var param=params[0]||1;while(param--){this.x=this.prevStop();}};/** - * CSI Ps b Repeat the preceding graphic character Ps times (REP). - */Terminal.prototype.repeatPrecedingCharacter=function(params){var param=params[0]||1,line=this.lines[this.ybase+this.y],ch=line[this.x-1]||[this.defAttr,' ',1];while(param--){line[this.x++]=ch;}};/** - * CSI Ps g Tab Clear (TBC). - * Ps = 0 -> Clear Current Column (default). - * Ps = 3 -> Clear All. - * Potentially: - * Ps = 2 -> Clear Stops on Line. - * http://vt100.net/annarbor/aaa-ug/section6.html - */Terminal.prototype.tabClear=function(params){var param=params[0];if(param<=0){delete this.tabs[this.x];}else if(param===3){this.tabs={};}};/** - * CSI Pm i Media Copy (MC). - * Ps = 0 -> Print screen (default). - * Ps = 4 -> Turn off printer controller mode. - * Ps = 5 -> Turn on printer controller mode. - * CSI ? Pm i - * Media Copy (MC, DEC-specific). - * Ps = 1 -> Print line containing cursor. - * Ps = 4 -> Turn off autoprint mode. - * Ps = 5 -> Turn on autoprint mode. - * Ps = 1 0 -> Print composed display, ignores DECPEX. - * Ps = 1 1 -> Print all pages. - */Terminal.prototype.mediaCopy=function(params){;};/** - * CSI > Ps; Ps m - * Set or reset resource-values used by xterm to decide whether - * to construct escape sequences holding information about the - * modifiers pressed with a given key. The first parameter iden- - * tifies the resource to set/reset. The second parameter is the - * value to assign to the resource. If the second parameter is - * omitted, the resource is reset to its initial value. - * Ps = 1 -> modifyCursorKeys. - * Ps = 2 -> modifyFunctionKeys. - * Ps = 4 -> modifyOtherKeys. - * If no parameters are given, all resources are reset to their - * initial values. - */Terminal.prototype.setResources=function(params){;};/** - * CSI > Ps n - * Disable modifiers which may be enabled via the CSI > Ps; Ps m - * sequence. This corresponds to a resource value of "-1", which - * cannot be set with the other sequence. The parameter identi- - * fies the resource to be disabled: - * Ps = 1 -> modifyCursorKeys. - * Ps = 2 -> modifyFunctionKeys. - * Ps = 4 -> modifyOtherKeys. - * If the parameter is omitted, modifyFunctionKeys is disabled. - * When modifyFunctionKeys is disabled, xterm uses the modifier - * keys to make an extended sequence of functions rather than - * adding a parameter to each function key to denote the modi- - * fiers. - */Terminal.prototype.disableModifiers=function(params){;};/** - * CSI > Ps p - * Set resource value pointerMode. This is used by xterm to - * decide whether to hide the pointer cursor as the user types. - * Valid values for the parameter: - * Ps = 0 -> never hide the pointer. - * Ps = 1 -> hide if the mouse tracking mode is not enabled. - * Ps = 2 -> always hide the pointer. If no parameter is - * given, xterm uses the default, which is 1 . - */Terminal.prototype.setPointerMode=function(params){;};/** - * CSI ! p Soft terminal reset (DECSTR). - * http://vt100.net/docs/vt220-rm/table4-10.html - */Terminal.prototype.softReset=function(params){this.cursorHidden=false;this.insertMode=false;this.originMode=false;this.wraparoundMode=false;// autowrap -this.applicationKeypad=false;// ? -this.viewport.syncScrollArea();this.applicationCursor=false;this.scrollTop=0;this.scrollBottom=this.rows-1;this.curAttr=this.defAttr;this.x=this.y=0;// ? -this.charset=null;this.glevel=0;// ?? -this.charsets=[null];// ?? -};/** - * CSI Ps$ p - * Request ANSI mode (DECRQM). For VT300 and up, reply is - * CSI Ps; Pm$ y - * where Ps is the mode number as in RM, and Pm is the mode - * value: - * 0 - not recognized - * 1 - set - * 2 - reset - * 3 - permanently set - * 4 - permanently reset - */Terminal.prototype.requestAnsiMode=function(params){;};/** - * CSI ? Ps$ p - * Request DEC private mode (DECRQM). For VT300 and up, reply is - * CSI ? Ps; Pm$ p - * where Ps is the mode number as in DECSET, Pm is the mode value - * as in the ANSI DECRQM. - */Terminal.prototype.requestPrivateMode=function(params){;};/** - * CSI Ps ; Ps " p - * Set conformance level (DECSCL). Valid values for the first - * parameter: - * Ps = 6 1 -> VT100. - * Ps = 6 2 -> VT200. - * Ps = 6 3 -> VT300. - * Valid values for the second parameter: - * Ps = 0 -> 8-bit controls. - * Ps = 1 -> 7-bit controls (always set for VT100). - * Ps = 2 -> 8-bit controls. - */Terminal.prototype.setConformanceLevel=function(params){;};/** - * CSI Ps q Load LEDs (DECLL). - * Ps = 0 -> Clear all LEDS (default). - * Ps = 1 -> Light Num Lock. - * Ps = 2 -> Light Caps Lock. - * Ps = 3 -> Light Scroll Lock. - * Ps = 2 1 -> Extinguish Num Lock. - * Ps = 2 2 -> Extinguish Caps Lock. - * Ps = 2 3 -> Extinguish Scroll Lock. - */Terminal.prototype.loadLEDs=function(params){;};/** - * CSI Ps SP q - * Set cursor style (DECSCUSR, VT520). - * Ps = 0 -> blinking block. - * Ps = 1 -> blinking block (default). - * Ps = 2 -> steady block. - * Ps = 3 -> blinking underline. - * Ps = 4 -> steady underline. - */Terminal.prototype.setCursorStyle=function(params){;};/** - * CSI Ps " q - * Select character protection attribute (DECSCA). Valid values - * for the parameter: - * Ps = 0 -> DECSED and DECSEL can erase (default). - * Ps = 1 -> DECSED and DECSEL cannot erase. - * Ps = 2 -> DECSED and DECSEL can erase. - */Terminal.prototype.setCharProtectionAttr=function(params){;};/** - * CSI ? Pm r - * Restore DEC Private Mode Values. The value of Ps previously - * saved is restored. Ps values are the same as for DECSET. - */Terminal.prototype.restorePrivateValues=function(params){;};/** - * CSI Pt; Pl; Pb; Pr; Ps$ r - * Change Attributes in Rectangular Area (DECCARA), VT400 and up. - * Pt; Pl; Pb; Pr denotes the rectangle. - * Ps denotes the SGR attributes to change: 0, 1, 4, 5, 7. - * NOTE: xterm doesn't enable this code by default. - */Terminal.prototype.setAttrInRectangle=function(params){var t=params[0],l=params[1],b=params[2],r=params[3],attr=params[4];var line,i;for(;t<b+1;t++){line=this.lines[this.ybase+t];for(i=l;i<r;i++){line[i]=[attr,line[i][1]];}}// this.maxRange(); -this.updateRange(params[0]);this.updateRange(params[2]);};/** - * CSI Pc; Pt; Pl; Pb; Pr$ x - * Fill Rectangular Area (DECFRA), VT420 and up. - * Pc is the character to use. - * Pt; Pl; Pb; Pr denotes the rectangle. - * NOTE: xterm doesn't enable this code by default. - */Terminal.prototype.fillRectangle=function(params){var ch=params[0],t=params[1],l=params[2],b=params[3],r=params[4];var line,i;for(;t<b+1;t++){line=this.lines[this.ybase+t];for(i=l;i<r;i++){line[i]=[line[i][0],String.fromCharCode(ch)];}}// this.maxRange(); -this.updateRange(params[1]);this.updateRange(params[3]);};/** - * CSI Ps ; Pu ' z - * Enable Locator Reporting (DECELR). - * Valid values for the first parameter: - * Ps = 0 -> Locator disabled (default). - * Ps = 1 -> Locator enabled. - * Ps = 2 -> Locator enabled for one report, then disabled. - * The second parameter specifies the coordinate unit for locator - * reports. - * Valid values for the second parameter: - * Pu = 0 <- or omitted -> default to character cells. - * Pu = 1 <- device physical pixels. - * Pu = 2 <- character cells. - */Terminal.prototype.enableLocatorReporting=function(params){var val=params[0]>0;//this.mouseEvents = val; -//this.decLocator = val; -};/** - * CSI Pt; Pl; Pb; Pr$ z - * Erase Rectangular Area (DECERA), VT400 and up. - * Pt; Pl; Pb; Pr denotes the rectangle. - * NOTE: xterm doesn't enable this code by default. - */Terminal.prototype.eraseRectangle=function(params){var t=params[0],l=params[1],b=params[2],r=params[3];var line,i,ch;ch=[this.eraseAttr(),' ',1];// xterm? -for(;t<b+1;t++){line=this.lines[this.ybase+t];for(i=l;i<r;i++){line[i]=ch;}}// this.maxRange(); -this.updateRange(params[0]);this.updateRange(params[2]);};/** - * CSI P m SP } - * Insert P s Column(s) (default = 1) (DECIC), VT420 and up. - * NOTE: xterm doesn't enable this code by default. - */Terminal.prototype.insertColumns=function(){var param=params[0],l=this.ybase+this.rows,ch=[this.eraseAttr(),' ',1]// xterm? -,i;while(param--){for(i=this.ybase;i<l;i++){this.lines[i].splice(this.x+1,0,ch);this.lines[i].pop();}}this.maxRange();};/** - * CSI P m SP ~ - * Delete P s Column(s) (default = 1) (DECDC), VT420 and up - * NOTE: xterm doesn't enable this code by default. - */Terminal.prototype.deleteColumns=function(){var param=params[0],l=this.ybase+this.rows,ch=[this.eraseAttr(),' ',1]// xterm? -,i;while(param--){for(i=this.ybase;i<l;i++){this.lines[i].splice(this.x,1);this.lines[i].push(ch);}}this.maxRange();};/** - * Character Sets - */Terminal.charsets={};// DEC Special Character and Line Drawing Set. -// http://vt100.net/docs/vt102-ug/table5-13.html -// A lot of curses apps use this if they see TERM=xterm. -// testing: echo -e '\e(0a\e(B' -// The xterm output sometimes seems to conflict with the -// reference above. xterm seems in line with the reference -// when running vttest however. -// The table below now uses xterm's output from vttest. -Terminal.charsets.SCLD={// (0 -'`':'◆',// '◆' -'a':'▒',// '▒' -'b':'\t',// '\t' -'c':'\f',// '\f' -'d':'\r',// '\r' -'e':'\n',// '\n' -'f':'°',// '°' -'g':'±',// '±' -'h':'',// '\u2424' (NL) -'i':'\u000b',// '\v' -'j':'┘',// '┘' -'k':'┐',// '┐' -'l':'┌',// '┌' -'m':'└',// '└' -'n':'┼',// '┼' -'o':'⎺',// '⎺' -'p':'⎻',// '⎻' -'q':'─',// '─' -'r':'⎼',// '⎼' -'s':'⎽',// '⎽' -'t':'├',// '├' -'u':'┤',// '┤' -'v':'┴',// '┴' -'w':'┬',// '┬' -'x':'│',// '│' -'y':'≤',// '≤' -'z':'≥',// '≥' -'{':'π',// 'π' -'|':'≠',// '≠' -'}':'£',// '£' -'~':'·'// '·' -};Terminal.charsets.UK=null;// (A -Terminal.charsets.US=null;// (B (USASCII) -Terminal.charsets.Dutch=null;// (4 -Terminal.charsets.Finnish=null;// (C or (5 -Terminal.charsets.French=null;// (R -Terminal.charsets.FrenchCanadian=null;// (Q -Terminal.charsets.German=null;// (K -Terminal.charsets.Italian=null;// (Y -Terminal.charsets.NorwegianDanish=null;// (E or (6 -Terminal.charsets.Spanish=null;// (Z -Terminal.charsets.Swedish=null;// (H or (7 -Terminal.charsets.Swiss=null;// (= -Terminal.charsets.ISOLatin=null;// /A -/** - * Helpers - */function contains(el,arr){for(var i=0;i<arr.length;i+=1){if(el===arr[i]){return true;}}return false;}function on(el,type,handler,capture){if(!Array.isArray(el)){el=[el];}el.forEach(function(element){element.addEventListener(type,handler,capture||false);});}function off(el,type,handler,capture){el.removeEventListener(type,handler,capture||false);}function cancel(ev,force){if(!this.cancelEvents&&!force){return;}ev.preventDefault();ev.stopPropagation();return false;}function inherits(child,parent){function f(){this.constructor=child;}f.prototype=parent.prototype;child.prototype=new f();}// if bold is broken, we can't -// use it in the terminal. -function isBoldBroken(document){var body=document.getElementsByTagName('body')[0];var el=document.createElement('span');el.innerHTML='hello world';body.appendChild(el);var w1=el.scrollWidth;el.style.fontWeight='bold';var w2=el.scrollWidth;body.removeChild(el);return w1!==w2;}function indexOf(obj,el){var i=obj.length;while(i--){if(obj[i]===el)return i;}return-1;}function isThirdLevelShift(term,ev){var thirdLevelKey=term.isMac&&ev.altKey&&!ev.ctrlKey&&!ev.metaKey||term.isMSWindows&&ev.altKey&&ev.ctrlKey&&!ev.metaKey;if(ev.type=='keypress'){return thirdLevelKey;}// Don't invoke for arrows, pageDown, home, backspace, etc. (on non-keypress events) -return thirdLevelKey&&(!ev.keyCode||ev.keyCode>47);}function matchColor(r1,g1,b1){var hash=r1<<16|g1<<8|b1;if(matchColor._cache[hash]!=null){return matchColor._cache[hash];}var ldiff=Infinity,li=-1,i=0,c,r2,g2,b2,diff;for(;i<Terminal.vcolors.length;i++){c=Terminal.vcolors[i];r2=c[0];g2=c[1];b2=c[2];diff=matchColor.distance(r1,g1,b1,r2,g2,b2);if(diff===0){li=i;break;}if(diff<ldiff){ldiff=diff;li=i;}}return matchColor._cache[hash]=li;}matchColor._cache={};// http://stackoverflow.com/questions/1633828 -matchColor.distance=function(r1,g1,b1,r2,g2,b2){return Math.pow(30*(r1-r2),2)+Math.pow(59*(g1-g2),2)+Math.pow(11*(b1-b2),2);};function each(obj,iter,con){if(obj.forEach)return obj.forEach(iter,con);for(var i=0;i<obj.length;i++){iter.call(con,obj[i],i,obj);}}function keys(obj){if(Object.keys)return Object.keys(obj);var key,keys=[];for(key in obj){if(Object.prototype.hasOwnProperty.call(obj,key)){keys.push(key);}}return keys;}var wcwidth=function(opts){// extracted from https://www.cl.cam.ac.uk/%7Emgk25/ucs/wcwidth.c -// combining characters -var COMBINING=[[0x0300,0x036F],[0x0483,0x0486],[0x0488,0x0489],[0x0591,0x05BD],[0x05BF,0x05BF],[0x05C1,0x05C2],[0x05C4,0x05C5],[0x05C7,0x05C7],[0x0600,0x0603],[0x0610,0x0615],[0x064B,0x065E],[0x0670,0x0670],[0x06D6,0x06E4],[0x06E7,0x06E8],[0x06EA,0x06ED],[0x070F,0x070F],[0x0711,0x0711],[0x0730,0x074A],[0x07A6,0x07B0],[0x07EB,0x07F3],[0x0901,0x0902],[0x093C,0x093C],[0x0941,0x0948],[0x094D,0x094D],[0x0951,0x0954],[0x0962,0x0963],[0x0981,0x0981],[0x09BC,0x09BC],[0x09C1,0x09C4],[0x09CD,0x09CD],[0x09E2,0x09E3],[0x0A01,0x0A02],[0x0A3C,0x0A3C],[0x0A41,0x0A42],[0x0A47,0x0A48],[0x0A4B,0x0A4D],[0x0A70,0x0A71],[0x0A81,0x0A82],[0x0ABC,0x0ABC],[0x0AC1,0x0AC5],[0x0AC7,0x0AC8],[0x0ACD,0x0ACD],[0x0AE2,0x0AE3],[0x0B01,0x0B01],[0x0B3C,0x0B3C],[0x0B3F,0x0B3F],[0x0B41,0x0B43],[0x0B4D,0x0B4D],[0x0B56,0x0B56],[0x0B82,0x0B82],[0x0BC0,0x0BC0],[0x0BCD,0x0BCD],[0x0C3E,0x0C40],[0x0C46,0x0C48],[0x0C4A,0x0C4D],[0x0C55,0x0C56],[0x0CBC,0x0CBC],[0x0CBF,0x0CBF],[0x0CC6,0x0CC6],[0x0CCC,0x0CCD],[0x0CE2,0x0CE3],[0x0D41,0x0D43],[0x0D4D,0x0D4D],[0x0DCA,0x0DCA],[0x0DD2,0x0DD4],[0x0DD6,0x0DD6],[0x0E31,0x0E31],[0x0E34,0x0E3A],[0x0E47,0x0E4E],[0x0EB1,0x0EB1],[0x0EB4,0x0EB9],[0x0EBB,0x0EBC],[0x0EC8,0x0ECD],[0x0F18,0x0F19],[0x0F35,0x0F35],[0x0F37,0x0F37],[0x0F39,0x0F39],[0x0F71,0x0F7E],[0x0F80,0x0F84],[0x0F86,0x0F87],[0x0F90,0x0F97],[0x0F99,0x0FBC],[0x0FC6,0x0FC6],[0x102D,0x1030],[0x1032,0x1032],[0x1036,0x1037],[0x1039,0x1039],[0x1058,0x1059],[0x1160,0x11FF],[0x135F,0x135F],[0x1712,0x1714],[0x1732,0x1734],[0x1752,0x1753],[0x1772,0x1773],[0x17B4,0x17B5],[0x17B7,0x17BD],[0x17C6,0x17C6],[0x17C9,0x17D3],[0x17DD,0x17DD],[0x180B,0x180D],[0x18A9,0x18A9],[0x1920,0x1922],[0x1927,0x1928],[0x1932,0x1932],[0x1939,0x193B],[0x1A17,0x1A18],[0x1B00,0x1B03],[0x1B34,0x1B34],[0x1B36,0x1B3A],[0x1B3C,0x1B3C],[0x1B42,0x1B42],[0x1B6B,0x1B73],[0x1DC0,0x1DCA],[0x1DFE,0x1DFF],[0x200B,0x200F],[0x202A,0x202E],[0x2060,0x2063],[0x206A,0x206F],[0x20D0,0x20EF],[0x302A,0x302F],[0x3099,0x309A],[0xA806,0xA806],[0xA80B,0xA80B],[0xA825,0xA826],[0xFB1E,0xFB1E],[0xFE00,0xFE0F],[0xFE20,0xFE23],[0xFEFF,0xFEFF],[0xFFF9,0xFFFB],[0x10A01,0x10A03],[0x10A05,0x10A06],[0x10A0C,0x10A0F],[0x10A38,0x10A3A],[0x10A3F,0x10A3F],[0x1D167,0x1D169],[0x1D173,0x1D182],[0x1D185,0x1D18B],[0x1D1AA,0x1D1AD],[0x1D242,0x1D244],[0xE0001,0xE0001],[0xE0020,0xE007F],[0xE0100,0xE01EF]];// binary search -function bisearch(ucs){var min=0;var max=COMBINING.length-1;var mid;if(ucs<COMBINING[0][0]||ucs>COMBINING[max][1])return false;while(max>=min){mid=Math.floor((min+max)/2);if(ucs>COMBINING[mid][1])min=mid+1;else if(ucs<COMBINING[mid][0])max=mid-1;else return true;}return false;}function wcwidth(ucs){// test for 8-bit control characters -if(ucs===0)return opts.nul;if(ucs<32||ucs>=0x7f&&ucs<0xa0)return opts.control;// binary search in table of non-spacing characters -if(bisearch(ucs))return 0;// if we arrive here, ucs is not a combining or C0/C1 control character -return 1+(ucs>=0x1100&&(ucs<=0x115f||// Hangul Jamo init. consonants -ucs==0x2329||ucs==0x232a||ucs>=0x2e80&&ucs<=0xa4cf&&ucs!=0x303f||// CJK..Yi -ucs>=0xac00&&ucs<=0xd7a3||// Hangul Syllables -ucs>=0xf900&&ucs<=0xfaff||// CJK Compat Ideographs -ucs>=0xfe10&&ucs<=0xfe19||// Vertical forms -ucs>=0xfe30&&ucs<=0xfe6f||// CJK Compat Forms -ucs>=0xff00&&ucs<=0xff60||// Fullwidth Forms -ucs>=0xffe0&&ucs<=0xffe6||ucs>=0x20000&&ucs<=0x2fffd||ucs>=0x30000&&ucs<=0x3fffd));}return wcwidth;}({nul:0,control:0});// configurable options -/** - * Expose - */Terminal.EventEmitter=_EventEmitter.EventEmitter;Terminal.CompositionHelper=_CompositionHelper.CompositionHelper;Terminal.Viewport=_Viewport.Viewport;Terminal.inherits=inherits;/** - * Adds an event listener to the terminal. - * - * @param {string} event The name of the event. TODO: Document all event types - * @param {function} callback The function to call when the event is triggered. - */Terminal.on=on;Terminal.off=off;Terminal.cancel=cancel;module.exports=Terminal; -}).call(this,"/src") -},{"./CompositionHelper.js":1,"./EventEmitter.js":2,"./Viewport.js":3}]},{},[4])(4) +},{}],10:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function prepareTextForClipboard(text) { + var space = String.fromCharCode(32), nonBreakingSpace = String.fromCharCode(160), allNonBreakingSpaces = new RegExp(nonBreakingSpace, 'g'), processedText = text.split('\n').map(function (line) { + var processedLine = line.replace(/\s+$/g, '').replace(allNonBreakingSpaces, space); + return processedLine; + }).join('\n'); + return processedText; +} +exports.prepareTextForClipboard = prepareTextForClipboard; +function prepareTextForTerminal(text, isMSWindows) { + if (isMSWindows) { + return text.replace(/\r?\n/g, '\n'); + } + return text; +} +exports.prepareTextForTerminal = prepareTextForTerminal; +function copyHandler(ev, term) { + var copiedText = window.getSelection().toString(), text = prepareTextForClipboard(copiedText); + if (term.browser.isMSIE) { + window.clipboardData.setData('Text', text); + } + else { + ev.clipboardData.setData('text/plain', text); + } + ev.preventDefault(); +} +exports.copyHandler = copyHandler; +function pasteHandler(ev, term) { + ev.stopPropagation(); + var text; + var dispatchPaste = function (text) { + text = prepareTextForTerminal(text, term.browser.isMSWindows); + term.handler(text); + term.textarea.value = ''; + term.emit('paste', text); + return term.cancel(ev); + }; + if (term.browser.isMSIE) { + if (window.clipboardData) { + text = window.clipboardData.getData('Text'); + dispatchPaste(text); + } + } + else { + if (ev.clipboardData) { + text = ev.clipboardData.getData('text/plain'); + dispatchPaste(text); + } + } +} +exports.pasteHandler = pasteHandler; +function rightClickHandler(ev, term) { + var s = document.getSelection(), selectedText = prepareTextForClipboard(s.toString()), clickIsOnSelection = false, x = ev.clientX, y = ev.clientY; + if (s.rangeCount) { + var r = s.getRangeAt(0), cr = r.getClientRects(); + for (var i = 0; i < cr.length; i++) { + var rect = cr[i]; + clickIsOnSelection = ((x > rect.left) && (x < rect.right) && + (y > rect.top) && (y < rect.bottom)); + if (clickIsOnSelection) { + break; + } + } + if (selectedText.match(/^\s$/) || !selectedText.length) { + clickIsOnSelection = false; + } + } + if (!clickIsOnSelection) { + term.textarea.style.position = 'fixed'; + term.textarea.style.width = '20px'; + term.textarea.style.height = '20px'; + term.textarea.style.left = (x - 10) + 'px'; + term.textarea.style.top = (y - 10) + 'px'; + term.textarea.style.zIndex = '1000'; + term.textarea.focus(); + setTimeout(function () { + term.textarea.style.position = null; + term.textarea.style.width = null; + term.textarea.style.height = null; + term.textarea.style.left = null; + term.textarea.style.top = null; + term.textarea.style.zIndex = null; + }, 4); + } +} +exports.rightClickHandler = rightClickHandler; + + + +},{}],11:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var Generic_1 = require("./Generic"); +var isNode = (typeof navigator === 'undefined') ? true : false; +var userAgent = (isNode) ? 'node' : navigator.userAgent; +var platform = (isNode) ? 'node' : navigator.platform; +exports.isFirefox = !!~userAgent.indexOf('Firefox'); +exports.isMSIE = !!~userAgent.indexOf('MSIE') || !!~userAgent.indexOf('Trident'); +exports.isMac = Generic_1.contains(['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'], platform); +exports.isIpad = platform === 'iPad'; +exports.isIphone = platform === 'iPhone'; +exports.isMSWindows = Generic_1.contains(['Windows', 'Win16', 'Win32', 'WinCE'], platform); + + + +},{"./Generic":15}],12:[function(require,module,exports){ +"use strict"; +var __extends = (this && this.__extends) || (function () { + var extendStatics = Object.setPrototypeOf || + ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || + function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; + return function (d, b) { + extendStatics(d, b); + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); + }; +})(); +Object.defineProperty(exports, "__esModule", { value: true }); +var EventEmitter_js_1 = require("../EventEmitter.js"); +var CharMeasure = (function (_super) { + __extends(CharMeasure, _super); + function CharMeasure(document, parentElement) { + var _this = _super.call(this) || this; + _this._document = document; + _this._parentElement = parentElement; + return _this; + } + Object.defineProperty(CharMeasure.prototype, "width", { + get: function () { + return this._width; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CharMeasure.prototype, "height", { + get: function () { + return this._height; + }, + enumerable: true, + configurable: true + }); + CharMeasure.prototype.measure = function () { + var _this = this; + if (!this._measureElement) { + this._measureElement = this._document.createElement('span'); + this._measureElement.style.position = 'absolute'; + this._measureElement.style.top = '0'; + this._measureElement.style.left = '-9999em'; + this._measureElement.textContent = 'W'; + this._measureElement.setAttribute('aria-hidden', 'true'); + this._parentElement.appendChild(this._measureElement); + setTimeout(function () { return _this._doMeasure(); }, 0); + } + else { + this._doMeasure(); + } + }; + CharMeasure.prototype._doMeasure = function () { + var geometry = this._measureElement.getBoundingClientRect(); + if (geometry.width === 0 || geometry.height === 0) { + return; + } + if (this._width !== geometry.width || this._height !== geometry.height) { + this._width = geometry.width; + this._height = geometry.height; + this.emit('charsizechanged'); + } + }; + return CharMeasure; +}(EventEmitter_js_1.EventEmitter)); +exports.CharMeasure = CharMeasure; + + + +},{"../EventEmitter.js":4}],13:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var CircularList = (function () { + function CircularList(maxLength) { + this._array = new Array(maxLength); + this._startIndex = 0; + this._length = 0; + } + Object.defineProperty(CircularList.prototype, "maxLength", { + get: function () { + return this._array.length; + }, + set: function (newMaxLength) { + var newArray = new Array(newMaxLength); + for (var i = 0; i < Math.min(newMaxLength, this.length); i++) { + newArray[i] = this._array[this._getCyclicIndex(i)]; + } + this._array = newArray; + this._startIndex = 0; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CircularList.prototype, "length", { + get: function () { + return this._length; + }, + set: function (newLength) { + if (newLength > this._length) { + for (var i = this._length; i < newLength; i++) { + this._array[i] = undefined; + } + } + this._length = newLength; + }, + enumerable: true, + configurable: true + }); + Object.defineProperty(CircularList.prototype, "forEach", { + get: function () { + return this._array.forEach; + }, + enumerable: true, + configurable: true + }); + CircularList.prototype.get = function (index) { + return this._array[this._getCyclicIndex(index)]; + }; + CircularList.prototype.set = function (index, value) { + this._array[this._getCyclicIndex(index)] = value; + }; + CircularList.prototype.push = function (value) { + this._array[this._getCyclicIndex(this._length)] = value; + if (this._length === this.maxLength) { + this._startIndex++; + if (this._startIndex === this.maxLength) { + this._startIndex = 0; + } + } + else { + this._length++; + } + }; + CircularList.prototype.pop = function () { + return this._array[this._getCyclicIndex(this._length-- - 1)]; + }; + CircularList.prototype.splice = function (start, deleteCount) { + var items = []; + for (var _i = 2; _i < arguments.length; _i++) { + items[_i - 2] = arguments[_i]; + } + if (deleteCount) { + for (var i = start; i < this._length - deleteCount; i++) { + this._array[this._getCyclicIndex(i)] = this._array[this._getCyclicIndex(i + deleteCount)]; + } + this._length -= deleteCount; + } + if (items && items.length) { + for (var i = this._length - 1; i >= start; i--) { + this._array[this._getCyclicIndex(i + items.length)] = this._array[this._getCyclicIndex(i)]; + } + for (var i = 0; i < items.length; i++) { + this._array[this._getCyclicIndex(start + i)] = items[i]; + } + if (this._length + items.length > this.maxLength) { + this._startIndex += (this._length + items.length) - this.maxLength; + this._length = this.maxLength; + } + else { + this._length += items.length; + } + } + }; + CircularList.prototype.trimStart = function (count) { + if (count > this._length) { + count = this._length; + } + this._startIndex += count; + this._length -= count; + }; + CircularList.prototype.shiftElements = function (start, count, offset) { + if (count <= 0) { + return; + } + if (start < 0 || start >= this._length) { + throw new Error('start argument out of range'); + } + if (start + offset < 0) { + throw new Error('Cannot shift elements in list beyond index 0'); + } + if (offset > 0) { + for (var i = count - 1; i >= 0; i--) { + this.set(start + i + offset, this.get(start + i)); + } + var expandListBy = (start + count + offset) - this._length; + if (expandListBy > 0) { + this._length += expandListBy; + while (this._length > this.maxLength) { + this._length--; + this._startIndex++; + } + } + } + else { + for (var i = 0; i < count; i++) { + this.set(start + i + offset, this.get(start + i)); + } + } + }; + CircularList.prototype._getCyclicIndex = function (index) { + return (this._startIndex + index) % this.maxLength; + }; + return CircularList; +}()); +exports.CircularList = CircularList; + + + +},{}],14:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var DomElementObjectPool = (function () { + function DomElementObjectPool(type) { + this.type = type; + this._type = type; + this._pool = []; + this._inUse = {}; + } + DomElementObjectPool.prototype.acquire = function () { + var element; + if (this._pool.length === 0) { + element = this._createNew(); + } + else { + element = this._pool.pop(); + } + this._inUse[element.getAttribute(DomElementObjectPool.OBJECT_ID_ATTRIBUTE)] = element; + return element; + }; + DomElementObjectPool.prototype.release = function (element) { + if (!this._inUse[element.getAttribute(DomElementObjectPool.OBJECT_ID_ATTRIBUTE)]) { + throw new Error('Could not release an element not yet acquired'); + } + delete this._inUse[element.getAttribute(DomElementObjectPool.OBJECT_ID_ATTRIBUTE)]; + this._cleanElement(element); + this._pool.push(element); + }; + DomElementObjectPool.prototype._createNew = function () { + var element = document.createElement(this._type); + var id = DomElementObjectPool._objectCount++; + element.setAttribute(DomElementObjectPool.OBJECT_ID_ATTRIBUTE, id.toString(10)); + return element; + }; + DomElementObjectPool.prototype._cleanElement = function (element) { + element.className = ''; + element.innerHTML = ''; + }; + return DomElementObjectPool; +}()); +DomElementObjectPool.OBJECT_ID_ATTRIBUTE = 'data-obj-id'; +DomElementObjectPool._objectCount = 0; +exports.DomElementObjectPool = DomElementObjectPool; + + + +},{}],15:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function contains(arr, el) { + return arr.indexOf(el) >= 0; +} +exports.contains = contains; +; + + + +},{}],16:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +function getCoords(event, rowContainer, charMeasure) { + if (event.pageX == null) { + return null; + } + var x = event.pageX; + var y = event.pageY; + var el = rowContainer; + while (el && el !== self.document.documentElement) { + x -= el.offsetLeft; + y -= el.offsetTop; + el = 'offsetParent' in el ? el.offsetParent : el.parentElement; + } + x = Math.ceil(x / charMeasure.width); + y = Math.ceil(y / charMeasure.height); + return [x, y]; +} +exports.getCoords = getCoords; +function getRawByteCoords(event, rowContainer, charMeasure, colCount, rowCount) { + var coords = getCoords(event, rowContainer, charMeasure); + var x = coords[0]; + var y = coords[1]; + x = Math.min(Math.max(x, 0), colCount); + y = Math.min(Math.max(y, 0), rowCount); + x += 32; + y += 32; + return { x: x, y: y }; +} +exports.getRawByteCoords = getRawByteCoords; + + + +},{}],17:[function(require,module,exports){ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +var CompositionHelper_1 = require("./CompositionHelper"); +var EventEmitter_1 = require("./EventEmitter"); +var Viewport_1 = require("./Viewport"); +var Clipboard_1 = require("./handlers/Clipboard"); +var CircularList_1 = require("./utils/CircularList"); +var EscapeSequences_1 = require("./EscapeSequences"); +var InputHandler_1 = require("./InputHandler"); +var Parser_1 = require("./Parser"); +var Renderer_1 = require("./Renderer"); +var Linkifier_1 = require("./Linkifier"); +var CharMeasure_1 = require("./utils/CharMeasure"); +var Browser = require("./utils/Browser"); +var Mouse_1 = require("./utils/Mouse"); +var document = (typeof window != 'undefined') ? window.document : null; +var WRITE_BUFFER_PAUSE_THRESHOLD = 5; +var WRITE_BATCH_SIZE = 300; +var CURSOR_BLINK_INTERVAL = 600; +function Terminal(options) { + var self = this; + if (!(this instanceof Terminal)) { + return new Terminal(arguments[0], arguments[1], arguments[2]); + } + self.browser = Browser; + self.cancel = Terminal.cancel; + EventEmitter_1.EventEmitter.call(this); + if (typeof options === 'number') { + options = { + cols: arguments[0], + rows: arguments[1], + handler: arguments[2] + }; + } + options = options || {}; + Object.keys(Terminal.defaults).forEach(function (key) { + if (options[key] == null) { + options[key] = Terminal.options[key]; + if (Terminal[key] !== Terminal.defaults[key]) { + options[key] = Terminal[key]; + } + } + self[key] = options[key]; + }); + if (options.colors.length === 8) { + options.colors = options.colors.concat(Terminal._colors.slice(8)); + } + else if (options.colors.length === 16) { + options.colors = options.colors.concat(Terminal._colors.slice(16)); + } + else if (options.colors.length === 10) { + options.colors = options.colors.slice(0, -2).concat(Terminal._colors.slice(8, -2), options.colors.slice(-2)); + } + else if (options.colors.length === 18) { + options.colors = options.colors.concat(Terminal._colors.slice(16, -2), options.colors.slice(-2)); + } + this.colors = options.colors; + this.options = options; + this.parent = options.body || options.parent || (document ? document.getElementsByTagName('body')[0] : null); + this.cols = options.cols || options.geometry[0]; + this.rows = options.rows || options.geometry[1]; + this.geometry = [this.cols, this.rows]; + if (options.handler) { + this.on('data', options.handler); + } + this.ybase = 0; + this.ydisp = 0; + this.x = 0; + this.y = 0; + this.cursorState = 0; + this.cursorHidden = false; + this.convertEol; + this.queue = ''; + this.scrollTop = 0; + this.scrollBottom = this.rows - 1; + this.customKeydownHandler = null; + this.cursorBlinkInterval = null; + this.applicationKeypad = false; + this.applicationCursor = false; + this.originMode = false; + this.insertMode = false; + this.wraparoundMode = true; + this.normal = null; + this.charset = null; + this.gcharset = null; + this.glevel = 0; + this.charsets = [null]; + this.decLocator; + this.x10Mouse; + this.vt200Mouse; + this.vt300Mouse; + this.normalMouse; + this.mouseEvents; + this.sendFocus; + this.utfMouse; + this.sgrMouse; + this.urxvtMouse; + this.element; + this.children; + this.refreshStart; + this.refreshEnd; + this.savedX; + this.savedY; + this.savedCols; + this.readable = true; + this.writable = true; + this.defAttr = (0 << 18) | (257 << 9) | (256 << 0); + this.curAttr = this.defAttr; + this.params = []; + this.currentParam = 0; + this.prefix = ''; + this.postfix = ''; + this.inputHandler = new InputHandler_1.InputHandler(this); + this.parser = new Parser_1.Parser(this.inputHandler, this); + this.renderer = this.renderer || null; + this.linkifier = this.linkifier || new Linkifier_1.Linkifier(); + this.writeBuffer = []; + this.writeInProgress = false; + this.xoffSentToCatchUp = false; + this.writeStopped = false; + this.surrogate_high = ''; + this.lines = new CircularList_1.CircularList(this.scrollback); + var i = this.rows; + while (i--) { + this.lines.push(this.blankLine()); + } + this.tabs; + this.setupStops(); + this.userScrolling = false; +} +inherits(Terminal, EventEmitter_1.EventEmitter); +Terminal.prototype.eraseAttr = function () { + return (this.defAttr & ~0x1ff) | (this.curAttr & 0x1ff); +}; +Terminal.tangoColors = [ + '#2e3436', + '#cc0000', + '#4e9a06', + '#c4a000', + '#3465a4', + '#75507b', + '#06989a', + '#d3d7cf', + '#555753', + '#ef2929', + '#8ae234', + '#fce94f', + '#729fcf', + '#ad7fa8', + '#34e2e2', + '#eeeeec' +]; +Terminal.colors = (function () { + var colors = Terminal.tangoColors.slice(), r = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff], i; + i = 0; + for (; i < 216; i++) { + out(r[(i / 36) % 6 | 0], r[(i / 6) % 6 | 0], r[i % 6]); + } + i = 0; + for (; i < 24; i++) { + r = 8 + i * 10; + out(r, r, r); + } + function out(r, g, b) { + colors.push('#' + hex(r) + hex(g) + hex(b)); + } + function hex(c) { + c = c.toString(16); + return c.length < 2 ? '0' + c : c; + } + return colors; +})(); +Terminal._colors = Terminal.colors.slice(); +Terminal.vcolors = (function () { + var out = [], colors = Terminal.colors, i = 0, color; + for (; i < 256; i++) { + color = parseInt(colors[i].substring(1), 16); + out.push([ + (color >> 16) & 0xff, + (color >> 8) & 0xff, + color & 0xff + ]); + } + return out; +})(); +Terminal.defaults = { + colors: Terminal.colors, + theme: 'default', + convertEol: false, + termName: 'xterm', + geometry: [80, 24], + cursorBlink: false, + cursorStyle: 'block', + visualBell: false, + popOnBell: false, + scrollback: 1000, + screenKeys: false, + debug: false, + cancelEvents: false, + disableStdin: false, + useFlowControl: false, + tabStopWidth: 8 +}; +Terminal.options = {}; +Terminal.focus = null; +each(keys(Terminal.defaults), function (key) { + Terminal[key] = Terminal.defaults[key]; + Terminal.options[key] = Terminal.defaults[key]; +}); +Terminal.prototype.focus = function () { + return this.textarea.focus(); +}; +Terminal.prototype.getOption = function (key, value) { + if (!(key in Terminal.defaults)) { + throw new Error('No option with key "' + key + '"'); + } + if (typeof this.options[key] !== 'undefined') { + return this.options[key]; + } + return this[key]; +}; +Terminal.prototype.setOption = function (key, value) { + if (!(key in Terminal.defaults)) { + throw new Error('No option with key "' + key + '"'); + } + switch (key) { + case 'scrollback': + if (this.options[key] !== value) { + if (this.lines.length > value) { + var amountToTrim = this.lines.length - value; + var needsRefresh = (this.ydisp - amountToTrim < 0); + this.lines.trimStart(amountToTrim); + this.ybase = Math.max(this.ybase - amountToTrim, 0); + this.ydisp = Math.max(this.ydisp - amountToTrim, 0); + if (needsRefresh) { + this.refresh(0, this.rows - 1); + } + } + this.lines.maxLength = value; + this.viewport.syncScrollArea(); + } + break; + } + this[key] = value; + this.options[key] = value; + switch (key) { + case 'cursorBlink': + this.setCursorBlinking(value); + break; + case 'cursorStyle': + this.element.classList.toggle("xterm-cursor-style-underline", value === 'underline'); + this.element.classList.toggle("xterm-cursor-style-bar", value === 'bar'); + break; + case 'tabStopWidth': + this.setupStops(); + break; + } +}; +Terminal.prototype.restartCursorBlinking = function () { + this.setCursorBlinking(this.options.cursorBlink); +}; +Terminal.prototype.setCursorBlinking = function (enabled) { + this.element.classList.toggle('xterm-cursor-blink', enabled); + this.clearCursorBlinkingInterval(); + if (enabled) { + var self = this; + this.cursorBlinkInterval = setInterval(function () { + self.element.classList.toggle('xterm-cursor-blink-on'); + }, CURSOR_BLINK_INTERVAL); + } +}; +Terminal.prototype.clearCursorBlinkingInterval = function () { + this.element.classList.remove('xterm-cursor-blink-on'); + if (this.cursorBlinkInterval) { + clearInterval(this.cursorBlinkInterval); + this.cursorBlinkInterval = null; + } +}; +Terminal.bindFocus = function (term) { + on(term.textarea, 'focus', function (ev) { + if (term.sendFocus) { + term.send(EscapeSequences_1.C0.ESC + '[I'); + } + term.element.classList.add('focus'); + term.showCursor(); + term.restartCursorBlinking.apply(term); + Terminal.focus = term; + term.emit('focus', { terminal: term }); + }); +}; +Terminal.prototype.blur = function () { + return this.textarea.blur(); +}; +Terminal.bindBlur = function (term) { + on(term.textarea, 'blur', function (ev) { + term.refresh(term.y, term.y); + if (term.sendFocus) { + term.send(EscapeSequences_1.C0.ESC + '[O'); + } + term.element.classList.remove('focus'); + term.clearCursorBlinkingInterval.apply(term); + Terminal.focus = null; + term.emit('blur', { terminal: term }); + }); +}; +Terminal.prototype.initGlobal = function () { + var term = this; + Terminal.bindKeys(this); + Terminal.bindFocus(this); + Terminal.bindBlur(this); + on(this.element, 'copy', function (ev) { + Clipboard_1.copyHandler.call(this, ev, term); + }); + on(this.textarea, 'paste', function (ev) { + Clipboard_1.pasteHandler.call(this, ev, term); + }); + on(this.element, 'paste', function (ev) { + Clipboard_1.pasteHandler.call(this, ev, term); + }); + function rightClickHandlerWrapper(ev) { + Clipboard_1.rightClickHandler.call(this, ev, term); + } + if (term.browser.isFirefox) { + on(this.element, 'mousedown', function (ev) { + if (ev.button == 2) { + rightClickHandlerWrapper(ev); + } + }); + } + else { + on(this.element, 'contextmenu', rightClickHandlerWrapper); + } +}; +Terminal.bindKeys = function (term) { + on(term.element, 'keydown', function (ev) { + if (document.activeElement != this) { + return; + } + term.keyDown(ev); + }, true); + on(term.element, 'keypress', function (ev) { + if (document.activeElement != this) { + return; + } + term.keyPress(ev); + }, true); + on(term.element, 'keyup', function (ev) { + if (!wasMondifierKeyOnlyEvent(ev)) { + term.focus(term); + } + }, true); + on(term.textarea, 'keydown', function (ev) { + term.keyDown(ev); + }, true); + on(term.textarea, 'keypress', function (ev) { + term.keyPress(ev); + this.value = ''; + }, true); + on(term.textarea, 'compositionstart', term.compositionHelper.compositionstart.bind(term.compositionHelper)); + on(term.textarea, 'compositionupdate', term.compositionHelper.compositionupdate.bind(term.compositionHelper)); + on(term.textarea, 'compositionend', term.compositionHelper.compositionend.bind(term.compositionHelper)); + term.on('refresh', term.compositionHelper.updateCompositionElements.bind(term.compositionHelper)); + term.on('refresh', function (data) { + term.queueLinkification(data.start, data.end); + }); +}; +Terminal.prototype.insertRow = function (row) { + if (typeof row != 'object') { + row = document.createElement('div'); + } + this.rowContainer.appendChild(row); + this.children.push(row); + return row; +}; +Terminal.prototype.open = function (parent, focus) { + var self = this, i = 0, div; + this.parent = parent || this.parent; + if (!this.parent) { + throw new Error('Terminal requires a parent element.'); + } + this.context = this.parent.ownerDocument.defaultView; + this.document = this.parent.ownerDocument; + this.body = this.document.getElementsByTagName('body')[0]; + this.element = this.document.createElement('div'); + this.element.classList.add('terminal'); + this.element.classList.add('xterm'); + this.element.classList.add('xterm-theme-' + this.theme); + this.setCursorBlinking(this.options.cursorBlink); + this.element.style.height; + this.element.setAttribute('tabindex', 0); + this.viewportElement = document.createElement('div'); + this.viewportElement.classList.add('xterm-viewport'); + this.element.appendChild(this.viewportElement); + this.viewportScrollArea = document.createElement('div'); + this.viewportScrollArea.classList.add('xterm-scroll-area'); + this.viewportElement.appendChild(this.viewportScrollArea); + this.rowContainer = document.createElement('div'); + this.rowContainer.classList.add('xterm-rows'); + this.element.appendChild(this.rowContainer); + this.children = []; + this.linkifier.attachToDom(document, this.children); + this.helperContainer = document.createElement('div'); + this.helperContainer.classList.add('xterm-helpers'); + this.element.appendChild(this.helperContainer); + this.textarea = document.createElement('textarea'); + this.textarea.classList.add('xterm-helper-textarea'); + this.textarea.setAttribute('autocorrect', 'off'); + this.textarea.setAttribute('autocapitalize', 'off'); + this.textarea.setAttribute('spellcheck', 'false'); + this.textarea.tabIndex = 0; + this.textarea.addEventListener('focus', function () { + self.emit('focus', { terminal: self }); + }); + this.textarea.addEventListener('blur', function () { + self.emit('blur', { terminal: self }); + }); + this.helperContainer.appendChild(this.textarea); + this.compositionView = document.createElement('div'); + this.compositionView.classList.add('composition-view'); + this.compositionHelper = new CompositionHelper_1.CompositionHelper(this.textarea, this.compositionView, this); + this.helperContainer.appendChild(this.compositionView); + this.charSizeStyleElement = document.createElement('style'); + this.helperContainer.appendChild(this.charSizeStyleElement); + for (; i < this.rows; i++) { + this.insertRow(); + } + this.parent.appendChild(this.element); + this.charMeasure = new CharMeasure_1.CharMeasure(document, this.helperContainer); + this.charMeasure.on('charsizechanged', function () { + self.updateCharSizeCSS(); + }); + this.charMeasure.measure(); + this.viewport = new Viewport_1.Viewport(this, this.viewportElement, this.viewportScrollArea, this.charMeasure); + this.renderer = new Renderer_1.Renderer(this); + this.refresh(0, this.rows - 1); + this.initGlobal(); + if (typeof focus == 'undefined') { + var message = 'You did not pass the `focus` argument in `Terminal.prototype.open()`.\n'; + message += 'The `focus` argument now defaults to `true` but starting with xterm.js 3.0 '; + message += 'it will default to `false`.'; + console.warn(message); + focus = true; + } + if (focus) { + this.focus(); + } + on(this.element, 'click', function () { + var selection = document.getSelection(), collapsed = selection.isCollapsed, isRange = typeof collapsed == 'boolean' ? !collapsed : selection.type == 'Range'; + if (!isRange) { + self.focus(); + } + }); + this.bindMouse(); + this.emit('open'); +}; +Terminal.loadAddon = function (addon, callback) { + if (typeof exports === 'object' && typeof module === 'object') { + return require('./addons/' + addon + '/' + addon); + } + else if (typeof define == 'function') { + return require(['./addons/' + addon + '/' + addon], callback); + } + else { + console.error('Cannot load a module without a CommonJS or RequireJS environment.'); + return false; + } +}; +Terminal.prototype.updateCharSizeCSS = function () { + this.charSizeStyleElement.textContent = + ".xterm-wide-char{width:" + this.charMeasure.width * 2 + "px;}" + + (".xterm-normal-char{width:" + this.charMeasure.width + "px;}"); +}; +Terminal.prototype.bindMouse = function () { + var el = this.element, self = this, pressed = 32; + function sendButton(ev) { + var button, pos; + button = getButton(ev); + pos = Mouse_1.getRawByteCoords(ev, self.rowContainer, self.charMeasure, self.cols, self.rows); + if (!pos) + return; + sendEvent(button, pos); + switch (ev.overrideType || ev.type) { + case 'mousedown': + pressed = button; + break; + case 'mouseup': + pressed = 32; + break; + case 'wheel': + break; + } + } + function sendMove(ev) { + var button = pressed, pos; + pos = Mouse_1.getRawByteCoords(ev, self.rowContainer, self.charMeasure, self.cols, self.rows); + if (!pos) + return; + button += 32; + sendEvent(button, pos); + } + function encode(data, ch) { + if (!self.utfMouse) { + if (ch === 255) + return data.push(0); + if (ch > 127) + ch = 127; + data.push(ch); + } + else { + if (ch === 2047) + return data.push(0); + if (ch < 127) { + data.push(ch); + } + else { + if (ch > 2047) + ch = 2047; + data.push(0xC0 | (ch >> 6)); + data.push(0x80 | (ch & 0x3F)); + } + } + } + function sendEvent(button, pos) { + if (self.vt300Mouse) { + button &= 3; + pos.x -= 32; + pos.y -= 32; + var data = EscapeSequences_1.C0.ESC + '[24'; + if (button === 0) + data += '1'; + else if (button === 1) + data += '3'; + else if (button === 2) + data += '5'; + else if (button === 3) + return; + else + data += '0'; + data += '~[' + pos.x + ',' + pos.y + ']\r'; + self.send(data); + return; + } + if (self.decLocator) { + button &= 3; + pos.x -= 32; + pos.y -= 32; + if (button === 0) + button = 2; + else if (button === 1) + button = 4; + else if (button === 2) + button = 6; + else if (button === 3) + button = 3; + self.send(EscapeSequences_1.C0.ESC + '[' + + button + + ';' + + (button === 3 ? 4 : 0) + + ';' + + pos.y + + ';' + + pos.x + + ';' + + (pos.page || 0) + + '&w'); + return; + } + if (self.urxvtMouse) { + pos.x -= 32; + pos.y -= 32; + pos.x++; + pos.y++; + self.send(EscapeSequences_1.C0.ESC + '[' + button + ';' + pos.x + ';' + pos.y + 'M'); + return; + } + if (self.sgrMouse) { + pos.x -= 32; + pos.y -= 32; + self.send(EscapeSequences_1.C0.ESC + '[<' + + (((button & 3) === 3 ? button & ~3 : button) - 32) + + ';' + + pos.x + + ';' + + pos.y + + ((button & 3) === 3 ? 'm' : 'M')); + return; + } + var data = []; + encode(data, button); + encode(data, pos.x); + encode(data, pos.y); + self.send(EscapeSequences_1.C0.ESC + '[M' + String.fromCharCode.apply(String, data)); + } + function getButton(ev) { + var button, shift, meta, ctrl, mod; + switch (ev.overrideType || ev.type) { + case 'mousedown': + button = ev.button != null + ? +ev.button + : ev.which != null + ? ev.which - 1 + : null; + if (self.browser.isMSIE) { + button = button === 1 ? 0 : button === 4 ? 1 : button; + } + break; + case 'mouseup': + button = 3; + break; + case 'DOMMouseScroll': + button = ev.detail < 0 + ? 64 + : 65; + break; + case 'wheel': + button = ev.wheelDeltaY > 0 + ? 64 + : 65; + break; + } + shift = ev.shiftKey ? 4 : 0; + meta = ev.metaKey ? 8 : 0; + ctrl = ev.ctrlKey ? 16 : 0; + mod = shift | meta | ctrl; + if (self.vt200Mouse) { + mod &= ctrl; + } + else if (!self.normalMouse) { + mod = 0; + } + button = (32 + (mod << 2)) + button; + return button; + } + on(el, 'mousedown', function (ev) { + if (!self.mouseEvents) + return; + sendButton(ev); + self.focus(); + if (self.vt200Mouse) { + ev.overrideType = 'mouseup'; + sendButton(ev); + return self.cancel(ev); + } + if (self.normalMouse) + on(self.document, 'mousemove', sendMove); + if (!self.x10Mouse) { + on(self.document, 'mouseup', function up(ev) { + sendButton(ev); + if (self.normalMouse) + off(self.document, 'mousemove', sendMove); + off(self.document, 'mouseup', up); + return self.cancel(ev); + }); + } + return self.cancel(ev); + }); + on(el, 'wheel', function (ev) { + if (!self.mouseEvents) + return; + if (self.x10Mouse + || self.vt300Mouse + || self.decLocator) + return; + sendButton(ev); + return self.cancel(ev); + }); + on(el, 'wheel', function (ev) { + if (self.mouseEvents) + return; + self.viewport.onWheel(ev); + return self.cancel(ev); + }); +}; +Terminal.prototype.destroy = function () { + this.readable = false; + this.writable = false; + this._events = {}; + this.handler = function () { }; + this.write = function () { }; + if (this.element && this.element.parentNode) { + this.element.parentNode.removeChild(this.element); + } +}; +Terminal.prototype.refresh = function (start, end) { + if (this.renderer) { + this.renderer.queueRefresh(start, end); + } +}; +Terminal.prototype.queueLinkification = function (start, end) { + if (this.linkifier) { + for (var i = start; i <= end; i++) { + this.linkifier.linkifyRow(i); + } + } +}; +Terminal.prototype.showCursor = function () { + if (!this.cursorState) { + this.cursorState = 1; + this.refresh(this.y, this.y); + } +}; +Terminal.prototype.scroll = function () { + var row; + if (this.lines.length === this.lines.maxLength) { + this.lines.trimStart(1); + this.ybase--; + if (this.ydisp !== 0) { + this.ydisp--; + } + } + this.ybase++; + if (!this.userScrolling) { + this.ydisp = this.ybase; + } + row = this.ybase + this.rows - 1; + row -= this.rows - 1 - this.scrollBottom; + if (row === this.lines.length) { + this.lines.push(this.blankLine()); + } + else { + this.lines.splice(row, 0, this.blankLine()); + } + if (this.scrollTop !== 0) { + if (this.ybase !== 0) { + this.ybase--; + if (!this.userScrolling) { + this.ydisp = this.ybase; + } + } + this.lines.splice(this.ybase + this.scrollTop, 1); + } + this.updateRange(this.scrollTop); + this.updateRange(this.scrollBottom); + this.emit('scroll', this.ydisp); +}; +Terminal.prototype.scrollDisp = function (disp, suppressScrollEvent) { + if (disp < 0) { + this.userScrolling = true; + } + else if (disp + this.ydisp >= this.ybase) { + this.userScrolling = false; + } + this.ydisp += disp; + if (this.ydisp > this.ybase) { + this.ydisp = this.ybase; + } + else if (this.ydisp < 0) { + this.ydisp = 0; + } + if (!suppressScrollEvent) { + this.emit('scroll', this.ydisp); + } + this.refresh(0, this.rows - 1); +}; +Terminal.prototype.scrollPages = function (pageCount) { + this.scrollDisp(pageCount * (this.rows - 1)); +}; +Terminal.prototype.scrollToTop = function () { + this.scrollDisp(-this.ydisp); +}; +Terminal.prototype.scrollToBottom = function () { + this.scrollDisp(this.ybase - this.ydisp); +}; +Terminal.prototype.write = function (data) { + this.writeBuffer.push(data); + if (this.options.useFlowControl && !this.xoffSentToCatchUp && this.writeBuffer.length >= WRITE_BUFFER_PAUSE_THRESHOLD) { + this.send(EscapeSequences_1.C0.DC3); + this.xoffSentToCatchUp = true; + } + if (!this.writeInProgress && this.writeBuffer.length > 0) { + this.writeInProgress = true; + var self = this; + setTimeout(function () { + self.innerWrite(); + }); + } +}; +Terminal.prototype.innerWrite = function () { + var writeBatch = this.writeBuffer.splice(0, WRITE_BATCH_SIZE); + while (writeBatch.length > 0) { + var data = writeBatch.shift(); + var l = data.length, i = 0, j, cs, ch, code, low, ch_width, row; + if (this.xoffSentToCatchUp && writeBatch.length === 0 && this.writeBuffer.length === 0) { + this.send(EscapeSequences_1.C0.DC1); + this.xoffSentToCatchUp = false; + } + this.refreshStart = this.y; + this.refreshEnd = this.y; + var state = this.parser.parse(data); + this.parser.setState(state); + this.updateRange(this.y); + this.refresh(this.refreshStart, this.refreshEnd); + } + if (this.writeBuffer.length > 0) { + var self = this; + setTimeout(function () { + self.innerWrite(); + }, 0); + } + else { + this.writeInProgress = false; + } +}; +Terminal.prototype.writeln = function (data) { + this.write(data + '\r\n'); +}; +Terminal.prototype.attachCustomKeydownHandler = function (customKeydownHandler) { + this.customKeydownHandler = customKeydownHandler; +}; +Terminal.prototype.setHypertextLinkHandler = function (handler) { + if (!this.linkifier) { + throw new Error('Cannot attach a hypertext link handler before Terminal.open is called'); + } + this.linkifier.setHypertextLinkHandler(handler); + this.refresh(0, this.rows - 1); +}; +Terminal.prototype.setHypertextValidationCallback = function (handler) { + if (!this.linkifier) { + throw new Error('Cannot attach a hypertext validation callback before Terminal.open is called'); + } + this.linkifier.setHypertextValidationCallback(handler); + this.refresh(0, this.rows - 1); +}; +Terminal.prototype.registerLinkMatcher = function (regex, handler, options) { + if (this.linkifier) { + var matcherId = this.linkifier.registerLinkMatcher(regex, handler, options); + this.refresh(0, this.rows - 1); + return matcherId; + } +}; +Terminal.prototype.deregisterLinkMatcher = function (matcherId) { + if (this.linkifier) { + if (this.linkifier.deregisterLinkMatcher(matcherId)) { + this.refresh(0, this.rows - 1); + } + } +}; +Terminal.prototype.keyDown = function (ev) { + if (this.customKeydownHandler && this.customKeydownHandler(ev) === false) { + return false; + } + this.restartCursorBlinking(); + if (!this.compositionHelper.keydown.bind(this.compositionHelper)(ev)) { + if (this.ybase !== this.ydisp) { + this.scrollToBottom(); + } + return false; + } + var self = this; + var result = this.evaluateKeyEscapeSequence(ev); + if (result.key === EscapeSequences_1.C0.DC3) { + this.writeStopped = true; + } + else if (result.key === EscapeSequences_1.C0.DC1) { + this.writeStopped = false; + } + if (result.scrollDisp) { + this.scrollDisp(result.scrollDisp); + return this.cancel(ev, true); + } + if (isThirdLevelShift(this, ev)) { + return true; + } + if (result.cancel) { + this.cancel(ev, true); + } + if (!result.key) { + return true; + } + this.emit('keydown', ev); + this.emit('key', result.key, ev); + this.showCursor(); + this.handler(result.key); + return this.cancel(ev, true); +}; +Terminal.prototype.evaluateKeyEscapeSequence = function (ev) { + var result = { + cancel: false, + key: undefined, + scrollDisp: undefined + }; + var modifiers = ev.shiftKey << 0 | ev.altKey << 1 | ev.ctrlKey << 2 | ev.metaKey << 3; + switch (ev.keyCode) { + case 8: + if (ev.shiftKey) { + result.key = EscapeSequences_1.C0.BS; + break; + } + result.key = EscapeSequences_1.C0.DEL; + break; + case 9: + if (ev.shiftKey) { + result.key = EscapeSequences_1.C0.ESC + '[Z'; + break; + } + result.key = EscapeSequences_1.C0.HT; + result.cancel = true; + break; + case 13: + result.key = EscapeSequences_1.C0.CR; + result.cancel = true; + break; + case 27: + result.key = EscapeSequences_1.C0.ESC; + result.cancel = true; + break; + case 37: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'D'; + if (result.key == EscapeSequences_1.C0.ESC + '[1;3D') { + result.key = (this.browser.isMac) ? EscapeSequences_1.C0.ESC + 'b' : EscapeSequences_1.C0.ESC + '[1;5D'; + } + } + else if (this.applicationCursor) { + result.key = EscapeSequences_1.C0.ESC + 'OD'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[D'; + } + break; + case 39: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'C'; + if (result.key == EscapeSequences_1.C0.ESC + '[1;3C') { + result.key = (this.browser.isMac) ? EscapeSequences_1.C0.ESC + 'f' : EscapeSequences_1.C0.ESC + '[1;5C'; + } + } + else if (this.applicationCursor) { + result.key = EscapeSequences_1.C0.ESC + 'OC'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[C'; + } + break; + case 38: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'A'; + if (result.key == EscapeSequences_1.C0.ESC + '[1;3A') { + result.key = EscapeSequences_1.C0.ESC + '[1;5A'; + } + } + else if (this.applicationCursor) { + result.key = EscapeSequences_1.C0.ESC + 'OA'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[A'; + } + break; + case 40: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'B'; + if (result.key == EscapeSequences_1.C0.ESC + '[1;3B') { + result.key = EscapeSequences_1.C0.ESC + '[1;5B'; + } + } + else if (this.applicationCursor) { + result.key = EscapeSequences_1.C0.ESC + 'OB'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[B'; + } + break; + case 45: + if (!ev.shiftKey && !ev.ctrlKey) { + result.key = EscapeSequences_1.C0.ESC + '[2~'; + } + break; + case 46: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[3;' + (modifiers + 1) + '~'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[3~'; + } + break; + case 36: + if (modifiers) + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'H'; + else if (this.applicationCursor) + result.key = EscapeSequences_1.C0.ESC + 'OH'; + else + result.key = EscapeSequences_1.C0.ESC + '[H'; + break; + case 35: + if (modifiers) + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'F'; + else if (this.applicationCursor) + result.key = EscapeSequences_1.C0.ESC + 'OF'; + else + result.key = EscapeSequences_1.C0.ESC + '[F'; + break; + case 33: + if (ev.shiftKey) { + result.scrollDisp = -(this.rows - 1); + } + else { + result.key = EscapeSequences_1.C0.ESC + '[5~'; + } + break; + case 34: + if (ev.shiftKey) { + result.scrollDisp = this.rows - 1; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[6~'; + } + break; + case 112: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'P'; + } + else { + result.key = EscapeSequences_1.C0.ESC + 'OP'; + } + break; + case 113: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'Q'; + } + else { + result.key = EscapeSequences_1.C0.ESC + 'OQ'; + } + break; + case 114: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'R'; + } + else { + result.key = EscapeSequences_1.C0.ESC + 'OR'; + } + break; + case 115: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[1;' + (modifiers + 1) + 'S'; + } + else { + result.key = EscapeSequences_1.C0.ESC + 'OS'; + } + break; + case 116: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[15;' + (modifiers + 1) + '~'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[15~'; + } + break; + case 117: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[17;' + (modifiers + 1) + '~'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[17~'; + } + break; + case 118: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[18;' + (modifiers + 1) + '~'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[18~'; + } + break; + case 119: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[19;' + (modifiers + 1) + '~'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[19~'; + } + break; + case 120: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[20;' + (modifiers + 1) + '~'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[20~'; + } + break; + case 121: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[21;' + (modifiers + 1) + '~'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[21~'; + } + break; + case 122: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[23;' + (modifiers + 1) + '~'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[23~'; + } + break; + case 123: + if (modifiers) { + result.key = EscapeSequences_1.C0.ESC + '[24;' + (modifiers + 1) + '~'; + } + else { + result.key = EscapeSequences_1.C0.ESC + '[24~'; + } + break; + default: + if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) { + if (ev.keyCode >= 65 && ev.keyCode <= 90) { + result.key = String.fromCharCode(ev.keyCode - 64); + } + else if (ev.keyCode === 32) { + result.key = String.fromCharCode(0); + } + else if (ev.keyCode >= 51 && ev.keyCode <= 55) { + result.key = String.fromCharCode(ev.keyCode - 51 + 27); + } + else if (ev.keyCode === 56) { + result.key = String.fromCharCode(127); + } + else if (ev.keyCode === 219) { + result.key = String.fromCharCode(27); + } + else if (ev.keyCode === 220) { + result.key = String.fromCharCode(28); + } + else if (ev.keyCode === 221) { + result.key = String.fromCharCode(29); + } + } + else if (!this.browser.isMac && ev.altKey && !ev.ctrlKey && !ev.metaKey) { + if (ev.keyCode >= 65 && ev.keyCode <= 90) { + result.key = EscapeSequences_1.C0.ESC + String.fromCharCode(ev.keyCode + 32); + } + else if (ev.keyCode === 192) { + result.key = EscapeSequences_1.C0.ESC + '`'; + } + else if (ev.keyCode >= 48 && ev.keyCode <= 57) { + result.key = EscapeSequences_1.C0.ESC + (ev.keyCode - 48); + } + } + break; + } + return result; +}; +Terminal.prototype.setgLevel = function (g) { + this.glevel = g; + this.charset = this.charsets[g]; +}; +Terminal.prototype.setgCharset = function (g, charset) { + this.charsets[g] = charset; + if (this.glevel === g) { + this.charset = charset; + } +}; +Terminal.prototype.keyPress = function (ev) { + var key; + this.cancel(ev); + if (ev.charCode) { + key = ev.charCode; + } + else if (ev.which == null) { + key = ev.keyCode; + } + else if (ev.which !== 0 && ev.charCode !== 0) { + key = ev.which; + } + else { + return false; + } + if (!key || ((ev.altKey || ev.ctrlKey || ev.metaKey) && !isThirdLevelShift(this, ev))) { + return false; + } + key = String.fromCharCode(key); + this.emit('keypress', key, ev); + this.emit('key', key, ev); + this.showCursor(); + this.handler(key); + return false; +}; +Terminal.prototype.send = function (data) { + var self = this; + if (!this.queue) { + setTimeout(function () { + self.handler(self.queue); + self.queue = ''; + }, 1); + } + this.queue += data; +}; +Terminal.prototype.bell = function () { + if (!this.visualBell) + return; + var self = this; + this.element.style.borderColor = 'white'; + setTimeout(function () { + self.element.style.borderColor = ''; + }, 10); + if (this.popOnBell) + this.focus(); +}; +Terminal.prototype.log = function () { + if (!this.debug) + return; + if (!this.context.console || !this.context.console.log) + return; + var args = Array.prototype.slice.call(arguments); + this.context.console.log.apply(this.context.console, args); +}; +Terminal.prototype.error = function () { + if (!this.debug) + return; + if (!this.context.console || !this.context.console.error) + return; + var args = Array.prototype.slice.call(arguments); + this.context.console.error.apply(this.context.console, args); +}; +Terminal.prototype.resize = function (x, y) { + if (isNaN(x) || isNaN(y)) { + return; + } + var line, el, i, j, ch, addToY; + if (x === this.cols && y === this.rows) { + return; + } + if (x < 1) + x = 1; + if (y < 1) + y = 1; + j = this.cols; + if (j < x) { + ch = [this.defAttr, ' ', 1]; + i = this.lines.length; + while (i--) { + while (this.lines.get(i).length < x) { + this.lines.get(i).push(ch); + } + } + } + this.cols = x; + this.setupStops(this.cols); + j = this.rows; + addToY = 0; + if (j < y) { + el = this.element; + while (j++ < y) { + if (this.lines.length < y + this.ybase) { + if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) { + this.ybase--; + addToY++; + if (this.ydisp > 0) { + this.ydisp--; + } + } + else { + this.lines.push(this.blankLine()); + } + } + if (this.children.length < y) { + this.insertRow(); + } + } + } + else { + while (j-- > y) { + if (this.lines.length > y + this.ybase) { + if (this.lines.length > this.ybase + this.y + 1) { + this.lines.pop(); + } + else { + this.ybase++; + this.ydisp++; + } + } + if (this.children.length > y) { + el = this.children.shift(); + if (!el) + continue; + el.parentNode.removeChild(el); + } + } + } + this.rows = y; + if (this.y >= y) { + this.y = y - 1; + } + if (addToY) { + this.y += addToY; + } + if (this.x >= x) { + this.x = x - 1; + } + this.scrollTop = 0; + this.scrollBottom = y - 1; + this.charMeasure.measure(); + this.refresh(0, this.rows - 1); + this.normal = null; + this.geometry = [this.cols, this.rows]; + this.emit('resize', { terminal: this, cols: x, rows: y }); +}; +Terminal.prototype.updateRange = function (y) { + if (y < this.refreshStart) + this.refreshStart = y; + if (y > this.refreshEnd) + this.refreshEnd = y; +}; +Terminal.prototype.maxRange = function () { + this.refreshStart = 0; + this.refreshEnd = this.rows - 1; +}; +Terminal.prototype.setupStops = function (i) { + if (i != null) { + if (!this.tabs[i]) { + i = this.prevStop(i); + } + } + else { + this.tabs = {}; + i = 0; + } + for (; i < this.cols; i += this.getOption('tabStopWidth')) { + this.tabs[i] = true; + } +}; +Terminal.prototype.prevStop = function (x) { + if (x == null) + x = this.x; + while (!this.tabs[--x] && x > 0) + ; + return x >= this.cols + ? this.cols - 1 + : x < 0 ? 0 : x; +}; +Terminal.prototype.nextStop = function (x) { + if (x == null) + x = this.x; + while (!this.tabs[++x] && x < this.cols) + ; + return x >= this.cols + ? this.cols - 1 + : x < 0 ? 0 : x; +}; +Terminal.prototype.eraseRight = function (x, y) { + var line = this.lines.get(this.ybase + y); + if (!line) { + return; + } + var ch = [this.eraseAttr(), ' ', 1]; + for (; x < this.cols; x++) { + line[x] = ch; + } + this.updateRange(y); +}; +Terminal.prototype.eraseLeft = function (x, y) { + var line = this.lines.get(this.ybase + y); + if (!line) { + return; + } + var ch = [this.eraseAttr(), ' ', 1]; + x++; + while (x--) { + line[x] = ch; + } + this.updateRange(y); +}; +Terminal.prototype.clear = function () { + if (this.ybase === 0 && this.y === 0) { + return; + } + this.lines.set(0, this.lines.get(this.ybase + this.y)); + this.lines.length = 1; + this.ydisp = 0; + this.ybase = 0; + this.y = 0; + for (var i = 1; i < this.rows; i++) { + this.lines.push(this.blankLine()); + } + this.refresh(0, this.rows - 1); + this.emit('scroll', this.ydisp); +}; +Terminal.prototype.eraseLine = function (y) { + this.eraseRight(0, y); +}; +Terminal.prototype.blankLine = function (cur) { + var attr = cur + ? this.eraseAttr() + : this.defAttr; + var ch = [attr, ' ', 1], line = [], i = 0; + for (; i < this.cols; i++) { + line[i] = ch; + } + return line; +}; +Terminal.prototype.ch = function (cur) { + return cur + ? [this.eraseAttr(), ' ', 1] + : [this.defAttr, ' ', 1]; +}; +Terminal.prototype.is = function (term) { + var name = this.termName; + return (name + '').indexOf(term) === 0; +}; +Terminal.prototype.handler = function (data) { + if (this.options.disableStdin) { + return; + } + if (this.ybase !== this.ydisp) { + this.scrollToBottom(); + } + this.emit('data', data); +}; +Terminal.prototype.handleTitle = function (title) { + this.emit('title', title); +}; +Terminal.prototype.index = function () { + this.y++; + if (this.y > this.scrollBottom) { + this.y--; + this.scroll(); + } + if (this.x >= this.cols) { + this.x--; + } +}; +Terminal.prototype.reverseIndex = function () { + var j; + if (this.y === this.scrollTop) { + this.lines.shiftElements(this.y + this.ybase, this.rows - 1, 1); + this.lines.set(this.y + this.ybase, this.blankLine(true)); + this.updateRange(this.scrollTop); + this.updateRange(this.scrollBottom); + } + else { + this.y--; + } +}; +Terminal.prototype.reset = function () { + this.options.rows = this.rows; + this.options.cols = this.cols; + var customKeydownHandler = this.customKeydownHandler; + var cursorBlinkInterval = this.cursorBlinkInterval; + Terminal.call(this, this.options); + this.customKeydownHandler = customKeydownHandler; + this.cursorBlinkInterval = cursorBlinkInterval; + this.refresh(0, this.rows - 1); + this.viewport.syncScrollArea(); +}; +Terminal.prototype.tabSet = function () { + this.tabs[this.x] = true; +}; +function on(el, type, handler, capture) { + if (!Array.isArray(el)) { + el = [el]; + } + el.forEach(function (element) { + element.addEventListener(type, handler, capture || false); + }); +} +function off(el, type, handler, capture) { + el.removeEventListener(type, handler, capture || false); +} +function cancel(ev, force) { + if (!this.cancelEvents && !force) { + return; + } + ev.preventDefault(); + ev.stopPropagation(); + return false; +} +function inherits(child, parent) { + function f() { + this.constructor = child; + } + f.prototype = parent.prototype; + child.prototype = new f; +} +function indexOf(obj, el) { + var i = obj.length; + while (i--) { + if (obj[i] === el) + return i; + } + return -1; +} +function isThirdLevelShift(term, ev) { + var thirdLevelKey = (term.browser.isMac && ev.altKey && !ev.ctrlKey && !ev.metaKey) || + (term.browser.isMSWindows && ev.altKey && ev.ctrlKey && !ev.metaKey); + if (ev.type == 'keypress') { + return thirdLevelKey; + } + return thirdLevelKey && (!ev.keyCode || ev.keyCode > 47); +} +Terminal.prototype.matchColor = matchColor; +function matchColor(r1, g1, b1) { + var hash = (r1 << 16) | (g1 << 8) | b1; + if (matchColor._cache[hash] != null) { + return matchColor._cache[hash]; + } + var ldiff = Infinity, li = -1, i = 0, c, r2, g2, b2, diff; + for (; i < Terminal.vcolors.length; i++) { + c = Terminal.vcolors[i]; + r2 = c[0]; + g2 = c[1]; + b2 = c[2]; + diff = matchColor.distance(r1, g1, b1, r2, g2, b2); + if (diff === 0) { + li = i; + break; + } + if (diff < ldiff) { + ldiff = diff; + li = i; + } + } + return matchColor._cache[hash] = li; +} +matchColor._cache = {}; +matchColor.distance = function (r1, g1, b1, r2, g2, b2) { + return Math.pow(30 * (r1 - r2), 2) + + Math.pow(59 * (g1 - g2), 2) + + Math.pow(11 * (b1 - b2), 2); +}; +function each(obj, iter, con) { + if (obj.forEach) + return obj.forEach(iter, con); + for (var i = 0; i < obj.length; i++) { + iter.call(con, obj[i], i, obj); + } +} +function wasMondifierKeyOnlyEvent(ev) { + return ev.keyCode === 16 || + ev.keyCode === 17 || + ev.keyCode === 18; +} +function keys(obj) { + if (Object.keys) + return Object.keys(obj); + var key, keys = []; + for (key in obj) { + if (Object.prototype.hasOwnProperty.call(obj, key)) { + keys.push(key); + } + } + return keys; +} +Terminal.EventEmitter = EventEmitter_1.EventEmitter; +Terminal.inherits = inherits; +Terminal.on = on; +Terminal.off = off; +Terminal.cancel = cancel; +module.exports = Terminal; + + + +},{"./CompositionHelper":2,"./EscapeSequences":3,"./EventEmitter":4,"./InputHandler":5,"./Linkifier":6,"./Parser":7,"./Renderer":8,"./Viewport":9,"./handlers/Clipboard":10,"./utils/Browser":11,"./utils/CharMeasure":12,"./utils/CircularList":13,"./utils/Mouse":16}]},{},[17])(17) }); //# sourceMappingURL=xterm.js.map
diff --git a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/jsdoc.json b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/jsdoc.json deleted file mode 100644 index 66b174e..0000000 --- a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/jsdoc.json +++ /dev/null
@@ -1,26 +0,0 @@ -{ - "source": { - "include": [ - "src/xterm.js", - "addons/attach/attach.js", - "addons/fit/fit.js", - "addons/fullscreen/fullscreen.js", - "addons/linkify/linkify.js" - ] - }, - "opts": { - "readme": "README.md", - "template": "node_modules/docdash", - "encoding": "utf8", - "destination": "docs/", - "recurse": true, - "verbose": true - }, - "plugins": [ - "plugins/markdown" - ], - "templates": { - "cleverLinks": false, - "monospaceLinks": false - } -}
diff --git a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/package.json b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/package.json deleted file mode 100644 index 6b667dcc..0000000 --- a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/package.json +++ /dev/null
@@ -1,36 +0,0 @@ -{ - "name": "xterm", - "version": "1.1.3", - "ignore": [ - "demo", - "test", - ".gitignore" - ], - "main": "src/xterm.js", - "repository": "https://github.com/sourcelair/xterm.js", - "license": "MIT", - "devDependencies": { - "babel-core": "6.14.0", - "babel-preset-es2015": "6.14.0", - "babelify": "^7.3.0", - "browserify": "^13.1.0", - "chai": "3.5.0", - "derequire": "^2.0.3", - "docdash": "0.4.0", - "exorcist": "^0.4.0", - "express": "4.13.4", - "express-ws": "2.0.0-rc.1", - "glob": "^7.0.5", - "jsdoc": "3.4.0", - "mocha": "2.5.3", - "nodemon": "1.10.2", - "pty.js": "0.3.1", - "sleep": "^3.0.1" - }, - "scripts": { - "start": "nodemon --watch src --watch addons --exec bash -c './bin/build && node demo/app'", - "test": "mocha --recursive --compilers js:babel-core/register", - "build:docs": "jsdoc -c jsdoc.json", - "build": "./bin/build" - } -}
diff --git a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/src/CompositionHelper.js b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/src/CompositionHelper.js deleted file mode 100644 index eeadd83a..0000000 --- a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/src/CompositionHelper.js +++ /dev/null
@@ -1,201 +0,0 @@ -/** - * xterm.js: xterm, in the browser - * Copyright (c) 2016, SourceLair Limited <www.sourcelair.com> (MIT License) - */ - -/** - * Encapsulates the logic for handling compositionstart, compositionupdate and compositionend - * events, displaying the in-progress composition to the UI and forwarding the final composition - * to the handler. - * @param {HTMLTextAreaElement} textarea The textarea that xterm uses for input. - * @param {HTMLElement} compositionView The element to display the in-progress composition in. - * @param {Terminal} terminal The Terminal to forward the finished composition to. - */ -function CompositionHelper(textarea, compositionView, terminal) { - this.textarea = textarea; - this.compositionView = compositionView; - this.terminal = terminal; - - // Whether input composition is currently happening, eg. via a mobile keyboard, speech input - // or IME. This variable determines whether the compositionText should be displayed on the UI. - this.isComposing = false; - - // The input currently being composed, eg. via a mobile keyboard, speech input or IME. - this.compositionText = null; - - // The position within the input textarea's value of the current composition. - this.compositionPosition = { start: null, end: null }; - - // Whether a composition is in the process of being sent, setting this to false will cancel - // any in-progress composition. - this.isSendingComposition = false; -} - -/** - * Handles the compositionstart event, activating the composition view. - */ -CompositionHelper.prototype.compositionstart = function() { - this.isComposing = true; - this.compositionPosition.start = this.textarea.value.length; - this.compositionView.textContent = ''; - this.compositionView.classList.add('active'); -}; - -/** - * Handles the compositionupdate event, updating the composition view. - * @param {CompositionEvent} ev The event. - */ -CompositionHelper.prototype.compositionupdate = function(ev) { - this.compositionView.textContent = ev.data; - this.updateCompositionElements(); - var self = this; - setTimeout(function() { - self.compositionPosition.end = self.textarea.value.length; - }, 0); -}; - -/** - * Handles the compositionend event, hiding the composition view and sending the composition to - * the handler. - */ -CompositionHelper.prototype.compositionend = function() { - this.finalizeComposition(true); -}; - -/** - * Handles the keydown event, routing any necessary events to the CompositionHelper functions. - * @return Whether the Terminal should continue processing the keydown event. - */ -CompositionHelper.prototype.keydown = function(ev) { - if (this.isComposing || this.isSendingComposition) { - if (ev.keyCode === 229) { - // Continue composing if the keyCode is the "composition character" - return false; - } else if (ev.keyCode === 16 || ev.keyCode === 17 || ev.keyCode === 18) { - // Continue composing if the keyCode is a modifier key - return false; - } else { - // Finish composition immediately. This is mainly here for the case where enter is - // pressed and the handler needs to be triggered before the command is executed. - this.finalizeComposition(false); - } - } - - if (ev.keyCode === 229) { - // If the "composition character" is used but gets to this point it means a non-composition - // character (eg. numbers and punctuation) was pressed when the IME was active. - this.handleAnyTextareaChanges(); - return false; - } - - return true; -}; - -/** - * Finalizes the composition, resuming regular input actions. This is called when a composition - * is ending. - * @param {boolean} waitForPropogation Whether to wait for events to propogate before sending - * the input. This should be false if a non-composition keystroke is entered before the - * compositionend event is triggered, such as enter, so that the composition is send before - * the command is executed. - */ -CompositionHelper.prototype.finalizeComposition = function(waitForPropogation) { - this.compositionView.classList.remove('active'); - this.isComposing = false; - this.clearTextareaPosition(); - - if (!waitForPropogation) { - // Cancel any delayed composition send requests and send the input immediately. - this.isSendingComposition = false; - var input = this.textarea.value.substring(this.compositionPosition.start, this.compositionPosition.end); - this.terminal.handler(input); - } else { - // Make a deep copy of the composition position here as a new compositionstart event may - // fire before the setTimeout executes. - var currentCompositionPosition = { - start: this.compositionPosition.start, - end: this.compositionPosition.end, - } - - // Since composition* events happen before the changes take place in the textarea on most - // browsers, use a setTimeout with 0ms time to allow the native compositionend event to - // complete. This ensures the correct character is retrieved, this solution was used - // because: - // - The compositionend event's data property is unreliable, at least on Chromium - // - The last compositionupdate event's data property does not always accurately describe - // the character, a counter example being Korean where an ending consonsant can move to - // the following character if the following input is a vowel. - var self = this; - this.isSendingComposition = true; - setTimeout(function () { - // Ensure that the input has not already been sent - if (self.isSendingComposition) { - self.isSendingComposition = false; - var input; - if (self.isComposing) { - // Use the end position to get the string if a new composition has started. - input = self.textarea.value.substring(currentCompositionPosition.start, currentCompositionPosition.end); - } else { - // Don't use the end position here in order to pick up any characters after the - // composition has finished, for example when typing a non-composition character - // (eg. 2) after a composition character. - input = self.textarea.value.substring(currentCompositionPosition.start); - } - self.terminal.handler(input); - } - }, 0); - } -}; - -/** - * Apply any changes made to the textarea after the current event chain is allowed to complete. - * This should be called when not currently composing but a keydown event with the "composition - * character" (229) is triggered, in order to allow non-composition text to be entered when an - * IME is active. - */ -CompositionHelper.prototype.handleAnyTextareaChanges = function() { - var oldValue = this.textarea.value; - var self = this; - setTimeout(function() { - // Ignore if a composition has started since the timeout - if (!self.isComposing) { - var newValue = self.textarea.value; - var diff = newValue.replace(oldValue, ''); - if (diff.length > 0) { - self.terminal.handler(diff); - } - } - }, 0); -}; - -/** - * Positions the composition view on top of the cursor and the textarea just below it (so the - * IME helper dialog is positioned correctly). - */ -CompositionHelper.prototype.updateCompositionElements = function(dontRecurse) { - if (!this.isComposing) { - return; - } - var cursor = this.terminal.element.querySelector('.terminal-cursor'); - if (cursor) { - this.compositionView.style.left = cursor.offsetLeft + 'px'; - this.compositionView.style.top = cursor.offsetTop + 'px'; - var compositionViewBounds = this.compositionView.getBoundingClientRect(); - this.textarea.style.left = cursor.offsetLeft + compositionViewBounds.width + 'px'; - this.textarea.style.top = (cursor.offsetTop + cursor.offsetHeight) + 'px'; - } - if (!dontRecurse) { - setTimeout(this.updateCompositionElements.bind(this, true), 0); - } -}; - -/** - * Clears the textarea's position so that the cursor does not blink on IE. - * @private - */ -CompositionHelper.prototype.clearTextareaPosition = function() { - this.textarea.style.left = ''; - this.textarea.style.top = ''; -}; - -export { CompositionHelper };
diff --git a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/src/EventEmitter.js b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/src/EventEmitter.js deleted file mode 100644 index b17fbc7..0000000 --- a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/src/EventEmitter.js +++ /dev/null
@@ -1,64 +0,0 @@ -/** - * EventEmitter - */ - -function EventEmitter() { - this._events = this._events || {}; -} - -EventEmitter.prototype.addListener = function(type, listener) { - this._events[type] = this._events[type] || []; - this._events[type].push(listener); -}; - -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.removeListener = function(type, listener) { - if (!this._events[type]) return; - - var obj = this._events[type] - , i = obj.length; - - while (i--) { - if (obj[i] === listener || obj[i].listener === listener) { - obj.splice(i, 1); - return; - } - } -}; - -EventEmitter.prototype.off = EventEmitter.prototype.removeListener; - -EventEmitter.prototype.removeAllListeners = function(type) { - if (this._events[type]) delete this._events[type]; -}; - -EventEmitter.prototype.once = function(type, listener) { - var self = this; - function on() { - var args = Array.prototype.slice.call(arguments); - this.removeListener(type, on); - return listener.apply(this, args); - } - on.listener = listener; - return this.on(type, on); -}; - -EventEmitter.prototype.emit = function(type) { - if (!this._events[type]) return; - - var args = Array.prototype.slice.call(arguments, 1) - , obj = this._events[type] - , l = obj.length - , i = 0; - - for (; i < l; i++) { - obj[i].apply(this, args); - } -}; - -EventEmitter.prototype.listeners = function(type) { - return this._events[type] = this._events[type] || []; -}; - -export { EventEmitter };
diff --git a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/src/Viewport.js b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/src/Viewport.js deleted file mode 100644 index 05f04f85..0000000 --- a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/src/Viewport.js +++ /dev/null
@@ -1,114 +0,0 @@ -/** - * xterm.js: xterm, in the browser - * Copyright (c) 2016, SourceLair Limited <www.sourcelair.com> (MIT License) - */ - -/** - * Represents the viewport of a terminal, the visible area within the larger buffer of output. - * Logic for the virtual scroll bar is included in this object. - * @param {Terminal} terminal The Terminal object. - * @param {HTMLElement} viewportElement The DOM element acting as the viewport - * @param {HTMLElement} charMeasureElement A DOM element used to measure the character size of - * the terminal. - */ -function Viewport(terminal, viewportElement, scrollArea, charMeasureElement) { - this.terminal = terminal; - this.viewportElement = viewportElement; - this.scrollArea = scrollArea; - this.charMeasureElement = charMeasureElement; - this.currentRowHeight = 0; - this.lastRecordedBufferLength = 0; - this.lastRecordedViewportHeight = 0; - - this.terminal.on('scroll', this.syncScrollArea.bind(this)); - this.terminal.on('resize', this.syncScrollArea.bind(this)); - this.viewportElement.addEventListener('scroll', this.onScroll.bind(this)); - - this.syncScrollArea(); -} - -/** - * Refreshes row height, setting line-height, viewport height and scroll area height if - * necessary. - * @param {number|undefined} charSize A character size measurement bounding rect object, if it - * doesn't exist it will be created. - */ -Viewport.prototype.refresh = function(charSize) { - var size = charSize || this.charMeasureElement.getBoundingClientRect(); - if (size.height > 0) { - var rowHeightChanged = size.height !== this.currentRowHeight; - if (rowHeightChanged) { - this.currentRowHeight = size.height; - this.viewportElement.style.lineHeight = size.height + 'px'; - this.terminal.rowContainer.style.lineHeight = size.height + 'px'; - } - var viewportHeightChanged = this.lastRecordedViewportHeight !== this.terminal.rows; - if (rowHeightChanged || viewportHeightChanged) { - this.lastRecordedViewportHeight = this.terminal.rows; - this.viewportElement.style.height = size.height * this.terminal.rows + 'px'; - } - this.scrollArea.style.height = (size.height * this.lastRecordedBufferLength) + 'px'; - } -}; - -/** - * Updates dimensions and synchronizes the scroll area if necessary. - */ -Viewport.prototype.syncScrollArea = function() { - if (this.lastRecordedBufferLength !== this.terminal.lines.length) { - // If buffer height changed - this.lastRecordedBufferLength = this.terminal.lines.length; - this.refresh(); - } else if (this.lastRecordedViewportHeight !== this.terminal.rows) { - // If viewport height changed - this.refresh(); - } else { - // If size has changed, refresh viewport - var size = this.charMeasureElement.getBoundingClientRect(); - if (size.height !== this.currentRowHeight) { - this.refresh(size); - } - } - - // Sync scrollTop - var scrollTop = this.terminal.ydisp * this.currentRowHeight; - if (this.viewportElement.scrollTop !== scrollTop) { - this.viewportElement.scrollTop = scrollTop; - } -}; - -/** - * Handles scroll events on the viewport, calculating the new viewport and requesting the - * terminal to scroll to it. - * @param {Event} ev The scroll event. - */ -Viewport.prototype.onScroll = function(ev) { - var newRow = Math.round(this.viewportElement.scrollTop / this.currentRowHeight); - var diff = newRow - this.terminal.ydisp; - this.terminal.scrollDisp(diff, true); -}; - -/** - * Handles mouse wheel events by adjusting the viewport's scrollTop and delegating the actual - * scrolling to `onScroll`, this event needs to be attached manually by the consumer of - * `Viewport`. - * @param {WheelEvent} ev The mouse wheel event. - */ -Viewport.prototype.onWheel = function(ev) { - if (ev.deltaY === 0) { - // Do nothing if it's not a vertical scroll event - return; - } - // Fallback to WheelEvent.DOM_DELTA_PIXEL - var multiplier = 1; - if (ev.deltaMode === WheelEvent.DOM_DELTA_LINE) { - multiplier = this.currentRowHeight; - } else if (ev.deltaMode === WheelEvent.DOM_DELTA_PAGE) { - multiplier = this.currentRowHeight * this.terminal.rows; - } - this.viewportElement.scrollTop += ev.deltaY * multiplier; - // Prevent the page from scrolling when the terminal scrolls - ev.preventDefault(); -}; - -export { Viewport };
diff --git a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/src/xterm.css b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/src/xterm.css deleted file mode 100644 index 8295eb65..0000000 --- a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/src/xterm.css +++ /dev/null
@@ -1,2196 +0,0 @@ -/** - * xterm.js: xterm, in the browser - * Copyright (c) 2014, sourceLair Limited (www.sourcelair.com (MIT License) - * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) - * https://github.com/chjj/term.js - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * Originally forked from (with the author's permission): - * Fabrice Bellard's javascript vt100 for jslinux: - * http://bellard.org/jslinux/ - * Copyright (c) 2011 Fabrice Bellard - * The original design remains. The terminal itself - * has been extended to include xterm CSI codes, among - * other features. - */ - -/* - * Default style for xterm.js - */ - -.terminal { - background-color: #000; - color: #fff; - font-family: courier-new, courier, monospace; - font-feature-settings: "liga" 0; - position: relative; -} - -.terminal.focus, -.terminal:focus { - outline: none; -} - -.terminal .xterm-helpers { - position: absolute; - top: 0; -} - -.terminal .xterm-helper-textarea { - position: absolute; - /* - * HACK: to fix IE's blinking cursor - * Move textarea out of the screen to the far left, so that the cursor is not visible. - */ - left: -9999em; - opacity: 0; - width: 0; - height: 0; - z-index: -10; -} - -.terminal .terminal-cursor { - background-color: #fff; - color: #000; -} - -.terminal:not(.focus) .terminal-cursor { - outline: 1px solid #fff; - outline-offset: -1px; - background-color: transparent; -} - -.terminal.focus .terminal-cursor.blinking { - animation: blink-cursor 1.2s infinite step-end; -} - -@keyframes blink-cursor { - 0% { - background-color: #fff; - color: #000; - } - 50% { - background-color: transparent; - color: #FFF; - } -} - -.terminal .composition-view { - background: #000; - color: #FFF; - display: none; - position: absolute; - white-space: nowrap; - z-index: 1; -} - -.terminal .composition-view.active { - display: block; -} - -.terminal .xterm-viewport { - /* On OS X this is required in order for the scroll bar to appear fully opaque */ - background-color: #000; - overflow-y: scroll; -} - -.terminal .xterm-rows { - position: absolute; - left: 0; - top: 0; -} - -.terminal .xterm-scroll-area { - visibility: hidden; -} - -.terminal .xterm-char-measure-element { - display: inline-block; - visibility: hidden; - position: absolute; - left: -9999em; -} - -/* - * Determine default colors for xterm.js - */ -.terminal .xterm-bold { - font-weight: bold; -} - -.terminal .xterm-underline { - text-decoration: underline; -} - -.terminal .xterm-blink { - text-decoration: blink; -} - -.terminal .xterm-hidden { - visibility: hidden; -} - -.terminal .xterm-color-0 { - color: #2e3436; -} - -.terminal .xterm-bg-color-0 { - background-color: #2e3436; -} - -.terminal .xterm-color-1 { - color: #cc0000; -} - -.terminal .xterm-bg-color-1 { - background-color: #cc0000; -} - -.terminal .xterm-color-2 { - color: #4e9a06; -} - -.terminal .xterm-bg-color-2 { - background-color: #4e9a06; -} - -.terminal .xterm-color-3 { - color: #c4a000; -} - -.terminal .xterm-bg-color-3 { - background-color: #c4a000; -} - -.terminal .xterm-color-4 { - color: #3465a4; -} - -.terminal .xterm-bg-color-4 { - background-color: #3465a4; -} - -.terminal .xterm-color-5 { - color: #75507b; -} - -.terminal .xterm-bg-color-5 { - background-color: #75507b; -} - -.terminal .xterm-color-6 { - color: #06989a; -} - -.terminal .xterm-bg-color-6 { - background-color: #06989a; -} - -.terminal .xterm-color-7 { - color: #d3d7cf; -} - -.terminal .xterm-bg-color-7 { - background-color: #d3d7cf; -} - -.terminal .xterm-color-8 { - color: #555753; -} - -.terminal .xterm-bg-color-8 { - background-color: #555753; -} - -.terminal .xterm-color-9 { - color: #ef2929; -} - -.terminal .xterm-bg-color-9 { - background-color: #ef2929; -} - -.terminal .xterm-color-10 { - color: #8ae234; -} - -.terminal .xterm-bg-color-10 { - background-color: #8ae234; -} - -.terminal .xterm-color-11 { - color: #fce94f; -} - -.terminal .xterm-bg-color-11 { - background-color: #fce94f; -} - -.terminal .xterm-color-12 { - color: #729fcf; -} - -.terminal .xterm-bg-color-12 { - background-color: #729fcf; -} - -.terminal .xterm-color-13 { - color: #ad7fa8; -} - -.terminal .xterm-bg-color-13 { - background-color: #ad7fa8; -} - -.terminal .xterm-color-14 { - color: #34e2e2; -} - -.terminal .xterm-bg-color-14 { - background-color: #34e2e2; -} - -.terminal .xterm-color-15 { - color: #eeeeec; -} - -.terminal .xterm-bg-color-15 { - background-color: #eeeeec; -} - -.terminal .xterm-color-16 { - color: #000000; -} - -.terminal .xterm-bg-color-16 { - background-color: #000000; -} - -.terminal .xterm-color-17 { - color: #00005f; -} - -.terminal .xterm-bg-color-17 { - background-color: #00005f; -} - -.terminal .xterm-color-18 { - color: #000087; -} - -.terminal .xterm-bg-color-18 { - background-color: #000087; -} - -.terminal .xterm-color-19 { - color: #0000af; -} - -.terminal .xterm-bg-color-19 { - background-color: #0000af; -} - -.terminal .xterm-color-20 { - color: #0000d7; -} - -.terminal .xterm-bg-color-20 { - background-color: #0000d7; -} - -.terminal .xterm-color-21 { - color: #0000ff; -} - -.terminal .xterm-bg-color-21 { - background-color: #0000ff; -} - -.terminal .xterm-color-22 { - color: #005f00; -} - -.terminal .xterm-bg-color-22 { - background-color: #005f00; -} - -.terminal .xterm-color-23 { - color: #005f5f; -} - -.terminal .xterm-bg-color-23 { - background-color: #005f5f; -} - -.terminal .xterm-color-24 { - color: #005f87; -} - -.terminal .xterm-bg-color-24 { - background-color: #005f87; -} - -.terminal .xterm-color-25 { - color: #005faf; -} - -.terminal .xterm-bg-color-25 { - background-color: #005faf; -} - -.terminal .xterm-color-26 { - color: #005fd7; -} - -.terminal .xterm-bg-color-26 { - background-color: #005fd7; -} - -.terminal .xterm-color-27 { - color: #005fff; -} - -.terminal .xterm-bg-color-27 { - background-color: #005fff; -} - -.terminal .xterm-color-28 { - color: #008700; -} - -.terminal .xterm-bg-color-28 { - background-color: #008700; -} - -.terminal .xterm-color-29 { - color: #00875f; -} - -.terminal .xterm-bg-color-29 { - background-color: #00875f; -} - -.terminal .xterm-color-30 { - color: #008787; -} - -.terminal .xterm-bg-color-30 { - background-color: #008787; -} - -.terminal .xterm-color-31 { - color: #0087af; -} - -.terminal .xterm-bg-color-31 { - background-color: #0087af; -} - -.terminal .xterm-color-32 { - color: #0087d7; -} - -.terminal .xterm-bg-color-32 { - background-color: #0087d7; -} - -.terminal .xterm-color-33 { - color: #0087ff; -} - -.terminal .xterm-bg-color-33 { - background-color: #0087ff; -} - -.terminal .xterm-color-34 { - color: #00af00; -} - -.terminal .xterm-bg-color-34 { - background-color: #00af00; -} - -.terminal .xterm-color-35 { - color: #00af5f; -} - -.terminal .xterm-bg-color-35 { - background-color: #00af5f; -} - -.terminal .xterm-color-36 { - color: #00af87; -} - -.terminal .xterm-bg-color-36 { - background-color: #00af87; -} - -.terminal .xterm-color-37 { - color: #00afaf; -} - -.terminal .xterm-bg-color-37 { - background-color: #00afaf; -} - -.terminal .xterm-color-38 { - color: #00afd7; -} - -.terminal .xterm-bg-color-38 { - background-color: #00afd7; -} - -.terminal .xterm-color-39 { - color: #00afff; -} - -.terminal .xterm-bg-color-39 { - background-color: #00afff; -} - -.terminal .xterm-color-40 { - color: #00d700; -} - -.terminal .xterm-bg-color-40 { - background-color: #00d700; -} - -.terminal .xterm-color-41 { - color: #00d75f; -} - -.terminal .xterm-bg-color-41 { - background-color: #00d75f; -} - -.terminal .xterm-color-42 { - color: #00d787; -} - -.terminal .xterm-bg-color-42 { - background-color: #00d787; -} - -.terminal .xterm-color-43 { - color: #00d7af; -} - -.terminal .xterm-bg-color-43 { - background-color: #00d7af; -} - -.terminal .xterm-color-44 { - color: #00d7d7; -} - -.terminal .xterm-bg-color-44 { - background-color: #00d7d7; -} - -.terminal .xterm-color-45 { - color: #00d7ff; -} - -.terminal .xterm-bg-color-45 { - background-color: #00d7ff; -} - -.terminal .xterm-color-46 { - color: #00ff00; -} - -.terminal .xterm-bg-color-46 { - background-color: #00ff00; -} - -.terminal .xterm-color-47 { - color: #00ff5f; -} - -.terminal .xterm-bg-color-47 { - background-color: #00ff5f; -} - -.terminal .xterm-color-48 { - color: #00ff87; -} - -.terminal .xterm-bg-color-48 { - background-color: #00ff87; -} - -.terminal .xterm-color-49 { - color: #00ffaf; -} - -.terminal .xterm-bg-color-49 { - background-color: #00ffaf; -} - -.terminal .xterm-color-50 { - color: #00ffd7; -} - -.terminal .xterm-bg-color-50 { - background-color: #00ffd7; -} - -.terminal .xterm-color-51 { - color: #00ffff; -} - -.terminal .xterm-bg-color-51 { - background-color: #00ffff; -} - -.terminal .xterm-color-52 { - color: #5f0000; -} - -.terminal .xterm-bg-color-52 { - background-color: #5f0000; -} - -.terminal .xterm-color-53 { - color: #5f005f; -} - -.terminal .xterm-bg-color-53 { - background-color: #5f005f; -} - -.terminal .xterm-color-54 { - color: #5f0087; -} - -.terminal .xterm-bg-color-54 { - background-color: #5f0087; -} - -.terminal .xterm-color-55 { - color: #5f00af; -} - -.terminal .xterm-bg-color-55 { - background-color: #5f00af; -} - -.terminal .xterm-color-56 { - color: #5f00d7; -} - -.terminal .xterm-bg-color-56 { - background-color: #5f00d7; -} - -.terminal .xterm-color-57 { - color: #5f00ff; -} - -.terminal .xterm-bg-color-57 { - background-color: #5f00ff; -} - -.terminal .xterm-color-58 { - color: #5f5f00; -} - -.terminal .xterm-bg-color-58 { - background-color: #5f5f00; -} - -.terminal .xterm-color-59 { - color: #5f5f5f; -} - -.terminal .xterm-bg-color-59 { - background-color: #5f5f5f; -} - -.terminal .xterm-color-60 { - color: #5f5f87; -} - -.terminal .xterm-bg-color-60 { - background-color: #5f5f87; -} - -.terminal .xterm-color-61 { - color: #5f5faf; -} - -.terminal .xterm-bg-color-61 { - background-color: #5f5faf; -} - -.terminal .xterm-color-62 { - color: #5f5fd7; -} - -.terminal .xterm-bg-color-62 { - background-color: #5f5fd7; -} - -.terminal .xterm-color-63 { - color: #5f5fff; -} - -.terminal .xterm-bg-color-63 { - background-color: #5f5fff; -} - -.terminal .xterm-color-64 { - color: #5f8700; -} - -.terminal .xterm-bg-color-64 { - background-color: #5f8700; -} - -.terminal .xterm-color-65 { - color: #5f875f; -} - -.terminal .xterm-bg-color-65 { - background-color: #5f875f; -} - -.terminal .xterm-color-66 { - color: #5f8787; -} - -.terminal .xterm-bg-color-66 { - background-color: #5f8787; -} - -.terminal .xterm-color-67 { - color: #5f87af; -} - -.terminal .xterm-bg-color-67 { - background-color: #5f87af; -} - -.terminal .xterm-color-68 { - color: #5f87d7; -} - -.terminal .xterm-bg-color-68 { - background-color: #5f87d7; -} - -.terminal .xterm-color-69 { - color: #5f87ff; -} - -.terminal .xterm-bg-color-69 { - background-color: #5f87ff; -} - -.terminal .xterm-color-70 { - color: #5faf00; -} - -.terminal .xterm-bg-color-70 { - background-color: #5faf00; -} - -.terminal .xterm-color-71 { - color: #5faf5f; -} - -.terminal .xterm-bg-color-71 { - background-color: #5faf5f; -} - -.terminal .xterm-color-72 { - color: #5faf87; -} - -.terminal .xterm-bg-color-72 { - background-color: #5faf87; -} - -.terminal .xterm-color-73 { - color: #5fafaf; -} - -.terminal .xterm-bg-color-73 { - background-color: #5fafaf; -} - -.terminal .xterm-color-74 { - color: #5fafd7; -} - -.terminal .xterm-bg-color-74 { - background-color: #5fafd7; -} - -.terminal .xterm-color-75 { - color: #5fafff; -} - -.terminal .xterm-bg-color-75 { - background-color: #5fafff; -} - -.terminal .xterm-color-76 { - color: #5fd700; -} - -.terminal .xterm-bg-color-76 { - background-color: #5fd700; -} - -.terminal .xterm-color-77 { - color: #5fd75f; -} - -.terminal .xterm-bg-color-77 { - background-color: #5fd75f; -} - -.terminal .xterm-color-78 { - color: #5fd787; -} - -.terminal .xterm-bg-color-78 { - background-color: #5fd787; -} - -.terminal .xterm-color-79 { - color: #5fd7af; -} - -.terminal .xterm-bg-color-79 { - background-color: #5fd7af; -} - -.terminal .xterm-color-80 { - color: #5fd7d7; -} - -.terminal .xterm-bg-color-80 { - background-color: #5fd7d7; -} - -.terminal .xterm-color-81 { - color: #5fd7ff; -} - -.terminal .xterm-bg-color-81 { - background-color: #5fd7ff; -} - -.terminal .xterm-color-82 { - color: #5fff00; -} - -.terminal .xterm-bg-color-82 { - background-color: #5fff00; -} - -.terminal .xterm-color-83 { - color: #5fff5f; -} - -.terminal .xterm-bg-color-83 { - background-color: #5fff5f; -} - -.terminal .xterm-color-84 { - color: #5fff87; -} - -.terminal .xterm-bg-color-84 { - background-color: #5fff87; -} - -.terminal .xterm-color-85 { - color: #5fffaf; -} - -.terminal .xterm-bg-color-85 { - background-color: #5fffaf; -} - -.terminal .xterm-color-86 { - color: #5fffd7; -} - -.terminal .xterm-bg-color-86 { - background-color: #5fffd7; -} - -.terminal .xterm-color-87 { - color: #5fffff; -} - -.terminal .xterm-bg-color-87 { - background-color: #5fffff; -} - -.terminal .xterm-color-88 { - color: #870000; -} - -.terminal .xterm-bg-color-88 { - background-color: #870000; -} - -.terminal .xterm-color-89 { - color: #87005f; -} - -.terminal .xterm-bg-color-89 { - background-color: #87005f; -} - -.terminal .xterm-color-90 { - color: #870087; -} - -.terminal .xterm-bg-color-90 { - background-color: #870087; -} - -.terminal .xterm-color-91 { - color: #8700af; -} - -.terminal .xterm-bg-color-91 { - background-color: #8700af; -} - -.terminal .xterm-color-92 { - color: #8700d7; -} - -.terminal .xterm-bg-color-92 { - background-color: #8700d7; -} - -.terminal .xterm-color-93 { - color: #8700ff; -} - -.terminal .xterm-bg-color-93 { - background-color: #8700ff; -} - -.terminal .xterm-color-94 { - color: #875f00; -} - -.terminal .xterm-bg-color-94 { - background-color: #875f00; -} - -.terminal .xterm-color-95 { - color: #875f5f; -} - -.terminal .xterm-bg-color-95 { - background-color: #875f5f; -} - -.terminal .xterm-color-96 { - color: #875f87; -} - -.terminal .xterm-bg-color-96 { - background-color: #875f87; -} - -.terminal .xterm-color-97 { - color: #875faf; -} - -.terminal .xterm-bg-color-97 { - background-color: #875faf; -} - -.terminal .xterm-color-98 { - color: #875fd7; -} - -.terminal .xterm-bg-color-98 { - background-color: #875fd7; -} - -.terminal .xterm-color-99 { - color: #875fff; -} - -.terminal .xterm-bg-color-99 { - background-color: #875fff; -} - -.terminal .xterm-color-100 { - color: #878700; -} - -.terminal .xterm-bg-color-100 { - background-color: #878700; -} - -.terminal .xterm-color-101 { - color: #87875f; -} - -.terminal .xterm-bg-color-101 { - background-color: #87875f; -} - -.terminal .xterm-color-102 { - color: #878787; -} - -.terminal .xterm-bg-color-102 { - background-color: #878787; -} - -.terminal .xterm-color-103 { - color: #8787af; -} - -.terminal .xterm-bg-color-103 { - background-color: #8787af; -} - -.terminal .xterm-color-104 { - color: #8787d7; -} - -.terminal .xterm-bg-color-104 { - background-color: #8787d7; -} - -.terminal .xterm-color-105 { - color: #8787ff; -} - -.terminal .xterm-bg-color-105 { - background-color: #8787ff; -} - -.terminal .xterm-color-106 { - color: #87af00; -} - -.terminal .xterm-bg-color-106 { - background-color: #87af00; -} - -.terminal .xterm-color-107 { - color: #87af5f; -} - -.terminal .xterm-bg-color-107 { - background-color: #87af5f; -} - -.terminal .xterm-color-108 { - color: #87af87; -} - -.terminal .xterm-bg-color-108 { - background-color: #87af87; -} - -.terminal .xterm-color-109 { - color: #87afaf; -} - -.terminal .xterm-bg-color-109 { - background-color: #87afaf; -} - -.terminal .xterm-color-110 { - color: #87afd7; -} - -.terminal .xterm-bg-color-110 { - background-color: #87afd7; -} - -.terminal .xterm-color-111 { - color: #87afff; -} - -.terminal .xterm-bg-color-111 { - background-color: #87afff; -} - -.terminal .xterm-color-112 { - color: #87d700; -} - -.terminal .xterm-bg-color-112 { - background-color: #87d700; -} - -.terminal .xterm-color-113 { - color: #87d75f; -} - -.terminal .xterm-bg-color-113 { - background-color: #87d75f; -} - -.terminal .xterm-color-114 { - color: #87d787; -} - -.terminal .xterm-bg-color-114 { - background-color: #87d787; -} - -.terminal .xterm-color-115 { - color: #87d7af; -} - -.terminal .xterm-bg-color-115 { - background-color: #87d7af; -} - -.terminal .xterm-color-116 { - color: #87d7d7; -} - -.terminal .xterm-bg-color-116 { - background-color: #87d7d7; -} - -.terminal .xterm-color-117 { - color: #87d7ff; -} - -.terminal .xterm-bg-color-117 { - background-color: #87d7ff; -} - -.terminal .xterm-color-118 { - color: #87ff00; -} - -.terminal .xterm-bg-color-118 { - background-color: #87ff00; -} - -.terminal .xterm-color-119 { - color: #87ff5f; -} - -.terminal .xterm-bg-color-119 { - background-color: #87ff5f; -} - -.terminal .xterm-color-120 { - color: #87ff87; -} - -.terminal .xterm-bg-color-120 { - background-color: #87ff87; -} - -.terminal .xterm-color-121 { - color: #87ffaf; -} - -.terminal .xterm-bg-color-121 { - background-color: #87ffaf; -} - -.terminal .xterm-color-122 { - color: #87ffd7; -} - -.terminal .xterm-bg-color-122 { - background-color: #87ffd7; -} - -.terminal .xterm-color-123 { - color: #87ffff; -} - -.terminal .xterm-bg-color-123 { - background-color: #87ffff; -} - -.terminal .xterm-color-124 { - color: #af0000; -} - -.terminal .xterm-bg-color-124 { - background-color: #af0000; -} - -.terminal .xterm-color-125 { - color: #af005f; -} - -.terminal .xterm-bg-color-125 { - background-color: #af005f; -} - -.terminal .xterm-color-126 { - color: #af0087; -} - -.terminal .xterm-bg-color-126 { - background-color: #af0087; -} - -.terminal .xterm-color-127 { - color: #af00af; -} - -.terminal .xterm-bg-color-127 { - background-color: #af00af; -} - -.terminal .xterm-color-128 { - color: #af00d7; -} - -.terminal .xterm-bg-color-128 { - background-color: #af00d7; -} - -.terminal .xterm-color-129 { - color: #af00ff; -} - -.terminal .xterm-bg-color-129 { - background-color: #af00ff; -} - -.terminal .xterm-color-130 { - color: #af5f00; -} - -.terminal .xterm-bg-color-130 { - background-color: #af5f00; -} - -.terminal .xterm-color-131 { - color: #af5f5f; -} - -.terminal .xterm-bg-color-131 { - background-color: #af5f5f; -} - -.terminal .xterm-color-132 { - color: #af5f87; -} - -.terminal .xterm-bg-color-132 { - background-color: #af5f87; -} - -.terminal .xterm-color-133 { - color: #af5faf; -} - -.terminal .xterm-bg-color-133 { - background-color: #af5faf; -} - -.terminal .xterm-color-134 { - color: #af5fd7; -} - -.terminal .xterm-bg-color-134 { - background-color: #af5fd7; -} - -.terminal .xterm-color-135 { - color: #af5fff; -} - -.terminal .xterm-bg-color-135 { - background-color: #af5fff; -} - -.terminal .xterm-color-136 { - color: #af8700; -} - -.terminal .xterm-bg-color-136 { - background-color: #af8700; -} - -.terminal .xterm-color-137 { - color: #af875f; -} - -.terminal .xterm-bg-color-137 { - background-color: #af875f; -} - -.terminal .xterm-color-138 { - color: #af8787; -} - -.terminal .xterm-bg-color-138 { - background-color: #af8787; -} - -.terminal .xterm-color-139 { - color: #af87af; -} - -.terminal .xterm-bg-color-139 { - background-color: #af87af; -} - -.terminal .xterm-color-140 { - color: #af87d7; -} - -.terminal .xterm-bg-color-140 { - background-color: #af87d7; -} - -.terminal .xterm-color-141 { - color: #af87ff; -} - -.terminal .xterm-bg-color-141 { - background-color: #af87ff; -} - -.terminal .xterm-color-142 { - color: #afaf00; -} - -.terminal .xterm-bg-color-142 { - background-color: #afaf00; -} - -.terminal .xterm-color-143 { - color: #afaf5f; -} - -.terminal .xterm-bg-color-143 { - background-color: #afaf5f; -} - -.terminal .xterm-color-144 { - color: #afaf87; -} - -.terminal .xterm-bg-color-144 { - background-color: #afaf87; -} - -.terminal .xterm-color-145 { - color: #afafaf; -} - -.terminal .xterm-bg-color-145 { - background-color: #afafaf; -} - -.terminal .xterm-color-146 { - color: #afafd7; -} - -.terminal .xterm-bg-color-146 { - background-color: #afafd7; -} - -.terminal .xterm-color-147 { - color: #afafff; -} - -.terminal .xterm-bg-color-147 { - background-color: #afafff; -} - -.terminal .xterm-color-148 { - color: #afd700; -} - -.terminal .xterm-bg-color-148 { - background-color: #afd700; -} - -.terminal .xterm-color-149 { - color: #afd75f; -} - -.terminal .xterm-bg-color-149 { - background-color: #afd75f; -} - -.terminal .xterm-color-150 { - color: #afd787; -} - -.terminal .xterm-bg-color-150 { - background-color: #afd787; -} - -.terminal .xterm-color-151 { - color: #afd7af; -} - -.terminal .xterm-bg-color-151 { - background-color: #afd7af; -} - -.terminal .xterm-color-152 { - color: #afd7d7; -} - -.terminal .xterm-bg-color-152 { - background-color: #afd7d7; -} - -.terminal .xterm-color-153 { - color: #afd7ff; -} - -.terminal .xterm-bg-color-153 { - background-color: #afd7ff; -} - -.terminal .xterm-color-154 { - color: #afff00; -} - -.terminal .xterm-bg-color-154 { - background-color: #afff00; -} - -.terminal .xterm-color-155 { - color: #afff5f; -} - -.terminal .xterm-bg-color-155 { - background-color: #afff5f; -} - -.terminal .xterm-color-156 { - color: #afff87; -} - -.terminal .xterm-bg-color-156 { - background-color: #afff87; -} - -.terminal .xterm-color-157 { - color: #afffaf; -} - -.terminal .xterm-bg-color-157 { - background-color: #afffaf; -} - -.terminal .xterm-color-158 { - color: #afffd7; -} - -.terminal .xterm-bg-color-158 { - background-color: #afffd7; -} - -.terminal .xterm-color-159 { - color: #afffff; -} - -.terminal .xterm-bg-color-159 { - background-color: #afffff; -} - -.terminal .xterm-color-160 { - color: #d70000; -} - -.terminal .xterm-bg-color-160 { - background-color: #d70000; -} - -.terminal .xterm-color-161 { - color: #d7005f; -} - -.terminal .xterm-bg-color-161 { - background-color: #d7005f; -} - -.terminal .xterm-color-162 { - color: #d70087; -} - -.terminal .xterm-bg-color-162 { - background-color: #d70087; -} - -.terminal .xterm-color-163 { - color: #d700af; -} - -.terminal .xterm-bg-color-163 { - background-color: #d700af; -} - -.terminal .xterm-color-164 { - color: #d700d7; -} - -.terminal .xterm-bg-color-164 { - background-color: #d700d7; -} - -.terminal .xterm-color-165 { - color: #d700ff; -} - -.terminal .xterm-bg-color-165 { - background-color: #d700ff; -} - -.terminal .xterm-color-166 { - color: #d75f00; -} - -.terminal .xterm-bg-color-166 { - background-color: #d75f00; -} - -.terminal .xterm-color-167 { - color: #d75f5f; -} - -.terminal .xterm-bg-color-167 { - background-color: #d75f5f; -} - -.terminal .xterm-color-168 { - color: #d75f87; -} - -.terminal .xterm-bg-color-168 { - background-color: #d75f87; -} - -.terminal .xterm-color-169 { - color: #d75faf; -} - -.terminal .xterm-bg-color-169 { - background-color: #d75faf; -} - -.terminal .xterm-color-170 { - color: #d75fd7; -} - -.terminal .xterm-bg-color-170 { - background-color: #d75fd7; -} - -.terminal .xterm-color-171 { - color: #d75fff; -} - -.terminal .xterm-bg-color-171 { - background-color: #d75fff; -} - -.terminal .xterm-color-172 { - color: #d78700; -} - -.terminal .xterm-bg-color-172 { - background-color: #d78700; -} - -.terminal .xterm-color-173 { - color: #d7875f; -} - -.terminal .xterm-bg-color-173 { - background-color: #d7875f; -} - -.terminal .xterm-color-174 { - color: #d78787; -} - -.terminal .xterm-bg-color-174 { - background-color: #d78787; -} - -.terminal .xterm-color-175 { - color: #d787af; -} - -.terminal .xterm-bg-color-175 { - background-color: #d787af; -} - -.terminal .xterm-color-176 { - color: #d787d7; -} - -.terminal .xterm-bg-color-176 { - background-color: #d787d7; -} - -.terminal .xterm-color-177 { - color: #d787ff; -} - -.terminal .xterm-bg-color-177 { - background-color: #d787ff; -} - -.terminal .xterm-color-178 { - color: #d7af00; -} - -.terminal .xterm-bg-color-178 { - background-color: #d7af00; -} - -.terminal .xterm-color-179 { - color: #d7af5f; -} - -.terminal .xterm-bg-color-179 { - background-color: #d7af5f; -} - -.terminal .xterm-color-180 { - color: #d7af87; -} - -.terminal .xterm-bg-color-180 { - background-color: #d7af87; -} - -.terminal .xterm-color-181 { - color: #d7afaf; -} - -.terminal .xterm-bg-color-181 { - background-color: #d7afaf; -} - -.terminal .xterm-color-182 { - color: #d7afd7; -} - -.terminal .xterm-bg-color-182 { - background-color: #d7afd7; -} - -.terminal .xterm-color-183 { - color: #d7afff; -} - -.terminal .xterm-bg-color-183 { - background-color: #d7afff; -} - -.terminal .xterm-color-184 { - color: #d7d700; -} - -.terminal .xterm-bg-color-184 { - background-color: #d7d700; -} - -.terminal .xterm-color-185 { - color: #d7d75f; -} - -.terminal .xterm-bg-color-185 { - background-color: #d7d75f; -} - -.terminal .xterm-color-186 { - color: #d7d787; -} - -.terminal .xterm-bg-color-186 { - background-color: #d7d787; -} - -.terminal .xterm-color-187 { - color: #d7d7af; -} - -.terminal .xterm-bg-color-187 { - background-color: #d7d7af; -} - -.terminal .xterm-color-188 { - color: #d7d7d7; -} - -.terminal .xterm-bg-color-188 { - background-color: #d7d7d7; -} - -.terminal .xterm-color-189 { - color: #d7d7ff; -} - -.terminal .xterm-bg-color-189 { - background-color: #d7d7ff; -} - -.terminal .xterm-color-190 { - color: #d7ff00; -} - -.terminal .xterm-bg-color-190 { - background-color: #d7ff00; -} - -.terminal .xterm-color-191 { - color: #d7ff5f; -} - -.terminal .xterm-bg-color-191 { - background-color: #d7ff5f; -} - -.terminal .xterm-color-192 { - color: #d7ff87; -} - -.terminal .xterm-bg-color-192 { - background-color: #d7ff87; -} - -.terminal .xterm-color-193 { - color: #d7ffaf; -} - -.terminal .xterm-bg-color-193 { - background-color: #d7ffaf; -} - -.terminal .xterm-color-194 { - color: #d7ffd7; -} - -.terminal .xterm-bg-color-194 { - background-color: #d7ffd7; -} - -.terminal .xterm-color-195 { - color: #d7ffff; -} - -.terminal .xterm-bg-color-195 { - background-color: #d7ffff; -} - -.terminal .xterm-color-196 { - color: #ff0000; -} - -.terminal .xterm-bg-color-196 { - background-color: #ff0000; -} - -.terminal .xterm-color-197 { - color: #ff005f; -} - -.terminal .xterm-bg-color-197 { - background-color: #ff005f; -} - -.terminal .xterm-color-198 { - color: #ff0087; -} - -.terminal .xterm-bg-color-198 { - background-color: #ff0087; -} - -.terminal .xterm-color-199 { - color: #ff00af; -} - -.terminal .xterm-bg-color-199 { - background-color: #ff00af; -} - -.terminal .xterm-color-200 { - color: #ff00d7; -} - -.terminal .xterm-bg-color-200 { - background-color: #ff00d7; -} - -.terminal .xterm-color-201 { - color: #ff00ff; -} - -.terminal .xterm-bg-color-201 { - background-color: #ff00ff; -} - -.terminal .xterm-color-202 { - color: #ff5f00; -} - -.terminal .xterm-bg-color-202 { - background-color: #ff5f00; -} - -.terminal .xterm-color-203 { - color: #ff5f5f; -} - -.terminal .xterm-bg-color-203 { - background-color: #ff5f5f; -} - -.terminal .xterm-color-204 { - color: #ff5f87; -} - -.terminal .xterm-bg-color-204 { - background-color: #ff5f87; -} - -.terminal .xterm-color-205 { - color: #ff5faf; -} - -.terminal .xterm-bg-color-205 { - background-color: #ff5faf; -} - -.terminal .xterm-color-206 { - color: #ff5fd7; -} - -.terminal .xterm-bg-color-206 { - background-color: #ff5fd7; -} - -.terminal .xterm-color-207 { - color: #ff5fff; -} - -.terminal .xterm-bg-color-207 { - background-color: #ff5fff; -} - -.terminal .xterm-color-208 { - color: #ff8700; -} - -.terminal .xterm-bg-color-208 { - background-color: #ff8700; -} - -.terminal .xterm-color-209 { - color: #ff875f; -} - -.terminal .xterm-bg-color-209 { - background-color: #ff875f; -} - -.terminal .xterm-color-210 { - color: #ff8787; -} - -.terminal .xterm-bg-color-210 { - background-color: #ff8787; -} - -.terminal .xterm-color-211 { - color: #ff87af; -} - -.terminal .xterm-bg-color-211 { - background-color: #ff87af; -} - -.terminal .xterm-color-212 { - color: #ff87d7; -} - -.terminal .xterm-bg-color-212 { - background-color: #ff87d7; -} - -.terminal .xterm-color-213 { - color: #ff87ff; -} - -.terminal .xterm-bg-color-213 { - background-color: #ff87ff; -} - -.terminal .xterm-color-214 { - color: #ffaf00; -} - -.terminal .xterm-bg-color-214 { - background-color: #ffaf00; -} - -.terminal .xterm-color-215 { - color: #ffaf5f; -} - -.terminal .xterm-bg-color-215 { - background-color: #ffaf5f; -} - -.terminal .xterm-color-216 { - color: #ffaf87; -} - -.terminal .xterm-bg-color-216 { - background-color: #ffaf87; -} - -.terminal .xterm-color-217 { - color: #ffafaf; -} - -.terminal .xterm-bg-color-217 { - background-color: #ffafaf; -} - -.terminal .xterm-color-218 { - color: #ffafd7; -} - -.terminal .xterm-bg-color-218 { - background-color: #ffafd7; -} - -.terminal .xterm-color-219 { - color: #ffafff; -} - -.terminal .xterm-bg-color-219 { - background-color: #ffafff; -} - -.terminal .xterm-color-220 { - color: #ffd700; -} - -.terminal .xterm-bg-color-220 { - background-color: #ffd700; -} - -.terminal .xterm-color-221 { - color: #ffd75f; -} - -.terminal .xterm-bg-color-221 { - background-color: #ffd75f; -} - -.terminal .xterm-color-222 { - color: #ffd787; -} - -.terminal .xterm-bg-color-222 { - background-color: #ffd787; -} - -.terminal .xterm-color-223 { - color: #ffd7af; -} - -.terminal .xterm-bg-color-223 { - background-color: #ffd7af; -} - -.terminal .xterm-color-224 { - color: #ffd7d7; -} - -.terminal .xterm-bg-color-224 { - background-color: #ffd7d7; -} - -.terminal .xterm-color-225 { - color: #ffd7ff; -} - -.terminal .xterm-bg-color-225 { - background-color: #ffd7ff; -} - -.terminal .xterm-color-226 { - color: #ffff00; -} - -.terminal .xterm-bg-color-226 { - background-color: #ffff00; -} - -.terminal .xterm-color-227 { - color: #ffff5f; -} - -.terminal .xterm-bg-color-227 { - background-color: #ffff5f; -} - -.terminal .xterm-color-228 { - color: #ffff87; -} - -.terminal .xterm-bg-color-228 { - background-color: #ffff87; -} - -.terminal .xterm-color-229 { - color: #ffffaf; -} - -.terminal .xterm-bg-color-229 { - background-color: #ffffaf; -} - -.terminal .xterm-color-230 { - color: #ffffd7; -} - -.terminal .xterm-bg-color-230 { - background-color: #ffffd7; -} - -.terminal .xterm-color-231 { - color: #ffffff; -} - -.terminal .xterm-bg-color-231 { - background-color: #ffffff; -} - -.terminal .xterm-color-232 { - color: #080808; -} - -.terminal .xterm-bg-color-232 { - background-color: #080808; -} - -.terminal .xterm-color-233 { - color: #121212; -} - -.terminal .xterm-bg-color-233 { - background-color: #121212; -} - -.terminal .xterm-color-234 { - color: #1c1c1c; -} - -.terminal .xterm-bg-color-234 { - background-color: #1c1c1c; -} - -.terminal .xterm-color-235 { - color: #262626; -} - -.terminal .xterm-bg-color-235 { - background-color: #262626; -} - -.terminal .xterm-color-236 { - color: #303030; -} - -.terminal .xterm-bg-color-236 { - background-color: #303030; -} - -.terminal .xterm-color-237 { - color: #3a3a3a; -} - -.terminal .xterm-bg-color-237 { - background-color: #3a3a3a; -} - -.terminal .xterm-color-238 { - color: #444444; -} - -.terminal .xterm-bg-color-238 { - background-color: #444444; -} - -.terminal .xterm-color-239 { - color: #4e4e4e; -} - -.terminal .xterm-bg-color-239 { - background-color: #4e4e4e; -} - -.terminal .xterm-color-240 { - color: #585858; -} - -.terminal .xterm-bg-color-240 { - background-color: #585858; -} - -.terminal .xterm-color-241 { - color: #626262; -} - -.terminal .xterm-bg-color-241 { - background-color: #626262; -} - -.terminal .xterm-color-242 { - color: #6c6c6c; -} - -.terminal .xterm-bg-color-242 { - background-color: #6c6c6c; -} - -.terminal .xterm-color-243 { - color: #767676; -} - -.terminal .xterm-bg-color-243 { - background-color: #767676; -} - -.terminal .xterm-color-244 { - color: #808080; -} - -.terminal .xterm-bg-color-244 { - background-color: #808080; -} - -.terminal .xterm-color-245 { - color: #8a8a8a; -} - -.terminal .xterm-bg-color-245 { - background-color: #8a8a8a; -} - -.terminal .xterm-color-246 { - color: #949494; -} - -.terminal .xterm-bg-color-246 { - background-color: #949494; -} - -.terminal .xterm-color-247 { - color: #9e9e9e; -} - -.terminal .xterm-bg-color-247 { - background-color: #9e9e9e; -} - -.terminal .xterm-color-248 { - color: #a8a8a8; -} - -.terminal .xterm-bg-color-248 { - background-color: #a8a8a8; -} - -.terminal .xterm-color-249 { - color: #b2b2b2; -} - -.terminal .xterm-bg-color-249 { - background-color: #b2b2b2; -} - -.terminal .xterm-color-250 { - color: #bcbcbc; -} - -.terminal .xterm-bg-color-250 { - background-color: #bcbcbc; -} - -.terminal .xterm-color-251 { - color: #c6c6c6; -} - -.terminal .xterm-bg-color-251 { - background-color: #c6c6c6; -} - -.terminal .xterm-color-252 { - color: #d0d0d0; -} - -.terminal .xterm-bg-color-252 { - background-color: #d0d0d0; -} - -.terminal .xterm-color-253 { - color: #dadada; -} - -.terminal .xterm-bg-color-253 { - background-color: #dadada; -} - -.terminal .xterm-color-254 { - color: #e4e4e4; -} - -.terminal .xterm-bg-color-254 { - background-color: #e4e4e4; -} - -.terminal .xterm-color-255 { - color: #eeeeee; -} - -.terminal .xterm-bg-color-255 { - background-color: #eeeeee; -}
diff --git a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/src/xterm.js b/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/src/xterm.js deleted file mode 100644 index 3ccc99e5..0000000 --- a/third_party/WebKit/Source/devtools/front_end/terminal/xterm.js/src/xterm.js +++ /dev/null
@@ -1,5146 +0,0 @@ -/** - * xterm.js: xterm, in the browser - * Copyright (c) 2014, SourceLair Limited <www.sourcelair.com> (MIT License) - * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License) - * https://github.com/chjj/term.js - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * all copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN - * THE SOFTWARE. - * - * Originally forked from (with the author's permission): - * Fabrice Bellard's javascript vt100 for jslinux: - * http://bellard.org/jslinux/ - * Copyright (c) 2011 Fabrice Bellard - * The original design remains. The terminal itself - * has been extended to include xterm CSI codes, among - * other features. - */ - -import { CompositionHelper } from './CompositionHelper.js'; -import { EventEmitter } from './EventEmitter.js'; -import { Viewport } from './Viewport.js'; - -/** - * Terminal Emulation References: - * http://vt100.net/ - * http://invisible-island.net/xterm/ctlseqs/ctlseqs.txt - * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html - * http://invisible-island.net/vttest/ - * http://www.inwap.com/pdp10/ansicode.txt - * http://linux.die.net/man/4/console_codes - * http://linux.die.net/man/7/urxvt - */ - -// Let it work inside Node.js for automated testing purposes. -var document = (typeof window != 'undefined') ? window.document : null; - -/** - * States - */ -var normal = 0, escaped = 1, csi = 2, osc = 3, charset = 4, dcs = 5, ignore = 6; - -/** - * Terminal - */ - -/** - * Creates a new `Terminal` object. - * - * @param {object} options An object containing a set of options, the available options are: - * - cursorBlink (boolean): Whether the terminal cursor blinks - * - * @public - * @class Xterm Xterm - * @alias module:xterm/src/xterm - */ -function Terminal(options) { - var self = this; - - if (!(this instanceof Terminal)) { - return new Terminal(arguments[0], arguments[1], arguments[2]); - } - - self.cancel = Terminal.cancel; - - EventEmitter.call(this); - - if (typeof options === 'number') { - options = { - cols: arguments[0], - rows: arguments[1], - handler: arguments[2] - }; - } - - options = options || {}; - - - Object.keys(Terminal.defaults).forEach(function(key) { - if (options[key] == null) { - options[key] = Terminal.options[key]; - - if (Terminal[key] !== Terminal.defaults[key]) { - options[key] = Terminal[key]; - } - } - self[key] = options[key]; - }); - - if (options.colors.length === 8) { - options.colors = options.colors.concat(Terminal._colors.slice(8)); - } else if (options.colors.length === 16) { - options.colors = options.colors.concat(Terminal._colors.slice(16)); - } else if (options.colors.length === 10) { - options.colors = options.colors.slice(0, -2).concat( - Terminal._colors.slice(8, -2), options.colors.slice(-2)); - } else if (options.colors.length === 18) { - options.colors = options.colors.concat( - Terminal._colors.slice(16, -2), options.colors.slice(-2)); - } - this.colors = options.colors; - - this.options = options; - - // this.context = options.context || window; - // this.document = options.document || document; - this.parent = options.body || options.parent || ( - document ? document.getElementsByTagName('body')[0] : null - ); - - this.cols = options.cols || options.geometry[0]; - this.rows = options.rows || options.geometry[1]; - - if (options.handler) { - this.on('data', options.handler); - } - - /** - * The scroll position of the y cursor, ie. ybase + y = the y position within the entire - * buffer - */ - this.ybase = 0; - - /** - * The scroll position of the viewport - */ - this.ydisp = 0; - - /** - * The cursor's x position after ybase - */ - this.x = 0; - - /** - * The cursor's y position after ybase - */ - this.y = 0; - - /** - * Used to debounce the refresh function - */ - this.isRefreshing = false; - - /** - * Whether there is a full terminal refresh queued - */ - - this.cursorState = 0; - this.cursorHidden = false; - this.convertEol; - this.state = 0; - this.queue = ''; - this.scrollTop = 0; - this.scrollBottom = this.rows - 1; - this.customKeydownHandler = null; - - // modes - this.applicationKeypad = false; - this.applicationCursor = false; - this.originMode = false; - this.insertMode = false; - this.wraparoundMode = true; // defaults: xterm - true, vt100 - false - this.normal = null; - - // charset - this.charset = null; - this.gcharset = null; - this.glevel = 0; - this.charsets = [null]; - - // mouse properties - this.decLocator; - this.x10Mouse; - this.vt200Mouse; - this.vt300Mouse; - this.normalMouse; - this.mouseEvents; - this.sendFocus; - this.utfMouse; - this.sgrMouse; - this.urxvtMouse; - - // misc - this.element; - this.children; - this.refreshStart; - this.refreshEnd; - this.savedX; - this.savedY; - this.savedCols; - - // stream - this.readable = true; - this.writable = true; - - this.defAttr = (0 << 18) | (257 << 9) | (256 << 0); - this.curAttr = this.defAttr; - - this.params = []; - this.currentParam = 0; - this.prefix = ''; - this.postfix = ''; - - // leftover surrogate high from previous write invocation - this.surrogate_high = ''; - - /** - * An array of all lines in the entire buffer, including the prompt. The lines are array of - * characters which are 2-length arrays where [0] is an attribute and [1] is the character. - */ - this.lines = []; - var i = this.rows; - while (i--) { - this.lines.push(this.blankLine()); - } - - this.tabs; - this.setupStops(); -} - -inherits(Terminal, EventEmitter); - -/** - * back_color_erase feature for xterm. - */ -Terminal.prototype.eraseAttr = function() { - // if (this.is('screen')) return this.defAttr; - return (this.defAttr & ~0x1ff) | (this.curAttr & 0x1ff); -}; - -/** - * Colors - */ - -// Colors 0-15 -Terminal.tangoColors = [ - // dark: - '#2e3436', - '#cc0000', - '#4e9a06', - '#c4a000', - '#3465a4', - '#75507b', - '#06989a', - '#d3d7cf', - // bright: - '#555753', - '#ef2929', - '#8ae234', - '#fce94f', - '#729fcf', - '#ad7fa8', - '#34e2e2', - '#eeeeec' -]; - -// Colors 0-15 + 16-255 -// Much thanks to TooTallNate for writing this. -Terminal.colors = (function() { - var colors = Terminal.tangoColors.slice() - , r = [0x00, 0x5f, 0x87, 0xaf, 0xd7, 0xff] - , i; - - // 16-231 - i = 0; - for (; i < 216; i++) { - out(r[(i / 36) % 6 | 0], r[(i / 6) % 6 | 0], r[i % 6]); - } - - // 232-255 (grey) - i = 0; - for (; i < 24; i++) { - r = 8 + i * 10; - out(r, r, r); - } - - function out(r, g, b) { - colors.push('#' + hex(r) + hex(g) + hex(b)); - } - - function hex(c) { - c = c.toString(16); - return c.length < 2 ? '0' + c : c; - } - - return colors; -})(); - -Terminal._colors = Terminal.colors.slice(); - -Terminal.vcolors = (function() { - var out = [] - , colors = Terminal.colors - , i = 0 - , color; - - for (; i < 256; i++) { - color = parseInt(colors[i].substring(1), 16); - out.push([ - (color >> 16) & 0xff, - (color >> 8) & 0xff, - color & 0xff - ]); - } - - return out; -})(); - -/** - * Options - */ - -Terminal.defaults = { - colors: Terminal.colors, - theme: 'default', - convertEol: false, - termName: 'xterm', - geometry: [80, 24], - cursorBlink: false, - visualBell: false, - popOnBell: false, - scrollback: 1000, - screenKeys: false, - debug: false, - cancelEvents: false - // programFeatures: false, - // focusKeys: false, -}; - -Terminal.options = {}; - -Terminal.focus = null; - -each(keys(Terminal.defaults), function(key) { - Terminal[key] = Terminal.defaults[key]; - Terminal.options[key] = Terminal.defaults[key]; -}); - -/** - * Focus the terminal. Delegates focus handling to the terminal's DOM element. - */ -Terminal.prototype.focus = function() { - return this.textarea.focus(); -}; - -/** - * Retrieves an option's value from the terminal. - * @param {string} key The option key. - */ -Terminal.prototype.getOption = function(key, value) { - if (!(key in Terminal.defaults)) { - throw new Error('No option with key "' + key + '"'); - } - - if (typeof this.options[key] !== 'undefined') { - return this.options[key]; - } - - return this[key]; -}; - -/** - * Sets an option on the terminal. - * @param {string} key The option key. - * @param {string} value The option value. - */ -Terminal.prototype.setOption = function(key, value) { - if (!(key in Terminal.defaults)) { - throw new Error('No option with key "' + key + '"'); - } - this[key] = value; - this.options[key] = value; -}; - -/** - * Binds the desired focus behavior on a given terminal object. - * - * @static - */ -Terminal.bindFocus = function (term) { - on(term.textarea, 'focus', function (ev) { - if (term.sendFocus) { - term.send('\x1b[I'); - } - term.element.classList.add('focus'); - term.showCursor(); - Terminal.focus = term; - term.emit('focus', {terminal: term}); - }); -}; - -/** - * Blur the terminal. Delegates blur handling to the terminal's DOM element. - */ -Terminal.prototype.blur = function() { - return this.textarea.blur(); -}; - -/** - * Binds the desired blur behavior on a given terminal object. - * - * @static - */ -Terminal.bindBlur = function (term) { - on(term.textarea, 'blur', function (ev) { - term.refresh(term.y, term.y); - if (term.sendFocus) { - term.send('\x1b[O'); - } - term.element.classList.remove('focus'); - Terminal.focus = null; - term.emit('blur', {terminal: term}); - }); -}; - -/** - * Initialize default behavior - */ -Terminal.prototype.initGlobal = function() { - Terminal.bindPaste(this); - Terminal.bindKeys(this); - Terminal.bindCopy(this); - Terminal.bindFocus(this); - Terminal.bindBlur(this); -}; - -/** - * Bind to paste event and allow both keyboard and right-click pasting, without having the - * contentEditable value set to true. - */ -Terminal.bindPaste = function(term) { - on([term.textarea, term.element], 'paste', function(ev) { - ev.stopPropagation(); - if (ev.clipboardData) { - var text = ev.clipboardData.getData('text/plain'); - term.handler(text); - term.textarea.value = ''; - return term.cancel(ev); - } - }); -}; - -/** - * Prepares text copied from terminal selection, to be saved in the clipboard by: - * 1. stripping all trailing white spaces - * 2. converting all non-breaking spaces to regular spaces - * @param {string} text The copied text that needs processing for storing in clipboard - * @returns {string} - * @static - */ -Terminal.prepareCopiedTextForClipboard = function (text) { - var space = String.fromCharCode(32), - nonBreakingSpace = String.fromCharCode(160), - allNonBreakingSpaces = new RegExp(nonBreakingSpace, 'g'), - processedText = text.split('\n').map(function (line) { - /** - * Strip all trailing white spaces and convert all non-breaking spaces to regular - * spaces. - */ - var processedLine = line.replace(/\s+$/g, '').replace(allNonBreakingSpaces, space); - - return processedLine; - }).join('\n'); - - return processedText; -}; - -/** - * Apply key handling to the terminal - */ -Terminal.bindKeys = function(term) { - on(term.element, 'keydown', function(ev) { - if (document.activeElement != this) { - return; - } - term.keyDown(ev); - }, true); - - on(term.element, 'keypress', function(ev) { - if (document.activeElement != this) { - return; - } - term.keyPress(ev); - }, true); - - on(term.element, 'keyup', term.focus.bind(term)); - - on(term.textarea, 'keydown', function(ev) { - term.keyDown(ev); - }, true); - - on(term.textarea, 'keypress', function(ev) { - term.keyPress(ev); - // Truncate the textarea's value, since it is not needed - this.value = ''; - }, true); - - on(term.textarea, 'compositionstart', term.compositionHelper.compositionstart.bind(term.compositionHelper)); - on(term.textarea, 'compositionupdate', term.compositionHelper.compositionupdate.bind(term.compositionHelper)); - on(term.textarea, 'compositionend', term.compositionHelper.compositionend.bind(term.compositionHelper)); - term.on('refresh', term.compositionHelper.updateCompositionElements.bind(term.compositionHelper)); -}; - -/** - * Binds copy functionality to the given terminal. - * @static - */ -Terminal.bindCopy = function(term) { - on(term.element, 'copy', function(ev) { - return; // temporary - }); -}; - - -/** - * Insert the given row to the terminal or produce a new one - * if no row argument is passed. Return the inserted row. - * @param {HTMLElement} row (optional) The row to append to the terminal. - */ -Terminal.prototype.insertRow = function (row) { - if (typeof row != 'object') { - row = document.createElement('div'); - } - - this.rowContainer.appendChild(row); - this.children.push(row); - - return row; -}; - -/** - * Opens the terminal within an element. - * - * @param {HTMLElement} parent The element to create the terminal within. - */ -Terminal.prototype.open = function(parent) { - var self=this, i=0, div; - - this.parent = parent || this.parent; - - if (!this.parent) { - throw new Error('Terminal requires a parent element.'); - } - - // Grab global elements - this.context = this.parent.ownerDocument.defaultView; - this.document = this.parent.ownerDocument; - this.body = this.document.getElementsByTagName('body')[0]; - - // Parse User-Agent - if (this.context.navigator && this.context.navigator.userAgent) { - this.isMSIE = !!~this.context.navigator.userAgent.indexOf('MSIE'); - } - - // Find the users platform. We use this to interpret the meta key - // and ISO third level shifts. - // http://stackoverflow.com/q/19877924/577598 - if (this.context.navigator && this.context.navigator.platform) { - this.isMac = contains( - this.context.navigator.platform, - ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'] - ); - this.isIpad = this.context.navigator.platform === 'iPad'; - this.isIphone = this.context.navigator.platform === 'iPhone'; - this.isMSWindows = contains( - this.context.navigator.platform, - ['Windows', 'Win16', 'Win32', 'WinCE'] - ); - } - - //Create main element container - this.element = this.document.createElement('div'); - this.element.classList.add('terminal'); - this.element.classList.add('xterm'); - this.element.classList.add('xterm-theme-' + this.theme); - - this.element.style.height - this.element.setAttribute('tabindex', 0); - - this.viewportElement = document.createElement('div'); - this.viewportElement.classList.add('xterm-viewport'); - this.element.appendChild(this.viewportElement); - this.viewportScrollArea = document.createElement('div'); - this.viewportScrollArea.classList.add('xterm-scroll-area'); - this.viewportElement.appendChild(this.viewportScrollArea); - - // Create the container that will hold the lines of the terminal and then - // produce the lines the lines. - this.rowContainer = document.createElement('div'); - this.rowContainer.classList.add('xterm-rows'); - this.element.appendChild(this.rowContainer); - this.children = []; - - // Create the container that will hold helpers like the textarea for - // capturing DOM Events. Then produce the helpers. - this.helperContainer = document.createElement('div'); - this.helperContainer.classList.add('xterm-helpers'); - // TODO: This should probably be inserted once it's filled to prevent an additional layout - this.element.appendChild(this.helperContainer); - this.textarea = document.createElement('textarea'); - this.textarea.classList.add('xterm-helper-textarea'); - this.textarea.setAttribute('autocorrect', 'off'); - this.textarea.setAttribute('autocapitalize', 'off'); - this.textarea.setAttribute('spellcheck', 'false'); - this.textarea.tabIndex = 0; - this.textarea.addEventListener('focus', function() { - self.emit('focus', {terminal: self}); - }); - this.textarea.addEventListener('blur', function() { - self.emit('blur', {terminal: self}); - }); - this.helperContainer.appendChild(this.textarea); - - this.compositionView = document.createElement('div'); - this.compositionView.classList.add('composition-view'); - this.compositionHelper = new CompositionHelper(this.textarea, this.compositionView, this); - this.helperContainer.appendChild(this.compositionView); - - this.charMeasureElement = document.createElement('div'); - this.charMeasureElement.classList.add('xterm-char-measure-element'); - this.charMeasureElement.innerHTML = 'W'; - this.helperContainer.appendChild(this.charMeasureElement); - - for (; i < this.rows; i++) { - this.insertRow(); - } - this.parent.appendChild(this.element); - - this.viewport = new Viewport(this, this.viewportElement, this.viewportScrollArea, this.charMeasureElement); - - // Draw the screen. - this.refresh(0, this.rows - 1); - - // Initialize global actions that - // need to be taken on the document. - this.initGlobal(); - - // Ensure there is a Terminal.focus. - this.focus(); - - on(this.element, 'click', function() { - var selection = document.getSelection(), - collapsed = selection.isCollapsed, - isRange = typeof collapsed == 'boolean' ? !collapsed : selection.type == 'Range'; - if (!isRange) { - self.focus(); - } - }); - - // Listen for mouse events and translate - // them into terminal mouse protocols. - this.bindMouse(); - - // Figure out whether boldness affects - // the character width of monospace fonts. - if (Terminal.brokenBold == null) { - Terminal.brokenBold = isBoldBroken(this.document); - } - - this.emit('open'); -}; - - -/** - * Attempts to load an add-on using CommonJS or RequireJS (whichever is available). - * @param {string} addon The name of the addon to load - * @static - */ -Terminal.loadAddon = function(addon, callback) { - if (typeof exports === 'object' && typeof module === 'object') { - // CommonJS - return require(__dirname + '/../addons/' + addon); - } else if (typeof define == 'function') { - // RequireJS - return require(['../addons/' + addon + '/' + addon], callback); - } else { - console.error('Cannot load a module without a CommonJS or RequireJS environment.'); - return false; - } -}; - - -/** - * XTerm mouse events - * http://invisible-island.net/xterm/ctlseqs/ctlseqs.html#Mouse%20Tracking - * To better understand these - * the xterm code is very helpful: - * Relevant files: - * button.c, charproc.c, misc.c - * Relevant functions in xterm/button.c: - * BtnCode, EmitButtonCode, EditorButton, SendMousePosition - */ -Terminal.prototype.bindMouse = function() { - var el = this.element, self = this, pressed = 32; - - // mouseup, mousedown, wheel - // left click: ^[[M 3<^[[M#3< - // wheel up: ^[[M`3> - function sendButton(ev) { - var button - , pos; - - // get the xterm-style button - button = getButton(ev); - - // get mouse coordinates - pos = getCoords(ev); - if (!pos) return; - - sendEvent(button, pos); - - switch (ev.overrideType || ev.type) { - case 'mousedown': - pressed = button; - break; - case 'mouseup': - // keep it at the left - // button, just in case. - pressed = 32; - break; - case 'wheel': - // nothing. don't - // interfere with - // `pressed`. - break; - } - } - - // motion example of a left click: - // ^[[M 3<^[[M@4<^[[M@5<^[[M@6<^[[M@7<^[[M#7< - function sendMove(ev) { - var button = pressed - , pos; - - pos = getCoords(ev); - if (!pos) return; - - // buttons marked as motions - // are incremented by 32 - button += 32; - - sendEvent(button, pos); - } - - // encode button and - // position to characters - function encode(data, ch) { - if (!self.utfMouse) { - if (ch === 255) return data.push(0); - if (ch > 127) ch = 127; - data.push(ch); - } else { - if (ch === 2047) return data.push(0); - if (ch < 127) { - data.push(ch); - } else { - if (ch > 2047) ch = 2047; - data.push(0xC0 | (ch >> 6)); - data.push(0x80 | (ch & 0x3F)); - } - } - } - - // send a mouse event: - // regular/utf8: ^[[M Cb Cx Cy - // urxvt: ^[[ Cb ; Cx ; Cy M - // sgr: ^[[ Cb ; Cx ; Cy M/m - // vt300: ^[[ 24(1/3/5)~ [ Cx , Cy ] \r - // locator: CSI P e ; P b ; P r ; P c ; P p & w - function sendEvent(button, pos) { - // self.emit('mouse', { - // x: pos.x - 32, - // y: pos.x - 32, - // button: button - // }); - - if (self.vt300Mouse) { - // NOTE: Unstable. - // http://www.vt100.net/docs/vt3xx-gp/chapter15.html - button &= 3; - pos.x -= 32; - pos.y -= 32; - var data = '\x1b[24'; - if (button === 0) data += '1'; - else if (button === 1) data += '3'; - else if (button === 2) data += '5'; - else if (button === 3) return; - else data += '0'; - data += '~[' + pos.x + ',' + pos.y + ']\r'; - self.send(data); - return; - } - - if (self.decLocator) { - // NOTE: Unstable. - button &= 3; - pos.x -= 32; - pos.y -= 32; - if (button === 0) button = 2; - else if (button === 1) button = 4; - else if (button === 2) button = 6; - else if (button === 3) button = 3; - self.send('\x1b[' - + button - + ';' - + (button === 3 ? 4 : 0) - + ';' - + pos.y - + ';' - + pos.x - + ';' - + (pos.page || 0) - + '&w'); - return; - } - - if (self.urxvtMouse) { - pos.x -= 32; - pos.y -= 32; - pos.x++; - pos.y++; - self.send('\x1b[' + button + ';' + pos.x + ';' + pos.y + 'M'); - return; - } - - if (self.sgrMouse) { - pos.x -= 32; - pos.y -= 32; - self.send('\x1b[<' - + ((button & 3) === 3 ? button & ~3 : button) - + ';' - + pos.x - + ';' - + pos.y - + ((button & 3) === 3 ? 'm' : 'M')); - return; - } - - var data = []; - - encode(data, button); - encode(data, pos.x); - encode(data, pos.y); - - self.send('\x1b[M' + String.fromCharCode.apply(String, data)); - } - - function getButton(ev) { - var button - , shift - , meta - , ctrl - , mod; - - // two low bits: - // 0 = left - // 1 = middle - // 2 = right - // 3 = release - // wheel up/down: - // 1, and 2 - with 64 added - switch (ev.overrideType || ev.type) { - case 'mousedown': - button = ev.button != null - ? +ev.button - : ev.which != null - ? ev.which - 1 - : null; - - if (self.isMSIE) { - button = button === 1 ? 0 : button === 4 ? 1 : button; - } - break; - case 'mouseup': - button = 3; - break; - case 'DOMMouseScroll': - button = ev.detail < 0 - ? 64 - : 65; - break; - case 'wheel': - button = ev.wheelDeltaY > 0 - ? 64 - : 65; - break; - } - - // next three bits are the modifiers: - // 4 = shift, 8 = meta, 16 = control - shift = ev.shiftKey ? 4 : 0; - meta = ev.metaKey ? 8 : 0; - ctrl = ev.ctrlKey ? 16 : 0; - mod = shift | meta | ctrl; - - // no mods - if (self.vt200Mouse) { - // ctrl only - mod &= ctrl; - } else if (!self.normalMouse) { - mod = 0; - } - - // increment to SP - button = (32 + (mod << 2)) + button; - - return button; - } - - // mouse coordinates measured in cols/rows - function getCoords(ev) { - var x, y, w, h, el; - - // ignore browsers without pageX for now - if (ev.pageX == null) return; - - x = ev.pageX; - y = ev.pageY; - el = self.element; - - // should probably check offsetParent - // but this is more portable - while (el && el !== self.document.documentElement) { - x -= el.offsetLeft; - y -= el.offsetTop; - el = 'offsetParent' in el - ? el.offsetParent - : el.parentNode; - } - - // convert to cols/rows - w = self.element.clientWidth; - h = self.element.clientHeight; - x = Math.ceil((x / w) * self.cols); - y = Math.ceil((y / h) * self.rows); - - // be sure to avoid sending - // bad positions to the program - if (x < 0) x = 0; - if (x > self.cols) x = self.cols; - if (y < 0) y = 0; - if (y > self.rows) y = self.rows; - - // xterm sends raw bytes and - // starts at 32 (SP) for each. - x += 32; - y += 32; - - return { - x: x, - y: y, - type: 'wheel' - }; - } - - on(el, 'mousedown', function(ev) { - if (!self.mouseEvents) return; - - // send the button - sendButton(ev); - - // ensure focus - self.focus(); - - // fix for odd bug - //if (self.vt200Mouse && !self.normalMouse) { - if (self.vt200Mouse) { - ev.overrideType = 'mouseup'; - sendButton(ev); - return self.cancel(ev); - } - - // bind events - if (self.normalMouse) on(self.document, 'mousemove', sendMove); - - // x10 compatibility mode can't send button releases - if (!self.x10Mouse) { - on(self.document, 'mouseup', function up(ev) { - sendButton(ev); - if (self.normalMouse) off(self.document, 'mousemove', sendMove); - off(self.document, 'mouseup', up); - return self.cancel(ev); - }); - } - - return self.cancel(ev); - }); - - //if (self.normalMouse) { - // on(self.document, 'mousemove', sendMove); - //} - - on(el, 'wheel', function(ev) { - if (!self.mouseEvents) return; - if (self.x10Mouse - || self.vt300Mouse - || self.decLocator) return; - sendButton(ev); - return self.cancel(ev); - }); - - // allow wheel scrolling in - // the shell for example - on(el, 'wheel', function(ev) { - if (self.mouseEvents) return; - self.viewport.onWheel(ev); - return self.cancel(ev); - }); -}; - -/** - * Destroys the terminal. - */ -Terminal.prototype.destroy = function() { - this.readable = false; - this.writable = false; - this._events = {}; - this.handler = function() {}; - this.write = function() {}; - if (this.element.parentNode) { - this.element.parentNode.removeChild(this.element); - } - //this.emit('close'); -}; - - -/** - * Flags used to render terminal text properly - */ -Terminal.flags = { - BOLD: 1, - UNDERLINE: 2, - BLINK: 4, - INVERSE: 8, - INVISIBLE: 16 -} - -/** - * Refreshes (re-renders) terminal content within two rows (inclusive) - * - * Rendering Engine: - * - * In the screen buffer, each character is stored as a an array with a character - * and a 32-bit integer: - * - First value: a utf-16 character. - * - Second value: - * - Next 9 bits: background color (0-511). - * - Next 9 bits: foreground color (0-511). - * - Next 14 bits: a mask for misc. flags: - * - 1=bold - * - 2=underline - * - 4=blink - * - 8=inverse - * - 16=invisible - * - * @param {number} start The row to start from (between 0 and terminal's height terminal - 1) - * @param {number} end The row to end at (between fromRow and terminal's height terminal - 1) - * @param {boolean} queue Whether the refresh should ran right now or be queued - */ -Terminal.prototype.refresh = function(start, end, queue) { - var self = this; - - // queue defaults to true - queue = (typeof queue == 'undefined') ? true : queue; - - /** - * The refresh queue allows refresh to execute only approximately 30 times a second. For - * commands that pass a significant amount of output to the write function, this prevents the - * terminal from maxing out the CPU and making the UI unresponsive. While commands can still - * run beyond what they do on the terminal, it is far better with a debounce in place as - * every single terminal manipulation does not need to be constructed in the DOM. - * - * A side-effect of this is that it makes ^C to interrupt a process seem more responsive. - */ - if (queue) { - // If refresh should be queued, order the refresh and return. - if (this._refreshIsQueued) { - // If a refresh has already been queued, just order a full refresh next - this._fullRefreshNext = true; - } else { - setTimeout(function () { - self.refresh(start, end, false); - }, 34) - this._refreshIsQueued = true; - } - return; - } - - // If refresh should be run right now (not be queued), release the lock - this._refreshIsQueued = false; - - // If multiple refreshes were requested, make a full refresh. - if (this._fullRefreshNext) { - start = 0; - end = this.rows - 1; - this._fullRefreshNext = false // reset lock - } - - var x, y, i, line, out, ch, ch_width, width, data, attr, bg, fg, flags, row, parent, focused = document.activeElement; - - // If this is a big refresh, remove the terminal rows from the DOM for faster calculations - if (end - start >= this.rows / 2) { - parent = this.element.parentNode; - if (parent) { - this.element.removeChild(this.rowContainer); - } - } - - width = this.cols; - y = start; - - if (end >= this.rows.length) { - this.log('`end` is too large. Most likely a bad CSR.'); - end = this.rows.length - 1; - } - - for (; y <= end; y++) { - row = y + this.ydisp; - - line = this.lines[row]; - out = ''; - - if (this.y === y - (this.ybase - this.ydisp) - && this.cursorState - && !this.cursorHidden) { - x = this.x; - } else { - x = -1; - } - - attr = this.defAttr; - i = 0; - - for (; i < width; i++) { - data = line[i][0]; - ch = line[i][1]; - ch_width = line[i][2]; - if (!ch_width) - continue; - - if (i === x) data = -1; - - if (data !== attr) { - if (attr !== this.defAttr) { - out += '</span>'; - } - if (data !== this.defAttr) { - if (data === -1) { - out += '<span class="reverse-video terminal-cursor'; - if (this.cursorBlink) { - out += ' blinking'; - } - out += '">'; - } else { - var classNames = []; - - bg = data & 0x1ff; - fg = (data >> 9) & 0x1ff; - flags = data >> 18; - - if (flags & Terminal.flags.BOLD) { - if (!Terminal.brokenBold) { - classNames.push('xterm-bold'); - } - // See: XTerm*boldColors - if (fg < 8) fg += 8; - } - - if (flags & Terminal.flags.UNDERLINE) { - classNames.push('xterm-underline'); - } - - if (flags & Terminal.flags.BLINK) { - classNames.push('xterm-blink'); - } - - // If inverse flag is on, then swap the foreground and background variables. - if (flags & Terminal.flags.INVERSE) { - /* One-line variable swap in JavaScript: http://stackoverflow.com/a/16201730 */ - bg = [fg, fg = bg][0]; - // Should inverse just be before the - // above boldColors effect instead? - if ((flags & 1) && fg < 8) fg += 8; - } - - if (flags & Terminal.flags.INVISIBLE) { - classNames.push('xterm-hidden'); - } - - /** - * Weird situation: Invert flag used black foreground and white background results - * in invalid background color, positioned at the 256 index of the 256 terminal - * color map. Pin the colors manually in such a case. - * - * Source: https://github.com/sourcelair/xterm.js/issues/57 - */ - if (flags & Terminal.flags.INVERSE) { - if (bg == 257) { - bg = 15; - } - if (fg == 256) { - fg = 0; - } - } - - if (bg < 256) { - classNames.push('xterm-bg-color-' + bg); - } - - if (fg < 256) { - classNames.push('xterm-color-' + fg); - } - - out += '<span'; - if (classNames.length) { - out += ' class="' + classNames.join(' ') + '"'; - } - out += '>'; - } - } - } - - switch (ch) { - case '&': - out += '&'; - break; - case '<': - out += '<'; - break; - case '>': - out += '>'; - break; - default: - if (ch <= ' ') { - out += ' '; - } else { - out += ch; - } - break; - } - - attr = data; - } - - if (attr !== this.defAttr) { - out += '</span>'; - } - - this.children[y].innerHTML = out; - } - - if (parent) { - this.element.appendChild(this.rowContainer); - } - - this.emit('refresh', {element: this.element, start: start, end: end}); -}; - -/** - * Display the cursor element - */ -Terminal.prototype.showCursor = function() { - if (!this.cursorState) { - this.cursorState = 1; - this.refresh(this.y, this.y); - } -}; - -/** - * Scroll the terminal - */ -Terminal.prototype.scroll = function() { - var row; - - if (++this.ybase === this.scrollback) { - this.ybase = this.ybase / 2 | 0; - this.lines = this.lines.slice(-(this.ybase + this.rows) + 1); - } - - this.ydisp = this.ybase; - - // last line - row = this.ybase + this.rows - 1; - - // subtract the bottom scroll region - row -= this.rows - 1 - this.scrollBottom; - - if (row === this.lines.length) { - // potential optimization: - // pushing is faster than splicing - // when they amount to the same - // behavior. - this.lines.push(this.blankLine()); - } else { - // add our new line - this.lines.splice(row, 0, this.blankLine()); - } - - if (this.scrollTop !== 0) { - if (this.ybase !== 0) { - this.ybase--; - this.ydisp = this.ybase; - } - this.lines.splice(this.ybase + this.scrollTop, 1); - } - - // this.maxRange(); - this.updateRange(this.scrollTop); - this.updateRange(this.scrollBottom); - - this.emit('scroll', this.ydisp); -}; - -/** - * Scroll the display of the terminal - * @param {number} disp The number of lines to scroll down (negatives scroll up). - * @param {boolean} suppressScrollEvent Don't emit the scroll event as scrollDisp. This is used - * to avoid unwanted events being handled by the veiwport when the event was triggered from the - * viewport originally. - */ -Terminal.prototype.scrollDisp = function(disp, suppressScrollEvent) { - this.ydisp += disp; - - if (this.ydisp > this.ybase) { - this.ydisp = this.ybase; - } else if (this.ydisp < 0) { - this.ydisp = 0; - } - - if (!suppressScrollEvent) { - this.emit('scroll', this.ydisp); - } - - this.refresh(0, this.rows - 1); -}; - -/** - * Writes text to the terminal. - * @param {string} text The text to write to the terminal. - */ -Terminal.prototype.write = function(data) { - var l = data.length, i = 0, j, cs, ch, code, low, ch_width, row; - - this.refreshStart = this.y; - this.refreshEnd = this.y; - - if (this.ybase !== this.ydisp) { - this.ydisp = this.ybase; - this.emit('scroll', this.ydisp); - this.maxRange(); - } - - // apply leftover surrogate high from last write - if (this.surrogate_high) { - data = this.surrogate_high + data; - this.surrogate_high = ''; - } - - for (; i < l; i++) { - ch = data[i]; - - // FIXME: higher chars than 0xa0 are not allowed in escape sequences - // --> maybe move to default - code = data.charCodeAt(i); - if (0xD800 <= code && code <= 0xDBFF) { - // we got a surrogate high - // get surrogate low (next 2 bytes) - low = data.charCodeAt(i+1); - if (isNaN(low)) { - // end of data stream, save surrogate high - this.surrogate_high = ch; - continue; - } - code = ((code - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000; - ch += data.charAt(i+1); - } - // surrogate low - already handled above - if (0xDC00 <= code && code <= 0xDFFF) - continue; - - switch (this.state) { - case normal: - switch (ch) { - case '\x07': - this.bell(); - break; - - // '\n', '\v', '\f' - case '\n': - case '\x0b': - case '\x0c': - if (this.convertEol) { - this.x = 0; - } - this.y++; - if (this.y > this.scrollBottom) { - this.y--; - this.scroll(); - } - break; - - // '\r' - case '\r': - this.x = 0; - break; - - // '\b' - case '\x08': - if (this.x > 0) { - this.x--; - } - break; - - // '\t' - case '\t': - this.x = this.nextStop(); - break; - - // shift out - case '\x0e': - this.setgLevel(1); - break; - - // shift in - case '\x0f': - this.setgLevel(0); - break; - - // '\e' - case '\x1b': - this.state = escaped; - break; - - default: - // ' ' - // calculate print space - // expensive call, therefore we save width in line buffer - ch_width = wcwidth(code); - - if (ch >= ' ') { - if (this.charset && this.charset[ch]) { - ch = this.charset[ch]; - } - - row = this.y + this.ybase; - - // insert combining char in last cell - // FIXME: needs handling after cursor jumps - if (!ch_width && this.x) { - - // dont overflow left - if (this.lines[row][this.x-1]) { - if (!this.lines[row][this.x-1][2]) { - - // found empty cell after fullwidth, need to go 2 cells back - if (this.lines[row][this.x-2]) - this.lines[row][this.x-2][1] += ch; - - } else { - this.lines[row][this.x-1][1] += ch; - } - this.updateRange(this.y); - } - break; - } - - // goto next line if ch would overflow - // TODO: needs a global min terminal width of 2 - if (this.x+ch_width-1 >= this.cols) { - // autowrap - DECAWM - if (this.wraparoundMode) { - this.x = 0; - this.y++; - if (this.y > this.scrollBottom) { - this.y--; - this.scroll(); - } - } else { - this.x = this.cols-1; - if(ch_width===2) // FIXME: check for xterm behavior - continue; - } - } - row = this.y + this.ybase; - - // insert mode: move characters to right - if (this.insertMode) { - // do this twice for a fullwidth char - for (var moves=0; moves<ch_width; ++moves) { - // remove last cell, if it's width is 0 - // we have to adjust the second last cell as well - var removed = this.lines[this.y + this.ybase].pop(); - if (removed[2]===0 - && this.lines[row][this.cols-2] - && this.lines[row][this.cols-2][2]===2) - this.lines[row][this.cols-2] = [this.curAttr, ' ', 1]; - - // insert empty cell at cursor - this.lines[row].splice(this.x, 0, [this.curAttr, ' ', 1]); - } - } - - this.lines[row][this.x] = [this.curAttr, ch, ch_width]; - this.x++; - this.updateRange(this.y); - - // fullwidth char - set next cell width to zero and advance cursor - if (ch_width===2) { - this.lines[row][this.x] = [this.curAttr, '', 0]; - this.x++; - } - } - break; - } - break; - case escaped: - switch (ch) { - // ESC [ Control Sequence Introducer ( CSI is 0x9b). - case '[': - this.params = []; - this.currentParam = 0; - this.state = csi; - break; - - // ESC ] Operating System Command ( OSC is 0x9d). - case ']': - this.params = []; - this.currentParam = 0; - this.state = osc; - break; - - // ESC P Device Control String ( DCS is 0x90). - case 'P': - this.params = []; - this.currentParam = 0; - this.state = dcs; - break; - - // ESC _ Application Program Command ( APC is 0x9f). - case '_': - this.state = ignore; - break; - - // ESC ^ Privacy Message ( PM is 0x9e). - case '^': - this.state = ignore; - break; - - // ESC c Full Reset (RIS). - case 'c': - this.reset(); - break; - - // ESC E Next Line ( NEL is 0x85). - // ESC D Index ( IND is 0x84). - case 'E': - this.x = 0; - ; - case 'D': - this.index(); - break; - - // ESC M Reverse Index ( RI is 0x8d). - case 'M': - this.reverseIndex(); - break; - - // ESC % Select default/utf-8 character set. - // @ = default, G = utf-8 - case '%': - //this.charset = null; - this.setgLevel(0); - this.setgCharset(0, Terminal.charsets.US); - this.state = normal; - i++; - break; - - // ESC (,),*,+,-,. Designate G0-G2 Character Set. - case '(': // <-- this seems to get all the attention - case ')': - case '*': - case '+': - case '-': - case '.': - switch (ch) { - case '(': - this.gcharset = 0; - break; - case ')': - this.gcharset = 1; - break; - case '*': - this.gcharset = 2; - break; - case '+': - this.gcharset = 3; - break; - case '-': - this.gcharset = 1; - break; - case '.': - this.gcharset = 2; - break; - } - this.state = charset; - break; - - // Designate G3 Character Set (VT300). - // A = ISO Latin-1 Supplemental. - // Not implemented. - case '/': - this.gcharset = 3; - this.state = charset; - i--; - break; - - // ESC N - // Single Shift Select of G2 Character Set - // ( SS2 is 0x8e). This affects next character only. - case 'N': - break; - // ESC O - // Single Shift Select of G3 Character Set - // ( SS3 is 0x8f). This affects next character only. - case 'O': - break; - // ESC n - // Invoke the G2 Character Set as GL (LS2). - case 'n': - this.setgLevel(2); - break; - // ESC o - // Invoke the G3 Character Set as GL (LS3). - case 'o': - this.setgLevel(3); - break; - // ESC | - // Invoke the G3 Character Set as GR (LS3R). - case '|': - this.setgLevel(3); - break; - // ESC } - // Invoke the G2 Character Set as GR (LS2R). - case '}': - this.setgLevel(2); - break; - // ESC ~ - // Invoke the G1 Character Set as GR (LS1R). - case '~': - this.setgLevel(1); - break; - - // ESC 7 Save Cursor (DECSC). - case '7': - this.saveCursor(); - this.state = normal; - break; - - // ESC 8 Restore Cursor (DECRC). - case '8': - this.restoreCursor(); - this.state = normal; - break; - - // ESC # 3 DEC line height/width - case '#': - this.state = normal; - i++; - break; - - // ESC H Tab Set (HTS is 0x88). - case 'H': - this.tabSet(); - break; - - // ESC = Application Keypad (DECKPAM). - case '=': - this.log('Serial port requested application keypad.'); - this.applicationKeypad = true; - this.viewport.syncScrollArea(); - this.state = normal; - break; - - // ESC > Normal Keypad (DECKPNM). - case '>': - this.log('Switching back to normal keypad.'); - this.applicationKeypad = false; - this.viewport.syncScrollArea(); - this.state = normal; - break; - - default: - this.state = normal; - this.error('Unknown ESC control: %s.', ch); - break; - } - break; - - case charset: - switch (ch) { - case '0': // DEC Special Character and Line Drawing Set. - cs = Terminal.charsets.SCLD; - break; - case 'A': // UK - cs = Terminal.charsets.UK; - break; - case 'B': // United States (USASCII). - cs = Terminal.charsets.US; - break; - case '4': // Dutch - cs = Terminal.charsets.Dutch; - break; - case 'C': // Finnish - case '5': - cs = Terminal.charsets.Finnish; - break; - case 'R': // French - cs = Terminal.charsets.French; - break; - case 'Q': // FrenchCanadian - cs = Terminal.charsets.FrenchCanadian; - break; - case 'K': // German - cs = Terminal.charsets.German; - break; - case 'Y': // Italian - cs = Terminal.charsets.Italian; - break; - case 'E': // NorwegianDanish - case '6': - cs = Terminal.charsets.NorwegianDanish; - break; - case 'Z': // Spanish - cs = Terminal.charsets.Spanish; - break; - case 'H': // Swedish - case '7': - cs = Terminal.charsets.Swedish; - break; - case '=': // Swiss - cs = Terminal.charsets.Swiss; - break; - case '/': // ISOLatin (actually /A) - cs = Terminal.charsets.ISOLatin; - i++; - break; - default: // Default - cs = Terminal.charsets.US; - break; - } - this.setgCharset(this.gcharset, cs); - this.gcharset = null; - this.state = normal; - break; - - case osc: - // OSC Ps ; Pt ST - // OSC Ps ; Pt BEL - // Set Text Parameters. - if (ch === '\x1b' || ch === '\x07') { - if (ch === '\x1b') i++; - - this.params.push(this.currentParam); - - switch (this.params[0]) { - case 0: - case 1: - case 2: - if (this.params[1]) { - this.title = this.params[1]; - this.handleTitle(this.title); - } - break; - case 3: - // set X property - break; - case 4: - case 5: - // change dynamic colors - break; - case 10: - case 11: - case 12: - case 13: - case 14: - case 15: - case 16: - case 17: - case 18: - case 19: - // change dynamic ui colors - break; - case 46: - // change log file - break; - case 50: - // dynamic font - break; - case 51: - // emacs shell - break; - case 52: - // manipulate selection data - break; - case 104: - case 105: - case 110: - case 111: - case 112: - case 113: - case 114: - case 115: - case 116: - case 117: - case 118: - // reset colors - break; - } - - this.params = []; - this.currentParam = 0; - this.state = normal; - } else { - if (!this.params.length) { - if (ch >= '0' && ch <= '9') { - this.currentParam = - this.currentParam * 10 + ch.charCodeAt(0) - 48; - } else if (ch === ';') { - this.params.push(this.currentParam); - this.currentParam = ''; - } - } else { - this.currentParam += ch; - } - } - break; - - case csi: - // '?', '>', '!' - if (ch === '?' || ch === '>' || ch === '!') { - this.prefix = ch; - break; - } - - // 0 - 9 - if (ch >= '0' && ch <= '9') { - this.currentParam = this.currentParam * 10 + ch.charCodeAt(0) - 48; - break; - } - - // '$', '"', ' ', '\'' - if (ch === '$' || ch === '"' || ch === ' ' || ch === '\'') { - this.postfix = ch; - break; - } - - this.params.push(this.currentParam); - this.currentParam = 0; - - // ';' - if (ch === ';') break; - - this.state = normal; - - switch (ch) { - // CSI Ps A - // Cursor Up Ps Times (default = 1) (CUU). - case 'A': - this.cursorUp(this.params); - break; - - // CSI Ps B - // Cursor Down Ps Times (default = 1) (CUD). - case 'B': - this.cursorDown(this.params); - break; - - // CSI Ps C - // Cursor Forward Ps Times (default = 1) (CUF). - case 'C': - this.cursorForward(this.params); - break; - - // CSI Ps D - // Cursor Backward Ps Times (default = 1) (CUB). - case 'D': - this.cursorBackward(this.params); - break; - - // CSI Ps ; Ps H - // Cursor Position [row;column] (default = [1,1]) (CUP). - case 'H': - this.cursorPos(this.params); - break; - - // CSI Ps J Erase in Display (ED). - case 'J': - this.eraseInDisplay(this.params); - break; - - // CSI Ps K Erase in Line (EL). - case 'K': - this.eraseInLine(this.params); - break; - - // CSI Pm m Character Attributes (SGR). - case 'm': - if (!this.prefix) { - this.charAttributes(this.params); - } - break; - - // CSI Ps n Device Status Report (DSR). - case 'n': - if (!this.prefix) { - this.deviceStatus(this.params); - } - break; - - /** - * Additions - */ - - // CSI Ps @ - // Insert Ps (Blank) Character(s) (default = 1) (ICH). - case '@': - this.insertChars(this.params); - break; - - // CSI Ps E - // Cursor Next Line Ps Times (default = 1) (CNL). - case 'E': - this.cursorNextLine(this.params); - break; - - // CSI Ps F - // Cursor Preceding Line Ps Times (default = 1) (CNL). - case 'F': - this.cursorPrecedingLine(this.params); - break; - - // CSI Ps G - // Cursor Character Absolute [column] (default = [row,1]) (CHA). - case 'G': - this.cursorCharAbsolute(this.params); - break; - - // CSI Ps L - // Insert Ps Line(s) (default = 1) (IL). - case 'L': - this.insertLines(this.params); - break; - - // CSI Ps M - // Delete Ps Line(s) (default = 1) (DL). - case 'M': - this.deleteLines(this.params); - break; - - // CSI Ps P - // Delete Ps Character(s) (default = 1) (DCH). - case 'P': - this.deleteChars(this.params); - break; - - // CSI Ps X - // Erase Ps Character(s) (default = 1) (ECH). - case 'X': - this.eraseChars(this.params); - break; - - // CSI Pm ` Character Position Absolute - // [column] (default = [row,1]) (HPA). - case '`': - this.charPosAbsolute(this.params); - break; - - // 141 61 a * HPR - - // Horizontal Position Relative - case 'a': - this.HPositionRelative(this.params); - break; - - // CSI P s c - // Send Device Attributes (Primary DA). - // CSI > P s c - // Send Device Attributes (Secondary DA) - case 'c': - this.sendDeviceAttributes(this.params); - break; - - // CSI Pm d - // Line Position Absolute [row] (default = [1,column]) (VPA). - case 'd': - this.linePosAbsolute(this.params); - break; - - // 145 65 e * VPR - Vertical Position Relative - case 'e': - this.VPositionRelative(this.params); - break; - - // CSI Ps ; Ps f - // Horizontal and Vertical Position [row;column] (default = - // [1,1]) (HVP). - case 'f': - this.HVPosition(this.params); - break; - - // CSI Pm h Set Mode (SM). - // CSI ? Pm h - mouse escape codes, cursor escape codes - case 'h': - this.setMode(this.params); - break; - - // CSI Pm l Reset Mode (RM). - // CSI ? Pm l - case 'l': - this.resetMode(this.params); - break; - - // CSI Ps ; Ps r - // Set Scrolling Region [top;bottom] (default = full size of win- - // dow) (DECSTBM). - // CSI ? Pm r - case 'r': - this.setScrollRegion(this.params); - break; - - // CSI s - // Save cursor (ANSI.SYS). - case 's': - this.saveCursor(this.params); - break; - - // CSI u - // Restore cursor (ANSI.SYS). - case 'u': - this.restoreCursor(this.params); - break; - - /** - * Lesser Used - */ - - // CSI Ps I - // Cursor Forward Tabulation Ps tab stops (default = 1) (CHT). - case 'I': - this.cursorForwardTab(this.params); - break; - - // CSI Ps S Scroll up Ps lines (default = 1) (SU). - case 'S': - this.scrollUp(this.params); - break; - - // CSI Ps T Scroll down Ps lines (default = 1) (SD). - // CSI Ps ; Ps ; Ps ; Ps ; Ps T - // CSI > Ps; Ps T - case 'T': - // if (this.prefix === '>') { - // this.resetTitleModes(this.params); - // break; - // } - // if (this.params.length > 2) { - // this.initMouseTracking(this.params); - // break; - // } - if (this.params.length < 2 && !this.prefix) { - this.scrollDown(this.params); - } - break; - - // CSI Ps Z - // Cursor Backward Tabulation Ps tab stops (default = 1) (CBT). - case 'Z': - this.cursorBackwardTab(this.params); - break; - - // CSI Ps b Repeat the preceding graphic character Ps times (REP). - case 'b': - this.repeatPrecedingCharacter(this.params); - break; - - // CSI Ps g Tab Clear (TBC). - case 'g': - this.tabClear(this.params); - break; - - // CSI Pm i Media Copy (MC). - // CSI ? Pm i - // case 'i': - // this.mediaCopy(this.params); - // break; - - // CSI Pm m Character Attributes (SGR). - // CSI > Ps; Ps m - // case 'm': // duplicate - // if (this.prefix === '>') { - // this.setResources(this.params); - // } else { - // this.charAttributes(this.params); - // } - // break; - - // CSI Ps n Device Status Report (DSR). - // CSI > Ps n - // case 'n': // duplicate - // if (this.prefix === '>') { - // this.disableModifiers(this.params); - // } else { - // this.deviceStatus(this.params); - // } - // break; - - // CSI > Ps p Set pointer mode. - // CSI ! p Soft terminal reset (DECSTR). - // CSI Ps$ p - // Request ANSI mode (DECRQM). - // CSI ? Ps$ p - // Request DEC private mode (DECRQM). - // CSI Ps ; Ps " p - case 'p': - switch (this.prefix) { - // case '>': - // this.setPointerMode(this.params); - // break; - case '!': - this.softReset(this.params); - break; - // case '?': - // if (this.postfix === '$') { - // this.requestPrivateMode(this.params); - // } - // break; - // default: - // if (this.postfix === '"') { - // this.setConformanceLevel(this.params); - // } else if (this.postfix === '$') { - // this.requestAnsiMode(this.params); - // } - // break; - } - break; - - // CSI Ps q Load LEDs (DECLL). - // CSI Ps SP q - // CSI Ps " q - // case 'q': - // if (this.postfix === ' ') { - // this.setCursorStyle(this.params); - // break; - // } - // if (this.postfix === '"') { - // this.setCharProtectionAttr(this.params); - // break; - // } - // this.loadLEDs(this.params); - // break; - - // CSI Ps ; Ps r - // Set Scrolling Region [top;bottom] (default = full size of win- - // dow) (DECSTBM). - // CSI ? Pm r - // CSI Pt; Pl; Pb; Pr; Ps$ r - // case 'r': // duplicate - // if (this.prefix === '?') { - // this.restorePrivateValues(this.params); - // } else if (this.postfix === '$') { - // this.setAttrInRectangle(this.params); - // } else { - // this.setScrollRegion(this.params); - // } - // break; - - // CSI s Save cursor (ANSI.SYS). - // CSI ? Pm s - // case 's': // duplicate - // if (this.prefix === '?') { - // this.savePrivateValues(this.params); - // } else { - // this.saveCursor(this.params); - // } - // break; - - // CSI Ps ; Ps ; Ps t - // CSI Pt; Pl; Pb; Pr; Ps$ t - // CSI > Ps; Ps t - // CSI Ps SP t - // case 't': - // if (this.postfix === '$') { - // this.reverseAttrInRectangle(this.params); - // } else if (this.postfix === ' ') { - // this.setWarningBellVolume(this.params); - // } else { - // if (this.prefix === '>') { - // this.setTitleModeFeature(this.params); - // } else { - // this.manipulateWindow(this.params); - // } - // } - // break; - - // CSI u Restore cursor (ANSI.SYS). - // CSI Ps SP u - // case 'u': // duplicate - // if (this.postfix === ' ') { - // this.setMarginBellVolume(this.params); - // } else { - // this.restoreCursor(this.params); - // } - // break; - - // CSI Pt; Pl; Pb; Pr; Pp; Pt; Pl; Pp$ v - // case 'v': - // if (this.postfix === '$') { - // this.copyRectagle(this.params); - // } - // break; - - // CSI Pt ; Pl ; Pb ; Pr ' w - // case 'w': - // if (this.postfix === '\'') { - // this.enableFilterRectangle(this.params); - // } - // break; - - // CSI Ps x Request Terminal Parameters (DECREQTPARM). - // CSI Ps x Select Attribute Change Extent (DECSACE). - // CSI Pc; Pt; Pl; Pb; Pr$ x - // case 'x': - // if (this.postfix === '$') { - // this.fillRectangle(this.params); - // } else { - // this.requestParameters(this.params); - // //this.__(this.params); - // } - // break; - - // CSI Ps ; Pu ' z - // CSI Pt; Pl; Pb; Pr$ z - // case 'z': - // if (this.postfix === '\'') { - // this.enableLocatorReporting(this.params); - // } else if (this.postfix === '$') { - // this.eraseRectangle(this.params); - // } - // break; - - // CSI Pm ' { - // CSI Pt; Pl; Pb; Pr$ { - // case '{': - // if (this.postfix === '\'') { - // this.setLocatorEvents(this.params); - // } else if (this.postfix === '$') { - // this.selectiveEraseRectangle(this.params); - // } - // break; - - // CSI Ps ' | - // case '|': - // if (this.postfix === '\'') { - // this.requestLocatorPosition(this.params); - // } - // break; - - // CSI P m SP } - // Insert P s Column(s) (default = 1) (DECIC), VT420 and up. - // case '}': - // if (this.postfix === ' ') { - // this.insertColumns(this.params); - // } - // break; - - // CSI P m SP ~ - // Delete P s Column(s) (default = 1) (DECDC), VT420 and up - // case '~': - // if (this.postfix === ' ') { - // this.deleteColumns(this.params); - // } - // break; - - default: - this.error('Unknown CSI code: %s.', ch); - break; - } - - this.prefix = ''; - this.postfix = ''; - break; - - case dcs: - if (ch === '\x1b' || ch === '\x07') { - if (ch === '\x1b') i++; - - switch (this.prefix) { - // User-Defined Keys (DECUDK). - case '': - break; - - // Request Status String (DECRQSS). - // test: echo -e '\eP$q"p\e\\' - case '$q': - var pt = this.currentParam - , valid = false; - - switch (pt) { - // DECSCA - case '"q': - pt = '0"q'; - break; - - // DECSCL - case '"p': - pt = '61"p'; - break; - - // DECSTBM - case 'r': - pt = '' - + (this.scrollTop + 1) - + ';' - + (this.scrollBottom + 1) - + 'r'; - break; - - // SGR - case 'm': - pt = '0m'; - break; - - default: - this.error('Unknown DCS Pt: %s.', pt); - pt = ''; - break; - } - - this.send('\x1bP' + +valid + '$r' + pt + '\x1b\\'); - break; - - // Set Termcap/Terminfo Data (xterm, experimental). - case '+p': - break; - - // Request Termcap/Terminfo String (xterm, experimental) - // Regular xterm does not even respond to this sequence. - // This can cause a small glitch in vim. - // test: echo -ne '\eP+q6b64\e\\' - case '+q': - var pt = this.currentParam - , valid = false; - - this.send('\x1bP' + +valid + '+r' + pt + '\x1b\\'); - break; - - default: - this.error('Unknown DCS prefix: %s.', this.prefix); - break; - } - - this.currentParam = 0; - this.prefix = ''; - this.state = normal; - } else if (!this.currentParam) { - if (!this.prefix && ch !== '$' && ch !== '+') { - this.currentParam = ch; - } else if (this.prefix.length === 2) { - this.currentParam = ch; - } else { - this.prefix += ch; - } - } else { - this.currentParam += ch; - } - break; - - case ignore: - // For PM and APC. - if (ch === '\x1b' || ch === '\x07') { - if (ch === '\x1b') i++; - this.state = normal; - } - break; - } - } - - this.updateRange(this.y); - this.refresh(this.refreshStart, this.refreshEnd); -}; - -/** - * Writes text to the terminal, followed by a break line character (\n). - * @param {string} text The text to write to the terminal. - */ -Terminal.prototype.writeln = function(data) { - this.write(data + '\r\n'); -}; - -/** - * Attaches a custom keydown handler which is run before keys are processed, giving consumers of - * xterm.js ultimate control as to what keys should be processed by the terminal and what keys - * should not. - * @param {function} customKeydownHandler The custom KeyboardEvent handler to attach. This is a - * function that takes a KeyboardEvent, allowing consumers to stop propogation and/or prevent - * the default action. The function returns whether the event should be processed by xterm.js. - */ -Terminal.prototype.attachCustomKeydownHandler = function(customKeydownHandler) { - this.customKeydownHandler = customKeydownHandler; -} - -/** - * Handle a keydown event - * Key Resources: - * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent - * @param {KeyboardEvent} ev The keydown event to be handled. - */ -Terminal.prototype.keyDown = function(ev) { - if (this.customKeydownHandler && this.customKeydownHandler(ev) === false) { - return false; - } - - if (!this.compositionHelper.keydown.bind(this.compositionHelper)(ev)) { - return false; - } - - var self = this; - var result = this.evaluateKeyEscapeSequence(ev); - - if (result.scrollDisp) { - this.scrollDisp(result.scrollDisp); - return this.cancel(ev, true); - } - - if (isThirdLevelShift(this, ev)) { - return true; - } - - if (result.cancel) { - // The event is canceled at the end already, is this necessary? - this.cancel(ev, true); - } - - if (!result.key) { - return true; - } - - this.emit('keydown', ev); - this.emit('key', result.key, ev); - this.showCursor(); - this.handler(result.key); - - return this.cancel(ev, true); -}; - -/** - * Returns an object that determines how a KeyboardEvent should be handled. The key of the - * returned value is the new key code to pass to the PTY. - * - * Reference: http://invisible-island.net/xterm/ctlseqs/ctlseqs.html - * @param {KeyboardEvent} ev The keyboard event to be translated to key escape sequence. - */ -Terminal.prototype.evaluateKeyEscapeSequence = function(ev) { - var result = { - // Whether to cancel event propogation (NOTE: this may not be needed since the event is - // canceled at the end of keyDown - cancel: false, - // The new key even to emit - key: undefined, - // The number of characters to scroll, if this is defined it will cancel the event - scrollDisp: undefined - }; - var modifiers = ev.shiftKey << 0 | ev.altKey << 1 | ev.ctrlKey << 2 | ev.metaKey << 3; - switch (ev.keyCode) { - case 8: - // backspace - if (ev.shiftKey) { - result.key = '\x08'; // ^H - break; - } - result.key = '\x7f'; // ^? - break; - case 9: - // tab - if (ev.shiftKey) { - result.key = '\x1b[Z'; - break; - } - result.key = '\t'; - result.cancel = true; - break; - case 13: - // return/enter - result.key = '\r'; - result.cancel = true; - break; - case 27: - // escape - result.key = '\x1b'; - result.cancel = true; - break; - case 37: - // left-arrow - if (modifiers) { - result.key = '\x1b[1;' + (modifiers + 1) + 'D'; - // HACK: Make Alt + left-arrow behave like Ctrl + left-arrow: move one word backwards - // http://unix.stackexchange.com/a/108106 - if (result.key == '\x1b[1;3D') { - result.key = '\x1b[1;5D'; - } - } else if (this.applicationCursor) { - result.key = '\x1bOD'; - } else { - result.key = '\x1b[D'; - } - break; - case 39: - // right-arrow - if (modifiers) { - result.key = '\x1b[1;' + (modifiers + 1) + 'C'; - // HACK: Make Alt + right-arrow behave like Ctrl + right-arrow: move one word forward - // http://unix.stackexchange.com/a/108106 - if (result.key == '\x1b[1;3C') { - result.key = '\x1b[1;5C'; - } - } else if (this.applicationCursor) { - result.key = '\x1bOC'; - } else { - result.key = '\x1b[C'; - } - break; - case 38: - // up-arrow - if (modifiers) { - result.key = '\x1b[1;' + (modifiers + 1) + 'A'; - // HACK: Make Alt + up-arrow behave like Ctrl + up-arrow - // http://unix.stackexchange.com/a/108106 - if (result.key == '\x1b[1;3A') { - result.key = '\x1b[1;5A'; - } - } else if (this.applicationCursor) { - result.key = '\x1bOA'; - } else { - result.key = '\x1b[A'; - } - break; - case 40: - // down-arrow - if (modifiers) { - result.key = '\x1b[1;' + (modifiers + 1) + 'B'; - // HACK: Make Alt + down-arrow behave like Ctrl + down-arrow - // http://unix.stackexchange.com/a/108106 - if (result.key == '\x1b[1;3B') { - result.key = '\x1b[1;5B'; - } - } else if (this.applicationCursor) { - result.key = '\x1bOB'; - } else { - result.key = '\x1b[B'; - } - break; - case 45: - // insert - if (!ev.shiftKey && !ev.ctrlKey) { - // <Ctrl> or <Shift> + <Insert> are used to - // copy-paste on some systems. - result.key = '\x1b[2~'; - } - break; - case 46: - // delete - if (modifiers) { - result.key = '\x1b[3;' + (modifiers + 1) + '~'; - } else { - result.key = '\x1b[3~'; - } - break; - case 36: - // home - if (modifiers) - result.key = '\x1b[1;' + (modifiers + 1) + 'H'; - else if (this.applicationCursor) - result.key = '\x1bOH'; - else - result.key = '\x1b[H'; - break; - case 35: - // end - if (modifiers) - result.key = '\x1b[1;' + (modifiers + 1) + 'F'; - else if (this.applicationCursor) - result.key = '\x1bOF'; - else - result.key = '\x1b[F'; - break; - case 33: - // page up - if (ev.shiftKey) { - result.scrollDisp = -(this.rows - 1); - } else { - result.key = '\x1b[5~'; - } - break; - case 34: - // page down - if (ev.shiftKey) { - result.scrollDisp = this.rows - 1; - } else { - result.key = '\x1b[6~'; - } - break; - case 112: - // F1-F12 - if (modifiers) { - result.key = '\x1b[1;' + (modifiers + 1) + 'P'; - } else { - result.key = '\x1bOP'; - } - break; - case 113: - if (modifiers) { - result.key = '\x1b[1;' + (modifiers + 1) + 'Q'; - } else { - result.key = '\x1bOQ'; - } - break; - case 114: - if (modifiers) { - result.key = '\x1b[1;' + (modifiers + 1) + 'R'; - } else { - result.key = '\x1bOR'; - } - break; - case 115: - if (modifiers) { - result.key = '\x1b[1;' + (modifiers + 1) + 'S'; - } else { - result.key = '\x1bOS'; - } - break; - case 116: - if (modifiers) { - result.key = '\x1b[15;' + (modifiers + 1) + '~'; - } else { - result.key = '\x1b[15~'; - } - break; - case 117: - if (modifiers) { - result.key = '\x1b[17;' + (modifiers + 1) + '~'; - } else { - result.key = '\x1b[17~'; - } - break; - case 118: - if (modifiers) { - result.key = '\x1b[18;' + (modifiers + 1) + '~'; - } else { - result.key = '\x1b[18~'; - } - break; - case 119: - if (modifiers) { - result.key = '\x1b[19;' + (modifiers + 1) + '~'; - } else { - result.key = '\x1b[19~'; - } - break; - case 120: - if (modifiers) { - result.key = '\x1b[20;' + (modifiers + 1) + '~'; - } else { - result.key = '\x1b[20~'; - } - break; - case 121: - if (modifiers) { - result.key = '\x1b[21;' + (modifiers + 1) + '~'; - } else { - result.key = '\x1b[21~'; - } - break; - case 122: - if (modifiers) { - result.key = '\x1b[23;' + (modifiers + 1) + '~'; - } else { - result.key = '\x1b[23~'; - } - break; - case 123: - if (modifiers) { - result.key = '\x1b[24;' + (modifiers + 1) + '~'; - } else { - result.key = '\x1b[24~'; - } - break; - default: - // a-z and space - if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) { - if (ev.keyCode >= 65 && ev.keyCode <= 90) { - result.key = String.fromCharCode(ev.keyCode - 64); - } else if (ev.keyCode === 32) { - // NUL - result.key = String.fromCharCode(0); - } else if (ev.keyCode >= 51 && ev.keyCode <= 55) { - // escape, file sep, group sep, record sep, unit sep - result.key = String.fromCharCode(ev.keyCode - 51 + 27); - } else if (ev.keyCode === 56) { - // delete - result.key = String.fromCharCode(127); - } else if (ev.keyCode === 219) { - // ^[ - escape - result.key = String.fromCharCode(27); - } else if (ev.keyCode === 221) { - // ^] - group sep - result.key = String.fromCharCode(29); - } - } else if (!this.isMac && ev.altKey && !ev.ctrlKey && !ev.metaKey) { - // On Mac this is a third level shift. Use <Esc> instead. - if (ev.keyCode >= 65 && ev.keyCode <= 90) { - result.key = '\x1b' + String.fromCharCode(ev.keyCode + 32); - } else if (ev.keyCode === 192) { - result.key = '\x1b`'; - } else if (ev.keyCode >= 48 && ev.keyCode <= 57) { - result.key = '\x1b' + (ev.keyCode - 48); - } - } - break; - } - return result; -}; - -/** - * Set the G level of the terminal - * @param g - */ -Terminal.prototype.setgLevel = function(g) { - this.glevel = g; - this.charset = this.charsets[g]; -}; - -/** - * Set the charset for the given G level of the terminal - * @param g - * @param charset - */ -Terminal.prototype.setgCharset = function(g, charset) { - this.charsets[g] = charset; - if (this.glevel === g) { - this.charset = charset; - } -}; - -/** - * Handle a keypress event. - * Key Resources: - * - https://developer.mozilla.org/en-US/docs/DOM/KeyboardEvent - * @param {KeyboardEvent} ev The keypress event to be handled. - */ -Terminal.prototype.keyPress = function(ev) { - var key; - - this.cancel(ev); - - if (ev.charCode) { - key = ev.charCode; - } else if (ev.which == null) { - key = ev.keyCode; - } else if (ev.which !== 0 && ev.charCode !== 0) { - key = ev.which; - } else { - return false; - } - - if (!key || ( - (ev.altKey || ev.ctrlKey || ev.metaKey) && !isThirdLevelShift(this, ev) - )) { - return false; - } - - key = String.fromCharCode(key); - - this.emit('keypress', key, ev); - this.emit('key', key, ev); - this.showCursor(); - this.handler(key); - - return false; -}; - -/** - * Send data for handling to the terminal - * @param {string} data - */ -Terminal.prototype.send = function(data) { - var self = this; - - if (!this.queue) { - setTimeout(function() { - self.handler(self.queue); - self.queue = ''; - }, 1); - } - - this.queue += data; -}; - -/** - * Ring the bell. - * Note: We could do sweet things with webaudio here - */ -Terminal.prototype.bell = function() { - if (!this.visualBell) return; - var self = this; - this.element.style.borderColor = 'white'; - setTimeout(function() { - self.element.style.borderColor = ''; - }, 10); - if (this.popOnBell) this.focus(); -}; - -/** - * Log the current state to the console. - */ -Terminal.prototype.log = function() { - if (!this.debug) return; - if (!this.context.console || !this.context.console.log) return; - var args = Array.prototype.slice.call(arguments); - this.context.console.log.apply(this.context.console, args); -}; - -/** - * Log the current state as error to the console. - */ -Terminal.prototype.error = function() { - if (!this.debug) return; - if (!this.context.console || !this.context.console.error) return; - var args = Array.prototype.slice.call(arguments); - this.context.console.error.apply(this.context.console, args); -}; - -/** - * Resizes the terminal. - * - * @param {number} x The number of columns to resize to. - * @param {number} y The number of rows to resize to. - */ -Terminal.prototype.resize = function(x, y) { - var line - , el - , i - , j - , ch - , addToY; - - if (x === this.cols && y === this.rows) { - return; - } - - if (x < 1) x = 1; - if (y < 1) y = 1; - - // resize cols - j = this.cols; - if (j < x) { - ch = [this.defAttr, ' ', 1]; // does xterm use the default attr? - i = this.lines.length; - while (i--) { - while (this.lines[i].length < x) { - this.lines[i].push(ch); - } - } - } else { // (j > x) - i = this.lines.length; - while (i--) { - while (this.lines[i].length > x) { - this.lines[i].pop(); - } - } - } - this.setupStops(j); - this.cols = x; - - // resize rows - j = this.rows; - addToY = 0; - if (j < y) { - el = this.element; - while (j++ < y) { - // y is rows, not this.y - if (this.lines.length < y + this.ybase) { - if (this.ybase > 0 && this.lines.length <= this.ybase + this.y + addToY + 1) { - // There is room above the buffer and there are no empty elements below the line, - // scroll up - this.ybase--; - addToY++ - if (this.ydisp > 0) { - // Viewport is at the top of the buffer, must increase downwards - this.ydisp--; - } - } else { - // Add a blank line if there is no buffer left at the top to scroll to, or if there - // are blank lines after the cursor - this.lines.push(this.blankLine()); - } - } - if (this.children.length < y) { - this.insertRow(); - } - } - } else { // (j > y) - while (j-- > y) { - if (this.lines.length > y + this.ybase) { - if (this.lines.length > this.ybase + this.y + 1) { - // The line is a blank line below the cursor, remove it - this.lines.pop(); - } else { - // The line is the cursor, scroll down - this.ybase++; - this.ydisp++; - } - } - if (this.children.length > y) { - el = this.children.shift(); - if (!el) continue; - el.parentNode.removeChild(el); - } - } - } - this.rows = y; - - // Make sure that the cursor stays on screen - if (this.y >= y) { - this.y = y - 1; - } - if (addToY) { - this.y += addToY; - } - - if (this.x >= x) { - this.x = x - 1; - } - - this.scrollTop = 0; - this.scrollBottom = y - 1; - - this.refresh(0, this.rows - 1); - - this.normal = null; - - this.emit('resize', {terminal: this, cols: x, rows: y}); -}; - -/** - * Updates the range of rows to refresh - * @param {number} y The number of rows to refresh next. - */ -Terminal.prototype.updateRange = function(y) { - if (y < this.refreshStart) this.refreshStart = y; - if (y > this.refreshEnd) this.refreshEnd = y; - // if (y > this.refreshEnd) { - // this.refreshEnd = y; - // if (y > this.rows - 1) { - // this.refreshEnd = this.rows - 1; - // } - // } -}; - -/** - * Set the range of refreshing to the maximyum value - */ -Terminal.prototype.maxRange = function() { - this.refreshStart = 0; - this.refreshEnd = this.rows - 1; -}; - - - -/** - * Setup the tab stops. - * @param {number} i - */ -Terminal.prototype.setupStops = function(i) { - if (i != null) { - if (!this.tabs[i]) { - i = this.prevStop(i); - } - } else { - this.tabs = {}; - i = 0; - } - - for (; i < this.cols; i += 8) { - this.tabs[i] = true; - } -}; - - -/** - * Move the cursor to the previous tab stop from the given position (default is current). - * @param {number} x The position to move the cursor to the previous tab stop. - */ -Terminal.prototype.prevStop = function(x) { - if (x == null) x = this.x; - while (!this.tabs[--x] && x > 0); - return x >= this.cols - ? this.cols - 1 - : x < 0 ? 0 : x; -}; - - -/** - * Move the cursor one tab stop forward from the given position (default is current). - * @param {number} x The position to move the cursor one tab stop forward. - */ -Terminal.prototype.nextStop = function(x) { - if (x == null) x = this.x; - while (!this.tabs[++x] && x < this.cols); - return x >= this.cols - ? this.cols - 1 - : x < 0 ? 0 : x; -}; - - -/** - * Erase in the identified line everything from "x" to the end of the line (right). - * @param {number} x The column from which to start erasing to the end of the line. - * @param {number} y The line in which to operate. - */ -Terminal.prototype.eraseRight = function(x, y) { - var line = this.lines[this.ybase + y] - , ch = [this.eraseAttr(), ' ', 1]; // xterm - - - for (; x < this.cols; x++) { - line[x] = ch; - } - - this.updateRange(y); -}; - - - -/** - * Erase in the identified line everything from "x" to the start of the line (left). - * @param {number} x The column from which to start erasing to the start of the line. - * @param {number} y The line in which to operate. - */ -Terminal.prototype.eraseLeft = function(x, y) { - var line = this.lines[this.ybase + y] - , ch = [this.eraseAttr(), ' ', 1]; // xterm - - x++; - while (x--) line[x] = ch; - - this.updateRange(y); -}; - -/** - * Clears the entire buffer, making the prompt line the new first line. - */ -Terminal.prototype.clear = function() { - if (this.ybase === 0 && this.y === 0) { - // Don't clear if it's already clear - return; - } - this.lines = [this.lines[this.ybase + this.y]]; - this.ydisp = 0; - this.ybase = 0; - this.y = 0; - for (var i = 1; i < this.rows; i++) { - this.lines.push(this.blankLine()); - } - this.refresh(0, this.rows - 1); - this.emit('scroll', this.ydisp); -}; - -/** - * Erase all content in the given line - * @param {number} y The line to erase all of its contents. - */ -Terminal.prototype.eraseLine = function(y) { - this.eraseRight(0, y); -}; - - -/** - * Return the data array of a blank line/ - * @param {number} cur First bunch of data for each "blank" character. - */ -Terminal.prototype.blankLine = function(cur) { - var attr = cur - ? this.eraseAttr() - : this.defAttr; - - var ch = [attr, ' ', 1] // width defaults to 1 halfwidth character - , line = [] - , i = 0; - - for (; i < this.cols; i++) { - line[i] = ch; - } - - return line; -}; - - -/** - * If cur return the back color xterm feature attribute. Else return defAttr. - * @param {object} cur - */ -Terminal.prototype.ch = function(cur) { - return cur - ? [this.eraseAttr(), ' ', 1] - : [this.defAttr, ' ', 1]; -}; - - -/** - * Evaluate if the current erminal is the given argument. - * @param {object} term The terminal to evaluate - */ -Terminal.prototype.is = function(term) { - var name = this.termName; - return (name + '').indexOf(term) === 0; -}; - - -/** - * Emit the 'data' event and populate the given data. - * @param {string} data The data to populate in the event. - */ -Terminal.prototype.handler = function(data) { - this.emit('data', data); -}; - - -/** - * Emit the 'title' event and populate the given title. - * @param {string} title The title to populate in the event. - */ -Terminal.prototype.handleTitle = function(title) { - this.emit('title', title); -}; - - -/** - * ESC - */ - -/** - * ESC D Index (IND is 0x84). - */ -Terminal.prototype.index = function() { - this.y++; - if (this.y > this.scrollBottom) { - this.y--; - this.scroll(); - } - this.state = normal; -}; - - -/** - * ESC M Reverse Index (RI is 0x8d). - */ -Terminal.prototype.reverseIndex = function() { - var j; - this.y--; - if (this.y < this.scrollTop) { - this.y++; - // possibly move the code below to term.reverseScroll(); - // test: echo -ne '\e[1;1H\e[44m\eM\e[0m' - // blankLine(true) is xterm/linux behavior - this.lines.splice(this.y + this.ybase, 0, this.blankLine(true)); - j = this.rows - 1 - this.scrollBottom; - this.lines.splice(this.rows - 1 + this.ybase - j + 1, 1); - // this.maxRange(); - this.updateRange(this.scrollTop); - this.updateRange(this.scrollBottom); - } - this.state = normal; -}; - - -/** - * ESC c Full Reset (RIS). - */ -Terminal.prototype.reset = function() { - this.options.rows = this.rows; - this.options.cols = this.cols; - var customKeydownHandler = this.customKeydownHandler; - Terminal.call(this, this.options); - this.customKeydownHandler = customKeydownHandler; - this.refresh(0, this.rows - 1); - this.viewport.syncScrollArea(); -}; - - -/** - * ESC H Tab Set (HTS is 0x88). - */ -Terminal.prototype.tabSet = function() { - this.tabs[this.x] = true; - this.state = normal; -}; - - -/** - * CSI - */ - -/** - * CSI Ps A - * Cursor Up Ps Times (default = 1) (CUU). - */ -Terminal.prototype.cursorUp = function(params) { - var param = params[0]; - if (param < 1) param = 1; - this.y -= param; - if (this.y < 0) this.y = 0; -}; - - -/** - * CSI Ps B - * Cursor Down Ps Times (default = 1) (CUD). - */ -Terminal.prototype.cursorDown = function(params) { - var param = params[0]; - if (param < 1) param = 1; - this.y += param; - if (this.y >= this.rows) { - this.y = this.rows - 1; - } -}; - - -/** - * CSI Ps C - * Cursor Forward Ps Times (default = 1) (CUF). - */ -Terminal.prototype.cursorForward = function(params) { - var param = params[0]; - if (param < 1) param = 1; - this.x += param; - if (this.x >= this.cols) { - this.x = this.cols - 1; - } -}; - - -/** - * CSI Ps D - * Cursor Backward Ps Times (default = 1) (CUB). - */ -Terminal.prototype.cursorBackward = function(params) { - var param = params[0]; - if (param < 1) param = 1; - this.x -= param; - if (this.x < 0) this.x = 0; -}; - - -/** - * CSI Ps ; Ps H - * Cursor Position [row;column] (default = [1,1]) (CUP). - */ -Terminal.prototype.cursorPos = function(params) { - var row, col; - - row = params[0] - 1; - - if (params.length >= 2) { - col = params[1] - 1; - } else { - col = 0; - } - - if (row < 0) { - row = 0; - } else if (row >= this.rows) { - row = this.rows - 1; - } - - if (col < 0) { - col = 0; - } else if (col >= this.cols) { - col = this.cols - 1; - } - - this.x = col; - this.y = row; -}; - - -/** - * CSI Ps J Erase in Display (ED). - * Ps = 0 -> Erase Below (default). - * Ps = 1 -> Erase Above. - * Ps = 2 -> Erase All. - * Ps = 3 -> Erase Saved Lines (xterm). - * CSI ? Ps J - * Erase in Display (DECSED). - * Ps = 0 -> Selective Erase Below (default). - * Ps = 1 -> Selective Erase Above. - * Ps = 2 -> Selective Erase All. - */ -Terminal.prototype.eraseInDisplay = function(params) { - var j; - switch (params[0]) { - case 0: - this.eraseRight(this.x, this.y); - j = this.y + 1; - for (; j < this.rows; j++) { - this.eraseLine(j); - } - break; - case 1: - this.eraseLeft(this.x, this.y); - j = this.y; - while (j--) { - this.eraseLine(j); - } - break; - case 2: - j = this.rows; - while (j--) this.eraseLine(j); - break; - case 3: - ; // no saved lines - break; - } -}; - - -/** - * CSI Ps K Erase in Line (EL). - * Ps = 0 -> Erase to Right (default). - * Ps = 1 -> Erase to Left. - * Ps = 2 -> Erase All. - * CSI ? Ps K - * Erase in Line (DECSEL). - * Ps = 0 -> Selective Erase to Right (default). - * Ps = 1 -> Selective Erase to Left. - * Ps = 2 -> Selective Erase All. - */ -Terminal.prototype.eraseInLine = function(params) { - switch (params[0]) { - case 0: - this.eraseRight(this.x, this.y); - break; - case 1: - this.eraseLeft(this.x, this.y); - break; - case 2: - this.eraseLine(this.y); - break; - } -}; - - -/** - * CSI Pm m Character Attributes (SGR). - * Ps = 0 -> Normal (default). - * Ps = 1 -> Bold. - * Ps = 4 -> Underlined. - * Ps = 5 -> Blink (appears as Bold). - * Ps = 7 -> Inverse. - * Ps = 8 -> Invisible, i.e., hidden (VT300). - * Ps = 2 2 -> Normal (neither bold nor faint). - * Ps = 2 4 -> Not underlined. - * Ps = 2 5 -> Steady (not blinking). - * Ps = 2 7 -> Positive (not inverse). - * Ps = 2 8 -> Visible, i.e., not hidden (VT300). - * Ps = 3 0 -> Set foreground color to Black. - * Ps = 3 1 -> Set foreground color to Red. - * Ps = 3 2 -> Set foreground color to Green. - * Ps = 3 3 -> Set foreground color to Yellow. - * Ps = 3 4 -> Set foreground color to Blue. - * Ps = 3 5 -> Set foreground color to Magenta. - * Ps = 3 6 -> Set foreground color to Cyan. - * Ps = 3 7 -> Set foreground color to White. - * Ps = 3 9 -> Set foreground color to default (original). - * Ps = 4 0 -> Set background color to Black. - * Ps = 4 1 -> Set background color to Red. - * Ps = 4 2 -> Set background color to Green. - * Ps = 4 3 -> Set background color to Yellow. - * Ps = 4 4 -> Set background color to Blue. - * Ps = 4 5 -> Set background color to Magenta. - * Ps = 4 6 -> Set background color to Cyan. - * Ps = 4 7 -> Set background color to White. - * Ps = 4 9 -> Set background color to default (original). - * - * If 16-color support is compiled, the following apply. Assume - * that xterm's resources are set so that the ISO color codes are - * the first 8 of a set of 16. Then the aixterm colors are the - * bright versions of the ISO colors: - * Ps = 9 0 -> Set foreground color to Black. - * Ps = 9 1 -> Set foreground color to Red. - * Ps = 9 2 -> Set foreground color to Green. - * Ps = 9 3 -> Set foreground color to Yellow. - * Ps = 9 4 -> Set foreground color to Blue. - * Ps = 9 5 -> Set foreground color to Magenta. - * Ps = 9 6 -> Set foreground color to Cyan. - * Ps = 9 7 -> Set foreground color to White. - * Ps = 1 0 0 -> Set background color to Black. - * Ps = 1 0 1 -> Set background color to Red. - * Ps = 1 0 2 -> Set background color to Green. - * Ps = 1 0 3 -> Set background color to Yellow. - * Ps = 1 0 4 -> Set background color to Blue. - * Ps = 1 0 5 -> Set background color to Magenta. - * Ps = 1 0 6 -> Set background color to Cyan. - * Ps = 1 0 7 -> Set background color to White. - * - * If xterm is compiled with the 16-color support disabled, it - * supports the following, from rxvt: - * Ps = 1 0 0 -> Set foreground and background color to - * default. - * - * If 88- or 256-color support is compiled, the following apply. - * Ps = 3 8 ; 5 ; Ps -> Set foreground color to the second - * Ps. - * Ps = 4 8 ; 5 ; Ps -> Set background color to the second - * Ps. - */ -Terminal.prototype.charAttributes = function(params) { - // Optimize a single SGR0. - if (params.length === 1 && params[0] === 0) { - this.curAttr = this.defAttr; - return; - } - - var l = params.length - , i = 0 - , flags = this.curAttr >> 18 - , fg = (this.curAttr >> 9) & 0x1ff - , bg = this.curAttr & 0x1ff - , p; - - for (; i < l; i++) { - p = params[i]; - if (p >= 30 && p <= 37) { - // fg color 8 - fg = p - 30; - } else if (p >= 40 && p <= 47) { - // bg color 8 - bg = p - 40; - } else if (p >= 90 && p <= 97) { - // fg color 16 - p += 8; - fg = p - 90; - } else if (p >= 100 && p <= 107) { - // bg color 16 - p += 8; - bg = p - 100; - } else if (p === 0) { - // default - flags = this.defAttr >> 18; - fg = (this.defAttr >> 9) & 0x1ff; - bg = this.defAttr & 0x1ff; - // flags = 0; - // fg = 0x1ff; - // bg = 0x1ff; - } else if (p === 1) { - // bold text - flags |= 1; - } else if (p === 4) { - // underlined text - flags |= 2; - } else if (p === 5) { - // blink - flags |= 4; - } else if (p === 7) { - // inverse and positive - // test with: echo -e '\e[31m\e[42mhello\e[7mworld\e[27mhi\e[m' - flags |= 8; - } else if (p === 8) { - // invisible - flags |= 16; - } else if (p === 22) { - // not bold - flags &= ~1; - } else if (p === 24) { - // not underlined - flags &= ~2; - } else if (p === 25) { - // not blink - flags &= ~4; - } else if (p === 27) { - // not inverse - flags &= ~8; - } else if (p === 28) { - // not invisible - flags &= ~16; - } else if (p === 39) { - // reset fg - fg = (this.defAttr >> 9) & 0x1ff; - } else if (p === 49) { - // reset bg - bg = this.defAttr & 0x1ff; - } else if (p === 38) { - // fg color 256 - if (params[i + 1] === 2) { - i += 2; - fg = matchColor( - params[i] & 0xff, - params[i + 1] & 0xff, - params[i + 2] & 0xff); - if (fg === -1) fg = 0x1ff; - i += 2; - } else if (params[i + 1] === 5) { - i += 2; - p = params[i] & 0xff; - fg = p; - } - } else if (p === 48) { - // bg color 256 - if (params[i + 1] === 2) { - i += 2; - bg = matchColor( - params[i] & 0xff, - params[i + 1] & 0xff, - params[i + 2] & 0xff); - if (bg === -1) bg = 0x1ff; - i += 2; - } else if (params[i + 1] === 5) { - i += 2; - p = params[i] & 0xff; - bg = p; - } - } else if (p === 100) { - // reset fg/bg - fg = (this.defAttr >> 9) & 0x1ff; - bg = this.defAttr & 0x1ff; - } else { - this.error('Unknown SGR attribute: %d.', p); - } - } - - this.curAttr = (flags << 18) | (fg << 9) | bg; -}; - - -/** - * CSI Ps n Device Status Report (DSR). - * Ps = 5 -> Status Report. Result (``OK'') is - * CSI 0 n - * Ps = 6 -> Report Cursor Position (CPR) [row;column]. - * Result is - * CSI r ; c R - * CSI ? Ps n - * Device Status Report (DSR, DEC-specific). - * Ps = 6 -> Report Cursor Position (CPR) [row;column] as CSI - * ? r ; c R (assumes page is zero). - * Ps = 1 5 -> Report Printer status as CSI ? 1 0 n (ready). - * or CSI ? 1 1 n (not ready). - * Ps = 2 5 -> Report UDK status as CSI ? 2 0 n (unlocked) - * or CSI ? 2 1 n (locked). - * Ps = 2 6 -> Report Keyboard status as - * CSI ? 2 7 ; 1 ; 0 ; 0 n (North American). - * The last two parameters apply to VT400 & up, and denote key- - * board ready and LK01 respectively. - * Ps = 5 3 -> Report Locator status as - * CSI ? 5 3 n Locator available, if compiled-in, or - * CSI ? 5 0 n No Locator, if not. - */ -Terminal.prototype.deviceStatus = function(params) { - if (!this.prefix) { - switch (params[0]) { - case 5: - // status report - this.send('\x1b[0n'); - break; - case 6: - // cursor position - this.send('\x1b[' - + (this.y + 1) - + ';' - + (this.x + 1) - + 'R'); - break; - } - } else if (this.prefix === '?') { - // modern xterm doesnt seem to - // respond to any of these except ?6, 6, and 5 - switch (params[0]) { - case 6: - // cursor position - this.send('\x1b[?' - + (this.y + 1) - + ';' - + (this.x + 1) - + 'R'); - break; - case 15: - // no printer - // this.send('\x1b[?11n'); - break; - case 25: - // dont support user defined keys - // this.send('\x1b[?21n'); - break; - case 26: - // north american keyboard - // this.send('\x1b[?27;1;0;0n'); - break; - case 53: - // no dec locator/mouse - // this.send('\x1b[?50n'); - break; - } - } -}; - - -/** - * Additions - */ - -/** - * CSI Ps @ - * Insert Ps (Blank) Character(s) (default = 1) (ICH). - */ -Terminal.prototype.insertChars = function(params) { - var param, row, j, ch; - - param = params[0]; - if (param < 1) param = 1; - - row = this.y + this.ybase; - j = this.x; - ch = [this.eraseAttr(), ' ', 1]; // xterm - - while (param-- && j < this.cols) { - this.lines[row].splice(j++, 0, ch); - this.lines[row].pop(); - } -}; - -/** - * CSI Ps E - * Cursor Next Line Ps Times (default = 1) (CNL). - * same as CSI Ps B ? - */ -Terminal.prototype.cursorNextLine = function(params) { - var param = params[0]; - if (param < 1) param = 1; - this.y += param; - if (this.y >= this.rows) { - this.y = this.rows - 1; - } - this.x = 0; -}; - - -/** - * CSI Ps F - * Cursor Preceding Line Ps Times (default = 1) (CNL). - * reuse CSI Ps A ? - */ -Terminal.prototype.cursorPrecedingLine = function(params) { - var param = params[0]; - if (param < 1) param = 1; - this.y -= param; - if (this.y < 0) this.y = 0; - this.x = 0; -}; - - -/** - * CSI Ps G - * Cursor Character Absolute [column] (default = [row,1]) (CHA). - */ -Terminal.prototype.cursorCharAbsolute = function(params) { - var param = params[0]; - if (param < 1) param = 1; - this.x = param - 1; -}; - - -/** - * CSI Ps L - * Insert Ps Line(s) (default = 1) (IL). - */ -Terminal.prototype.insertLines = function(params) { - var param, row, j; - - param = params[0]; - if (param < 1) param = 1; - row = this.y + this.ybase; - - j = this.rows - 1 - this.scrollBottom; - j = this.rows - 1 + this.ybase - j + 1; - - while (param--) { - // test: echo -e '\e[44m\e[1L\e[0m' - // blankLine(true) - xterm/linux behavior - this.lines.splice(row, 0, this.blankLine(true)); - this.lines.splice(j, 1); - } - - // this.maxRange(); - this.updateRange(this.y); - this.updateRange(this.scrollBottom); -}; - - -/** - * CSI Ps M - * Delete Ps Line(s) (default = 1) (DL). - */ -Terminal.prototype.deleteLines = function(params) { - var param, row, j; - - param = params[0]; - if (param < 1) param = 1; - row = this.y + this.ybase; - - j = this.rows - 1 - this.scrollBottom; - j = this.rows - 1 + this.ybase - j; - - while (param--) { - // test: echo -e '\e[44m\e[1M\e[0m' - // blankLine(true) - xterm/linux behavior - this.lines.splice(j + 1, 0, this.blankLine(true)); - this.lines.splice(row, 1); - } - - // this.maxRange(); - this.updateRange(this.y); - this.updateRange(this.scrollBottom); -}; - - -/** - * CSI Ps P - * Delete Ps Character(s) (default = 1) (DCH). - */ -Terminal.prototype.deleteChars = function(params) { - var param, row, ch; - - param = params[0]; - if (param < 1) param = 1; - - row = this.y + this.ybase; - ch = [this.eraseAttr(), ' ', 1]; // xterm - - while (param--) { - this.lines[row].splice(this.x, 1); - this.lines[row].push(ch); - } -}; - -/** - * CSI Ps X - * Erase Ps Character(s) (default = 1) (ECH). - */ -Terminal.prototype.eraseChars = function(params) { - var param, row, j, ch; - - param = params[0]; - if (param < 1) param = 1; - - row = this.y + this.ybase; - j = this.x; - ch = [this.eraseAttr(), ' ', 1]; // xterm - - while (param-- && j < this.cols) { - this.lines[row][j++] = ch; - } -}; - -/** - * CSI Pm ` Character Position Absolute - * [column] (default = [row,1]) (HPA). - */ -Terminal.prototype.charPosAbsolute = function(params) { - var param = params[0]; - if (param < 1) param = 1; - this.x = param - 1; - if (this.x >= this.cols) { - this.x = this.cols - 1; - } -}; - - -/** - * 141 61 a * HPR - - * Horizontal Position Relative - * reuse CSI Ps C ? - */ -Terminal.prototype.HPositionRelative = function(params) { - var param = params[0]; - if (param < 1) param = 1; - this.x += param; - if (this.x >= this.cols) { - this.x = this.cols - 1; - } -}; - - -/** - * CSI Ps c Send Device Attributes (Primary DA). - * Ps = 0 or omitted -> request attributes from terminal. The - * response depends on the decTerminalID resource setting. - * -> CSI ? 1 ; 2 c (``VT100 with Advanced Video Option'') - * -> CSI ? 1 ; 0 c (``VT101 with No Options'') - * -> CSI ? 6 c (``VT102'') - * -> CSI ? 6 0 ; 1 ; 2 ; 6 ; 8 ; 9 ; 1 5 ; c (``VT220'') - * The VT100-style response parameters do not mean anything by - * themselves. VT220 parameters do, telling the host what fea- - * tures the terminal supports: - * Ps = 1 -> 132-columns. - * Ps = 2 -> Printer. - * Ps = 6 -> Selective erase. - * Ps = 8 -> User-defined keys. - * Ps = 9 -> National replacement character sets. - * Ps = 1 5 -> Technical characters. - * Ps = 2 2 -> ANSI color, e.g., VT525. - * Ps = 2 9 -> ANSI text locator (i.e., DEC Locator mode). - * CSI > Ps c - * Send Device Attributes (Secondary DA). - * Ps = 0 or omitted -> request the terminal's identification - * code. The response depends on the decTerminalID resource set- - * ting. It should apply only to VT220 and up, but xterm extends - * this to VT100. - * -> CSI > Pp ; Pv ; Pc c - * where Pp denotes the terminal type - * Pp = 0 -> ``VT100''. - * Pp = 1 -> ``VT220''. - * and Pv is the firmware version (for xterm, this was originally - * the XFree86 patch number, starting with 95). In a DEC termi- - * nal, Pc indicates the ROM cartridge registration number and is - * always zero. - * More information: - * xterm/charproc.c - line 2012, for more information. - * vim responds with ^[[?0c or ^[[?1c after the terminal's response (?) - */ -Terminal.prototype.sendDeviceAttributes = function(params) { - if (params[0] > 0) return; - - if (!this.prefix) { - if (this.is('xterm') - || this.is('rxvt-unicode') - || this.is('screen')) { - this.send('\x1b[?1;2c'); - } else if (this.is('linux')) { - this.send('\x1b[?6c'); - } - } else if (this.prefix === '>') { - // xterm and urxvt - // seem to spit this - // out around ~370 times (?). - if (this.is('xterm')) { - this.send('\x1b[>0;276;0c'); - } else if (this.is('rxvt-unicode')) { - this.send('\x1b[>85;95;0c'); - } else if (this.is('linux')) { - // not supported by linux console. - // linux console echoes parameters. - this.send(params[0] + 'c'); - } else if (this.is('screen')) { - this.send('\x1b[>83;40003;0c'); - } - } -}; - - -/** - * CSI Pm d - * Line Position Absolute [row] (default = [1,column]) (VPA). - */ -Terminal.prototype.linePosAbsolute = function(params) { - var param = params[0]; - if (param < 1) param = 1; - this.y = param - 1; - if (this.y >= this.rows) { - this.y = this.rows - 1; - } -}; - - -/** - * 145 65 e * VPR - Vertical Position Relative - * reuse CSI Ps B ? - */ -Terminal.prototype.VPositionRelative = function(params) { - var param = params[0]; - if (param < 1) param = 1; - this.y += param; - if (this.y >= this.rows) { - this.y = this.rows - 1; - } -}; - - -/** - * CSI Ps ; Ps f - * Horizontal and Vertical Position [row;column] (default = - * [1,1]) (HVP). - */ -Terminal.prototype.HVPosition = function(params) { - if (params[0] < 1) params[0] = 1; - if (params[1] < 1) params[1] = 1; - - this.y = params[0] - 1; - if (this.y >= this.rows) { - this.y = this.rows - 1; - } - - this.x = params[1] - 1; - if (this.x >= this.cols) { - this.x = this.cols - 1; - } -}; - - -/** - * CSI Pm h Set Mode (SM). - * Ps = 2 -> Keyboard Action Mode (AM). - * Ps = 4 -> Insert Mode (IRM). - * Ps = 1 2 -> Send/receive (SRM). - * Ps = 2 0 -> Automatic Newline (LNM). - * CSI ? Pm h - * DEC Private Mode Set (DECSET). - * Ps = 1 -> Application Cursor Keys (DECCKM). - * Ps = 2 -> Designate USASCII for character sets G0-G3 - * (DECANM), and set VT100 mode. - * Ps = 3 -> 132 Column Mode (DECCOLM). - * Ps = 4 -> Smooth (Slow) Scroll (DECSCLM). - * Ps = 5 -> Reverse Video (DECSCNM). - * Ps = 6 -> Origin Mode (DECOM). - * Ps = 7 -> Wraparound Mode (DECAWM). - * Ps = 8 -> Auto-repeat Keys (DECARM). - * Ps = 9 -> Send Mouse X & Y on button press. See the sec- - * tion Mouse Tracking. - * Ps = 1 0 -> Show toolbar (rxvt). - * Ps = 1 2 -> Start Blinking Cursor (att610). - * Ps = 1 8 -> Print form feed (DECPFF). - * Ps = 1 9 -> Set print extent to full screen (DECPEX). - * Ps = 2 5 -> Show Cursor (DECTCEM). - * Ps = 3 0 -> Show scrollbar (rxvt). - * Ps = 3 5 -> Enable font-shifting functions (rxvt). - * Ps = 3 8 -> Enter Tektronix Mode (DECTEK). - * Ps = 4 0 -> Allow 80 -> 132 Mode. - * Ps = 4 1 -> more(1) fix (see curses resource). - * Ps = 4 2 -> Enable Nation Replacement Character sets (DECN- - * RCM). - * Ps = 4 4 -> Turn On Margin Bell. - * Ps = 4 5 -> Reverse-wraparound Mode. - * Ps = 4 6 -> Start Logging. This is normally disabled by a - * compile-time option. - * Ps = 4 7 -> Use Alternate Screen Buffer. (This may be dis- - * abled by the titeInhibit resource). - * Ps = 6 6 -> Application keypad (DECNKM). - * Ps = 6 7 -> Backarrow key sends backspace (DECBKM). - * Ps = 1 0 0 0 -> Send Mouse X & Y on button press and - * release. See the section Mouse Tracking. - * Ps = 1 0 0 1 -> Use Hilite Mouse Tracking. - * Ps = 1 0 0 2 -> Use Cell Motion Mouse Tracking. - * Ps = 1 0 0 3 -> Use All Motion Mouse Tracking. - * Ps = 1 0 0 4 -> Send FocusIn/FocusOut events. - * Ps = 1 0 0 5 -> Enable Extended Mouse Mode. - * Ps = 1 0 1 0 -> Scroll to bottom on tty output (rxvt). - * Ps = 1 0 1 1 -> Scroll to bottom on key press (rxvt). - * Ps = 1 0 3 4 -> Interpret "meta" key, sets eighth bit. - * (enables the eightBitInput resource). - * Ps = 1 0 3 5 -> Enable special modifiers for Alt and Num- - * Lock keys. (This enables the numLock resource). - * Ps = 1 0 3 6 -> Send ESC when Meta modifies a key. (This - * enables the metaSendsEscape resource). - * Ps = 1 0 3 7 -> Send DEL from the editing-keypad Delete - * key. - * Ps = 1 0 3 9 -> Send ESC when Alt modifies a key. (This - * enables the altSendsEscape resource). - * Ps = 1 0 4 0 -> Keep selection even if not highlighted. - * (This enables the keepSelection resource). - * Ps = 1 0 4 1 -> Use the CLIPBOARD selection. (This enables - * the selectToClipboard resource). - * Ps = 1 0 4 2 -> Enable Urgency window manager hint when - * Control-G is received. (This enables the bellIsUrgent - * resource). - * Ps = 1 0 4 3 -> Enable raising of the window when Control-G - * is received. (enables the popOnBell resource). - * Ps = 1 0 4 7 -> Use Alternate Screen Buffer. (This may be - * disabled by the titeInhibit resource). - * Ps = 1 0 4 8 -> Save cursor as in DECSC. (This may be dis- - * abled by the titeInhibit resource). - * Ps = 1 0 4 9 -> Save cursor as in DECSC and use Alternate - * Screen Buffer, clearing it first. (This may be disabled by - * the titeInhibit resource). This combines the effects of the 1 - * 0 4 7 and 1 0 4 8 modes. Use this with terminfo-based - * applications rather than the 4 7 mode. - * Ps = 1 0 5 0 -> Set terminfo/termcap function-key mode. - * Ps = 1 0 5 1 -> Set Sun function-key mode. - * Ps = 1 0 5 2 -> Set HP function-key mode. - * Ps = 1 0 5 3 -> Set SCO function-key mode. - * Ps = 1 0 6 0 -> Set legacy keyboard emulation (X11R6). - * Ps = 1 0 6 1 -> Set VT220 keyboard emulation. - * Ps = 2 0 0 4 -> Set bracketed paste mode. - * Modes: - * http: *vt100.net/docs/vt220-rm/chapter4.html - */ -Terminal.prototype.setMode = function(params) { - if (typeof params === 'object') { - var l = params.length - , i = 0; - - for (; i < l; i++) { - this.setMode(params[i]); - } - - return; - } - - if (!this.prefix) { - switch (params) { - case 4: - this.insertMode = true; - break; - case 20: - //this.convertEol = true; - break; - } - } else if (this.prefix === '?') { - switch (params) { - case 1: - this.applicationCursor = true; - break; - case 2: - this.setgCharset(0, Terminal.charsets.US); - this.setgCharset(1, Terminal.charsets.US); - this.setgCharset(2, Terminal.charsets.US); - this.setgCharset(3, Terminal.charsets.US); - // set VT100 mode here - break; - case 3: // 132 col mode - this.savedCols = this.cols; - this.resize(132, this.rows); - break; - case 6: - this.originMode = true; - break; - case 7: - this.wraparoundMode = true; - break; - case 12: - // this.cursorBlink = true; - break; - case 66: - this.log('Serial port requested application keypad.'); - this.applicationKeypad = true; - this.viewport.syncScrollArea(); - break; - case 9: // X10 Mouse - // no release, no motion, no wheel, no modifiers. - case 1000: // vt200 mouse - // no motion. - // no modifiers, except control on the wheel. - case 1002: // button event mouse - case 1003: // any event mouse - // any event - sends motion events, - // even if there is no button held down. - this.x10Mouse = params === 9; - this.vt200Mouse = params === 1000; - this.normalMouse = params > 1000; - this.mouseEvents = true; - this.element.style.cursor = 'default'; - this.log('Binding to mouse events.'); - break; - case 1004: // send focusin/focusout events - // focusin: ^[[I - // focusout: ^[[O - this.sendFocus = true; - break; - case 1005: // utf8 ext mode mouse - this.utfMouse = true; - // for wide terminals - // simply encodes large values as utf8 characters - break; - case 1006: // sgr ext mode mouse - this.sgrMouse = true; - // for wide terminals - // does not add 32 to fields - // press: ^[[<b;x;yM - // release: ^[[<b;x;ym - break; - case 1015: // urxvt ext mode mouse - this.urxvtMouse = true; - // for wide terminals - // numbers for fields - // press: ^[[b;x;yM - // motion: ^[[b;x;yT - break; - case 25: // show cursor - this.cursorHidden = false; - break; - case 1049: // alt screen buffer cursor - //this.saveCursor(); - ; // FALL-THROUGH - case 47: // alt screen buffer - case 1047: // alt screen buffer - if (!this.normal) { - var normal = { - lines: this.lines, - ybase: this.ybase, - ydisp: this.ydisp, - x: this.x, - y: this.y, - scrollTop: this.scrollTop, - scrollBottom: this.scrollBottom, - tabs: this.tabs - // XXX save charset(s) here? - // charset: this.charset, - // glevel: this.glevel, - // charsets: this.charsets - }; - this.reset(); - this.normal = normal; - this.showCursor(); - } - break; - } - } -}; - -/** - * CSI Pm l Reset Mode (RM). - * Ps = 2 -> Keyboard Action Mode (AM). - * Ps = 4 -> Replace Mode (IRM). - * Ps = 1 2 -> Send/receive (SRM). - * Ps = 2 0 -> Normal Linefeed (LNM). - * CSI ? Pm l - * DEC Private Mode Reset (DECRST). - * Ps = 1 -> Normal Cursor Keys (DECCKM). - * Ps = 2 -> Designate VT52 mode (DECANM). - * Ps = 3 -> 80 Column Mode (DECCOLM). - * Ps = 4 -> Jump (Fast) Scroll (DECSCLM). - * Ps = 5 -> Normal Video (DECSCNM). - * Ps = 6 -> Normal Cursor Mode (DECOM). - * Ps = 7 -> No Wraparound Mode (DECAWM). - * Ps = 8 -> No Auto-repeat Keys (DECARM). - * Ps = 9 -> Don't send Mouse X & Y on button press. - * Ps = 1 0 -> Hide toolbar (rxvt). - * Ps = 1 2 -> Stop Blinking Cursor (att610). - * Ps = 1 8 -> Don't print form feed (DECPFF). - * Ps = 1 9 -> Limit print to scrolling region (DECPEX). - * Ps = 2 5 -> Hide Cursor (DECTCEM). - * Ps = 3 0 -> Don't show scrollbar (rxvt). - * Ps = 3 5 -> Disable font-shifting functions (rxvt). - * Ps = 4 0 -> Disallow 80 -> 132 Mode. - * Ps = 4 1 -> No more(1) fix (see curses resource). - * Ps = 4 2 -> Disable Nation Replacement Character sets (DEC- - * NRCM). - * Ps = 4 4 -> Turn Off Margin Bell. - * Ps = 4 5 -> No Reverse-wraparound Mode. - * Ps = 4 6 -> Stop Logging. (This is normally disabled by a - * compile-time option). - * Ps = 4 7 -> Use Normal Screen Buffer. - * Ps = 6 6 -> Numeric keypad (DECNKM). - * Ps = 6 7 -> Backarrow key sends delete (DECBKM). - * Ps = 1 0 0 0 -> Don't send Mouse X & Y on button press and - * release. See the section Mouse Tracking. - * Ps = 1 0 0 1 -> Don't use Hilite Mouse Tracking. - * Ps = 1 0 0 2 -> Don't use Cell Motion Mouse Tracking. - * Ps = 1 0 0 3 -> Don't use All Motion Mouse Tracking. - * Ps = 1 0 0 4 -> Don't send FocusIn/FocusOut events. - * Ps = 1 0 0 5 -> Disable Extended Mouse Mode. - * Ps = 1 0 1 0 -> Don't scroll to bottom on tty output - * (rxvt). - * Ps = 1 0 1 1 -> Don't scroll to bottom on key press (rxvt). - * Ps = 1 0 3 4 -> Don't interpret "meta" key. (This disables - * the eightBitInput resource). - * Ps = 1 0 3 5 -> Disable special modifiers for Alt and Num- - * Lock keys. (This disables the numLock resource). - * Ps = 1 0 3 6 -> Don't send ESC when Meta modifies a key. - * (This disables the metaSendsEscape resource). - * Ps = 1 0 3 7 -> Send VT220 Remove from the editing-keypad - * Delete key. - * Ps = 1 0 3 9 -> Don't send ESC when Alt modifies a key. - * (This disables the altSendsEscape resource). - * Ps = 1 0 4 0 -> Do not keep selection when not highlighted. - * (This disables the keepSelection resource). - * Ps = 1 0 4 1 -> Use the PRIMARY selection. (This disables - * the selectToClipboard resource). - * Ps = 1 0 4 2 -> Disable Urgency window manager hint when - * Control-G is received. (This disables the bellIsUrgent - * resource). - * Ps = 1 0 4 3 -> Disable raising of the window when Control- - * G is received. (This disables the popOnBell resource). - * Ps = 1 0 4 7 -> Use Normal Screen Buffer, clearing screen - * first if in the Alternate Screen. (This may be disabled by - * the titeInhibit resource). - * Ps = 1 0 4 8 -> Restore cursor as in DECRC. (This may be - * disabled by the titeInhibit resource). - * Ps = 1 0 4 9 -> Use Normal Screen Buffer and restore cursor - * as in DECRC. (This may be disabled by the titeInhibit - * resource). This combines the effects of the 1 0 4 7 and 1 0 - * 4 8 modes. Use this with terminfo-based applications rather - * than the 4 7 mode. - * Ps = 1 0 5 0 -> Reset terminfo/termcap function-key mode. - * Ps = 1 0 5 1 -> Reset Sun function-key mode. - * Ps = 1 0 5 2 -> Reset HP function-key mode. - * Ps = 1 0 5 3 -> Reset SCO function-key mode. - * Ps = 1 0 6 0 -> Reset legacy keyboard emulation (X11R6). - * Ps = 1 0 6 1 -> Reset keyboard emulation to Sun/PC style. - * Ps = 2 0 0 4 -> Reset bracketed paste mode. - */ -Terminal.prototype.resetMode = function(params) { - if (typeof params === 'object') { - var l = params.length - , i = 0; - - for (; i < l; i++) { - this.resetMode(params[i]); - } - - return; - } - - if (!this.prefix) { - switch (params) { - case 4: - this.insertMode = false; - break; - case 20: - //this.convertEol = false; - break; - } - } else if (this.prefix === '?') { - switch (params) { - case 1: - this.applicationCursor = false; - break; - case 3: - if (this.cols === 132 && this.savedCols) { - this.resize(this.savedCols, this.rows); - } - delete this.savedCols; - break; - case 6: - this.originMode = false; - break; - case 7: - this.wraparoundMode = false; - break; - case 12: - // this.cursorBlink = false; - break; - case 66: - this.log('Switching back to normal keypad.'); - this.applicationKeypad = false; - this.viewport.syncScrollArea(); - break; - case 9: // X10 Mouse - case 1000: // vt200 mouse - case 1002: // button event mouse - case 1003: // any event mouse - this.x10Mouse = false; - this.vt200Mouse = false; - this.normalMouse = false; - this.mouseEvents = false; - this.element.style.cursor = ''; - break; - case 1004: // send focusin/focusout events - this.sendFocus = false; - break; - case 1005: // utf8 ext mode mouse - this.utfMouse = false; - break; - case 1006: // sgr ext mode mouse - this.sgrMouse = false; - break; - case 1015: // urxvt ext mode mouse - this.urxvtMouse = false; - break; - case 25: // hide cursor - this.cursorHidden = true; - break; - case 1049: // alt screen buffer cursor - ; // FALL-THROUGH - case 47: // normal screen buffer - case 1047: // normal screen buffer - clearing it first - if (this.normal) { - this.lines = this.normal.lines; - this.ybase = this.normal.ybase; - this.ydisp = this.normal.ydisp; - this.x = this.normal.x; - this.y = this.normal.y; - this.scrollTop = this.normal.scrollTop; - this.scrollBottom = this.normal.scrollBottom; - this.tabs = this.normal.tabs; - this.normal = null; - // if (params === 1049) { - // this.x = this.savedX; - // this.y = this.savedY; - // } - this.refresh(0, this.rows - 1); - this.showCursor(); - } - break; - } - } -}; - - -/** - * CSI Ps ; Ps r - * Set Scrolling Region [top;bottom] (default = full size of win- - * dow) (DECSTBM). - * CSI ? Pm r - */ -Terminal.prototype.setScrollRegion = function(params) { - if (this.prefix) return; - this.scrollTop = (params[0] || 1) - 1; - this.scrollBottom = (params[1] || this.rows) - 1; - this.x = 0; - this.y = 0; -}; - - -/** - * CSI s - * Save cursor (ANSI.SYS). - */ -Terminal.prototype.saveCursor = function(params) { - this.savedX = this.x; - this.savedY = this.y; -}; - - -/** - * CSI u - * Restore cursor (ANSI.SYS). - */ -Terminal.prototype.restoreCursor = function(params) { - this.x = this.savedX || 0; - this.y = this.savedY || 0; -}; - - -/** - * Lesser Used - */ - -/** - * CSI Ps I - * Cursor Forward Tabulation Ps tab stops (default = 1) (CHT). - */ -Terminal.prototype.cursorForwardTab = function(params) { - var param = params[0] || 1; - while (param--) { - this.x = this.nextStop(); - } -}; - - -/** - * CSI Ps S Scroll up Ps lines (default = 1) (SU). - */ -Terminal.prototype.scrollUp = function(params) { - var param = params[0] || 1; - while (param--) { - this.lines.splice(this.ybase + this.scrollTop, 1); - this.lines.splice(this.ybase + this.scrollBottom, 0, this.blankLine()); - } - // this.maxRange(); - this.updateRange(this.scrollTop); - this.updateRange(this.scrollBottom); -}; - - -/** - * CSI Ps T Scroll down Ps lines (default = 1) (SD). - */ -Terminal.prototype.scrollDown = function(params) { - var param = params[0] || 1; - while (param--) { - this.lines.splice(this.ybase + this.scrollBottom, 1); - this.lines.splice(this.ybase + this.scrollTop, 0, this.blankLine()); - } - // this.maxRange(); - this.updateRange(this.scrollTop); - this.updateRange(this.scrollBottom); -}; - - -/** - * CSI Ps ; Ps ; Ps ; Ps ; Ps T - * Initiate highlight mouse tracking. Parameters are - * [func;startx;starty;firstrow;lastrow]. See the section Mouse - * Tracking. - */ -Terminal.prototype.initMouseTracking = function(params) { - // Relevant: DECSET 1001 -}; - - -/** - * CSI > Ps; Ps T - * Reset one or more features of the title modes to the default - * value. Normally, "reset" disables the feature. It is possi- - * ble to disable the ability to reset features by compiling a - * different default for the title modes into xterm. - * Ps = 0 -> Do not set window/icon labels using hexadecimal. - * Ps = 1 -> Do not query window/icon labels using hexadeci- - * mal. - * Ps = 2 -> Do not set window/icon labels using UTF-8. - * Ps = 3 -> Do not query window/icon labels using UTF-8. - * (See discussion of "Title Modes"). - */ -Terminal.prototype.resetTitleModes = function(params) { - ; -}; - - -/** - * CSI Ps Z Cursor Backward Tabulation Ps tab stops (default = 1) (CBT). - */ -Terminal.prototype.cursorBackwardTab = function(params) { - var param = params[0] || 1; - while (param--) { - this.x = this.prevStop(); - } -}; - - -/** - * CSI Ps b Repeat the preceding graphic character Ps times (REP). - */ -Terminal.prototype.repeatPrecedingCharacter = function(params) { - var param = params[0] || 1 - , line = this.lines[this.ybase + this.y] - , ch = line[this.x - 1] || [this.defAttr, ' ', 1]; - - while (param--) line[this.x++] = ch; -}; - - -/** - * CSI Ps g Tab Clear (TBC). - * Ps = 0 -> Clear Current Column (default). - * Ps = 3 -> Clear All. - * Potentially: - * Ps = 2 -> Clear Stops on Line. - * http://vt100.net/annarbor/aaa-ug/section6.html - */ -Terminal.prototype.tabClear = function(params) { - var param = params[0]; - if (param <= 0) { - delete this.tabs[this.x]; - } else if (param === 3) { - this.tabs = {}; - } -}; - - -/** - * CSI Pm i Media Copy (MC). - * Ps = 0 -> Print screen (default). - * Ps = 4 -> Turn off printer controller mode. - * Ps = 5 -> Turn on printer controller mode. - * CSI ? Pm i - * Media Copy (MC, DEC-specific). - * Ps = 1 -> Print line containing cursor. - * Ps = 4 -> Turn off autoprint mode. - * Ps = 5 -> Turn on autoprint mode. - * Ps = 1 0 -> Print composed display, ignores DECPEX. - * Ps = 1 1 -> Print all pages. - */ -Terminal.prototype.mediaCopy = function(params) { - ; -}; - - -/** - * CSI > Ps; Ps m - * Set or reset resource-values used by xterm to decide whether - * to construct escape sequences holding information about the - * modifiers pressed with a given key. The first parameter iden- - * tifies the resource to set/reset. The second parameter is the - * value to assign to the resource. If the second parameter is - * omitted, the resource is reset to its initial value. - * Ps = 1 -> modifyCursorKeys. - * Ps = 2 -> modifyFunctionKeys. - * Ps = 4 -> modifyOtherKeys. - * If no parameters are given, all resources are reset to their - * initial values. - */ -Terminal.prototype.setResources = function(params) { - ; -}; - - -/** - * CSI > Ps n - * Disable modifiers which may be enabled via the CSI > Ps; Ps m - * sequence. This corresponds to a resource value of "-1", which - * cannot be set with the other sequence. The parameter identi- - * fies the resource to be disabled: - * Ps = 1 -> modifyCursorKeys. - * Ps = 2 -> modifyFunctionKeys. - * Ps = 4 -> modifyOtherKeys. - * If the parameter is omitted, modifyFunctionKeys is disabled. - * When modifyFunctionKeys is disabled, xterm uses the modifier - * keys to make an extended sequence of functions rather than - * adding a parameter to each function key to denote the modi- - * fiers. - */ -Terminal.prototype.disableModifiers = function(params) { - ; -}; - - -/** - * CSI > Ps p - * Set resource value pointerMode. This is used by xterm to - * decide whether to hide the pointer cursor as the user types. - * Valid values for the parameter: - * Ps = 0 -> never hide the pointer. - * Ps = 1 -> hide if the mouse tracking mode is not enabled. - * Ps = 2 -> always hide the pointer. If no parameter is - * given, xterm uses the default, which is 1 . - */ -Terminal.prototype.setPointerMode = function(params) { - ; -}; - - -/** - * CSI ! p Soft terminal reset (DECSTR). - * http://vt100.net/docs/vt220-rm/table4-10.html - */ -Terminal.prototype.softReset = function(params) { - this.cursorHidden = false; - this.insertMode = false; - this.originMode = false; - this.wraparoundMode = false; // autowrap - this.applicationKeypad = false; // ? - this.viewport.syncScrollArea(); - this.applicationCursor = false; - this.scrollTop = 0; - this.scrollBottom = this.rows - 1; - this.curAttr = this.defAttr; - this.x = this.y = 0; // ? - this.charset = null; - this.glevel = 0; // ?? - this.charsets = [null]; // ?? -}; - - -/** - * CSI Ps$ p - * Request ANSI mode (DECRQM). For VT300 and up, reply is - * CSI Ps; Pm$ y - * where Ps is the mode number as in RM, and Pm is the mode - * value: - * 0 - not recognized - * 1 - set - * 2 - reset - * 3 - permanently set - * 4 - permanently reset - */ -Terminal.prototype.requestAnsiMode = function(params) { - ; -}; - - -/** - * CSI ? Ps$ p - * Request DEC private mode (DECRQM). For VT300 and up, reply is - * CSI ? Ps; Pm$ p - * where Ps is the mode number as in DECSET, Pm is the mode value - * as in the ANSI DECRQM. - */ -Terminal.prototype.requestPrivateMode = function(params) { - ; -}; - - -/** - * CSI Ps ; Ps " p - * Set conformance level (DECSCL). Valid values for the first - * parameter: - * Ps = 6 1 -> VT100. - * Ps = 6 2 -> VT200. - * Ps = 6 3 -> VT300. - * Valid values for the second parameter: - * Ps = 0 -> 8-bit controls. - * Ps = 1 -> 7-bit controls (always set for VT100). - * Ps = 2 -> 8-bit controls. - */ -Terminal.prototype.setConformanceLevel = function(params) { - ; -}; - - -/** - * CSI Ps q Load LEDs (DECLL). - * Ps = 0 -> Clear all LEDS (default). - * Ps = 1 -> Light Num Lock. - * Ps = 2 -> Light Caps Lock. - * Ps = 3 -> Light Scroll Lock. - * Ps = 2 1 -> Extinguish Num Lock. - * Ps = 2 2 -> Extinguish Caps Lock. - * Ps = 2 3 -> Extinguish Scroll Lock. - */ -Terminal.prototype.loadLEDs = function(params) { - ; -}; - - -/** - * CSI Ps SP q - * Set cursor style (DECSCUSR, VT520). - * Ps = 0 -> blinking block. - * Ps = 1 -> blinking block (default). - * Ps = 2 -> steady block. - * Ps = 3 -> blinking underline. - * Ps = 4 -> steady underline. - */ -Terminal.prototype.setCursorStyle = function(params) { - ; -}; - - -/** - * CSI Ps " q - * Select character protection attribute (DECSCA). Valid values - * for the parameter: - * Ps = 0 -> DECSED and DECSEL can erase (default). - * Ps = 1 -> DECSED and DECSEL cannot erase. - * Ps = 2 -> DECSED and DECSEL can erase. - */ -Terminal.prototype.setCharProtectionAttr = function(params) { - ; -}; - - -/** - * CSI ? Pm r - * Restore DEC Private Mode Values. The value of Ps previously - * saved is restored. Ps values are the same as for DECSET. - */ -Terminal.prototype.restorePrivateValues = function(params) { - ; -}; - - -/** - * CSI Pt; Pl; Pb; Pr; Ps$ r - * Change Attributes in Rectangular Area (DECCARA), VT400 and up. - * Pt; Pl; Pb; Pr denotes the rectangle. - * Ps denotes the SGR attributes to change: 0, 1, 4, 5, 7. - * NOTE: xterm doesn't enable this code by default. - */ -Terminal.prototype.setAttrInRectangle = function(params) { - var t = params[0] - , l = params[1] - , b = params[2] - , r = params[3] - , attr = params[4]; - - var line - , i; - - for (; t < b + 1; t++) { - line = this.lines[this.ybase + t]; - for (i = l; i < r; i++) { - line[i] = [attr, line[i][1]]; - } - } - - // this.maxRange(); - this.updateRange(params[0]); - this.updateRange(params[2]); -}; - - -/** - * CSI Pc; Pt; Pl; Pb; Pr$ x - * Fill Rectangular Area (DECFRA), VT420 and up. - * Pc is the character to use. - * Pt; Pl; Pb; Pr denotes the rectangle. - * NOTE: xterm doesn't enable this code by default. - */ -Terminal.prototype.fillRectangle = function(params) { - var ch = params[0] - , t = params[1] - , l = params[2] - , b = params[3] - , r = params[4]; - - var line - , i; - - for (; t < b + 1; t++) { - line = this.lines[this.ybase + t]; - for (i = l; i < r; i++) { - line[i] = [line[i][0], String.fromCharCode(ch)]; - } - } - - // this.maxRange(); - this.updateRange(params[1]); - this.updateRange(params[3]); -}; - - -/** - * CSI Ps ; Pu ' z - * Enable Locator Reporting (DECELR). - * Valid values for the first parameter: - * Ps = 0 -> Locator disabled (default). - * Ps = 1 -> Locator enabled. - * Ps = 2 -> Locator enabled for one report, then disabled. - * The second parameter specifies the coordinate unit for locator - * reports. - * Valid values for the second parameter: - * Pu = 0 <- or omitted -> default to character cells. - * Pu = 1 <- device physical pixels. - * Pu = 2 <- character cells. - */ -Terminal.prototype.enableLocatorReporting = function(params) { - var val = params[0] > 0; - //this.mouseEvents = val; - //this.decLocator = val; -}; - - -/** - * CSI Pt; Pl; Pb; Pr$ z - * Erase Rectangular Area (DECERA), VT400 and up. - * Pt; Pl; Pb; Pr denotes the rectangle. - * NOTE: xterm doesn't enable this code by default. - */ -Terminal.prototype.eraseRectangle = function(params) { - var t = params[0] - , l = params[1] - , b = params[2] - , r = params[3]; - - var line - , i - , ch; - - ch = [this.eraseAttr(), ' ', 1]; // xterm? - - for (; t < b + 1; t++) { - line = this.lines[this.ybase + t]; - for (i = l; i < r; i++) { - line[i] = ch; - } - } - - // this.maxRange(); - this.updateRange(params[0]); - this.updateRange(params[2]); -}; - - -/** - * CSI P m SP } - * Insert P s Column(s) (default = 1) (DECIC), VT420 and up. - * NOTE: xterm doesn't enable this code by default. - */ -Terminal.prototype.insertColumns = function() { - var param = params[0] - , l = this.ybase + this.rows - , ch = [this.eraseAttr(), ' ', 1] // xterm? - , i; - - while (param--) { - for (i = this.ybase; i < l; i++) { - this.lines[i].splice(this.x + 1, 0, ch); - this.lines[i].pop(); - } - } - - this.maxRange(); -}; - - -/** - * CSI P m SP ~ - * Delete P s Column(s) (default = 1) (DECDC), VT420 and up - * NOTE: xterm doesn't enable this code by default. - */ -Terminal.prototype.deleteColumns = function() { - var param = params[0] - , l = this.ybase + this.rows - , ch = [this.eraseAttr(), ' ', 1] // xterm? - , i; - - while (param--) { - for (i = this.ybase; i < l; i++) { - this.lines[i].splice(this.x, 1); - this.lines[i].push(ch); - } - } - - this.maxRange(); -}; - -/** - * Character Sets - */ - -Terminal.charsets = {}; - -// DEC Special Character and Line Drawing Set. -// http://vt100.net/docs/vt102-ug/table5-13.html -// A lot of curses apps use this if they see TERM=xterm. -// testing: echo -e '\e(0a\e(B' -// The xterm output sometimes seems to conflict with the -// reference above. xterm seems in line with the reference -// when running vttest however. -// The table below now uses xterm's output from vttest. -Terminal.charsets.SCLD = { // (0 - '`': '\u25c6', // '◆' - 'a': '\u2592', // '▒' - 'b': '\u0009', // '\t' - 'c': '\u000c', // '\f' - 'd': '\u000d', // '\r' - 'e': '\u000a', // '\n' - 'f': '\u00b0', // '°' - 'g': '\u00b1', // '±' - 'h': '\u2424', // '\u2424' (NL) - 'i': '\u000b', // '\v' - 'j': '\u2518', // '┘' - 'k': '\u2510', // '┐' - 'l': '\u250c', // '┌' - 'm': '\u2514', // '└' - 'n': '\u253c', // '┼' - 'o': '\u23ba', // '⎺' - 'p': '\u23bb', // '⎻' - 'q': '\u2500', // '─' - 'r': '\u23bc', // '⎼' - 's': '\u23bd', // '⎽' - 't': '\u251c', // '├' - 'u': '\u2524', // '┤' - 'v': '\u2534', // '┴' - 'w': '\u252c', // '┬' - 'x': '\u2502', // '│' - 'y': '\u2264', // '≤' - 'z': '\u2265', // '≥' - '{': '\u03c0', // 'π' - '|': '\u2260', // '≠' - '}': '\u00a3', // '£' - '~': '\u00b7' // '·' -}; - -Terminal.charsets.UK = null; // (A -Terminal.charsets.US = null; // (B (USASCII) -Terminal.charsets.Dutch = null; // (4 -Terminal.charsets.Finnish = null; // (C or (5 -Terminal.charsets.French = null; // (R -Terminal.charsets.FrenchCanadian = null; // (Q -Terminal.charsets.German = null; // (K -Terminal.charsets.Italian = null; // (Y -Terminal.charsets.NorwegianDanish = null; // (E or (6 -Terminal.charsets.Spanish = null; // (Z -Terminal.charsets.Swedish = null; // (H or (7 -Terminal.charsets.Swiss = null; // (= -Terminal.charsets.ISOLatin = null; // /A - -/** - * Helpers - */ - -function contains(el, arr) { - for (var i = 0; i < arr.length; i += 1) { - if (el === arr[i]) { - return true; - } - } - return false; -} - -function on(el, type, handler, capture) { - if (!Array.isArray(el)) { - el = [el]; - } - el.forEach(function (element) { - element.addEventListener(type, handler, capture || false); - }); -} - -function off(el, type, handler, capture) { - el.removeEventListener(type, handler, capture || false); -} - -function cancel(ev, force) { - if (!this.cancelEvents && !force) { - return; - } - ev.preventDefault(); - ev.stopPropagation(); - return false; -} - -function inherits(child, parent) { - function f() { - this.constructor = child; - } - f.prototype = parent.prototype; - child.prototype = new f; -} - -// if bold is broken, we can't -// use it in the terminal. -function isBoldBroken(document) { - var body = document.getElementsByTagName('body')[0]; - var el = document.createElement('span'); - el.innerHTML = 'hello world'; - body.appendChild(el); - var w1 = el.scrollWidth; - el.style.fontWeight = 'bold'; - var w2 = el.scrollWidth; - body.removeChild(el); - return w1 !== w2; -} - -function indexOf(obj, el) { - var i = obj.length; - while (i--) { - if (obj[i] === el) return i; - } - return -1; -} - -function isThirdLevelShift(term, ev) { - var thirdLevelKey = - (term.isMac && ev.altKey && !ev.ctrlKey && !ev.metaKey) || - (term.isMSWindows && ev.altKey && ev.ctrlKey && !ev.metaKey); - - if (ev.type == 'keypress') { - return thirdLevelKey; - } - - // Don't invoke for arrows, pageDown, home, backspace, etc. (on non-keypress events) - return thirdLevelKey && (!ev.keyCode || ev.keyCode > 47); -} - -function matchColor(r1, g1, b1) { - var hash = (r1 << 16) | (g1 << 8) | b1; - - if (matchColor._cache[hash] != null) { - return matchColor._cache[hash]; - } - - var ldiff = Infinity - , li = -1 - , i = 0 - , c - , r2 - , g2 - , b2 - , diff; - - for (; i < Terminal.vcolors.length; i++) { - c = Terminal.vcolors[i]; - r2 = c[0]; - g2 = c[1]; - b2 = c[2]; - - diff = matchColor.distance(r1, g1, b1, r2, g2, b2); - - if (diff === 0) { - li = i; - break; - } - - if (diff < ldiff) { - ldiff = diff; - li = i; - } - } - - return matchColor._cache[hash] = li; -} - -matchColor._cache = {}; - -// http://stackoverflow.com/questions/1633828 -matchColor.distance = function(r1, g1, b1, r2, g2, b2) { - return Math.pow(30 * (r1 - r2), 2) - + Math.pow(59 * (g1 - g2), 2) - + Math.pow(11 * (b1 - b2), 2); -}; - -function each(obj, iter, con) { - if (obj.forEach) return obj.forEach(iter, con); - for (var i = 0; i < obj.length; i++) { - iter.call(con, obj[i], i, obj); - } -} - -function keys(obj) { - if (Object.keys) return Object.keys(obj); - var key, keys = []; - for (key in obj) { - if (Object.prototype.hasOwnProperty.call(obj, key)) { - keys.push(key); - } - } - return keys; -} - -var wcwidth = (function(opts) { - // extracted from https://www.cl.cam.ac.uk/%7Emgk25/ucs/wcwidth.c - // combining characters - var COMBINING = [ - [0x0300, 0x036F], [0x0483, 0x0486], [0x0488, 0x0489], - [0x0591, 0x05BD], [0x05BF, 0x05BF], [0x05C1, 0x05C2], - [0x05C4, 0x05C5], [0x05C7, 0x05C7], [0x0600, 0x0603], - [0x0610, 0x0615], [0x064B, 0x065E], [0x0670, 0x0670], - [0x06D6, 0x06E4], [0x06E7, 0x06E8], [0x06EA, 0x06ED], - [0x070F, 0x070F], [0x0711, 0x0711], [0x0730, 0x074A], - [0x07A6, 0x07B0], [0x07EB, 0x07F3], [0x0901, 0x0902], - [0x093C, 0x093C], [0x0941, 0x0948], [0x094D, 0x094D], - [0x0951, 0x0954], [0x0962, 0x0963], [0x0981, 0x0981], - [0x09BC, 0x09BC], [0x09C1, 0x09C4], [0x09CD, 0x09CD], - [0x09E2, 0x09E3], [0x0A01, 0x0A02], [0x0A3C, 0x0A3C], - [0x0A41, 0x0A42], [0x0A47, 0x0A48], [0x0A4B, 0x0A4D], - [0x0A70, 0x0A71], [0x0A81, 0x0A82], [0x0ABC, 0x0ABC], - [0x0AC1, 0x0AC5], [0x0AC7, 0x0AC8], [0x0ACD, 0x0ACD], - [0x0AE2, 0x0AE3], [0x0B01, 0x0B01], [0x0B3C, 0x0B3C], - [0x0B3F, 0x0B3F], [0x0B41, 0x0B43], [0x0B4D, 0x0B4D], - [0x0B56, 0x0B56], [0x0B82, 0x0B82], [0x0BC0, 0x0BC0], - [0x0BCD, 0x0BCD], [0x0C3E, 0x0C40], [0x0C46, 0x0C48], - [0x0C4A, 0x0C4D], [0x0C55, 0x0C56], [0x0CBC, 0x0CBC], - [0x0CBF, 0x0CBF], [0x0CC6, 0x0CC6], [0x0CCC, 0x0CCD], - [0x0CE2, 0x0CE3], [0x0D41, 0x0D43], [0x0D4D, 0x0D4D], - [0x0DCA, 0x0DCA], [0x0DD2, 0x0DD4], [0x0DD6, 0x0DD6], - [0x0E31, 0x0E31], [0x0E34, 0x0E3A], [0x0E47, 0x0E4E], - [0x0EB1, 0x0EB1], [0x0EB4, 0x0EB9], [0x0EBB, 0x0EBC], - [0x0EC8, 0x0ECD], [0x0F18, 0x0F19], [0x0F35, 0x0F35], - [0x0F37, 0x0F37], [0x0F39, 0x0F39], [0x0F71, 0x0F7E], - [0x0F80, 0x0F84], [0x0F86, 0x0F87], [0x0F90, 0x0F97], - [0x0F99, 0x0FBC], [0x0FC6, 0x0FC6], [0x102D, 0x1030], - [0x1032, 0x1032], [0x1036, 0x1037], [0x1039, 0x1039], - [0x1058, 0x1059], [0x1160, 0x11FF], [0x135F, 0x135F], - [0x1712, 0x1714], [0x1732, 0x1734], [0x1752, 0x1753], - [0x1772, 0x1773], [0x17B4, 0x17B5], [0x17B7, 0x17BD], - [0x17C6, 0x17C6], [0x17C9, 0x17D3], [0x17DD, 0x17DD], - [0x180B, 0x180D], [0x18A9, 0x18A9], [0x1920, 0x1922], - [0x1927, 0x1928], [0x1932, 0x1932], [0x1939, 0x193B], - [0x1A17, 0x1A18], [0x1B00, 0x1B03], [0x1B34, 0x1B34], - [0x1B36, 0x1B3A], [0x1B3C, 0x1B3C], [0x1B42, 0x1B42], - [0x1B6B, 0x1B73], [0x1DC0, 0x1DCA], [0x1DFE, 0x1DFF], - [0x200B, 0x200F], [0x202A, 0x202E], [0x2060, 0x2063], - [0x206A, 0x206F], [0x20D0, 0x20EF], [0x302A, 0x302F], - [0x3099, 0x309A], [0xA806, 0xA806], [0xA80B, 0xA80B], - [0xA825, 0xA826], [0xFB1E, 0xFB1E], [0xFE00, 0xFE0F], - [0xFE20, 0xFE23], [0xFEFF, 0xFEFF], [0xFFF9, 0xFFFB], - [0x10A01, 0x10A03], [0x10A05, 0x10A06], [0x10A0C, 0x10A0F], - [0x10A38, 0x10A3A], [0x10A3F, 0x10A3F], [0x1D167, 0x1D169], - [0x1D173, 0x1D182], [0x1D185, 0x1D18B], [0x1D1AA, 0x1D1AD], - [0x1D242, 0x1D244], [0xE0001, 0xE0001], [0xE0020, 0xE007F], - [0xE0100, 0xE01EF] - ]; - // binary search - function bisearch(ucs) { - var min = 0; - var max = COMBINING.length - 1; - var mid; - if (ucs < COMBINING[0][0] || ucs > COMBINING[max][1]) - return false; - while (max >= min) { - mid = Math.floor((min + max) / 2); - if (ucs > COMBINING[mid][1]) - min = mid + 1; - else if (ucs < COMBINING[mid][0]) - max = mid - 1; - else - return true; - } - return false; - } - function wcwidth(ucs) { - // test for 8-bit control characters - if (ucs === 0) - return opts.nul; - if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0)) - return opts.control; - // binary search in table of non-spacing characters - if (bisearch(ucs)) - return 0; - // if we arrive here, ucs is not a combining or C0/C1 control character - return 1 + - ( - ucs >= 0x1100 && - ( - ucs <= 0x115f || // Hangul Jamo init. consonants - ucs == 0x2329 || - ucs == 0x232a || - (ucs >= 0x2e80 && ucs <= 0xa4cf && ucs != 0x303f) || // CJK..Yi - (ucs >= 0xac00 && ucs <= 0xd7a3) || // Hangul Syllables - (ucs >= 0xf900 && ucs <= 0xfaff) || // CJK Compat Ideographs - (ucs >= 0xfe10 && ucs <= 0xfe19) || // Vertical forms - (ucs >= 0xfe30 && ucs <= 0xfe6f) || // CJK Compat Forms - (ucs >= 0xff00 && ucs <= 0xff60) || // Fullwidth Forms - (ucs >= 0xffe0 && ucs <= 0xffe6) || - (ucs >= 0x20000 && ucs <= 0x2fffd) || - (ucs >= 0x30000 && ucs <= 0x3fffd) - ) - ); - } - return wcwidth; -})({nul: 0, control: 0}); // configurable options - -/** - * Expose - */ - -Terminal.EventEmitter = EventEmitter; -Terminal.CompositionHelper = CompositionHelper; -Terminal.Viewport = Viewport; -Terminal.inherits = inherits; - -/** - * Adds an event listener to the terminal. - * - * @param {string} event The name of the event. TODO: Document all event types - * @param {function} callback The function to call when the event is triggered. - */ -Terminal.on = on; -Terminal.off = off; -Terminal.cancel = cancel; - -module.exports = Terminal;
diff --git a/third_party/WebKit/Source/platform/graphics/compositing/PropertyTreeManager.cpp b/third_party/WebKit/Source/platform/graphics/compositing/PropertyTreeManager.cpp index 59e400b..467cd6e 100644 --- a/third_party/WebKit/Source/platform/graphics/compositing/PropertyTreeManager.cpp +++ b/third_party/WebKit/Source/platform/graphics/compositing/PropertyTreeManager.cpp
@@ -78,7 +78,6 @@ // until we can remove animation subsystem dependency on layer // references. http://crbug.com/709137 transform_node.owning_layer_id = root_layer_->id(); - transform_tree.SetOwningLayerIdForNode(&transform_node, root_layer_->id()); // TODO(jaydasika): We shouldn't set ToScreen and FromScreen of root // transform node here. They should be set while updating transform tree in @@ -112,7 +111,6 @@ clip_node.clip = gfx::RectF( gfx::SizeF(root_layer_->layer_tree_host()->device_viewport_size())); clip_node.transform_id = kRealRootNodeId; - clip_tree.SetOwningLayerIdForNode(&clip_node, clip_node.owning_layer_id); clip_node_map_.Set(ClipPaintPropertyNode::Root(), clip_node.id); root_layer_->SetClipTreeIndex(clip_node.id); @@ -146,8 +144,6 @@ DCHECK_EQ(scroll_node.id, kSecondaryRootNodeId); scroll_node.owning_layer_id = root_layer_->id(); scroll_node.transform_id = kSecondaryRootNodeId; - scroll_tree.SetOwningLayerIdForNode(&scroll_node, - scroll_node.owning_layer_id); scroll_node_map_.Set(ScrollPaintPropertyNode::Root(), scroll_node.id); root_layer_->SetScrollTreeIndex(scroll_node.id); @@ -174,8 +170,6 @@ // until we can remove animation subsystem dependency on layer // references. http://crbug.com/709137 compositor_node.owning_layer_id = dummy_layer->id(); - GetTransformTree().SetOwningLayerIdForNode(&compositor_node, - compositor_node.owning_layer_id); FloatPoint3D origin = transform_node->Origin(); compositor_node.pre_local.matrix().setTranslate(-origin.X(), -origin.Y(), @@ -229,8 +223,6 @@ cc::ClipNode& compositor_node = *GetClipTree().Node(id); compositor_node.owning_layer_id = dummy_layer->id(); - GetClipTree().SetOwningLayerIdForNode(&compositor_node, - compositor_node.owning_layer_id); // TODO(jbroman): Don't discard rounded corners. compositor_node.clip = clip_node->ClipRect().Rect(); @@ -330,8 +322,6 @@ int layer_id = layer->id(); auto& compositor_scroll_node = *GetScrollTree().Node(scroll_node_id); - GetScrollTree().SetOwningLayerIdForNode(&compositor_scroll_node, layer_id); - if (!transform->IsScrollTranslation()) return;
diff --git a/third_party/WebKit/Source/platform/wtf/debug/DEPS b/third_party/WebKit/Source/platform/wtf/debug/DEPS index 2b999bc..0445c08 100644 --- a/third_party/WebKit/Source/platform/wtf/debug/DEPS +++ b/third_party/WebKit/Source/platform/wtf/debug/DEPS
@@ -3,4 +3,5 @@ # directories and files instead of writing 'base/'. "+base/debug/alias.h", "+base/debug/crash_logging.h", + "+base/debug/stack_trace.h", ]
diff --git a/third_party/WebKit/Source/platform/wtf/debug/StackTrace.h b/third_party/WebKit/Source/platform/wtf/debug/StackTrace.h new file mode 100644 index 0000000..e1c00d1 --- /dev/null +++ b/third_party/WebKit/Source/platform/wtf/debug/StackTrace.h
@@ -0,0 +1,18 @@ +// Copyright 2017 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef WTF_StackTrace_h +#define WTF_StackTrace_h + +#include "base/debug/stack_trace.h" + +namespace WTF { +namespace debug { + +using StackTrace = base::debug::StackTrace; + +} // namespace debug +} // namespace WTF + +#endif // WTF_StackTrace_h
diff --git a/third_party/gvr-android-sdk/BUILD.gn b/third_party/gvr-android-sdk/BUILD.gn index 396cf6f..37067797 100644 --- a/third_party/gvr-android-sdk/BUILD.gn +++ b/third_party/gvr-android-sdk/BUILD.gn
@@ -11,38 +11,13 @@ android_aar_prebuilt("gvr_common_java") { aar_path = "common_library.aar" - proguard_configs = [ "proguard-gvr-chromium.txt" ] + proguard_configs = [ "src/proguard-gvr.txt" ] ignore_manifest = true # Ignored because manifest merging is not supported (http://crbug.com/643967) ignore_native_libraries = true - - # Ignore unused auto generated classes. Proguard will not strip them automatically because they - # implemented an interface that is called by VrEvent. - jar_excluded_patterns = [ - "*google/common/logging/nano/Vr\$VREvent\$VrStreaming*.class", - "*google/common/logging/nano/Vr\$VREvent\$VrHome*.class", - "*google/common/logging/nano/Vr\$VREvent\$VrCore*.class", - "*google/common/logging/nano/Vr\$VREvent\$TimeSeriesData*.class", - "*google/common/logging/nano/Vr\$VREvent\$StreetView*.class", - "*google/common/logging/nano/Vr\$VREvent\$SensorStats*.class", - "*google/common/logging/nano/Vr\$VREvent\$Renderer.class", - "*google/common/logging/nano/Vr\$VREvent\$QrCodeScan.class", - "*google/common/logging/nano/Vr\$VREvent\$Photos*.class", - "*google/common/logging/nano/Vr\$VREvent\$Lullaby*.class", - "*google/common/logging/nano/Vr\$VREvent\$Launcher.class", - "*google/common/logging/nano/Vr\$VREvent\$Keyboard*.class", - "*google/common/logging/nano/Vr\$VREvent\$JumpInspector*.class", - "*google/common/logging/nano/Vr\$VREvent\$GConfigUpdate*.class", - "*google/common/logging/nano/Vr\$VREvent\$EmbedVrWidget*.class", - "*google/common/logging/nano/Vr\$VREvent\$EarthVr*.class", - "*google/common/logging/nano/Vr\$VREvent\$DoublePrecisionTransform.class", - "*google/common/logging/nano/Vr\$VREvent\$Cyclops*.class", - "*google/common/logging/nano/Vr\$VREvent\$AudioStats.class", - "*google/common/logging/nano/Vr\$VREvent\$Application.class", - ] } android_aar_prebuilt("gvr_controller_java") { - aar_path = "src/libraries/sdk-controller-1.60.1.aar" + aar_path = "src/libraries/sdk-controller-1.10.0.aar" } config("libgvr_config") {
diff --git a/third_party/gvr-android-sdk/README.chromium b/third_party/gvr-android-sdk/README.chromium index 47a8431..1ba339e 100644 --- a/third_party/gvr-android-sdk/README.chromium +++ b/third_party/gvr-android-sdk/README.chromium
@@ -1,9 +1,9 @@ Name: Google VR SDK Short Name: gvr URL: https://github.com/googlevr/gvr-android-sdk -Version: 1.60.1 -Date: 06 June 2017 -Revision: a27f768b13682189c23eed69656319db5ef7cbfc +Version: 1.10.0 +Date: 10 Feb 2017 +Revision: 8d1395957283ee13ebe2bc672ba24e5ca4ec343f License: Apache 2.0 License File: LICENSE Security Critical: yes
diff --git a/third_party/gvr-android-sdk/common_library.aar.sha1 b/third_party/gvr-android-sdk/common_library.aar.sha1 index ca06c1af..9295cfe0 100644 --- a/third_party/gvr-android-sdk/common_library.aar.sha1 +++ b/third_party/gvr-android-sdk/common_library.aar.sha1
@@ -1 +1 @@ -2e65f66d39019f6c9be93c6cb28e2d434667daa5 \ No newline at end of file +fb48131fdbeb6a353d1657743b51cd9bc08c3f7c \ No newline at end of file
diff --git a/third_party/gvr-android-sdk/gvr_api_jni.h b/third_party/gvr-android-sdk/gvr_api_jni.h index a8c1115..9d5a790 100644 --- a/third_party/gvr-android-sdk/gvr_api_jni.h +++ b/third_party/gvr-android-sdk/gvr_api_jni.h
@@ -11,9 +11,8 @@ // 1. Remove all implementaiton, only keep definition. // 2. Use absolute path instead of relative path. // 3. Removed all helper functions such as: Create. -// 4. Removed external functions that don't have implementation in shim file. -// 5. Changed RectF, Point, and PoseTracker to correct package name. -// 6. Added function RegisterGvrApiNatives at the end of this file. +// 4. Changed RectF, Point, and PoseTracker to correct package name. +// 5. Added function RegisterGvrApiNatives at the end of this file. #ifndef com_google_vr_ndk_base_GvrApi_JNI #define com_google_vr_ndk_base_GvrApi_JNI @@ -39,351 +38,289 @@ } // namespace namespace GvrApi { -// Step 2: method stubs. -JNI_GENERATOR_EXPORT jlong +// Step 2: method stubs. +extern "C" __attribute__((visibility("default"))) jlong Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportListCreate( JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportListDestroy( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewportList); -JNI_GENERATOR_EXPORT jint +extern "C" __attribute__((visibility("default"))) jint Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportListGetSize( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewportList); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportListGetItem( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewportList, jint index, jlong nativeBufferViewport); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportListSetItem( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewportList, jint index, jlong nativeBufferViewport); -JNI_GENERATOR_EXPORT jlong +extern "C" __attribute__((visibility("default"))) jlong Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportCreate( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportDestroy( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewport); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportGetSourceUv( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewport, jobject out); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportSetSourceUv( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewport, jfloat left, jfloat top, jfloat right, jfloat bottom); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportGetSourceFov( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewport, jobject out); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportSetSourceFov( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewport, jfloat left, jfloat top, jfloat right, jfloat bottom); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportGetTransform( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewport, jfloatArray matrix); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportSetTransform( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewport, jfloatArray matrix); -JNI_GENERATOR_EXPORT jboolean +extern "C" __attribute__((visibility("default"))) jboolean Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportEqual(JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeA, jlong nativeB); -JNI_GENERATOR_EXPORT jint +extern "C" __attribute__((visibility("default"))) jint Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportGetTargetEye( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewport); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportSetTargetEye( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewport, jint eye); -JNI_GENERATOR_EXPORT jint +extern "C" __attribute__((visibility("default"))) jint Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportGetSourceBufferIndex( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewport); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportSetSourceBufferIndex( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewport, jint index); -JNI_GENERATOR_EXPORT jint +extern "C" __attribute__((visibility("default"))) jint Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportGetExternalSurfaceId( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewport); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportSetExternalSurfaceId( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewport, jint id); -JNI_GENERATOR_EXPORT void -Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportSetExternalSurface( - JNIEnv* env, - jclass jcaller, - jlong nativeBufferViewport, - jlong nativeExternalSurface); - -JNI_GENERATOR_EXPORT jint +extern "C" __attribute__((visibility("default"))) jint Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportGetReprojection( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewport); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportSetReprojection( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferViewport, jint reprojection); -JNI_GENERATOR_EXPORT void -Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportSetSourceLayer( - JNIEnv* env, - jclass jcaller, - jlong nativeBufferViewport, - jint layerIndex); - -JNI_GENERATOR_EXPORT jlong +extern "C" __attribute__((visibility("default"))) jlong Java_com_google_vr_ndk_base_GvrApi_nativeBufferSpecCreate( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferSpecDestroy( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferSpec); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferSpecGetSize( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferSpec, jobject size); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferSpecSetSize( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferSpec, jint width, jint height); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferSpecSetColorFormat( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferSpec, jint format); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferSpecSetDepthStencilFormat( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferSpec, jint format); -JNI_GENERATOR_EXPORT void -Java_com_google_vr_ndk_base_GvrApi_nativeBufferSpecSetMultiviewLayers( - JNIEnv* env, - jclass jcaller, - jlong nativeBufferSpec, - jint numLayers); - -JNI_GENERATOR_EXPORT jint +extern "C" __attribute__((visibility("default"))) jint Java_com_google_vr_ndk_base_GvrApi_nativeBufferSpecGetSamples( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferSpec); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeBufferSpecSetSamples( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeBufferSpec, jint samples); -JNI_GENERATOR_EXPORT jlong -Java_com_google_vr_ndk_base_GvrApi_nativeExternalSurfaceCreateWithListeners( - JNIEnv* env, - jclass jcaller, - jlong nativeGvrContext, - jobject surfaceListener, - jobject frameListener, - jobject handler); - -JNI_GENERATOR_EXPORT void -Java_com_google_vr_ndk_base_GvrApi_nativeExternalSurfaceDestroy( - JNIEnv* env, - jclass jcaller, - jlong nativeBufferSpec); - -JNI_GENERATOR_EXPORT jint -Java_com_google_vr_ndk_base_GvrApi_nativeExternalSurfaceGetId( - JNIEnv* env, - jclass jcaller, - jlong nativeBufferSpec); - -JNI_GENERATOR_EXPORT jobject -Java_com_google_vr_ndk_base_GvrApi_nativeExternalSurfaceGetSurface( - JNIEnv* env, - jclass jcaller, - jlong nativeBufferSpec); - -JNI_GENERATOR_EXPORT jlong +extern "C" __attribute__((visibility("default"))) jlong Java_com_google_vr_ndk_base_GvrApi_nativeSwapChainCreate(JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeContext, jlongArray specs); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeSwapChainDestroy(JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeContext); -JNI_GENERATOR_EXPORT jint +extern "C" __attribute__((visibility("default"))) jint Java_com_google_vr_ndk_base_GvrApi_nativeSwapChainGetBufferCount( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeSwapChain); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeSwapChainGetBufferSize( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeSwapChain, jint bufferIndex, jobject size); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeSwapChainResizeBuffer( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeSwapChain, jint bufferIndex, jint width, jint height); -JNI_GENERATOR_EXPORT jlong +extern "C" __attribute__((visibility("default"))) jlong Java_com_google_vr_ndk_base_GvrApi_nativeSwapChainAcquireFrame( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeSwapChain); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeFrameBindBuffer(JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeFrame, jint bufferIndex); -JNI_GENERATOR_EXPORT void Java_com_google_vr_ndk_base_GvrApi_nativeFrameUnbind( - JNIEnv* env, - jclass jcaller, - jlong nativeFrame); +extern "C" __attribute__((visibility("default"))) void +Java_com_google_vr_ndk_base_GvrApi_nativeFrameUnbind(JNIEnv* env, + jobject jcaller, + jlong nativeFrame); -JNI_GENERATOR_EXPORT jint +extern "C" __attribute__((visibility("default"))) jint Java_com_google_vr_ndk_base_GvrApi_nativeFrameGetFramebufferObject( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeFrame, jint bufferIndex); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeFrameGetBufferSize(JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeFrame, jint bufferIndex, jobject size); -JNI_GENERATOR_EXPORT void Java_com_google_vr_ndk_base_GvrApi_nativeFrameSubmit( +extern "C" __attribute__((visibility("default"))) void +Java_com_google_vr_ndk_base_GvrApi_nativeFrameSubmit( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeFrame, jlong nativeBufferViewportList, - jfloatArray headSpaceFromStartSpace); + jfloatArray transform); -JNI_GENERATOR_EXPORT jboolean -Java_com_google_vr_ndk_base_GvrApi_nativeUsingDynamicLibrary(JNIEnv* env, - jclass jcaller); - -JNI_GENERATOR_EXPORT void -Java_com_google_vr_ndk_base_GvrApi_nativeSetApplicationState(JNIEnv* env, - jclass jcaller, - jclass classLoader, - jobject context); - -JNI_GENERATOR_EXPORT void -Java_com_google_vr_ndk_base_GvrApi_nativeSetDynamicLibraryLoadingEnabled( - JNIEnv* env, - jclass jcaller, - jboolean enabled); - -JNI_GENERATOR_EXPORT jlong Java_com_google_vr_ndk_base_GvrApi_nativeCreate( +extern "C" __attribute__((visibility("default"))) jlong +Java_com_google_vr_ndk_base_GvrApi_nativeCreate( JNIEnv* env, jobject jcaller, jclass classLoader, @@ -395,129 +332,132 @@ jfloat yDpi, jobject optionalPoseTrackingForTesting); -JNI_GENERATOR_EXPORT void -Java_com_google_vr_ndk_base_GvrApi_nativeRequestContextSharing( - JNIEnv* env, - jobject jcaller, - jlong nativeGvrContext, - jobject eglListener); - -JNI_GENERATOR_EXPORT jint +extern "C" __attribute__((visibility("default"))) jint Java_com_google_vr_ndk_base_GvrApi_nativeGetError(JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT jint +extern "C" __attribute__((visibility("default"))) jint Java_com_google_vr_ndk_base_GvrApi_nativeClearError(JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT jstring +extern "C" __attribute__((visibility("default"))) jstring Java_com_google_vr_ndk_base_GvrApi_nativeGetErrorString(JNIEnv* env, jclass jcaller, jint errorCode); -JNI_GENERATOR_EXPORT jlong +extern "C" __attribute__((visibility("default"))) jlong Java_com_google_vr_ndk_base_GvrApi_nativeGetUserPrefs(JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT jint +extern "C" __attribute__((visibility("default"))) jint Java_com_google_vr_ndk_base_GvrApi_nativeUserPrefsGetControllerHandedness( JNIEnv* env, - jclass jcaller, + jobject jcaller, jlong nativeUserPrefs); -JNI_GENERATOR_EXPORT void Java_com_google_vr_ndk_base_GvrApi_nativePause( - JNIEnv* env, - jobject jcaller, - jlong nativeGvrContext); +extern "C" __attribute__((visibility("default"))) void +Java_com_google_vr_ndk_base_GvrApi_nativePause(JNIEnv* env, + jobject jcaller, + jlong nativeGvrContext); -JNI_GENERATOR_EXPORT void Java_com_google_vr_ndk_base_GvrApi_nativeResume( - JNIEnv* env, - jobject jcaller, - jlong nativeGvrContext); +extern "C" __attribute__((visibility("default"))) void +Java_com_google_vr_ndk_base_GvrApi_nativeResume(JNIEnv* env, + jobject jcaller, + jlong nativeGvrContext); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeReleaseGvrContext( JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT void Java_com_google_vr_ndk_base_GvrApi_nativeInitializeGl( - JNIEnv* env, - jobject jcaller, - jlong nativeGvrContext); +extern "C" __attribute__((visibility("default"))) void +Java_com_google_vr_ndk_base_GvrApi_nativeInitializeGl(JNIEnv* env, + jobject jcaller, + jlong nativeGvrContext); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeOnSurfaceCreatedReprojectionThread( JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT void -Java_com_google_vr_ndk_base_GvrApi_nativeOnSurfaceChangedReprojectionThread( - JNIEnv* env, - jobject jcaller, - jlong nativeGvrContext); - -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeGetRecommendedBufferViewports( JNIEnv* env, jobject jcaller, jlong nativeGvrContext, jlong nativeBufferViewportList); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeGetScreenBufferViewports( JNIEnv* env, jobject jcaller, jlong nativeGvrContext, jlong nativeBufferViewportList); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeGetMaximumEffectiveRenderTargetSize( JNIEnv* env, jobject jcaller, jlong nativeGvrContext, jobject size); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeGetScreenTargetSize( JNIEnv* env, jobject jcaller, jlong nativeGvrContext, jobject size); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeDistortToScreen( JNIEnv* env, jobject jcaller, jlong nativeGvrContext, jint textureId, jlong nativeBufferViewportList, - jfloatArray headSpaceFromStartSpace, + jfloatArray pose, jlong timeNs); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeSetDefaultFramebufferActive( JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT jobject +extern "C" __attribute__((visibility("default"))) jobject Java_com_google_vr_ndk_base_GvrApi_nativeRenderReprojectionThread( JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeOnPauseReprojectionThread( JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void +Java_com_google_vr_ndk_base_GvrApi_nativeUpdateSurfaceReprojectionThread( + JNIEnv* env, + jobject jcaller, + jlong nativeGvrContext, + jint surfaceId, + jint textureId, + jlong timestamp, + jfloatArray transformMatrix); + +extern "C" __attribute__((visibility("default"))) void +Java_com_google_vr_ndk_base_GvrApi_nativeRemoveAllSurfacesReprojectionThread( + JNIEnv* env, + jobject jcaller, + jlong nativeGvrContext); + +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeGetHeadSpaceFromStartSpaceRotation( JNIEnv* env, jobject jcaller, @@ -525,48 +465,37 @@ jfloatArray outPose, jlong timeNs); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeSetIgnoreManualPauseResumeTracker( JNIEnv* env, jobject jcaller, jlong nativeGvrContext, jboolean shouldIgnore); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) jbyteArray Java_com_google_vr_ndk_base_GvrApi_nativePauseTracking(JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT jbyteArray -Java_com_google_vr_ndk_base_GvrApi_nativePauseTrackingGetState( - JNIEnv* env, - jobject jcaller, - jlong nativeGvrContext); - -JNI_GENERATOR_EXPORT void -Java_com_google_vr_ndk_base_GvrApi_nativeResumeTracking(JNIEnv* env, - jobject jcaller, - jlong nativeGvrContext); - -JNI_GENERATOR_EXPORT void -Java_com_google_vr_ndk_base_GvrApi_nativeResumeTrackingSetState( +extern "C" __attribute__((visibility("default"))) void +Java_com_google_vr_ndk_base_GvrApi_nativeResumeTracking( JNIEnv* env, jobject jcaller, jlong nativeGvrContext, jbyteArray trackerStateBytes); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeResetTracking(JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeRecenterTracking( JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeGetEyeFromHeadMatrix( JNIEnv* env, jobject jcaller, @@ -574,13 +503,13 @@ jint eye, jfloatArray out); -JNI_GENERATOR_EXPORT jintArray +extern "C" __attribute__((visibility("default"))) jintArray Java_com_google_vr_ndk_base_GvrApi_nativeGetWindowBounds( JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT jfloatArray +extern "C" __attribute__((visibility("default"))) jfloatArray Java_com_google_vr_ndk_base_GvrApi_nativeComputeDistortedPoint( JNIEnv* env, jobject jcaller, @@ -588,69 +517,56 @@ jint eyeType, jfloatArray uvIn); -JNI_GENERATOR_EXPORT jboolean +extern "C" __attribute__((visibility("default"))) jboolean Java_com_google_vr_ndk_base_GvrApi_nativeSetDefaultViewerProfile( JNIEnv* env, jobject jcaller, jlong nativeGvrContext, jstring viewerProfileUri); -JNI_GENERATOR_EXPORT jstring +extern "C" __attribute__((visibility("default"))) jstring Java_com_google_vr_ndk_base_GvrApi_nativeGetViewerVendor( JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT jstring +extern "C" __attribute__((visibility("default"))) jstring Java_com_google_vr_ndk_base_GvrApi_nativeGetViewerModel(JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT jint +extern "C" __attribute__((visibility("default"))) jint Java_com_google_vr_ndk_base_GvrApi_nativeGetViewerType(JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT jboolean +extern "C" __attribute__((visibility("default"))) jboolean Java_com_google_vr_ndk_base_GvrApi_nativeSetAsyncReprojectionEnabled( JNIEnv* env, jobject jcaller, jlong nativeGvrContext, jboolean enabled); -JNI_GENERATOR_EXPORT jboolean +extern "C" __attribute__((visibility("default"))) jboolean Java_com_google_vr_ndk_base_GvrApi_nativeGetAsyncReprojectionEnabled( JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT jboolean -Java_com_google_vr_ndk_base_GvrApi_nativeIsFeatureSupported( - JNIEnv* env, - jobject jcaller, - jlong nativeGvrContext, - jint feature); - -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeReconnectSensors( JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT void -Java_com_google_vr_ndk_base_GvrApi_nativeSetIdleListener(JNIEnv* env, - jobject jcaller, - jlong nativeGvrContext, - jobject idleListener); - -JNI_GENERATOR_EXPORT jboolean +extern "C" __attribute__((visibility("default"))) jboolean Java_com_google_vr_ndk_base_GvrApi_nativeSetViewerParams( JNIEnv* env, jobject jcaller, jlong nativeGvrContext, jbyteArray serializedViewerParams); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeSetDisplayMetrics( JNIEnv* env, jobject jcaller, @@ -660,13 +576,13 @@ jfloat xDpi, jfloat yDpi); -JNI_GENERATOR_EXPORT jfloat +extern "C" __attribute__((visibility("default"))) jfloat Java_com_google_vr_ndk_base_GvrApi_nativeGetBorderSizeMeters( JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeSetSurfaceSize( JNIEnv* env, jobject jcaller, @@ -674,19 +590,19 @@ jint surfaceWidthPixels, jint surfaceHeightPixels); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeSetLensOffset(JNIEnv* env, jobject jcaller, jlong nativeGvrContext, jfloat x, jfloat y); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_ndk_base_GvrApi_nativeDumpDebugData(JNIEnv* env, jobject jcaller, jlong nativeGvrContext); -JNI_GENERATOR_EXPORT jboolean +extern "C" __attribute__((visibility("default"))) jboolean Java_com_google_vr_ndk_base_GvrApi_nativeUsingVrDisplayService( JNIEnv* env, jobject jcaller, @@ -855,14 +771,6 @@ "V", reinterpret_cast<void*>( Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportSetExternalSurfaceId)}, - {"nativeBufferViewportSetExternalSurface", - "(" - "J" - "J" - ")" - "V", - reinterpret_cast<void*>( - Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportSetExternalSurface)}, {"nativeBufferViewportGetReprojection", "(" "J" @@ -878,14 +786,6 @@ "V", reinterpret_cast<void*>( Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportSetReprojection)}, - {"nativeBufferViewportSetSourceLayer", - "(" - "J" - "I" - ")" - "V", - reinterpret_cast<void*>( - Java_com_google_vr_ndk_base_GvrApi_nativeBufferViewportSetSourceLayer)}, {"nativeBufferSpecCreate", "(" "J" @@ -933,14 +833,6 @@ "V", reinterpret_cast<void*>( Java_com_google_vr_ndk_base_GvrApi_nativeBufferSpecSetDepthStencilFormat)}, - {"nativeBufferSpecSetMultiviewLayers", - "(" - "J" - "I" - ")" - "V", - reinterpret_cast<void*>( - Java_com_google_vr_ndk_base_GvrApi_nativeBufferSpecSetMultiviewLayers)}, {"nativeBufferSpecGetSamples", "(" "J" @@ -956,37 +848,6 @@ "V", reinterpret_cast<void*>( Java_com_google_vr_ndk_base_GvrApi_nativeBufferSpecSetSamples)}, - {"nativeExternalSurfaceCreateWithListeners", - "(" - "J" - "Ljava/lang/Runnable;" - "Ljava/lang/Runnable;" - "Landroid/os/Handler;" - ")" - "J", - reinterpret_cast<void*>( - Java_com_google_vr_ndk_base_GvrApi_nativeExternalSurfaceCreateWithListeners)}, - {"nativeExternalSurfaceDestroy", - "(" - "J" - ")" - "V", - reinterpret_cast<void*>( - Java_com_google_vr_ndk_base_GvrApi_nativeExternalSurfaceDestroy)}, - {"nativeExternalSurfaceGetId", - "(" - "J" - ")" - "I", - reinterpret_cast<void*>( - Java_com_google_vr_ndk_base_GvrApi_nativeExternalSurfaceGetId)}, - {"nativeExternalSurfaceGetSurface", - "(" - "J" - ")" - "Landroid/view/Surface;", - reinterpret_cast<void*>( - Java_com_google_vr_ndk_base_GvrApi_nativeExternalSurfaceGetSurface)}, {"nativeSwapChainCreate", "(" "J" @@ -1076,27 +937,6 @@ "V", reinterpret_cast<void*>( Java_com_google_vr_ndk_base_GvrApi_nativeFrameSubmit)}, - {"nativeUsingDynamicLibrary", - "(" - ")" - "Z", - reinterpret_cast<void*>( - Java_com_google_vr_ndk_base_GvrApi_nativeUsingDynamicLibrary)}, - {"nativeSetApplicationState", - "(" - "Ljava/lang/ClassLoader;" - "Landroid/content/Context;" - ")" - "V", - reinterpret_cast<void*>( - Java_com_google_vr_ndk_base_GvrApi_nativeSetApplicationState)}, - {"nativeSetDynamicLibraryLoadingEnabled", - "(" - "Z" - ")" - "V", - reinterpret_cast<void*>( - Java_com_google_vr_ndk_base_GvrApi_nativeSetDynamicLibraryLoadingEnabled)}, {"nativeCreate", "(" "Ljava/lang/ClassLoader;" @@ -1110,14 +950,6 @@ ")" "J", reinterpret_cast<void*>(Java_com_google_vr_ndk_base_GvrApi_nativeCreate)}, - {"nativeRequestContextSharing", - "(" - "J" - "Lcom/google/vr/cardboard/EglReadyListener;" - ")" - "V", - reinterpret_cast<void*>( - Java_com_google_vr_ndk_base_GvrApi_nativeRequestContextSharing)}, {"nativeGetError", "(" "J" @@ -1186,13 +1018,6 @@ "V", reinterpret_cast<void*>( Java_com_google_vr_ndk_base_GvrApi_nativeOnSurfaceCreatedReprojectionThread)}, - {"nativeOnSurfaceChangedReprojectionThread", - "(" - "J" - ")" - "V", - reinterpret_cast<void*>( - Java_com_google_vr_ndk_base_GvrApi_nativeOnSurfaceChangedReprojectionThread)}, {"nativeGetRecommendedBufferViewports", "(" "J" @@ -1257,6 +1082,24 @@ "V", reinterpret_cast<void*>( Java_com_google_vr_ndk_base_GvrApi_nativeOnPauseReprojectionThread)}, + {"nativeUpdateSurfaceReprojectionThread", + "(" + "J" + "I" + "I" + "J" + "[F" + ")" + "V", + reinterpret_cast<void*>( + Java_com_google_vr_ndk_base_GvrApi_nativeUpdateSurfaceReprojectionThread)}, + {"nativeRemoveAllSurfacesReprojectionThread", + "(" + "J" + ")" + "V", + reinterpret_cast<void*>( + Java_com_google_vr_ndk_base_GvrApi_nativeRemoveAllSurfacesReprojectionThread)}, {"nativeGetHeadSpaceFromStartSpaceRotation", "(" "J" @@ -1278,31 +1121,17 @@ "(" "J" ")" - "V", - reinterpret_cast<void*>( - Java_com_google_vr_ndk_base_GvrApi_nativePauseTracking)}, - {"nativePauseTrackingGetState", - "(" - "J" - ")" "[B", reinterpret_cast<void*>( - Java_com_google_vr_ndk_base_GvrApi_nativePauseTrackingGetState)}, + Java_com_google_vr_ndk_base_GvrApi_nativePauseTracking)}, {"nativeResumeTracking", "(" "J" - ")" - "V", - reinterpret_cast<void*>( - Java_com_google_vr_ndk_base_GvrApi_nativeResumeTracking)}, - {"nativeResumeTrackingSetState", - "(" - "J" "[B" ")" "V", reinterpret_cast<void*>( - Java_com_google_vr_ndk_base_GvrApi_nativeResumeTrackingSetState)}, + Java_com_google_vr_ndk_base_GvrApi_nativeResumeTracking)}, {"nativeResetTracking", "(" "J" @@ -1386,14 +1215,6 @@ "Z", reinterpret_cast<void*>( Java_com_google_vr_ndk_base_GvrApi_nativeGetAsyncReprojectionEnabled)}, - {"nativeIsFeatureSupported", - "(" - "J" - "I" - ")" - "Z", - reinterpret_cast<void*>( - Java_com_google_vr_ndk_base_GvrApi_nativeIsFeatureSupported)}, {"nativeReconnectSensors", "(" "J" @@ -1401,14 +1222,6 @@ "V", reinterpret_cast<void*>( Java_com_google_vr_ndk_base_GvrApi_nativeReconnectSensors)}, - {"nativeSetIdleListener", - "(" - "J" - "Lcom/google/vr/ndk/base/GvrApi$IdleListener;" - ")" - "V", - reinterpret_cast<void*>( - Java_com_google_vr_ndk_base_GvrApi_nativeSetIdleListener)}, {"nativeSetViewerParams", "(" "J"
diff --git a/third_party/gvr-android-sdk/libgvr_shim_static_arm.a.sha1 b/third_party/gvr-android-sdk/libgvr_shim_static_arm.a.sha1 index c3106905..4ffd258f 100644 --- a/third_party/gvr-android-sdk/libgvr_shim_static_arm.a.sha1 +++ b/third_party/gvr-android-sdk/libgvr_shim_static_arm.a.sha1
@@ -1 +1 @@ -a951bb4b47a6a250c2705cec4a772b606d1b39ae \ No newline at end of file +a65b912586f1292188c42774d8b93534c6eda3a1 \ No newline at end of file
diff --git a/third_party/gvr-android-sdk/libgvr_shim_static_arm64.a.sha1 b/third_party/gvr-android-sdk/libgvr_shim_static_arm64.a.sha1 index 51e10c7..2c735001 100644 --- a/third_party/gvr-android-sdk/libgvr_shim_static_arm64.a.sha1 +++ b/third_party/gvr-android-sdk/libgvr_shim_static_arm64.a.sha1
@@ -1 +1 @@ -8536e70560ab4f3a3f4f93d9dd0fc639c898a4d7 \ No newline at end of file +ffd722cdf7bf26b6e3f719bf540b2f8121d41e45 \ No newline at end of file
diff --git a/third_party/gvr-android-sdk/native_callbacks_jni.h b/third_party/gvr-android-sdk/native_callbacks_jni.h index 96a4b59..e5469f5 100644 --- a/third_party/gvr-android-sdk/native_callbacks_jni.h +++ b/third_party/gvr-android-sdk/native_callbacks_jni.h
@@ -11,12 +11,11 @@ // 1. Remove all implementaiton, only keep definition. // 2. Use absolute path instead of relative path. // 3. Removed all helper functions such as: Create. -// 4. Removed external functions that don't have implementation in shim file. -// 5. Replace all nativeHandle to handle. This is because jni_generator.py +// 4. Replace all nativeHandle to handle. This is because jni_generator.py // require jni functions start with "native" prefix. So we add the prefix to // generate the file. But the real jni functions in the static library // doesn't have the prefix. -// 6. Added function RegisterNativeCallbacksNatives at the end of this file. +// 5. Added function RegisterNativeCallbacksNatives at the end of this file. #ifndef com_google_vr_internal_controller_NativeCallbacks_JNI #define com_google_vr_internal_controller_NativeCallbacks_JNI @@ -44,9 +43,10 @@ } // namespace namespace NativeCallbacks { + // Step 2: method stubs. -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_internal_controller_NativeCallbacks_handleStateChanged( JNIEnv* env, jobject jcaller, @@ -54,7 +54,7 @@ jint controllerId, jint newState); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_internal_controller_NativeCallbacks_handleControllerRecentered( JNIEnv* env, jobject jcaller, @@ -65,7 +65,7 @@ jfloat qz, jfloat qw); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_internal_controller_NativeCallbacks_handleTouchEvent( JNIEnv* env, jobject jcaller, @@ -75,7 +75,7 @@ jfloat x, jfloat y); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_internal_controller_NativeCallbacks_handleOrientationEvent( JNIEnv* env, jobject jcaller, @@ -86,7 +86,7 @@ jfloat qz, jfloat qw); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_internal_controller_NativeCallbacks_handleButtonEvent( JNIEnv* env, jobject jcaller, @@ -95,7 +95,7 @@ jint buttonCode, jboolean down); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_internal_controller_NativeCallbacks_handleAccelEvent( JNIEnv* env, jobject jcaller, @@ -105,7 +105,7 @@ jfloat y, jfloat z); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_internal_controller_NativeCallbacks_handleGyroEvent( JNIEnv* env, jobject jcaller, @@ -115,57 +115,37 @@ jfloat y, jfloat z); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_internal_controller_NativeCallbacks_handleServiceInitFailed( JNIEnv* env, jobject jcaller, jlong userData, jint failureReason); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_internal_controller_NativeCallbacks_handleServiceFailed( JNIEnv* env, jobject jcaller, jlong userData); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_internal_controller_NativeCallbacks_handleServiceUnavailable( JNIEnv* env, jobject jcaller, jlong userData); - -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_internal_controller_NativeCallbacks_handleServiceConnected( JNIEnv* env, jobject jcaller, jlong userData, jint flags); -JNI_GENERATOR_EXPORT void +extern "C" __attribute__((visibility("default"))) void Java_com_google_vr_internal_controller_NativeCallbacks_handleServiceDisconnected( JNIEnv* env, jobject jcaller, jlong userData); -JNI_GENERATOR_EXPORT void -Java_com_google_vr_internal_controller_NativeCallbacks_handlePositionEvent( - JNIEnv* env, - jobject jcaller, - jlong userData, - jlong timestampNanos, - jfloat x, - jfloat y, - jfloat z); - -JNI_GENERATOR_EXPORT void -Java_com_google_vr_internal_controller_NativeCallbacks_handleBatteryEvent( - JNIEnv* env, - jobject jcaller, - jlong userData, - jlong timestampNanos, - jboolean isCharging, - jint batteryLevelBucket); - // Step 3: RegisterNatives. static const JNINativeMethod kMethodsNativeCallbacks[] = { @@ -282,27 +262,6 @@ "V", reinterpret_cast<void*>( Java_com_google_vr_internal_controller_NativeCallbacks_handleServiceDisconnected)}, - {"handlePositionEvent", - "(" - "J" - "J" - "F" - "F" - "F" - ")" - "V", - reinterpret_cast<void*>( - Java_com_google_vr_internal_controller_NativeCallbacks_handlePositionEvent)}, - {"handleBatteryEvent", - "(" - "J" - "J" - "Z" - "I" - ")" - "V", - reinterpret_cast<void*>( - Java_com_google_vr_internal_controller_NativeCallbacks_handleBatteryEvent)}, }; static bool RegisterNativesImpl(JNIEnv* env) {
diff --git a/third_party/gvr-android-sdk/proguard-gvr-chromium.txt b/third_party/gvr-android-sdk/proguard-gvr-chromium.txt deleted file mode 100644 index 5b303440..0000000 --- a/third_party/gvr-android-sdk/proguard-gvr-chromium.txt +++ /dev/null
@@ -1,31 +0,0 @@ -# Don't obfuscate any NDK/SDK code. This makes the debugging of stack traces in -# in release builds easier. --keepnames class com.google.vr.ndk.** { *; } --keepnames class com.google.vr.sdk.** { *; } - -# These are part of the Java <-> native interfaces for GVR. --keepclasseswithmembernames,includedescriptorclasses class com.google.vr.** { - native <methods>; -} - --keep class com.google.vr.cardboard.UsedByNative --keep @com.google.vr.cardboard.UsedByNative class * --keepclassmembers class * { - @com.google.vr.cardboard.UsedByNative *; -} - --keep class com.google.vr.cardboard.annotations.UsedByNative --keep @com.google.vr.cardboard.annotations.UsedByNative class * --keepclassmembers class * { - @com.google.vr.cardboard.annotations.UsedByNative *; -} - --keep class com.google.vr.cardboard.annotations.UsedByReflection --keep @com.google.vr.cardboard.annotations.UsedByReflection class * --keepclassmembers class * { - @com.google.vr.cardboard.annotations.UsedByReflection *; -} - -# All the above is copied from src/proguard-gvr.txt. -# Chromium needs the following line to be able to exclude some unused auto generated classes. --dontwarn com.google.common.logging.nano.Vr$**
diff --git a/tools/metrics/histograms/histograms.xml b/tools/metrics/histograms/histograms.xml index 3fc7b7b..51751a9 100644 --- a/tools/metrics/histograms/histograms.xml +++ b/tools/metrics/histograms/histograms.xml
@@ -46581,6 +46581,14 @@ </summary> </histogram> +<histogram name="OfflinePages.Background.LoadingErrorStatusCode" + enum="CombinedHttpResponseAndNetErrorCode"> + <owner>chili@chromium.org</owner> + <summary> + The combined http and net error codes that caused a page load failure. + </summary> +</histogram> + <histogram name="OfflinePages.Background.OfflinerRequestStatus" enum="OfflinePagesBackgroundOfflinerRequestStatus"> <owner>dougarnett@chromium.org</owner> @@ -68319,6 +68327,9 @@ </histogram> <histogram name="ServiceWorker.TerminateThread.Time" units="ms"> + <obsolete> + Deprecated in June 2017. + </obsolete> <owner>falken@chromium.org</owner> <summary> The time taken in the renderer process between the main thread asking the @@ -68327,6 +68338,9 @@ </histogram> <histogram name="ServiceWorker.TimeBetweenEvents" units="ms"> + <obsolete> + Deprecated in June 2017. + </obsolete> <owner>falken@chromium.org</owner> <summary> Called at the beginning of each ServiceWorkerVersion::Dispatch*Event @@ -92088,8 +92102,6 @@ </histogram_suffixes> <histogram_suffixes name="OfflinePagesNamespace" separator="."> - <affected-histogram - name="OfflinePages.Background.BackgroundLoadingFailedCode"/> <suffix name="bookmark" label="Offline bookmark cache"/> <suffix name="last_n" label="Offline recent pages"/> <suffix name="async_loading" label="Offline async loaded pages"/> @@ -92097,10 +92109,13 @@ <suffix name="download" label="Offline downloaded pages"/> <suffix name="ntp_suggestions" label="Offline ntp suggestions"/> <affected-histogram + name="OfflinePages.Background.BackgroundLoadingFailedCode"/> + <affected-histogram name="OfflinePages.Background.EffectiveConnectionType.OffliningStartType"/> <affected-histogram name="OfflinePages.Background.EffectiveConnectionType.SavePageLater"/> <affected-histogram name="OfflinePages.Background.FinalSavePageResult"/> + <affected-histogram name="OfflinePages.Background.LoadingErrorStatusCode"/> <affected-histogram name="OfflinePages.Background.OfflinerRequestStatus"/> <affected-histogram name="OfflinePages.Background.TimeToCanceled"/> <affected-histogram name="OfflinePages.Background.TimeToSaved"/>
diff --git a/tools/perf/benchmarks/system_health_smoke_test.py b/tools/perf/benchmarks/system_health_smoke_test.py index 0ca7d624..69b96ef8 100644 --- a/tools/perf/benchmarks/system_health_smoke_test.py +++ b/tools/perf/benchmarks/system_health_smoke_test.py
@@ -32,6 +32,8 @@ _DISABLED_TESTS = frozenset({ + # crbug.com/733427 + 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_mobile.browse:news:cnn', # pylint: disable=line-too-long # cburg.com/721549 'benchmarks.system_health_smoke_test.SystemHealthBenchmarkSmokeTest.system_health.memory_mobile.browse:news:toi', # pylint: disable=line-too-long # crbug.com/702455
diff --git a/tools/perf/core/benchmark_sharding_map.json b/tools/perf/core/benchmark_sharding_map.json index b78b77f..7676a7a1 100644 --- a/tools/perf/core/benchmark_sharding_map.json +++ b/tools/perf/core/benchmark_sharding_map.json
@@ -681,7 +681,7 @@ } }, "Android Nexus5X WebView Perf": { - "build243-m1--device1": { + "build243-m4--device1": { "benchmarks": [ "system_health.memory_desktop", "thread_times.polymer", @@ -690,7 +690,7 @@ "v8.runtimestats.browsing_mobile" ] }, - "build243-m1--device2": { + "build243-m4--device2": { "benchmarks": [ "loading.desktop", "rasterize_and_record_micro.polymer", @@ -703,7 +703,7 @@ "v8.browsing_mobile" ] }, - "build243-m1--device3": { + "build243-m4--device3": { "benchmarks": [ "blink_perf.events", "blink_perf.svg", @@ -727,7 +727,7 @@ "thread_times.key_noop_cases" ] }, - "build243-m1--device4": { + "build243-m4--device4": { "benchmarks": [ "blink_perf.bindings", "blink_perf.dom", @@ -750,7 +750,7 @@ "v8.infinite_scroll_tbmv2" ] }, - "build243-m1--device5": { + "build243-m4--device5": { "benchmarks": [ "battor.trivial_pages", "blink_perf.css", @@ -777,7 +777,7 @@ "v8.runtimestats.browsing_desktop" ] }, - "build243-m1--device6": { + "build243-m4--device6": { "benchmarks": [ "blink_perf.layout", "blink_perf.shadow_dom", @@ -799,7 +799,7 @@ "v8.detached_context_age_in_gc" ] }, - "build243-m1--device7": { + "build243-m4--device7": { "benchmarks": [ "battor.steady_state", "blink_perf.canvas",
diff --git a/tools/perf/core/perf_data_generator.py b/tools/perf/core/perf_data_generator.py index d70009a..2f85b3d 100755 --- a/tools/perf/core/perf_data_generator.py +++ b/tools/perf/core/perf_data_generator.py
@@ -130,10 +130,10 @@ 'android_devices': '1', 'pool': 'Chrome-perf', 'device_ids': [ - 'build243-m1--device1', 'build243-m1--device2', - 'build243-m1--device3', 'build243-m1--device4', - 'build243-m1--device5', 'build243-m1--device6', - 'build243-m1--device7', + 'build243-m4--device1', 'build243-m4--device2', + 'build243-m4--device3', 'build243-m4--device4', + 'build243-m4--device5', 'build243-m4--device6', + 'build243-m4--device7', ], 'perf_tests': [ # TODO(martiniss): implement these isolate targets
diff --git a/ui/accessibility/platform/ax_platform_node_mac.mm b/ui/accessibility/platform/ax_platform_node_mac.mm index 8430b383..240240e6 100644 --- a/ui/accessibility/platform/ax_platform_node_mac.mm +++ b/ui/accessibility/platform/ax_platform_node_mac.mm
@@ -230,6 +230,8 @@ @interface AXPlatformNodeCocoa () // Helper function for string attributes that don't require extra processing. - (NSString*)getStringAttribute:(ui::AXStringAttribute)attribute; +// Returns AXValue, or nil if AXValue isn't an NSString. +- (NSString*)getAXValueAsString; @end @implementation AXPlatformNodeCocoa { @@ -287,6 +289,11 @@ return nil; } +- (NSString*)getAXValueAsString { + id value = [self AXValue]; + return [value isKindOfClass:[NSString class]] ? value : nil; +} + // NSAccessibility informal protocol implementation. - (BOOL)accessibilityIsIgnored { @@ -363,8 +370,8 @@ // Attributes required for user-editable controls. NSArray* const kValueAttributes = @[ NSAccessibilityValueAttribute ]; - // Attributes required for unprotected textfields. - NSArray* const kUnprotectedTextfieldAttributes = @[ + // Attributes required for unprotected textfields and labels. + NSArray* const kUnprotectedTextAttributes = @[ NSAccessibilityInsertionPointLineNumberAttribute, NSAccessibilityNumberOfCharactersAttribute, NSAccessibilitySelectedTextAttribute, @@ -372,19 +379,20 @@ NSAccessibilityVisibleCharacterRangeAttribute, ]; - // Required for all textfields, including protected ones. - NSString* const kTextfieldAttributes = - NSAccessibilityPlaceholderValueAttribute; + // Required for all text, including protected textfields. + NSString* const kTextAttributes = NSAccessibilityPlaceholderValueAttribute; base::scoped_nsobject<NSMutableArray> axAttributes( [[NSMutableArray alloc] init]); [axAttributes addObjectsFromArray:kAllRoleAttributes]; + switch (node_->GetData().role) { case ui::AX_ROLE_TEXT_FIELD: - [axAttributes addObject:kTextfieldAttributes]; + case ui::AX_ROLE_STATIC_TEXT: + [axAttributes addObject:kTextAttributes]; if (!node_->GetData().HasState(ui::AX_STATE_PROTECTED)) - [axAttributes addObjectsFromArray:kUnprotectedTextfieldAttributes]; + [axAttributes addObjectsFromArray:kUnprotectedTextAttributes]; // Fallthrough. case ui::AX_ROLE_CHECK_BOX: case ui::AX_ROLE_COMBO_BOX: @@ -419,10 +427,6 @@ } if ([attributeName isEqualToString:NSAccessibilityValueAttribute]) { - // NSSecureTextField doesn't allow values to be edited (despite showing up - // as editable), match its behavior. - if (node_->GetData().HasState(ui::AX_STATE_PROTECTED)) - return NO; // Since tabs use the Radio Button role on Mac, the standard way to set // them is via the value attribute rather than the selected attribute. if (node_->GetData().role == ui::AX_ROLE_TAB) @@ -450,8 +454,7 @@ // Check for attributes first. Only the |data.action| should be set here - any // type-specific information, if needed, should be set below. - if ([attribute isEqualToString:NSAccessibilityValueAttribute] && - !node_->GetData().HasState(ui::AX_STATE_PROTECTED)) { + if ([attribute isEqualToString:NSAccessibilityValueAttribute]) { data.action = node_->GetData().role == ui::AX_ROLE_TAB ? ui::AX_ACTION_SET_SELECTION : ui::AX_ACTION_SET_VALUE; @@ -531,8 +534,14 @@ } - (id)AXValue { - if (node_->GetData().role == ui::AX_ROLE_TAB) - return [self AXSelected]; + switch (node_->GetData().role) { + case ui::AX_ROLE_TAB: + return [self AXSelected]; + case ui::AX_ROLE_STATIC_TEXT: + return [self AXTitle]; + default: + break; + } return [self getStringAttribute:ui::AX_ATTR_VALUE]; } @@ -596,46 +605,30 @@ // Text-specific attributes. - (NSString*)AXSelectedText { - if (node_->GetData().HasState(ui::AX_STATE_PROTECTED)) - return nil; - NSRange selectedTextRange; [[self AXSelectedTextRange] getValue:&selectedTextRange]; - return [[self AXValue] substringWithRange:selectedTextRange]; + return [[self getAXValueAsString] substringWithRange:selectedTextRange]; } - (NSValue*)AXSelectedTextRange { - if (node_->GetData().HasState(ui::AX_STATE_PROTECTED)) - return nil; - - int textDir, start, end; - node_->GetIntAttribute(ui::AX_ATTR_TEXT_DIRECTION, &textDir); + // Selection might not be supported. Return (NSRange){0,0} in that case. + int start = 0, end = 0; node_->GetIntAttribute(ui::AX_ATTR_TEXT_SEL_START, &start); node_->GetIntAttribute(ui::AX_ATTR_TEXT_SEL_END, &end); - // NSRange cannot represent the direction the text was selected in, so make - // sure the correct selection index is used when creating a new range, taking - // into account the textfield text direction as well. - bool isReversed = (textDir == ui::AX_TEXT_DIRECTION_RTL) || - (textDir == ui::AX_TEXT_DIRECTION_BTT); - int beginSelectionIndex = (end > start && !isReversed) ? start : end; - return [NSValue valueWithRange:{beginSelectionIndex, abs(end - start)}]; + + // NSRange cannot represent the direction the text was selected in. + return [NSValue valueWithRange:{std::min(start, end), abs(end - start)}]; } - (NSNumber*)AXNumberOfCharacters { - if (node_->GetData().HasState(ui::AX_STATE_PROTECTED)) - return nil; - return @([[self AXValue] length]); + return @([[self getAXValueAsString] length]); } - (NSValue*)AXVisibleCharacterRange { - if (node_->GetData().HasState(ui::AX_STATE_PROTECTED)) - return nil; - return [NSValue valueWithRange:{0, [[self AXNumberOfCharacters] intValue]}]; + return [NSValue valueWithRange:{0, [[self getAXValueAsString] length]}]; } - (NSNumber*)AXInsertionPointLineNumber { - if (node_->GetData().HasState(ui::AX_STATE_PROTECTED)) - return nil; // Multiline is not supported on views. return @0; }
diff --git a/ui/views/controls/textfield/textfield.cc b/ui/views/controls/textfield/textfield.cc index 70892160..1dd4dec9 100644 --- a/ui/views/controls/textfield/textfield.cc +++ b/ui/views/controls/textfield/textfield.cc
@@ -926,7 +926,8 @@ node_data->AddState(ui::AX_STATE_EDITABLE); if (text_input_type_ == ui::TEXT_INPUT_TYPE_PASSWORD) { node_data->AddState(ui::AX_STATE_PROTECTED); - node_data->SetValue(base::string16(text().size(), '*')); + node_data->SetValue(base::string16( + text().size(), gfx::RenderText::kPasswordReplacementChar)); } else { node_data->SetValue(text()); }
diff --git a/ui/views/controls/textfield/textfield_unittest.cc b/ui/views/controls/textfield/textfield_unittest.cc index 2a6546235..b1639dd 100644 --- a/ui/views/controls/textfield/textfield_unittest.cc +++ b/ui/views/controls/textfield/textfield_unittest.cc
@@ -3142,8 +3142,13 @@ ui::AXNodeData node_data_protected; textfield_->GetAccessibleNodeData(&node_data_protected); EXPECT_EQ(ui::AX_ROLE_TEXT_FIELD, node_data_protected.role); +#if defined(OS_MACOSX) + EXPECT_EQ(UTF8ToUTF16("••••••••"), + node_data_protected.GetString16Attribute(ui::AX_ATTR_VALUE)); +#else EXPECT_EQ(ASCIIToUTF16("********"), node_data_protected.GetString16Attribute(ui::AX_ATTR_VALUE)); +#endif EXPECT_TRUE(node_data_protected.HasState(ui::AX_STATE_PROTECTED)); }
diff --git a/ui/views/widget/native_widget_mac_accessibility_unittest.mm b/ui/views/widget/native_widget_mac_accessibility_unittest.mm index d06b7925..ce019f5b 100644 --- a/ui/views/widget/native_widget_mac_accessibility_unittest.mm +++ b/ui/views/widget/native_widget_mac_accessibility_unittest.mm
@@ -26,6 +26,14 @@ // Expose some methods from AXPlatformNodeCocoa for testing purposes only. @interface AXPlatformNodeCocoa (Testing) - (NSString*)AXRole; +- (id)AXValue; + +// Text attributes. +- (NSString*)AXSelectedText; +- (NSValue*)AXSelectedTextRange; +- (NSNumber*)AXNumberOfCharacters; +- (NSValue*)AXVisibleCharacterRange; +- (NSNumber*)AXInsertionPointLineNumber; @end namespace views { @@ -34,6 +42,8 @@ NSString* const kTestPlaceholderText = @"Test placeholder text"; NSString* const kTestStringValue = @"Test string value"; +constexpr int kTestStringLength = 17; +NSString* const kTestRTLStringValue = @"אבגדהוזאבגדהוז"; NSString* const kTestTitle = @"Test textfield"; class FlexibleRoleTestView : public View { @@ -353,12 +363,29 @@ EXPECT_EQ(gfx::Range(kTestStringValue.length, kTestStringValue.length), gfx::Range([AttributeValueAtMidpoint( NSAccessibilitySelectedTextRangeAttribute) rangeValue])); + // Select some text in the middle of the textfield. - gfx::Range selection_range(2, 6); - textfield->SelectRange(selection_range); - EXPECT_NSEQ([kTestStringValue substringWithRange:selection_range.ToNSRange()], + const gfx::Range forward_range(2, 6); + const NSRange ns_range = forward_range.ToNSRange(); + textfield->SelectRange(forward_range); + EXPECT_NSEQ([kTestStringValue substringWithRange:ns_range], AttributeValueAtMidpoint(NSAccessibilitySelectedTextAttribute)); - EXPECT_EQ(selection_range, + EXPECT_EQ(textfield->GetSelectedText(), + base::SysNSStringToUTF16(AttributeValueAtMidpoint( + NSAccessibilitySelectedTextAttribute))); + EXPECT_EQ(forward_range, + gfx::Range([AttributeValueAtMidpoint( + NSAccessibilitySelectedTextRangeAttribute) rangeValue])); + + const gfx::Range reversed_range(6, 2); + textfield->SelectRange(reversed_range); + // NSRange has no direction, so these are unchanged from the forward range. + EXPECT_NSEQ([kTestStringValue substringWithRange:ns_range], + AttributeValueAtMidpoint(NSAccessibilitySelectedTextAttribute)); + EXPECT_EQ(textfield->GetSelectedText(), + base::SysNSStringToUTF16(AttributeValueAtMidpoint( + NSAccessibilitySelectedTextAttribute))); + EXPECT_EQ(forward_range, gfx::Range([AttributeValueAtMidpoint( NSAccessibilitySelectedTextRangeAttribute) rangeValue])); @@ -366,6 +393,17 @@ EXPECT_EQ(gfx::Range(0, kTestStringValue.length), gfx::Range([AttributeValueAtMidpoint( NSAccessibilityVisibleCharacterRangeAttribute) rangeValue])); + + // Test an RTL string. + textfield->SetText(base::SysNSStringToUTF16(kTestRTLStringValue)); + textfield->SelectRange(forward_range); + EXPECT_EQ(textfield->GetSelectedText(), + base::SysNSStringToUTF16(AttributeValueAtMidpoint( + NSAccessibilitySelectedTextAttribute))); + textfield->SelectRange(reversed_range); + EXPECT_EQ(textfield->GetSelectedText(), + base::SysNSStringToUTF16(AttributeValueAtMidpoint( + NSAccessibilitySelectedTextAttribute))); } // Test writing accessibility attributes via an accessibility client for normal @@ -401,8 +439,7 @@ Textfield* textfield = AddChildTextfield(GetWidgetBounds().size()); // Get the Textfield accessibility object. - NSPoint midpoint = gfx::ScreenPointToNSPoint(GetWidgetBounds().CenterPoint()); - id ax_node = [widget()->GetNativeWindow() accessibilityHitTest:midpoint]; + id ax_node = A11yElementAtMidpoint(); EXPECT_TRUE(ax_node); // Make sure it's the correct accessibility object. @@ -560,15 +597,72 @@ isAccessibilitySelectorAllowed:@selector(accessibilityValue)]); } - EXPECT_FALSE( - [ax_node accessibilityIsAttributeSettable:NSAccessibilityValueAttribute]); - for (NSString* attribute_name in expected_unsupported_attributes) { SCOPED_TRACE(base::SysNSStringToUTF8([NSString stringWithFormat:@"Missing attribute is: %@", attribute_name])); EXPECT_FALSE([views_attributes containsObject:attribute_name]); EXPECT_FALSE([cocoa_attributes containsObject:attribute_name]); } + + // Explicit checks done without comparing to NSTextField. + EXPECT_TRUE( + [ax_node accessibilityIsAttributeSettable:NSAccessibilityValueAttribute]); + EXPECT_NSEQ(NSAccessibilityTextFieldRole, [ax_node AXRole]); + + NSString* kShownValue = @"•" + @"••••••••••••••••"; + // Sanity check. + EXPECT_EQ(kTestStringLength, static_cast<int>([kShownValue length])); + EXPECT_NSEQ(kShownValue, [ax_node AXValue]); + + // Cursor currently at the end of input. + EXPECT_NSEQ(@"", [ax_node AXSelectedText]); + EXPECT_NSEQ([NSValue valueWithRange:NSMakeRange(kTestStringLength, 0)], + [ax_node AXSelectedTextRange]); + + EXPECT_EQ(kTestStringLength, [[ax_node AXNumberOfCharacters] intValue]); + EXPECT_NSEQ(([NSValue valueWithRange:{0, kTestStringLength}]), + [ax_node AXVisibleCharacterRange]); + EXPECT_EQ(0, [[ax_node AXInsertionPointLineNumber] intValue]); + + // Test replacing text. + textfield->SetText(base::ASCIIToUTF16("123")); + EXPECT_NSEQ(@"•••", [ax_node AXValue]); + EXPECT_EQ(3, [[ax_node AXNumberOfCharacters] intValue]); + + textfield->SelectRange(gfx::Range(2, 3)); // Selects "3". + [ax_node accessibilitySetValue:@"ab" + forAttribute:NSAccessibilitySelectedTextAttribute]; + EXPECT_EQ(base::ASCIIToUTF16("12ab"), textfield->text()); + EXPECT_NSEQ(@"••••", [ax_node AXValue]); + EXPECT_EQ(4, [[ax_node AXNumberOfCharacters] intValue]); +} + +// Test text-specific attributes of Labels. +TEST_F(NativeWidgetMacAccessibilityTest, Label) { + Label* label = new Label; + label->SetText(base::SysNSStringToUTF16(kTestStringValue)); + label->SetSize(GetWidgetBounds().size()); + widget()->GetContentsView()->AddChildView(label); + + // Get the Label's accessibility object. + id ax_node = A11yElementAtMidpoint(); + EXPECT_TRUE(ax_node); + + EXPECT_NSEQ(NSAccessibilityStaticTextRole, [ax_node AXRole]); + EXPECT_NSEQ(kTestStringValue, [ax_node AXValue]); + + // No selection by default. TODO(tapted): Test selection when views::Label + // uses RenderTextHarfBuzz on Mac. See http://crbug.com/454835. + // For now, this tests that the codepaths are valid for views::Label. + EXPECT_NSEQ(@"", [ax_node AXSelectedText]); + EXPECT_NSEQ([NSValue valueWithRange:NSMakeRange(0, 0)], + [ax_node AXSelectedTextRange]); + + EXPECT_EQ(kTestStringLength, [[ax_node AXNumberOfCharacters] intValue]); + EXPECT_NSEQ(([NSValue valueWithRange:{0, kTestStringLength}]), + [ax_node AXVisibleCharacterRange]); + EXPECT_EQ(0, [[ax_node AXInsertionPointLineNumber] intValue]); } } // namespace views